Add some additional guard for unavailable players
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 27 Mar 2023 05:55:38 +0000 (07:55 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 27 Mar 2023 05:55:38 +0000 (07:55 +0200)
music_assistant/server/controllers/config.py
music_assistant/server/controllers/players.py

index c3e0abde49e855d21389a2f3ce334585661f9db0..e49a6da1763a8b907f2a21aa03405fe5d9455ba5 100644 (file)
@@ -263,9 +263,7 @@ class ConfigController:
         """Return single configentry value for a player."""
         conf = self.get(f"{CONF_PLAYERS}/{player_id}")
         if not conf:
-            player = self.mass.players.get(player_id)
-            if not player:
-                raise PlayerUnavailableError(f"Player {player_id} is not available")
+            player = self.mass.players.get(player_id, True)
             conf = {"provider": player.provider, "player_id": player_id, "values": {}}
         prov = self.mass.get_provider(conf["provider"])
         entries = DEFAULT_PLAYER_CONFIG_ENTRIES + prov.get_player_config_entries(player_id)
index 27f9044bc19b98e35dbbbaec2c6fa76539507ece..4e81031f9272a7bc7c7b08b5c69ef0713bde5504 100755 (executable)
@@ -2,7 +2,6 @@
 from __future__ import annotations
 
 import asyncio
-import contextlib
 import logging
 from collections.abc import Iterator
 from typing import TYPE_CHECKING, cast
@@ -82,13 +81,15 @@ class PlayerController:
         self,
         player_id: str,
         raise_unavailable: bool = False,
-    ) -> Player:
+    ) -> Player | None:
         """Return Player by player_id."""
         if player := self._players.get(player_id):
             if (not player.available or not player.enabled) and raise_unavailable:
                 raise PlayerUnavailableError(f"Player {player_id} is not available")
             return player
-        raise PlayerUnavailableError(f"Player {player_id} is not available")
+        if raise_unavailable:
+            raise PlayerUnavailableError(f"Player {player_id} is not available")
+        return None
 
     @api_command("players/get_by_name")
     def get_by_name(self, name: str) -> Player | None:
@@ -255,7 +256,7 @@ class PlayerController:
         await player_provider.cmd_pause(player_id)
 
         async def _watch_pause(_player_id: str) -> None:
-            player = self.get(_player_id)
+            player = self.get(_player_id, True)
             count = 0
             # wait for pause
             while count < 5 and player.state == PlayerState.PLAYING:
@@ -504,16 +505,15 @@ class PlayerController:
             # it is the master in a sync group and thus always present as child player
             child_players.append(player)
         for child_id in player.group_childs:
-            with contextlib.suppress(PlayerUnavailableError):
-                if child_player := self.get(child_id):
-                    if not (not only_powered or child_player.powered):
-                        continue
-                    if not (
-                        not only_playing
-                        or child_player.state in (PlayerState.PLAYING, PlayerState.PAUSED)
-                    ):
-                        continue
-                    child_players.append(child_player)
+            if child_player := self.get(child_id, False):
+                if not (not only_powered or child_player.powered):
+                    continue
+                if not (
+                    not only_playing
+                    or child_player.state in (PlayerState.PLAYING, PlayerState.PAUSED)
+                ):
+                    continue
+                child_players.append(child_player)
         return child_players
 
     async def _poll_players(self) -> None: