-
released this
2026-07-15 19:17:49 -04:00 | 0 commits to main since this releasePer-day CalVer, re-cut forward to
47de7be4(PR #110 + notification-skip follow-up PR #111). Android UPnP/Sonos playback-state rework + a cross-client queue like button.Install this APK. The cursor sync + no-flicker behaviour is device-confirmed; this re-cut adds the notification next/prev fix — please re-verify the transport controls.
UPnP/Sonos — one authoritative "what's playing" (Android, #171)
While casting, the local ExoPlayer cursor and the Sonos renderer were two competing sources of truth. The local cursor lagged (forward-only, index-based sync switched off during every queue-load / re-cast window) and two writers of the current-track index fought — so the in-app player flickered to the pre-cast track on reopen and the notification metadata went stale.
The fix completes
MinstrelForwardingPlayerinto a single source of truth:- Identity-locked cursor — the paused local cursor now tracks the song the renderer is actually playing, matched by track identity (the id in the Sonos
TrackURIvs the localMediaItem.mediaId), not the raw index. Survives queue-reload index wobble; moves both directions. ✅ device-confirmed: stays in sync, no flicker. - One writer — the position tick only moves the scrubber; the current track/index is owned solely by the player-event path. The stale-tick stomp is gone.
- Handoff for free — ending the cast resumes local playback on the correct track + position.
- Notification transport now controls Sonos — the system next/prev buttons issue
COMMAND_SEEK_TO_NEXT/COMMAND_SEEK_TO_PREVIOUS→Player.seekToNext()/seekToPrevious(), which are distinct from theseekTo*MediaItem()methods the in-app buttons use. Those two were un-overridden, so notification next/prev nudged the paused local player instead of Sonos (they read as dead — play/pause worked because it was routed). Now overridden to route to Sonos while casting. (new in this re-cut)
Resolves the index-drift half of #1211; builds on the June UPnP foundation (#606 / #608 / #612).
Verify on device
- Sync / no flicker — already confirmed. ✅
- Notification/lock-screen transport — while casting, the next and previous buttons (and play/pause) should now drive Sonos.
- Handoff — end the cast mid-queue → local resumes on the same track + position.
Queue like button (web + Android, #1596)
The queue ("up next") rows in the full-screen player were the only track-list surface without a like heart. Added the shared like button to the web queue rows (
QueueTrackRow— covers the/now-playingside panel and the mobile queue drawer) and the Android "Queue" screen rows. Liked state stays sourced from the shared store by track id — no data-model change.🤖 Generated with Claude Code
Downloads
- Identity-locked cursor — the paused local cursor now tracks the song the renderer is actually playing, matched by track identity (the id in the Sonos