Fix Sonos looping announcements (#3032)
authorMarvin Schenkel <marvinschenkel@gmail.com>
Tue, 27 Jan 2026 14:42:39 +0000 (15:42 +0100)
committerGitHub <noreply@github.com>
Tue, 27 Jan 2026 14:42:39 +0000 (15:42 +0100)
Fix Sonos looping announcements.

music_assistant/providers/sonos/player.py

index 4417fc6c7ab8f9b2f89cb8da8acf8ef82b59a902..c92563071c1ff4087004480bde9061595a4fbefe 100644 (file)
@@ -386,6 +386,23 @@ class SonosPlayer(Player):
         if media.source_id:
             await self._set_sonos_queue_from_mass_queue(media.source_id)
 
+        if media.media_type == MediaType.ANNOUNCEMENT:
+            # We cannot use play_stream_url for announcements because Sonos treats those
+            # as duration less radio streams and will retry/loop them.
+            if not media.duration and media.custom_data:
+                announcement_url = media.custom_data.get("announcement_url", media.uri)
+                media_info = await async_parse_tags(announcement_url, require_duration=True)
+                media.duration = media_info.duration
+            media.queue_item_id = "announcement"
+            self.sonos_queue.items = [media]
+            self.sonos_queue.last_updated = time.time()
+            cloud_queue_url = f"{self.mass.streams.base_url}/sonos_queue/v2.3/"
+            await self.client.player.group.play_cloud_queue(
+                cloud_queue_url,
+                item_id=media.queue_item_id,
+            )
+            return
+
         if (
             not self.flow_mode and media.source_id and media.queue_item_id
         ) or media.media_type == MediaType.PLUGIN_SOURCE: