feat: fall back to album artwork in player when track has no image (#458)

when a track doesn't have its own artwork but belongs to an album
with artwork, use the album artwork instead of the placeholder icon.

applies to:
- player artwork thumbnail (TrackInfo.svelte)
- media session metadata for system controls (Player.svelte)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude <noreply@anthropic.com>

authored by zzstoatzz.io Claude and committed by GitHub 436cdd58 2000e592

Changed files
+8 -5
frontend
src
lib
components
+4 -1
frontend/src/lib/components/player/Player.svelte
··· 16 16 const artwork: MediaImage[] = []; 17 17 if (track.image_url) { 18 18 artwork.push({ src: track.image_url, sizes: '512x512', type: 'image/jpeg' }); 19 + } else if (track.album?.image_url) { 20 + // fall back to album artwork if no track artwork 21 + artwork.push({ src: track.album.image_url, sizes: '512x512', type: 'image/jpeg' }); 19 22 } else if (track.artist_avatar_url) { 20 - // fall back to artist avatar if no track artwork 23 + // fall back to artist avatar if no album artwork 21 24 artwork.push({ src: track.artist_avatar_url, sizes: '256x256', type: 'image/jpeg' }); 22 25 } 23 26
+4 -4
frontend/src/lib/components/player/TrackInfo.svelte
··· 55 55 56 56 <div class="player-track"> 57 57 <a href="/track/{track.id}" class="player-artwork" aria-label={`view ${track.title}`}> 58 - {#if track.image_url && !imageError} 59 - <img 60 - src={track.image_url} 61 - alt="{track.title} artwork" 58 + {#if (track.image_url || track.album?.image_url) && !imageError} 59 + <img 60 + src={track.image_url || track.album?.image_url} 61 + alt="{track.title} artwork" 62 62 onerror={() => imageError = true} 63 63 /> 64 64 {:else}