iconパリッと開発日記
ハウツー / 体験記

Claude で YouTube Music 視聴履歴からプレイリストを自動作成する方法

Google TakeoutのYouTube Music視聴履歴をClaudeに読み込ませ、好み分析レポートやスコアリングによるプレイリストを作成し、ytmusic-djで実際のプレイリストとして書き出すまでの手順とプロンプト例をまとめた

Claude で YouTube Music 視聴履歴からプレイリストを自動作成する方法

はじまりのセクション

Google Takeout で取得した YouTube Music の視聴履歴を Claude に読み込ませると、以下のようなものを作成できる。

  • 音楽の好み分析レポート:アーティスト別の再生ランキング、時系列トレンド、コアジャンルやムード別の使い分けなどをまとめたレポート
  • プレイリストの自動作成:単一ジャンル指定、テーマ指定、スコアリングによるおすすめ抽出、新規開拓提案など、条件の指定の仕方次第で色々なパターンのプレイリストを作成できる

これらは最終的に ytmusic-dj というツールを使うことで、実際に YouTube Music(YouTube本体でも再生可能)上のプレイリストとして作成できる。

Google Takeout でデータをエクスポート
        ↓
Claude でデータの準備(YouTube Music抽出・ジャンル付与)
        ↓
Claude で音楽の好み分析レポートを作成
Claude でプレイリストを自動作成
        ↓
Claude で playlists-config.json を作成
        ↓
ytmusic-dj で実際のプレイリストを作成

データの準備

1. Google Takeout でデータをエクスポート

takeout.google.com にアクセス。

追加するデータの選択

  1. 「YouTube と YouTube Music」のみチェック
  2. 「複数の形式」から「履歴」を CSV → JSON に変更
  3. 「YouTube のすべてのデータが含まれます」を 「履歴」のみ チェック
  4. 「次のステップ」をクリック

ファイル形式・エクスポート回数・エクスポート先の選択

  • すべて初期値のままでOK
  • 「エクスポートを作成」をクリック

ダウンロード可能になると Gmail に通知メールが届くので、そこから zip をダウンロードする。

使用するファイル

zip を展開すると以下のパスに視聴履歴ファイルがある。以降の手順で Claude に渡すのはこのファイル。

Takeout/YouTube と YouTube Music/履歴/watch-history.json

2. Claude でデータを整備する

2-1. YouTube Music のデータのみを抽出

watch-history.json には YouTube(動画視聴)由来のエントリも混在している場合がある。まず YouTube Music 由来のエントリだけを抽出したファイルを作らせる。

プロンプト例

添付は Google Takeout の Takeout/YouTube と YouTube Music/履歴/watch-history.json です。
この中から YouTube Music の再生履歴のみを抽出したJSONファイルを作成してください。

Claude は header("YouTube Music" 表記)や products フィールドなどをもとに絞り込みを行う。件数・ユニークアーティスト数を確認しながら進めるとよい。

なお、視聴履歴にある曲の videoId は、各エントリの titleUrlhttps://music.youtube.com/watch?v=VIDEO_ID のような形式)の ?v= パラメータから直接取得できる。そのためパターン1〜3(視聴履歴内の曲だけを使うもの)では、videoId の特定に迷うことはない。パターン4(新規開拓を含むもの)は視聴履歴に存在しない曲を扱うため、これに該当しない(後述)。

2-2. ジャンル情報を追加させる

watch-history.json にはジャンル情報が含まれていない。そのためジャンルは Claude に外部情報などから推定させ、各エントリに新しいフィールドとして追加した状態のファイルを出力させる必要がある。

ジャンル分類は自動判定だけに任せると正確でない場合がある。そのため以下のようなプロンプトで一次分類させた上で、判定に自信がないアーティストは一覧化させて人力で確認するのがよい。

プロンプト例

添付のJSONは楽曲ごとの視聴履歴です。このファイルにはジャンル情報が含まれていないため、
各エントリに genre フィールドを追加した新しいJSONファイルを作成してください。

ジャンル判定は機械的な自動分類だけに頼らず、以下の方針で進めてください。

1. 外部音楽DBなどを使ってジャンルを推定する
2. 判定に自信が持てないアーティストは、確定させずに一覧化して私に確認してほしい
3. 私の確認結果を最優先で反映し、ジャンル情報を追加した視聴履歴ファイルを最終出力してほしい

確認フェーズのプロンプト例(Claudeが不明アーティスト一覧を出した後)

