From fddbc223c4da39cd9248bd6319c3139c76701f65 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 26 Feb 2026 10:30:41 -0500 Subject: [PATCH] Fix sendspin metadata sending wrong progress when paused (#3250) * Fix sendspin metadata sending wrong progress when paused Two issues caused the progress bar in sendspin clients to show wildly incorrect values (e.g. 795:54 / 04:23) after reconnecting to a paused stream: 1. playback_speed was hardcoded to 1000 (normal) and never set to 0 when paused, so the server kept advancing progress. 2. Used PlayerMedia.corrected_elapsed_time which always interpolates elapsed time regardless of playback state (adding hours of wall- clock time while paused). Switched to Player.corrected_elapsed_time which only interpolates during PLAYING. Co-Authored-By: Claude Opus 4.6 * fix(sendspin): preserve metadata progress when paused --------- Co-authored-by: Claude Opus 4.6 Co-authored-by: Maxim Raznatovski --- music_assistant/providers/sendspin/player.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/music_assistant/providers/sendspin/player.py b/music_assistant/providers/sendspin/player.py index 1ae50be4..1485511c 100644 --- a/music_assistant/providers/sendspin/player.py +++ b/music_assistant/providers/sendspin/player.py @@ -574,6 +574,18 @@ class SendspinPlayer(Player): repeat = SendspinRepeatMode.ONE shuffle = queue.shuffle_enabled if queue else False + is_playing = self.state.playback_state == PlaybackState.PLAYING + + # Prefer queue/media elapsed as source of truth. Only interpolate while + # actively playing; for paused/idle states keep the last fixed position. + elapsed_time: float | None = ( + float(current_media.elapsed_time) if current_media.elapsed_time is not None else None + ) + if is_playing and current_media.corrected_elapsed_time is not None: + elapsed_time = current_media.corrected_elapsed_time + if elapsed_time is None: + elapsed_time = self.corrected_elapsed_time if is_playing else self.elapsed_time + track_progress = int(elapsed_time * 1000) if elapsed_time is not None else 0 metadata = Metadata( title=current_media.title, @@ -584,10 +596,8 @@ class SendspinPlayer(Player): year=None, track=None, track_duration=track_duration * 1000 if track_duration is not None else None, - track_progress=int(current_media.corrected_elapsed_time * 1000) - if current_media.corrected_elapsed_time - else 0, - playback_speed=1000, + track_progress=track_progress, + playback_speed=1000 if is_playing else 0, repeat=repeat, shuffle=shuffle, ) -- 2.34.1