Enforce flow mode when player does not support enqueueing (#2595)
authorMarvin Schenkel <marvinschenkel@gmail.com>
Tue, 4 Nov 2025 22:21:18 +0000 (23:21 +0100)
committerGitHub <noreply@github.com>
Tue, 4 Nov 2025 22:21:18 +0000 (23:21 +0100)
music_assistant/controllers/player_queues.py
music_assistant/providers/sonos/player.py
music_assistant/providers/sonos/provider.py

index 6bc98534a28aea0f2cc283fb52c9106cb2280da6..46924f70779355f59fd4b961a7847b2ad7600fca 100644 (file)
@@ -814,6 +814,8 @@ class PlayerQueuesController(CoreController):
         queue.index_in_buffer = index
         queue.flow_mode_stream_log = []
         prefer_flow_mode = await self.mass.config.get_player_config_value(queue_id, CONF_FLOW_MODE)
+        target_player = self.mass.players.get(queue_id)
+        enqueue_supported = PlayerFeature.ENQUEUE in target_player.supported_features
         queue.next_item_id_enqueued = None
         # always update session id when we start a new playback session
         queue.session_id = shortuuid.random(length=8)
@@ -859,7 +861,9 @@ class PlayerQueuesController(CoreController):
                 # all attempts to find a playable item failed
                 raise MediaNotFoundError("No playable item found to start playback")
 
-            flow_mode = prefer_flow_mode and queue_item.media_type not in (
+            flow_mode = (
+                prefer_flow_mode or not enqueue_supported
+            ) and queue_item.media_type not in (
                 # don't use flow mode for duration-less streams
                 MediaType.RADIO,
                 MediaType.PLUGIN_SOURCE,
index 3bdbccae1537e417391d0f998cd9d150c8f62608..d43cb70dc23a409f24e48b2fa64f72b143961fa1 100644 (file)
@@ -59,11 +59,8 @@ if TYPE_CHECKING:
 
 SUPPORTED_FEATURES = {
     PlayerFeature.PAUSE,
-    PlayerFeature.NEXT_PREVIOUS,
     PlayerFeature.SEEK,
     PlayerFeature.SELECT_SOURCE,
-    PlayerFeature.SELECT_SOURCE,
-    PlayerFeature.ENQUEUE,
     PlayerFeature.SET_MEMBERS,
     PlayerFeature.GAPLESS_PLAYBACK,
     PlayerFeature.GAPLESS_DIFFERENT_SAMPLERATE,
@@ -148,6 +145,8 @@ class SonosPlayer(Player):
             _supported_features.add(PlayerFeature.VOLUME_MUTE)
         if not self.get_linked_airplay_player(False):
             _supported_features.add(PlayerFeature.NEXT_PREVIOUS)
+        if not self.get_linked_airplay_player(True):
+            _supported_features.add(PlayerFeature.ENQUEUE)
         self._attr_supported_features = _supported_features
 
         self._attr_name = (
index 8b28afc71b9a4e18871ffe763780c80a7992b24a..b3520d4cd697af431584b9845a59e1f6550060d9 100644 (file)
@@ -126,6 +126,9 @@ class SonosPlayerProvider(PlayerProvider):
             # edge case: we switched from airplay mode to sonos mode (or vice versa)
             # we need to make sure that playback gets stopped on the airplay player
             await airplay_player.stop()
+            # We also need to run setup again on the Sonos player to ensure the supported
+            # features are updated.
+            await sonos_player.setup()
 
     async def _setup_player(self, player_id: str, name: str, info: AsyncServiceInfo) -> None:
         """Handle setup of a new player that is discovered using mdns."""