diff --git a/web/src/routes/playlists/[id]/+page.svelte b/web/src/routes/playlists/[id]/+page.svelte index fd80bcf9..f35fcd06 100644 --- a/web/src/routes/playlists/[id]/+page.svelte +++ b/web/src/routes/playlists/[id]/+page.svelte @@ -70,13 +70,14 @@ // so the index in the playable list != the playlist position. const clickedTrackID = data.tracks.find((t) => t.position === position)?.track_id; const startIdx = live.findIndex((t) => t.id === clickedTrackID); - // #968: a system playlist played from its detail page gets the same - // self-heal closure as the home tile, so a stale snapshot re-pulls on - // total failure. (Source attribution is intentionally left to the home - // tile / shuffle path — this only adds the recovery closure.) + // #968: a system playlist played from its detail page is tagged with its + // source (so play_started advances the rotation, matching the home tile and + // the Android detail screen) and gets the self-heal closure so a stale + // snapshot re-pulls on total failure. const variant = data.system_variant; if (variant != null) { playQueue(live, Math.max(0, startIdx), { + source: variant, refetch: systemPlaylistRefetch({ variant, playlistId: id,