Prevent old streamdetails being reused when buffer still present
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 4 Nov 2025 18:48:59 +0000 (19:48 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 4 Nov 2025 18:48:59 +0000 (19:48 +0100)
music_assistant/helpers/audio.py
music_assistant/helpers/audio_buffer.py

index 1a339d810544f05b6c0f0b8aa99ce593f3f7e30a..4661b5ec8d72b829ddb89c5e5259fe6eca9d65dd 100644 (file)
@@ -334,9 +334,10 @@ async def get_stream_details(
         raise MediaNotFoundError(
             f"Unable to retrieve streamdetails for {queue_item.name} ({queue_item.uri})"
         )
+    buffer: AudioBuffer | None = None
     if queue_item.streamdetails and (
         (utc() - queue_item.streamdetails.created_at).seconds < STREAMDETAILS_EXPIRATION
-        or queue_item.streamdetails.buffer
+        or ((buffer := queue_item.streamdetails.buffer) and buffer.is_valid(seek_position))
     ):
         # already got a fresh/unused (or cached) streamdetails
         # we assume that the streamdetails are valid for max STREAMDETAILS_EXPIRATION seconds
index 836cd1f35cea4eec9efbbff131387d8eba8e2e9c..ace103dd3475ae0f93d300b1197e737ae5c7884c 100644 (file)
@@ -86,7 +86,7 @@ class AudioBuffer:
         """Return number of seconds of audio currently available in the buffer."""
         return len(self._chunks)
 
-    def is_valid(self, checksum: str, seek_position: int = 0) -> bool:
+    def is_valid(self, checksum: str | None = None, seek_position: int = 0) -> bool:
         """
         Validate the buffer's checksum and check if seek position is available.
 
@@ -100,7 +100,7 @@ class AudioBuffer:
         if self.cancelled:
             return False
 
-        if self.checksum != checksum:
+        if checksum is not None and self.checksum != checksum:
             return False
 
         # Check if buffer is close to inactivity timeout (within 30 seconds)