以下は◯◯ジャンルに含めてください:アーティストA, アーティストB, ...
以下は◯◯ジャンルではありません:アーティストC, アーティストD, ...
この結果を反映してジャンル分類を再構築してください。

Claude に音楽の好み分析レポートを作成させる

ジャンル情報を追加した視聴履歴ができたら、傾向分析のレポートを作らせる。

プロンプト例

ジャンル情報を追加したこの視聴履歴データから、私の音楽の好みを分析したレポートを
Markdownで作成してください。

含めてほしい内容:
- アーティスト別の再生回数ランキング
- 時系列トレンド(いつどんなアーティスト・ジャンルにハマっていたか)
- 音楽以外でよく観ているジャンル(あれば)
- 好みの傾向のまとめ(コアジャンル、ムード別の使い分け、新規開拓の傾向など)

過去の実践では、年ごと・半年ごとの「トレンド」セクションと、ジャンルごとのアーティスト内訳、「好みの傾向まとめ」セクションを含む形でレポートが作成された。データ量が多い場合は Claude 側で Python によるコード実行(集計)が行われるため、通常の思考量設定で十分(複雑な深い推論よりデータ処理が主体のタスクのため)。


プレイリストを自動作成する

条件の指定の仕方次第で色々なパターンのプレイリストを作れる。出力形式は毎回 HTML で依頼している。ブラウザで開くだけで見やすく、videoId をリンクにしておけばその場で曲を確認でき、Claudeにとってもテーブルなどの構造を持つHTMLは生成・修正がしやすいため。

代表的なパターンを紹介する。

パターン1:単一ジャンル指定

視聴履歴の中から、指定した1ジャンルの曲だけを抽出する、シンプルなパターン。

プロンプト例

添付のジャンル付き視聴履歴から、◯◯ジャンルの曲だけで32曲のプレイリストを
作成したいです。

HTMLファイルとして出力してください。各行に「順位・曲名・アーティスト・
videoId(YouTube Musicへのリンク)・再生回数」を表示してください。

曲数が多すぎる場合は、サブジャンルへの絞り込みを Claude に相談してもよい。

プロンプト例(サブジャンルをClaudeに相談)

◯◯ジャンルだけで1本プレイリストを作りたいのですが、曲数が多すぎるので
サブジャンルで分けた方がいいか、あなたから提案してください。

パターン2:ジャンルに関係なくテーマ指定

ジャンルではなく、シーンやムードなど自由なテーマを条件にするパターン。

プロンプト例

「作業に集中したいときに聴く曲」というテーマでプレイリストを作りたいです。
ジャンルに関係なく、視聴履歴の中から合いそうな曲を選んでください。

HTMLファイルとして出力してください。各行に「曲名・アーティスト・videoId
(YouTube Musicへのリンク)」を表示してください。

パターン3:おすすめの方法(ジャンルごとにスコアリングし上位32曲)

視聴履歴全体から、ジャンルごとに機械的なスコアリングで上位曲を抽出するパターン。過去に使った基準の例:

  • 再生回数ベース:単純に再生回数が多い順に選ぶ
  • 直近性ベース:初めて聴いた日(first-listen)が新しい順に選ぶ
  • ハイブリッド方式(採用例):再生回数と直近性を重み付けで合成
    totalScore = 0.7 × playScore + 0.3 × recencyScore
    
    • playScorelog(playCount + 1) で対数正規化した後、ジャンル内で min-max 正規化
    • recencyScore:初聴取日をジャンルの日付レンジ内で正規化(新しいほど高スコア)
    • 同スコア時は再生回数の多い方を優先(タイブレーク)

プロンプト例

添付のジャンル付き視聴履歴から、ジャンルごとに上位32曲を抽出したプレイリストを
作成したいです。

選定基準:再生回数と直近性を組み合わせたスコアでランキングしてください。
totalScore = 0.7×playScore + 0.3×recencyScore
playScoreは対数正規化→ジャンル内min-max正規化、recencyScoreは初聴取日をジャンルの
日付レンジで正規化する形でお願いします。

HTMLファイルとして出力してください。各行に「順位・曲名・アーティスト・
videoId(YouTube Musicへのリンク)・再生回数・初聴取日・各スコア・総合スコア」を
表示してください。総合スコアは数値に加えてバーで視覚的にも表示してください。

パターン4:ジャンル指定かつ新規開拓

視聴履歴にある曲だけでなく、視聴履歴にまだ出てきていない曲も好みの傾向から推測して混ぜてもらうパターン。実際に聴いた曲と、Claudeの推測による新規開拓の曲は目的が異なるため、区別できるようにしておくと後で聴き分けやすい。

