Playback/enqueue fixes (#1355)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 13 Jun 2024 12:48:27 +0000 (14:48 +0200)
committerGitHub <noreply@github.com>
Thu, 13 Jun 2024 12:48:27 +0000 (14:48 +0200)
* Fix playback state on Fully Kiosk players

* tweaks

music_assistant/server/controllers/players.py
music_assistant/server/controllers/streams.py
music_assistant/server/providers/fully_kiosk/__init__.py

index bd545df6a2043f426c3a035164d74cdaeb8377a2..5d739d092338d71383e37002a619cab223657125 100644 (file)
@@ -15,7 +15,6 @@ from music_assistant.common.models.config_entries import (
     CONF_ENTRY_ANNOUNCE_VOLUME_STRATEGY,
     CONF_ENTRY_PLAYER_ICON,
     CONF_ENTRY_PLAYER_ICON_GROUP,
-    CONF_ENTRY_TTS_PRE_ANNOUNCE,
 )
 from music_assistant.common.models.enums import (
     EventType,
@@ -40,6 +39,7 @@ from music_assistant.constants import (
     CONF_GROUP_MEMBERS,
     CONF_HIDE_PLAYER,
     CONF_PLAYERS,
+    CONF_TTS_PRE_ANNOUNCE,
     SYNCGROUP_PREFIX,
 )
 from music_assistant.server.helpers.api import api_command
@@ -168,6 +168,12 @@ class PlayerController(CoreController):
 
         - player_id: player_id of the player to handle the command.
         """
+        player = self.get(player_id, True)
+        # Always prefer queue controller's stop (as it also handles some other logic)
+        if player.active_source == player_id:
+            await self.mass.player_queues.stop(player_id)
+            return
+        # if the player doesn't have our queue controller active, forward the stop command
         player_id = self._check_redirect(player_id)
         if player_provider := self.get_player_provider(player_id):
             await player_provider.cmd_stop(player_id)
@@ -179,6 +185,12 @@ class PlayerController(CoreController):
 
         - player_id: player_id of the player to handle the command.
         """
+        player = self.get(player_id, True)
+        # Always prefer queue controller's play (as it also handles some other logic)
+        if player.active_source == player_id:
+            await self.mass.player_queues.play(player_id)
+            return
+        # if the player doesn't have our queue controller active, forward the stop command
         player_id = self._check_redirect(player_id)
         player_provider = self.get_player_provider(player_id)
         await player_provider.cmd_play(player_id)
@@ -190,6 +202,11 @@ class PlayerController(CoreController):
 
         - player_id: player_id of the player to handle the command.
         """
+        player = self.get(player_id, True)
+        # Always prefer queue controller's pause (as it also handles some other logic)
+        if player.active_source == player_id:
+            await self.mass.player_queues.pause(player_id)
+            return
         player_id = self._check_redirect(player_id)
         player = self.get(player_id, True)
         if PlayerFeature.PAUSE not in player.supported_features:
@@ -493,10 +510,9 @@ class PlayerController(CoreController):
                     return
             # determine pre-announce from (group)player config
             if use_pre_announce is None and "tts" in url:
-                use_pre_announce = self.mass.config.get_raw_player_config_value(
+                use_pre_announce = await self.mass.config.get_player_config_value(
                     player_id,
-                    CONF_ENTRY_TTS_PRE_ANNOUNCE.key,
-                    CONF_ENTRY_TTS_PRE_ANNOUNCE.default_value,
+                    CONF_TTS_PRE_ANNOUNCE,
                 )
             self.logger.info(
                 "Playback announcement to player %s (with pre-announce: %s): %s",
index b7a97ecf916aa7100c1846abf676abb80b227d89..33451e268a735988e6d34ae6c6959d9d8540ab83 100644 (file)
@@ -495,8 +495,8 @@ class StreamsController(CoreController):
         last_fadeout_part = b""
         queue.flow_mode = True
         queue.stream_finished = False
-        use_crossfade = self.mass.config.get_raw_player_config_value(
-            queue.queue_id, CONF_CROSSFADE, False
+        use_crossfade = await self.mass.config.get_player_config_value(
+            queue.queue_id, CONF_CROSSFADE
         )
         if start_queue_item.media_type != MediaType.TRACK:
             use_crossfade = False
@@ -540,8 +540,8 @@ class StreamsController(CoreController):
 
             # set some basic vars
             pcm_sample_size = int(pcm_format.sample_rate * (pcm_format.bit_depth / 8) * 2)
-            crossfade_duration = self.mass.config.get_raw_player_config_value(
-                queue.queue_id, CONF_CROSSFADE_DURATION, 8
+            crossfade_duration = await self.mass.config.get_player_config_value(
+                queue.queue_id, CONF_CROSSFADE_DURATION
             )
             crossfade_size = int(pcm_sample_size * crossfade_duration)
             bytes_written = 0
index 3f6605cd91dc86addbb351590e1b18b2993331ed..575b1dbc0f30c5c8b75eb6962ab98eeeed8d2715 100644 (file)
@@ -70,7 +70,7 @@ async def get_config_entries(
         ),
         ConfigEntry(
             key=CONF_PASSWORD,
-            type=ConfigEntryType.STRING,
+            type=ConfigEntryType.SECURE_STRING,
             label="Password to use to connect to the Fully Kiosk API.",
             required=True,
         ),
@@ -149,7 +149,10 @@ class FullyKioskProvider(PlayerProvider):
                 volume = volume_dict[str(AUDIOMANAGER_STREAM_MUSIC)]
                 player.volume_level = volume
                 break
-        player.current_item_id = self._fully.deviceInfo.get("soundUrlPlaying")
+        current_url = self._fully.deviceInfo.get("soundUrlPlaying")
+        player.current_item_id = current_url
+        if not current_url:
+            player.state = PlayerState.IDLE
         player.available = True
         self.mass.players.update(player_id)