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
feat(now-playing): full artwork + metadata for every provider
Populate the OS Now Playing widget (macOS Control Center / MPRIS) with
artwork, real artist, and album for all music providers — previously it
showed a blank cover and the service name as the artist.
- Cover art: set_metadata passes thumbnail_path as a percent-encoded
file:// URL (souvlaki feeds it to NSImage / MPMediaItemArtwork on
macOS, the MPRIS URI on Linux). Uniform across providers.
- Stream-first SoundCloud/HypeM tracks aren't downloaded and so had no
art; fetch their thumbnail lazily for the current track via a new
ytdlp::fetch_thumbnail (one yt-dlp call that writes the thumbnail and
prints the id used to name it). Done in prepare_track_for_playback so
a playlist fetches one-at-a-time as tracks play, not all upfront.
- Local files have no embedded art: use a bundled fallback cover
(assets/local-cover.png, embedded via include_bytes! and materialized
into the cache) so the widget is never blank.
- Real artist: new TrackInfo.artist, joined from Spotify Track.artists
and parsed from yt-dlp artist/creator/uploader/channel. set_metadata
prefers it, falling back to the service name. Album is the
playlist/album collection name.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CLAUDE.md
+9Lines changed: 9 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -245,6 +245,15 @@ There are now two major UI modes:
245
245
- a directly-requested **single** Spotify track that is unavailable is caught at
246
246
resolve (`ensure_track_available`) so it shows the modal; unavailable tracks
247
247
inside a playlist/album are silently dropped during concurrent metadata fetch.
248
+
- the OS Now Playing widget (`media_controls::set_metadata`) gets title, artist
249
+
(real artist when the source provides one — Spotify `Track.artists`, yt-dlp
250
+
`artist`/`uploader`; falls back to the service name), album (the playlist/album
251
+
`collection`), and cover art. Cover art is passed as a percent-encoded
252
+
`file://` URL of `thumbnail_path` (souvlaki hands it to `NSImage` /
253
+
MPRIS). Stream-first SoundCloud/HypeM tracks fetch their thumbnail lazily at
254
+
playback via `ytdlp::fetch_thumbnail`; local files (no embedded art) use a
255
+
bundled fallback cover embedded from `assets/local-cover.png` via
256
+
`include_bytes!` and materialized into the cache, so the widget is never blank.
248
257
-`souvlaki` is wired with the `use_zbus` feature so Linux builds don't need `libdbus-1-dev`; macOS uses `MPRemoteCommandCenter` + `MPNowPlayingInfoCenter` directly. Windows is intentionally unwired (would need a hidden message-only HWND + a per-tick `pump_event_queue`).
0 commit comments