視聴履歴にある曲は titleUrl から videoId を直接取得できるが、新規開拓の曲は視聴履歴に存在しないため、別途 videoId を特定する工程が必要になる。曲名・アーティスト名は分かっても、それがYouTube Music上のどの動画に対応するかはClaude自身も確認済みとは限らない(存在しない曲やアーティストを提示してしまう可能性もある)。

※ このvideoId特定の工程については daichi はまだ実際に試していないため、うまくいくかどうか・どういうやり方が良いかは分からない。

プロンプト例

◯◯ジャンルのプレイリストを作りたいのですが、視聴履歴にある曲だけでなく、
新規開拓用の曲も混ぜてほしいです。

- 視聴履歴には登場しない曲・アーティストも、好んで聴いている既知のアーティストと
  作風・雰囲気が近いものを優先して選んでほしい
- 有名すぎる定番曲より、まだ知らなそうな曲を優先する
- 新規開拓の曲には、なぜ好みに合いそうかの一言コメントを添えてほしい

HTMLファイルとして出力してください。各行に「曲名・アーティスト・videoId
(YouTube Musicへのリンク、確認できない場合は空欄でよい)」を表示し、視聴履歴由来の曲か
新規開拓の曲かが分かるようにラベル・色分けなどで区別してください。

ytmusic-dj を使って YouTube Music(YouTubeでも再生可能)なプレイリストを作成する

**ここから先は開発環境の準備と技術的な知識が必要になる。**Claudeとのチャットだけでは完結せず、Node.js の実行環境や Google Cloud Console でのAPI設定など、開発者向けのセットアップが必要になる。

ytmusic-dj の簡単な紹介

ytmusic-dj は、playlists-config.json を読み込んで、YouTube Data API v3 経由で実際に YouTube Music 上で再生可能な(YouTube本体からも再生できる)プレイリストを自分のアカウントに作成する、自作の Node.js/TypeScript 製CLIツール。Claude と一緒に設計・実装したもの。

  • 作成専用:同じ title のプレイリストが既に存在する場合はスキップし、既存プレイリストへの追記や同期は行わない
  • 曲名からの検索(search.list)は使わず、Takeout の titleUrl から直接取り出した videoId を使うため、検索APIのクオータ制約を受けにくい
  • 実行結果はログファイルに記録され、追加に失敗した曲(削除済み・非公開化された動画など)は一覧としてまとめて出力される

playlists-config.json を作成からの手順

1. Claude に playlists-config.json を作成させる

これまでに作った HTML(プレイリスト・新規開拓提案含む)の内容を、ytmusic-dj が読み込める設定ファイルに変換させる。

プロンプト例

添付の playlists-config.example.json を参考に、確定した playlist_by_genre.html の
内容から playlists-config.json を作成してください。

- 各タブ(ジャンル・新規開拓含む)を1つの playlist として扱う
- title は日本語のジャンル名でわかりやすく
- tracks は HTML に表示されている順(総合スコア順)のまま videoId・title・artist を含める
- videoIdが確認できていない新規開拓の曲は除外する
- privacyStatus は private のままでよい

設定ファイルの形式イメージ:

{
  "playlists": [
    {
      "title": "Chill Night Drive",
      "description": "夜のドライブ用に選定",
      "privacyStatus": "private",
      "tracks": [
        { "videoId": "dQw4w9WgXcQ", "title": "曲名", "artist": "アーティスト名" },
        { "videoId": "xxxxxxxxxxx" }
      ]
    }
  ]
}

2. ytmusic-dj をセットアップする

  1. リポジトリで npm install
  2. Google Cloud Console で OAuthクライアントID(デスクトップアプリ種別)を発行し、YouTube Data API v3 を有効化
  3. 環境変数を設定
    export YT_CLIENT_ID="xxxxx.apps.googleusercontent.com"
    export YT_CLIENT_SECRET="xxxxx"
    

3. 実行する

npx tsx create-playlists-from-config.ts ./playlists-config.json

初回はブラウザで認可画面が開く。認可後は token.json にリフレッシュトークンが保存されるので、2回目以降はブラウザ操作なしで実行できる。実行後、対象のYouTube/YouTube Musicアカウントに実際のプレイリストが作成される。

注意点

  • playlistItems.insert は書き込みAPIで1回あたり50ユニット消費(10,000ユニット/日の共有プール)。合計200曲を超える追加は1日の上限に達する可能性がある
  • 削除済み・非公開化された動画は追加に失敗する。失敗した曲は failed.json に詳細(videoId・title・artist・失敗理由)が出力される