YouTube Playlist Saver 設計書
このドキュメントは、YouTube のプレイリストに含まれる動画 ID を記録・管理するユーザースクリプトの設計を定義します。
1. プロジェクトの目的
youtube-playlist-saver.user.js を作成し、YouTube プレイリスト内の動画情報を効率的に収集・可視化することを目的とします。
開発リソース
- サンプル DOM:
samples/ディレクトリに、プレイリスト全体の DOM や動画アイテムの断片を保存し、分析に使用します。 - 実行環境: ブラウザの Tampermonkey 拡張機能での動作を想定しています。
- v0.2.59: Playlist Liteと同様にマウスオーバーでのバージョン表示強調とダブルクリックによる縮小機能を実装。Activeインジケーターを削除。
2. 動作対象ページ
URL の list パラメータにプレイリスト ID が含まれるページを対象とします。
- 後で見る (Watch Later):
https://www.youtube.com/playlist?list=WL - 高く評価した動画 (Liked Videos):
https://www.youtube.com/playlist?list=LL - 一般のプレイリスト:
https://www.youtube.com/playlist?list=[PLAYLIST_ID] - インストール範囲: YouTube 全体にインストールされますが、主要機能がアクティブになるのはプレイリストページのみです。
3. ユーザースクリプトの機能
3.1 動画 ID の収集
- 自動記録: ユーザーがプレイリストをスクロールして表示された動画アイテムの ID を抽出します。
- プレイリスト管理: 動画 ID は、対応するプレイリスト ID(
WLやLLを含む)と紐付けて記録します。 - 重複除外: すでに保存済みの動画については、新規に記録しません。
3.2 永続データストレージ
- 収集したデータの保存および読み込みには、ユーザースクリプトの API である
GM_setValueおよびGM_getValueを使用します。 - パフォーマンス最適化:
- データのキャッシュ: ストレージへのアクセス回数を減らすため、メモリ上にデータのキャッシュを保持します。
- 一括保存 (Batch Save): データの書き込みは、バッチ処理により効率化。変更検知から2秒間の待機(デバウンス)を経て、まとめて保存されます。
- メタデータ項目の
@grantには、これらの API を使用するために必要な権限を設定します。
3.3 既知動画のインジケーター表示
- 表示場所: 各動画アイテム内の
id="engagement-bar"要素(メタデータ領域)。 - 表示内容:
- 新規:
[NEW](青色) - 今回のセッションで初めて検出・記録された動画。 - 既知:
[SAVED](緑色) - 以前のセッションですでに記録済みの動画。
- 新規:
- 個別削除: インジケーターの横に「ゴミ箱」アイコンを表示します。
- クリックすると確認ダイアログが表示され、OKを押すと YouTube のメニューを自動操作して削除します。
- 削除後は動画行が半透明化されます。
3.4 ステータスパネル
- 右下のパネルで保存数や保存状態を表示します。
- アクティブ状態に連動: プレイリストページでは内容を展開し、非プレイリストではパネルを最小化します。
- 初期化ディレイ: 初回注入時は 1-3 秒のランダムディレイ後に初期化します。
3.5 API機能 (開発者向け)
window.YouTubePlaylistSaver: 他のスクリプトからデータを利用するためのAPIを公開しています。isSaved(playlistId, videoId): 動画が保存済みかチェック。save(playlistId, ...): 動画を強制的に保存し、新規かどうかの結果を返す。getAllKnownIds(playlistId): 保存済みの全IDを取得。
3.6 補助機能の分離
- フィルタリング: 以前のバージョンに含まれていたフィルタリング機能は、YouTube Playlist Filter に分離されました。
- 一括削除: フィルタ条件やスクロール状態に基づいた一括削除機能は、YouTube Playlist Remover に分離されました。
- 自動スクロール: YouTube Playlist Scroller に分離されました。
4. データ構造とバージョニング
将来的な機能拡張(最終発見日時の記録など)に備え、保存データの形式をバージョニング管理しています。
4.1 旧データ形式 (バージョン表記なし)
初期実装で採用されていた形式です。プレイリスト ID をキーとし、動画 ID の配列を値に持つ単純なマッピング構造です。
{
"PL_ExampleId1": ["videoId1", "videoId2"],
"PL_ExampleId2": ["videoId3"]
}
4.2 バージョン 1
データ全体をラッパーオブジェクトで包み、version プロパティと playlists プロパティを導入しました。
{
"version": 1,
"playlists": {
"PL_ExampleId1": ["videoId1", "videoId2"],
"PL_ExampleId2": ["videoId3"]
}
}
4.3 バージョン 2 (現在)
各動画IDに対してメタデータ(タイトル、チャンネル名、追加日時)を保持するオブジェクト構造へ変更されました。
{
"version": 2,
"playlists": {
"PL_ExampleId1": {
"videoId1": { "title": "video title", "channel": "channel name", "addedAt": 1234567890 }
}
}
4.4 JSONスキーマ
エクスポートされるデータの正確な形式定義は、data-format/data-format-v2.schema.json に記載されています。 このスキーマはバリデーションや他のツールとのデータ交換に使用できます。
5. プロジェクト管理
5.1 バージョン管理
- 形式:
major.minor.patch(Semantic Versioning) - 更新ルール: スクリプトファイルが少しでも変更された場合は、
patchレベルを更新します。
5.2 現在バージョン
0.2.51
5.3 メタデータ定義
- 作者: Takashi Sasaki (x.com/TakashiSasaki)
- Namespace:
userscript.moukaeritai.work - 許可ドメイン (@connect):
gist.githubusercontent.com(インポート機能に使用) - 公開・更新: GitHub (
TakashiSasaki/userscript.moukaeritai.work) 上で公開し、Tampermonkey の自動更新機能に対応させます。
6. データインポート機能
外部サーバー(主にGist)にバックアップされたJSONデータ、またはローカルファイルからデータを取り込み、統合します。
- 使用方法:
- URLから: メニュー「Import Data from URL」を選択し、JSONデータのURLを入力します。GistのRaw URL(ハッシュ付き)は自動的に最新版に変換されます。
- ファイルから: メニュー「Import Data from File」を選択し、ローカルのJSONファイル(
.json)を選択して読み込みます。
- 仕様:
- 対象フォーマット: バージョン2形式のJSONデータに対応しています。旧バージョン形式も可能な限り自動変換して読み込みます。
- マージの挙動:
- プレイリスト非依存: 現在ブラウザで開いているページに関わらず、JSONデータ内の各プレイリストID(キー)に基づいて、正しいプレイリストにデータが振り分けられます。
- 新規追加: ローカルに存在しない動画IDは新規に追加されます。
- メタデータ補完: ローカルにIDのみが存在し、タイトルやチャンネル名が欠落している場合、インポートデータに情報があればそれを反映して更新します。
- 即時反映: インポート完了後、現在表示中のリストに含まれる動画のステータス(
[NEW]/[SAVED])は即座に更新されます。 - 許可ドメイン: デフォルトでは
@connectに指定されたgist.githubusercontent.comからの取得を許可しています。 - CORS:
GM_xmlhttpRequestを使用し、クロスドメイン制約を回避してデータを取得します。
7. データエクスポート機能
保存されているすべてのプレイリストのデータを、クリップボードへのコピーまたはファイルとしてエクスポートします。
- 使用方法:
- クリップボードへ: メニュー「Copy Data to Clipboard」を選択します。全データがJSONテキストとしてコピーされます。
- ファイルへ: メニュー「Export Data to File」を選択します。全データが
youtube_playlist_saver_data.jsonとしてダウンロードされます。
- 出力データの内容:
- 現在開いているプレイリストだけでなく、過去に記録された全てのプレイリスト(後で見る、高く評価した動画、その他のプレイリスト)の情報が含まれます。
- 用途:
- バックアップ: Gistなどの外部ストレージやローカルディスクへの保存。
- データ移行: 別のPCでインポート機能を使用してデータを同期する際に使用します。
更新履歴
- vnull: フローティングUIのロジック(表示・最小化・ドラッグ)を共通化
- v0.2.60: フローティングUIが画面外にある場合は、画面内に自動的に位置を調整して表示するようにしました。
- v0.2.59: UIタイトルバーの機能を統一し、マウスオーバーの協調表示、ダブルクリックによる最小化・全体表示の切り替えを実装。Active/Inactive表示を削除し、非アクティブ時は自動的に最小化するように変更しました。