You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Apple catalog surface: search, quality tiers, lyrics formats, cover art #6
What does the Apple Music catalog actually expose, independent of engine choice? Verify against primary sources (Apple's API docs, the candidate engines' source code — how they call Apple endpoints). Report:
Search: can the Apple Music API be searched programmatically (terms, kinds: song/album/artist/playlist)? What auth does search need vs what fetching needs?
Per-track quality metadata: how a client knows a track has ALAC 24/192, AAC 256, or Dolby Atmos — the exact flags/fields.
Lyrics: what formats Apple serves (plain, timed line, word/syllable TTML), and per-track availability.
Cover art: maximum resolution obtainable and how the URL/template works.
ISRC / identifiers: what cross-provider matching (future ISRC dedupe) could key on.
Which candidate engine (gamdl / zhaarey / AppleMusicDecrypt) exposes or could expose each of these.
This ticket feeds the chooser UX, lyrics/art policy, and engine choice.
Summary (verified against Apple docs + all three engines' source):
Search: yes, documented — GET /v1/catalog/{sf}/search?term=&types= (songs/albums/artists/playlists/music-videos). Dev token only; Music-User-Token just for /v1/me/.... All engines scrape the web player's dev token; gamdl + zhaarey expose search, AppleMusicDecrypt doesn't.
Quality: two layers. Catalog audioVariants gives tier presence (lossy-stereo/lossless/hi-res-lossless/dolby-atmos/dolby-audio). Exact 24/192 vs 24/96 and Atmos/AAC bitrates are ONLY in the enhanced-HLS master playlist (extendedAssetUrls.enhancedHls, undocumented): audio-alac-stereo-192000-24, audio-atmos-2768, audio-stereo-256. Chooser needs one extra m3u8 GET for exact tier.
Lyrics: TTML only on the wire, three timing modes (itunes:timing None/Line/Word), translations+transliterations embedded; availability via documented hasLyrics + undocumented hasTimeSyncedLyrics; word-level via syllable-lyrics sub-resource; wants media-user-token.
Cover art: documented {w}x{h}bb.jpg template with native max in width/height; original master via undocumented URL rewrite (gamdl + zhaarey implement); animated artwork via editorialVideo.
ISRC: documented Song attribute plus a documented batch lookup endpoint (filter[isrc], 25 max) — the natural TIDAL↔Apple dedupe key; albums expose upc.
Exposure: gamdl = broadest library surface (incl. search); zhaarey = richest lyrics (word-level enhanced LRC) + original art; AppleMusicDecrypt = richest per-variant quality probe but no search/art-original. Details table in the file.
Activity
ranokay commentedon Sep 1, 2026
Research complete — findings in
docs/research/apple-catalog-surface.mdon branchresearch/apple-catalog-surface(commit 078dad0).Summary (verified against Apple docs + all three engines' source):
GET /v1/catalog/{sf}/search?term=&types=(songs/albums/artists/playlists/music-videos). Dev token only;Music-User-Tokenjust for/v1/me/.... All engines scrape the web player's dev token; gamdl + zhaarey expose search, AppleMusicDecrypt doesn't.audioVariantsgives tier presence (lossy-stereo/lossless/hi-res-lossless/dolby-atmos/dolby-audio). Exact 24/192 vs 24/96 and Atmos/AAC bitrates are ONLY in the enhanced-HLS master playlist (extendedAssetUrls.enhancedHls, undocumented):audio-alac-stereo-192000-24,audio-atmos-2768,audio-stereo-256. Chooser needs one extra m3u8 GET for exact tier.itunes:timingNone/Line/Word), translations+transliterations embedded; availability via documentedhasLyrics+ undocumentedhasTimeSyncedLyrics; word-level viasyllable-lyricssub-resource; wantsmedia-user-token.{w}x{h}bb.jpgtemplate with native max inwidth/height; original master via undocumented URL rewrite (gamdl + zhaarey implement); animated artwork viaeditorialVideo.filter[isrc], 25 max) — the natural TIDAL↔Apple dedupe key; albums exposeupc.Closes the research question feeding #8/#10/#13.