release / govulncheck (push) Successful in 18s
release / web (push) Successful in 1m33s
release / android (push) Failing after 1m44s
release / go (push) Successful in 1m48s
release / Build signed APK (releases and dev) (push) Successful in 4m54s
release / integration (push) Successful in 5m12s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Skipped
release / Verify release artifacts (tag releases only) (push) Skipped
Discovery already listed every MediaRenderer on the LAN, but playback only spoke the Sonos native queue (AddURIToQueue, x-rincon-queue, Seek TRACK_NR, Next/Previous), which a generic renderer faults on, so picking one fell straight back to the phone. A renderer that isn't a Sonos is now fed one track at a time by SingleTrackLoader: SetAVTransportURI + Play for the current track, and SetNextAVTransportURI for the one after it so the renderer moves on by itself without a gap. A renderer without SetNext is advanced by the app when the poll sees it stop (or report NO_MEDIA_PRESENT) at the end of a track; a stop partway is still the stall watchdog's. ActiveUpnp carries the queue mode, picked from the route at select. Skip, previous and queue taps point a one-track renderer at the cursor's track, the poll takes the queue position from the loader instead of the renderer's Track=1, queue changes keep the playing track and re-arm the next, and adopting a running session matches by track id. Sonos keeps its native queue unchanged. DIDL-Lite drops the Rincon metadata for non-Sonos renderers and declares DLNA.ORG_OP=01 so renderers that need it will seek. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>