From: Maxim Raznatovski Date: Tue, 1 Apr 2025 14:00:43 +0000 (+0200) Subject: fix: Built-in Web Player Part 4 (#2091) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=1a7b90455f6003e5177a659ab07dda60fdecc672;p=music-assistant-server.git fix: Built-in Web Player Part 4 (#2091) * fix: add missing player update on unregister * fix: reuse the existing player on re-registers * fix: incorrect instances check * fix: keep old player object on re-register * fix: always use IDLE on re-register --- diff --git a/music_assistant/providers/builtin_player/__init__.py b/music_assistant/providers/builtin_player/__init__.py index 3f106909..bdd7a8be 100644 --- a/music_assistant/providers/builtin_player/__init__.py +++ b/music_assistant/providers/builtin_player/__init__.py @@ -284,7 +284,7 @@ class BuiltinPlayerProvider(PlayerProvider): if player_id is None: player_id = f"ma_{shortuuid.random(10).lower()}" - await self.unregister_player(player_id) + already_registered = player_id in self.instances player_features = { PlayerFeature.VOLUME_SET, @@ -293,30 +293,40 @@ class BuiltinPlayerProvider(PlayerProvider): PlayerFeature.POWER, } - self.instances[player_id] = PlayerInstance( - unregister_cbs=[ - self.mass.webserver.register_dynamic_route( - f"/builtin_player/flow/{player_id}.mp3", self._serve_audio_stream - ), - ], - last_update=time(), - ) - - player = Player( - player_id=player_id, - provider=self.instance_id, - type=PlayerType.PLAYER, - name=player_name, - available=True, - power_control=PLAYER_CONTROL_NATIVE, - powered=False, - device_info=DeviceInfo(), - supported_features=player_features, - needs_poll=True, - poll_interval=POLL_INTERVAL, - hidden_by_default=True, - expose_to_ha_by_default=False, - ) + if not already_registered: + self.instances[player_id] = PlayerInstance( + unregister_cbs=[ + self.mass.webserver.register_dynamic_route( + f"/builtin_player/flow/{player_id}.mp3", self._serve_audio_stream + ), + ], + last_update=time(), + ) + + player = self.mass.players.get(player_id) + + if player is None: + player = Player( + player_id=player_id, + provider=self.instance_id, + type=PlayerType.PLAYER, + name=player_name, + available=True, + power_control=PLAYER_CONTROL_NATIVE, + powered=False, + device_info=DeviceInfo(), + supported_features=player_features, + needs_poll=True, + poll_interval=POLL_INTERVAL, + hidden_by_default=True, + expose_to_ha_by_default=False, + state=PlayerState.IDLE, + ) + else: + player.state = PlayerState.IDLE + player.name = player_name + player.available = True + player.powered = False await self.mass.players.register_or_update(player) return player @@ -332,6 +342,7 @@ class BuiltinPlayerProvider(PlayerProvider): player.available = False player.state = PlayerState.IDLE player.powered = False + self.mass.players.update(player.player_id) async def update_player_state(self, player_id: str, state: BuiltinPlayerState) -> bool: """Update current state of a player. @@ -345,8 +356,9 @@ class BuiltinPlayerProvider(PlayerProvider): if not (player := self.mass.players.get(player_id)): return False - if not (instance := self.instances[player_id]): - raise RuntimeError("No instance found") + if player_id not in self.instances: + return False + instance = self.instances[player_id] instance.last_update = time() if not player.powered and state.powered: