Fix sendspin metadata sending wrong progress when paused (#3250)
authorPaulus Schoutsen <balloob@gmail.com>
Thu, 26 Feb 2026 15:30:41 +0000 (10:30 -0500)
committerGitHub <noreply@github.com>
Thu, 26 Feb 2026 15:30:41 +0000 (16:30 +0100)
* 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 <noreply@anthropic.com>
* fix(sendspin): preserve metadata progress when paused

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Maxim Raznatovski <nda.mr43@gmail.com>
music_assistant/providers/sendspin/player.py

index 1ae50be4401e1e87f34d2c5b020574898dd826a2..1485511c554b441b24c0d1a70f64dee320290dcc 100644 (file)
@@ -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,
         )