# YouTube チャンネルランダムプレイヤー (ytrand)

YouTubeチャンネルの全動画を取得し、ランダムシャッフル再生するインタラクティブプレイヤー。

## 概要

- YouTube Data API v3 でチャンネルの全動画メタデータを取得
- Python でHTML生成し、軽量HTTPサーバーで配信
- ランダムシャッフル、高度なフィルタリング、PiP、視聴済み管理
- 24時間キャッシュでAPI呼び出しを最小化

## 技術スタック

| 技術 | 用途 |
|---|---|
| Python 3 (stdlib + requests) | API取得・キャッシュ・HTMLl生成・HTTPサーバー |
| YouTube Data API v3 | 動画メタデータ取得 |
| YouTube IFrame API | 動画再生 |
| Vanilla JavaScript | フロントエンドUI・フィルタリング・状態管理 |
| localStorage | 視聴済み管理・状態永続化 |

## ディレクトリ構造

```
rodoku/
├── server.py       # メインアプリケーション (API取得, HTML生成, HTTPサーバー, デーモン管理)
├── player.html     # UIテンプレート (VIDEO_DATA_PLACEHOLDER を置換)
├── index.html      # 生成済みHTML (player.html + 埋め込みJSONデータ, ~1.8MB)
└── .cache/         # APIキャッシュ (gitignore対象)
    ├── {channelId1}.json
    ├── {channelId2}.json
    └── server.pid  # デーモンPIDファイル
```

## セットアップ・起動

```bash
cd rodoku

# 依存: requests のみ
pip install requests

# 起動（デフォルトチャンネルを取得 → ブラウザ自動起動）
python server.py --local
# → http://localhost:18936

# カスタムチャンネル指定
python server.py "https://www.youtube.com/@channelhandle" --local

# キャッシュを無視して再取得
python server.py --refresh --local

# サーバー状態確認
python server.py --status

# サーバー停止
python server.py --stop
```

### コマンドオプション

| オプション | 説明 |
|---|---|
| `(引数なし)` | デフォルト3チャンネルの動画を取得、index.html 生成 |
| `"URL or ID"` | 指定チャンネルの動画を取得 |
| `--refresh` | キャッシュを無視して全チャンネル再取得 |
| `--local` | デーモンHTTPサーバー起動 + ブラウザ自動オープン |
| `--status` | デーモンの稼働状態を確認 |
| `--stop` | デーモンを停止 |

## デフォルトチャンネル

3つの怪談/朗読系チャンネルがデフォルト設定:

| チャンネル | ID |
|---|---|
| チャンネル1 | `UCJKVQPLRqCrXEFmNEWxzlzw` |
| チャンネル2 | `UCiDXupaVh-J90OjFI_KmThA` |
| チャンネル3 | `UCTFopUbU1l2NFKguwb7NU6w` |

## API連携

### チャンネル解決
URL形式（`@handle`, `/channel/`, `/user/`, `/c/`）を自動判別し、チャンネルIDに変換。

### データ取得フロー

```
1. チャンネルID → uploads プレイリストID取得
2. プレイリスト → 全動画ID一覧取得 (50件/ページ, ページング)
3. 動画ID → 詳細メタデータ取得 (50件/バッチ)
4. 正規化 → JSONキャッシュ保存
```

各APIリクエスト間に0.1秒のスリープ（レートリミット対策）。

### キャッシュ

- 保存先: `.cache/{channelId}.json`
- TTL: 24時間 (86400秒)
- 構造: `{ cached_at, channel_name, videos: [...] }`
- 手動無効化: `--refresh` フラグ

## UI機能

### 再生制御
- ランダムシャッフル再生
- 前の動画 / 次の動画
- Picture-in-Picture (PiP)
- 再生位置の記憶・復元

### フィルタリング
- チャンネル別
- 種別（通常動画 / ライブ / すべて）
- 視聴済み（すべて / 未視聴のみ / 視聴済みのみ）
- 含むキーワード（カンマ区切り、OR検索）
- 除外キーワード（カンマ区切り）
- プリセットキーワード（`絶望の世界`, `師匠`, `夜行堂`）
- 再生時間範囲（分単位）
- 公開日範囲（月単位）

### キーボードショートカット

| キー | 動作 |
|---|---|
| `Ctrl+N` / `Ctrl+→` | 次の動画 |
| `Ctrl+P` / `Ctrl+←` | 前の動画 |
| `R` | 再シャッフル |

### 状態永続化

- `ytrand_watched`: 視聴済み動画ID (localStorage)
- `ytrand_state`: 再生状態 (現在のインデックス、再生時間、フィルタ設定、シャッフル順序)
- 5秒ごとに自動保存

## カラーテーマ

YouTube風ダークテーマ:

| 要素 | 色 |
|---|---|
| 背景 | `#0f0f0f` |
| テキスト | `#e1e1e1` |
| サブテキスト | `#aaa` |
| カード/入力 | `#1a1a1a` ~ `#272727` |
| ボタン (デフォルト) | `#272727` → hover `#3a3a3a` |
| チャンネルボタン (active) | `#269` (青) |
| 種別ボタン (active) | `#593` (緑) |
| 視聴済みボタン (active) | `#96c` (紫) |
| プリセットボタン (active) | `#b33` (赤) |
