From: Marvin Schenkel Date: Tue, 4 Nov 2025 22:21:18 +0000 (+0100) Subject: Enforce flow mode when player does not support enqueueing (#2595) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=a24c5c082d6f031d1d44df469feae69c9de9a4d7;p=music-assistant-server.git Enforce flow mode when player does not support enqueueing (#2595) --- diff --git a/music_assistant/controllers/player_queues.py b/music_assistant/controllers/player_queues.py index 6bc98534..46924f70 100644 --- a/music_assistant/controllers/player_queues.py +++ b/music_assistant/controllers/player_queues.py @@ -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, diff --git a/music_assistant/providers/sonos/player.py b/music_assistant/providers/sonos/player.py index 3bdbccae..d43cb70d 100644 --- a/music_assistant/providers/sonos/player.py +++ b/music_assistant/providers/sonos/player.py @@ -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 = ( diff --git a/music_assistant/providers/sonos/provider.py b/music_assistant/providers/sonos/provider.py index 8b28afc7..b3520d4c 100644 --- a/music_assistant/providers/sonos/provider.py +++ b/music_assistant/providers/sonos/provider.py @@ -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."""