Making MetroList playback and playlist sync more predictable

Written by Alessio on 7/30/2026

Problem

Sync could duplicate playlists and contribute to memory pressure. Crossfade timing also needed to account for playback speed, while some podcasts failed with IO_UNSPECIFIED because of URL validation behavior.

Changes

I moved playlist cleanup ahead of the sync loop to prevent duplicate processing. For crossfade, I scaled trigger timing by playback speed, kept that speed on the secondary player, and used an ExoPlayer PlayerMessage for precise timing on the main looper. For podcasts, I stopped skipping HEAD validation on WEB_REMIX streams and closed the OkHttp response correctly.

Result

Playlist synchronization is less error-prone, crossfade transitions align with playback speed, and validation handles the affected podcast source correctly.

Commits: playlist sync, crossfade timing, podcast playback