v0.16.0
Highlights
This release brings MPRIS tracklist support, end to end — from the D-Bus
interface to the dashboard.
- #132 — MPRIS TrackList backend: the tracklist is loaded into the player
cache, kept live via TrackList D-Bus signals, and exposed through new
capability-gated endpoints plus a dedicated SSE event. - #133 — Tracklist UI & cover zoom: the player card can switch its cover
to the tracklist, and covers zoom fullscreen.
✨ Features
- Tracklist endpoints —
GET /players/{player}/tracklistserves the
cached list;POST …/tracklist/goto/{trackid}jumps to a track,
POST …/tracklist/addinserts a URI (validated against the player's
supported schemes),POST …/tracklist/remove/{trackid}removes one. Edit
operations are gated on the player'sCanEditTracks; tracks are referenced
by ID (last path segment, or the full%2F-encoded object path). - Live tracklist cache — TrackListReplaced / TrackAdded / TrackRemoved /
TrackMetadataChanged signals mutate the cache and broadcast
player.tracklist.updatedSSE events. Players that only reveal the
interface through signals (failed initial load) are picked up lazily.
🎨 UI
- Tracklist view — a toggle on the player card swaps the cover for the
tracklist (same footprint, inner scroll): current track highlighted, tap a
row to jump, per-track remove when the player allows edits. Only rendered
with 2+ tracks; the chosen view and scroll position survive live refreshes. - Cover zoom — tap a cover to view it fullscreen; tap or Escape closes.
🧹 Internal
- Lock-free player cache — readers take immutable snapshots, writers are
serialized copy-on-write. - MPRIS backend dedup — capability guards, variant extraction and
capability property mapping factored into shared helpers. - Deps & CI — Go 1.25 in CI, dependabot enabled for GitHub Actions,
actions and golang.org/x bumps.
Full Changelog: v0.15.1...v0.16.0