b6d6f22598
Fetches album cover bytes via the authenticated dio and writes to <applicationCacheDirectory>/album_covers/<albumId>.jpg. Returns the local path so MediaItem.artUri can point at a file:// URI — Android's MediaSession framework fetches artUri itself without our Bearer header, so a pre-fetched local file is the workaround. Concurrent callers for the same albumId dedupe to one fetch via an in-flight Future map. Any failure (network / 4xx / 5xx / disk full / empty id) returns null without throwing — playback continues with the system's generic music icon, same UX as today. No eviction — covers are tiny, OS clears cache when space is tight. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>