# 漫画マネージャー

4つの漫画サイトから情報を自動収集し、一元管理できるWebアプリケーション。

## 概要

- 4サイト（K-漫神、MangaRawJP、KLManga、RawFree）から約60,000作品を収集
- 重複統合: 同一作品を複数サイトで検出した場合に1エントリに統合
- Node.js/Express（ローカル開発）と PHP（本番サーバー）のデュアルデプロイ対応
- REST APIによるCRUD操作・検索・統計

## 技術スタック

| 技術 | バージョン | 用途 |
|---|---|---|
| Node.js/Express | 4.18.2 | ローカル開発サーバー |
| PHP | — | 本番サーバー (Star Server) |
| Python 3 (aiohttp, BeautifulSoup, pandas) | — | 非同期マルチサイトスクレイパー |
| Vanilla JavaScript | — | フロントエンドUI |
| HTML/CSS | — | レスポンシブUI |

## ディレクトリ構造

```
raw/
├── server.js              # Express APIサーバー（ローカル用, ~319行）
├── package.json
├── README.md              # プロジェクト固有ドキュメント
├── .htaccess              # URLリライト設定 (本番用)
├── api/
│   ├── index.php          # PHP APIサーバー（本番用, ~302行）
│   └── .htaccess          # API URLリライト
├── public/
│   ├── index.html         # フロントエンド (~194行)
│   ├── script.js          # フロントエンドロジック (~1169行)
│   ├── style.css          # スタイルシート (~999行)
│   └── favicon.svg
├── python_scraper/
│   ├── manga_scraper.py   # マルチサイトスクレイパー (~641行)
│   └── requirements.txt   # Python依存関係
└── data/                  # スクレイピングデータ (gitignore対象, ~87MB)
    ├── manga_all.json     # 統合データ (~33MB)
    ├── manga_all.csv      # CSV版 (~21MB)
    ├── manga_kmansin09.json
    ├── manga_mangarawjp.json
    ├── manga_klmanga.json
    ├── manga_rawfree.json
    └── .htaccess          # 直接アクセス禁止
```

## セットアップ

### ローカル開発（Node.js）

```bash
cd raw
npm install
pip install -r python_scraper/requirements.txt
npm start
# → http://localhost:3000
```

> **ポート競合注意**: steam プロジェクトも3000を使用。`PORT=3001 npm start` で回避可能。

### 本番デプロイ（Star Server / PHP）

以下をサーバーにアップロード:
- `public/` の中身 → Webルート
- `api/` フォルダ → `api/`
- `data/` フォルダ → `data/` (chmod 755)
- `.htaccess` → ルート

## データソース

### 対応サイト

| サイト | ドメイン | 推定件数 | ページ数 |
|---|---|---|---|
| K-漫神 | kmansin09.top | ~3,000 | 256 |
| MangaRawJP | mangarawjp.me | ~6,500 | 206 |
| KLManga | klmanga.fit | ~25,000 | 2,148 |
| RawFree | rawfree.ro | ~25,000 | 851 |

**合計: 約60,000作品**（フルスクレイピング所要時間: 約90分）

### スクレイパー実行

```bash
# 全サイト一括取得
cd python_scraper
python3 manga_scraper.py

# ローカルNode.jsサーバー経由
curl -X POST http://localhost:3000/api/run-scraper
```

### スクレイパー機能
- 非同期HTTPリクエスト (aiohttp)
- リトライ + 指数バックオフ
- レートリミット (0.5～1秒)
- 進捗バー (tqdm)
- サイト別CSSセレクタ設定

## REST API

| メソッド | エンドポイント | 説明 |
|---|---|---|
| GET | `/api/manga` | 全漫画取得 |
| GET | `/api/manga/:id` | 個別取得 |
| POST | `/api/manga` | 追加 |
| PUT | `/api/manga/:id` | 更新 |
| DELETE | `/api/manga/:id` | 削除 |
| GET | `/api/search?q=` | テキスト検索 |
| GET | `/api/stats` | 統計情報 (サイト別・ステータス別・評価別) |
| GET | `/api/reload-data` | JSONデータ再読込 |
| GET | `/api/manga/by-site/:site` | サイト別フィルタ |
| POST | `/api/upload-data` | JSONデータアップロード (本番サーバー用) |
| POST | `/api/run-scraper` | スクレイパー実行 (ローカルのみ) |

## UI機能

### 表示モード
- グリッドビュー / リストビュー切替

### フィルタリング
- タイトル・作者テキスト検索
- ステータスフィルタ (連載中 / 完結 / 休載)
- サイト別フィルタ
- 5段階星評価

### その他
- ソート（各カラム）
- ページネーション (50件/ページ)
- 詳細モーダル（カバー画像・概要）
- 統計ダッシュボード

## データスキーマ

```json
{
  "id": 1,
  "title": "ワンピース",
  "author": "尾田栄一郎",
  "status": "連載中",
  "lastRead": "第1100話",
  "rating": 5,
  "cover": "...",
  "source_site": "kmansin09",
  "site_name": "K-漫神",
  "latest_chapter": "第1100話"
}
```

## 重複統合ロジック

- タイトルを正規化（小文字化、スペース/記号除去）して比較
- 同一タイトルが複数サイトに存在する場合、1エントリに統合
- 全ソースサイトのリンクを保持

## カラーテーマ

紫グラデーション (pico と同系統):

| 要素 | 色 |
|---|---|
| 背景 | `linear-gradient(135deg, #667eea, #764ba2)` |
| カード | `#ffffff` |
| フォント | Noto Sans JP (Google Fonts) |

## Python依存関係

```
requests>=2.31.0
beautifulsoup4>=4.12.0
lxml>=4.9.0
aiohttp>=3.9.0
asyncio>=3.4.3
pandas>=2.0.0
tqdm>=4.65.0
```
