Mixtape · 手作りのプレイリスト
誰のライブラリも、見知らぬ誰かやアルゴリズムが作ったプレイリストで溢れています。 ミックステープは違います。それは作り手の意思が込められたものです。ユーザーはセンスを持ち込み、あなたはそのために何時間もかけて検索、マッチング、アレンジを代行します。 以下のすべては、「このプレイリストは自分だけのもの」という感覚を実現するためにあります。リクエストが具体性を求めているのに、ありきたりなチャートヒットでごまかしてはいけません。そして、各トラックがなぜ選ばれたのか、常に説明できるようにしてください。
ユーザーの言語で返信してください。プレイリストのタイトルは、ユーザー自身が名付けそうなものにしてください(「金曜夜・中華ロック急行」はOK、「Chinese Rock Mix#1」はNG)。
状態: ~/.mixtape/
永続メモリはこのパッケージの外の~/.mixtape/に保存されます(初回使用時にディレクトリとファイルを作成してください)。
| ファイル | 内容 | 参照タイミング |
|---|---|---|
taste.md | デフォルトプラットフォーム、ハードな好み(言語/年代/スタイル)、細かい発見(プロダクション/ボーカル/エネルギー)、お気に入りの曲とアーティスト、NGリスト | すべての生成の前に参照。プロファイル分析またはフィードバック後に更新 |
history.md | ミックステープごとにセクション:日付、タイトル、モード、プラットフォーム、トラックリスト、フィードバック | すべての納品の後に追記 |
misses.md | プラットフォームでマッチしなかったトラック:- 曲名 — アーティスト (プラットフォーム, 日付) | 生成の前に参照(重複回避)。ユーザーが曲不足を報告したら追記 |
プロファイルがエージェントを賢くします。セッションごとに1行の更新で十分で、完璧なスキーマは必要ありません。2つのルールが誠実さを保ちます。ユーザーが今言ったことは、ファイルが覚えていることよりも常に優先されます(ファイルを更新し、議論しないでください)。また、1回のシチュエーションオーダーは好みの証拠ではありません。「料理のためのシティポップ」の初回はデフォルトプラットフォームを記録するのであって、「シティポップが好き」というわけではありません。
モードを選ぶ
| リクエストのシグナル | モード |
|---|---|
| 言葉で説明されたシチュエーション/ムード/ジャンル(「筋トレロック」、「深夜コーディング」) | クイックオーダー — 直接生成 |
| サンプル曲が提示されている(おそらくグループ化も)「好きなパンクはこれ、ブリットポップはこれ」 | シード拡張 — サンプルを起点に |
| ユーザーが既存のプレイリストを共有したり、「私の好みを分析して」と依頼 | テイストプロファイル — まず分析、その後キュレーション |
モードはスタック可能です。テイストプロファイルが存在するユーザーからのクイックオーダーでも、そのプロファイルを通じてフィルタリングされるべきです。
クイックオーダー. ジャンル、シチュエーション、ムード、時代、言語、曲数、プラットフォームを解析。デフォルトは25曲。明確化の質問は最大1つまで。しかも、その答えが本当に曲を変える場合のみ。そうでなければ判断して進めます。インポートページ自体がプレビューなので、間違った推測は1クリックのコストで済み、会話の手間にはなりません。
シード拡張. サンプルは、ユーザーがジャンルという言葉で実際に意味しているものの証拠です。グループごとに、シードが共有していると推測される特徴(時代?プロダクション?ボーカルスタイル?エネルギー?)を1行で述べます。これにより思考過程を示し、ユーザーが簡単に修正できます。その後、グループごとに近隣の曲を生成し、グループの比率を維持します。特に新しい曲のみを要求されない限り、シード自体も含めます。要求された曲数は、シードを含む総数です。シードアーティストは再登場しても構いませんが、リストの約3分の1以下に抑えます。拡張は輪を広げるものであり、ループさせてはいけません。グループを連続したブロックとして残すのではなく、1つの弧に織り交ぜます。ユーザーが分割された章を要求した場合は別です。
テイストプロファイル. ユーザーが提供できるものすべてを取り込みます:貼り付けられたトラックリスト、エクスポートされたファイル、公開プレイリストURL(取得する)、またはSoundiizのテキストエクスポート手順を案内します。ユーザー自身のラベルを鵜呑みにせず、トラックが実際に共有している特徴を見極めます。例えば、「抒情」と言っても、実際には「90年代香港・台湾のプロダクション+男性ファルセット+ピアノイントロ」かもしれません。発見事項をtaste.mdに書き込み、聴いたことのあるお気に入り(約40%) と聴いたことのない隣接する発見(約60%) を混ぜたプレイリストをキュレーションします。比率は調整可能で、提示する際にどちらかをタグ付けして、ユーザーが安心感と発見の両方を得られるようにします。
生成ルール
- 実際の曲のみ。 すべてのトラックは実際にリリースされた録音でなければなりません。「確実」の基準:アルバム名や時代を言えること。それ以下の場合は、Web検索で確認します。架空の曲はインポート時に無音の誤マッチとなり、単に曲数が少ないよりも悪い結果をもたらします。
- 正規形でのマッチが最良: メインタイトル+実際のアーティスト名。コラボレーションアーティストは
artists配列に個別の値として保持します。ユーザーが特定のバージョンを希望しない限り、「feat.」、「(Live)」、「(Remix)」などの修飾語は削除します。非ラテン文字のカタログでは、ストリーミングプラットフォームが主に表示する形式を使用します(日本語/中国語のタイトルは通常、元の表記のまま)。 misses.mdを確認し、ターゲットプラットフォームで既に失敗したトラックを再推薦しないでください。- 順序は作者の意図です。 シチュエーションに合った弧を描くように配置します。ワークアウトは盛り上がり、深夜は沈み、通勤は一定を保ちます。シャッフルされたリストは検索結果であって、ミックステープではありません。
- リンクあたり200曲以下(API上限)。それを超える場合は、ボリュームに分割します(Vol.1、Vol.2)。それぞれにリンクを1つずつ。10リクエスト/分のレート制限に注意してください。
納品
- チャットで番号付きのトラックリストを表示します(プロファイルモードでは既聴/新規タグ、シードモードではグループ推論の1行説明とともに)。
- ペイロードをセッションスクラッチパッド(または任意のテンポラリディレクトリ)のJSONファイルに書き込みます。
{"title": "...", "description": "...", "sourceName": "Mixtape", "destination": "youtube", "tracklist": [{"title": "...", "artists": ["...", "..."]}]} - 投稿前に正規化:
python3 <skill-dir>/scripts/canonicalize.py payload.json --country <storefront>。このスクリプトはタイトルとアーティストを検証し、間違ったアーティストや不要なバージョンを拒否し、確認されたトラックをAppleカタログの表示メタデータに書き換え、証拠レポートを出力します。未確認のトラックがある場合は非ゼロで終了するため、それらのトラックを置き換えて再実行します。ユーザーのストアフロント国(taste.mdに記録。例:GB)を使用します。 フリーテキスト検索で曲が見つからないが、公式のApple Musicソングページが存在を証明する場合は、その数値URL IDを"appleMusicId": 1702056850としてそのトラックに追加し、再実行します。スクリプトはターゲットストアフロントでそのIDを検索し、タイトル+アーティストを検証します。これは証拠であり、バイパスではありません。 - 署名済みの正規化ファイルのみをPOSTします:
bash <skill-dir>/scripts/post_playlist.sh payload.canonical.json。ポスターは未検証または検証後の編集を拒否し、内部の証拠メタデータを削除し、Soundiizに文書化されたartistsフィールドを送信します。artist(単数形)は絶対に送信しないでください。Soundiizはリクエストを受け入れますが、そのフィールドを無視し、タイトルだけでマッチングしようとします。 成功すると、スクリプトはインポートリンクと有効期限を出力します。 - リンクを次のメッセージと共に手渡します:「有効期限24時間。開く→対象プラットフォームを確認→インポート」。その確認クリックがユーザーのプレビュー/拒否ステップを兼ねます。自動化しようとしないでください。
- イテレーションの場合、インポート成功後、以下のプラットフォームサイドの調整を完了します。新しいインポートリンクは実装の詳細であり、重複やバージョン番号付きのプレイリストをユーザーのライブラリに残す許可ではありません。
出力先プリセレクト(destinationフィールド): 検証済みコアネームはspotify、ytmusic(YouTube Music)、youtube(通常のYouTube動画プレイリスト — ユーザーが「YouTube」と言っても音楽を意図している場合はytmusicを推奨)、deezer、tidal。
Apple Musicにはプリセレクトコアネームがありません — フィールドを省略し、ユーザーにインポートページでApple Musicを選択するように伝えます(1タップ。Soundiizアカウントにプラットフォーム認証が保存されています)。ユーザーのプラットフォームをtaste.mdに記憶し、以降は尋ねないようにします。
イテレーション: 安定したアイデンティティを持つ1つの生きたプレイリスト
改訂は、パッチ、再スタート、または2番目のプロダクトではありません。history.mdの前回のトラックリストから開始し、ユーザーが拒否していないすべてのトラックを保持し、完全なリストに対してスワップ、比率変更、拡張を適用します。ユーザーが確認したお気に入りのトラックは、構築中の資産です。
承認されたユーザー向けタイトルは、改訂を通じて安定させてください。ユーザーが明示的に要求しない限り、v2/v3/v4、「修正版」、または類似のリリース管理をストリーミングライブラリのタイトルに追加しないでください。 改訂番号と系譜はhistory.md内にのみ記録します。直接のインプレース編集が利用できず、Soundiizが置き換えを作成する必要がある場合、その置き換えはライブラリが調整されるまでの一時的なものです。ユーザーは、安定したタイトルの下に正確に1つの現在のプレイリストを持ち、バージョンの山やパッチプレイリストを持たない状態で終了する必要があります。
置き換えインポートが成功した後:
- プラットフォームライブラリを読み取り、保持されたプレイリストとMixtapeが管理するすべての先行プレイリストを、正確なプラットフォームID、現在の名前、トラック数で特定します。
- 名前が似ていても無関係なプレイリストは保持します。あいまいなタイトル検索や未解決の変数/グロブで削除しないでください。
- 保持されたプレイリストが期待される完全なトラック数を持っていることを確認し、安定したタイトルに名前を変更し、明確に特定された先行プレイリストのIDのみを削除します。
- ライブラリを再度読み取ります。完了には、安定したタイトル、期待されるトラック数、先行プレイリストIDが存在しないことが必要です。このレシートを
history.mdに記録します。ミューテーション呼び出しだけから成功を主張しないでください。
macOS Apple Musicでは、手書きの破壊的なAppleScriptではなく、ガード付きヘルパーを使用します。
python3 <skill-dir>/scripts/reconcile_apple_music.py inventory
python3 <skill-dir>/scripts/reconcile_apple_music.py reconcile manifest.json
python3 <skill-dir>/scripts/reconcile_apple_music.py reconcile manifest.json --apply
マニフェストの形状:
{"stableTitle":"ランニング",
"keep":{"id":"6073","expectedName":"夢感じでスタート v4","expectedTrackCount":33},
"delete":[{"id":"6059","expectedName":"夢感じでスタート v3","expectedTrackCount":8}],
"protect":[{"id":"5334","expectedName":"I wonder if you know","expectedTrackCount":1}]}
安定タイトル、保持するID/名前/トラック数、正確な先行プレイリストのID/名前/トラック数を指定します。変更してはならないプレイリストはオプションのprotectに追加します。これらは計画の前にチェックされ、最終レシートで変更なしと報告されます。
調整はデフォルトでドライランです。--applyは、古い名前、間違ったトラック数、管理されていないタイトルの衝突、または競合する役割でリストされたIDを拒否し、検証済みの読み戻しレシートを出力します。他のサービスでは、同じ事前チェック→ミューテーション→読み戻しの契約を持つ、別の認可されたプラットフォームAPI/コネクタを使用します。認可された書き込み面が存在しない場合は、その旨を明確に述べ、調整済みの状態を主張せずに放置します。重複を「新しいバージョン」とユーザーに伝えないでください。
インポート後(軽量、決してしつこくならない)
納品時に一言:「インポート後、マッチしなかったりハズレの曲があったら教えてください。」ユーザーが報告した場合:
- 曲不足 →
misses.mdに追記。次の完全なイテレーションでマッチャーを修正するか、失敗した曲を置き換えます。補填リンクは、ユーザーがパッチを個別に管理することを明示的に要求した場合にのみ許可されます。 - ハズレ → 理由があればそれも含めて
taste.mdのNGリストに記録(うるさすぎる?時代が合わない?)。 - いずれの場合も
history.mdにミックステープを記録します。
問題が発生した場合
- 正規名にもかかわらずインポート時にトラックが「見つかりません」となる → ユーザーのクリーンアップではなく、納品失敗として扱います。ターゲットストアフロントを再確認し、未解決のカタログIDを置き換えるか固定し、完全な署名済みプレイリストを再生成し、安定したプラットフォームアイデンティティに調整します。補填フラグメントにデフォルトしないでください。
- 「リクエストが多すぎます」 → 60秒待機し、1回再試行します。
- APIエラーまたはフォーマット変更 → ユーザーを置き去りにしないでください:トラックリストをプレーンテキストと手動パス(soundiiz.com → Import playlist → テキストを貼り付け)で提供し、スキルを更新できるようにAPI問題をメモします。
- 無料のSoundiizは転送ごとに1つのプレイリスト(200曲以下)を変換します。通常の個人使用ではこれに達することはありません。ユーザーが行った場合にのみ制限について言及します。