Sonos S2: prevent flipflop of UI during track transition
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 24 Aug 2024 17:44:51 +0000 (19:44 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 24 Aug 2024 17:45:18 +0000 (19:45 +0200)
music_assistant/server/providers/sonos/__init__.py

index b61184ff9b722a412361e9c3893bcc38d959902f..9b8b92401b9fe2f2f6ea286a0f8028893fc165cb 100644 (file)
@@ -705,7 +705,7 @@ class SonosPlayerProvider(PlayerProvider):
                 },
             },
             "reports": {
-                "sendUpdateAfterMillis": 0,
+                "sendUpdateAfterMillis": 100,
                 "periodicIntervalMillis": 10000,
                 "sendPlaybackActions": True,
             },
@@ -735,17 +735,22 @@ class SonosPlayerProvider(PlayerProvider):
         json_body = await request.json()
         sonos_playback_id = request.headers["X-Sonos-Playback-Id"]
         sonos_player_id = sonos_playback_id.split(":")[0]
-        if mass_player := self.mass.players.get(sonos_player_id):
-            for item in json_body["items"]:
-                if "positionMillis" not in item:
-                    continue
-                mass_player.current_media = PlayerMedia(
-                    uri=item["mediaUrl"], queue_id=sonos_playback_id, queue_item_id=item["id"]
-                )
-                mass_player.elapsed_time = item["positionMillis"] / 1000
-                mass_player.elapsed_time_last_updated = time.time()
-                self.mass.players.update(sonos_player_id)
-                break
+        if not (mass_player := self.mass.players.get(sonos_player_id)):
+            return web.Response(status=501)
+        if not (mass_queue := self.mass.player_queues.get(mass_player.active_source)):
+            return web.Response(status=501)
+        for item in json_body["items"]:
+            if item["queueVersion"] != str(mass_queue.queue_items_last_updated):
+                continue
+            if "positionMillis" not in item:
+                continue
+            mass_player.current_media = PlayerMedia(
+                uri=item["mediaUrl"], queue_id=sonos_playback_id, queue_item_id=item["id"]
+            )
+            mass_player.elapsed_time = item["positionMillis"] / 1000
+            mass_player.elapsed_time_last_updated = time.time()
+            self.mass.players.update(sonos_player_id)
+            break
         return web.Response(status=204)