Apple Music ↔ YouTube Music 雙向播放清單差異同步工具。
- 支援 Apple Music → YT Music 和 YT Music → Apple Music 兩個方向
- 差異同步(只新增/刪除差異部分,不重建清單)
- ISRC 精確比對 + title/artist 模糊比對 fallback
--dry-run模式:只顯示差異,不執行任何寫入
- Python 3.10+
- uv 套件管理器
git clone <repo-url>
cd playlist-sync
uv sync複製範本並填入你的金鑰:
cp .env.example .env需要兩個憑證:
- 登入 Apple Developer Portal
- 前往 Certificates, Identifiers & Profiles → Keys
- 建立新 Key,勾選 MusicKit
- 下載
.p8私鑰檔案(只能下載一次) - 記下 Key ID 和你的 Team ID(右上角帳號頁面可查到)
填入 .env:
APPLE_KEY_ID=你的 Key ID(10 位英數字)
APPLE_TEAM_ID=你的 Team ID(10 位英數字)
APPLE_PRIVATE_KEY_PATH=/絕對路徑/AuthKey_XXXXXXXXXX.p8
MUT 代表使用者對 Apple Music 個人資料庫的授權,無法由程式自動取得,需手動從瀏覽器擷取。
取得步驟:
- 打開瀏覽器,前往 music.apple.com 並登入
- 開啟開發者工具(F12)→ Application 標籤 → Cookies
- 找到
music.apple.com的 cookie,尋找名為media-user-token的值
或使用 MusicKit JS(較可靠):
- 打開開發者工具 Console
- 執行:
MusicKit.getInstance().musicUserToken- 複製回傳的 token 字串
填入 .env:
APPLE_MUSIC_USER_TOKEN=你取得的 token
⚠️ MUT 有效期約數個月,過期後需重新取得。
使用 ytmusicapi OAuth 認證:
uv run ytmusicapi oauth依照指示完成授權後,會在當前目錄產生 oauth.json。
預設路徑即為 oauth.json,若需自訂:
YTMUSIC_OAUTH_JSON_PATH=/你的路徑/oauth.json
# 列出兩個平台的播放清單
uv run python main.py list-playlists --platform both
# 只列 Apple Music
uv run python main.py list-playlists --platform apple
# 只列 YouTube Music
uv run python main.py list-playlists --platform ytmusic# 先用 dry-run 預覽差異(不執行寫入)
uv run python main.py sync \
--direction apple-to-yt \
--source "我的最愛" \
--target "My Favorites" \
--dry-run
# 確認無誤後執行真實同步
uv run python main.py sync \
--direction apple-to-yt \
--source "我的最愛" \
--target "My Favorites"
# 只新增不刪除
uv run python main.py sync \
--direction apple-to-yt \
--source "我的最愛" \
--target "My Favorites" \
--no-remove--direction 值 |
說明 |
|---|---|
apple-to-yt(預設) |
Apple Music → YouTube Music |
yt-to-apple |
YouTube Music → Apple Music |
bidirectional |
雙向同步 |
uv run pytest tests/
⚠️ 需先在兩個平台手動建立名為[TEST] playlist-sync的測試清單
INTEGRATION_TEST=1 uv run pytest tests/ -m integration- Apple Music 刪除功能:Apple Music REST API 無官方的刪除播放清單歌曲端點,此功能行為需實測確認。若不支援,刪除操作將回報於同步報告的
Failed區段。 - ISRC 可用性:部分歌曲(獨立廠牌、地區限定)可能無 ISRC,將 fallback 至模糊比對。
- ytmusicapi 非官方:YouTube Music 無官方 API,
ytmusicapi可能因 YT Music 更新而失效。