-
v2026.06.04
Stablereleased this
2026-06-04 23:03:04 -04:00 | 112 commits to main since this releaseSame-day re-cut on the per-day mutable CalVer scheme. Sixth re-cut of v2026.06.04 — two evening on-device papercuts (notification art + false-offline) on top of the morning UPnP parity, afternoon offline-UX composite + server DRY,
/healthzhysteresis hotfix, and Sonos queue resync + prefetcher batch.Evening papercuts
1. Notification / lock-screen art now matches the in-app album cover (PR #84)
The MediaController notification and lock-screen background showed a different album cover than the in-app surfaces for some tracks.
- In-app covers come from
TrackRef.coverUrl→/api/albums/{id}/cover(server album-level art). - The notification art came from the stream's embedded ID3/FLAC tags (
MediaMetadata.artworkData), becausePlayerController.toMediaItemnever setartworkUri. Media3'sBitmapLoaderprefersartworkDataoverartworkUri, and ExoPlayer extracts embedded picture frames into the live metadata. For tracks whose embedded art differs from the server album cover (compilations, re-grouped singles), the two surfaces disagreed.
Fix:
PlayerController.toMediaItemsetsartworkUritocoverUrl(verified against Media3 1.10.1 source:MediaMetadata.populate()overwritesartworkUri+artworkDataas an atomic pair, so the MediaItem URI clears the embedded bytes).PlayerFactory.buildBitmapLoaderprovides an OkHttp-backedCacheBitmapLoaderso the authedplaceholder.invalidcover URL resolves.MinstrelPlayerServiceattaches it viaMediaSession.setBitmapLoader. Album cover now wins on every surface (notification, lock screen, BT/AVRCP, Auto, Pixel Watch).2. False "server offline" → playback "Source error" on a healthy LAN server (PR #85)
The app reported the server offline while it wasn't; a streaming track failed with
load_failed/ "Source error", then recovered on its own.ConnectivityObserver.onlinegated onNET_CAPABILITY_VALIDATED— Android's WAN internet-validation probe, not Minstrel reachability. A transient WAN/DNS blip dropsVALIDATEDwhile the LAN server stays reachable.ServerHealthControllerflipped toOfflineinstantly (no debounce; the/healthzhysteresis only guards ServerDown), andOfflineGatedDataSourcefast-failed the in-flight stream read → ExoPlayer SOURCE error.
Fix:
ConnectivityObserverrequiresINTERNETonly, notVALIDATED— the/healthzpoll (with its own failure hysteresis) is now the sole authority on whether Minstrel is reachable. Added a WARN-tierServerHealth -> Xtransition log (the signal previously had zero instrumentation).
For the morning / afternoon batches that make up the rest of v2026.06.04, see the same-day commits on
main(PRs #80–#83).Verify on device
- Play a track whose embedded tag art differs from its server album cover → notification / lock-screen background now matches the in-app cover.
- During a Wi-Fi/WAN hiccup,
adb logcat -s MinstrelshowsServerHealthstayingHealthy(orServerDownonly after sustained/healthzfailures) — never aOfflineflip from a brief validation drop. Streaming a non-cached track no longer dies with "Source error" on a momentary blip.
Downloads
- In-app covers come from