Fix empty players list in config (#1062)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 3 Feb 2024 17:59:43 +0000 (18:59 +0100)
committerGitHub <noreply@github.com>
Sat, 3 Feb 2024 17:59:43 +0000 (18:59 +0100)
ensure instance id for player provider

music_assistant/server/controllers/config.py
music_assistant/server/controllers/players.py
music_assistant/server/providers/airplay/__init__.py
music_assistant/server/providers/chromecast/__init__.py
music_assistant/server/providers/dlna/__init__.py
music_assistant/server/providers/slimproto/__init__.py
music_assistant/server/providers/snapcast/__init__.py
music_assistant/server/providers/sonos/__init__.py
music_assistant/server/providers/sonos/player.py

index dc7b26c02bf61b6a55fe46a9a239eae6441271ae..8b21c74b9206b835ad33cfac2910217d4c6d71b5 100644 (file)
@@ -71,15 +71,6 @@ class ConfigController:
         """Async initialize of controller."""
         await self._load()
         self.initialized = True
-        #### temp fix issue introduced in b89 ##########
-        # TODO: remove after b92
-        final_player_configs = {}
-        for player_id, player_conf in self.get(CONF_PLAYERS, {}).items():
-            if "provider" in player_conf:
-                final_player_configs[player_id] = player_conf
-        self.set(CONF_PLAYERS, final_player_configs)
-        #### end of temp fix ############################
-
         # create default server ID if needed (also used for encrypting passwords)
         self.set_default(CONF_SERVER_ID, uuid4().hex)
         server_id: str = self.get(CONF_SERVER_ID)
@@ -88,7 +79,6 @@ class ConfigController:
         self._fernet = Fernet(fernet_key)
         config_entries.ENCRYPT_CALLBACK = self.encrypt_string
         config_entries.DECRYPT_CALLBACK = self.decrypt_string
-
         LOGGER.debug("Started.")
 
     async def close(self) -> None:
@@ -322,11 +312,13 @@ class ConfigController:
     async def get_player_configs(self, provider: str | None = None) -> list[PlayerConfig]:
         """Return all known player configurations, optionally filtered by provider domain."""
         available_providers = {x.instance_id for x in self.mass.providers}
+        # add both domain and instance id
+        available_providers.update({x.domain for x in self.mass.providers})
         return [
-            await self.get_player_config(player_id)
-            for player_id, raw_conf in self.get(CONF_PLAYERS, {}).items()
+            await self.get_player_config(raw_conf["player_id"])
+            for raw_conf in list(self.get(CONF_PLAYERS, {}).values())
             # filter out unavailable providers
-            if raw_conf["provider"] in available_providers
+            if self.mass.get_provider(raw_conf["provider"])
             # optional provider filter
             and (provider in (None, raw_conf["provider"]))
         ]
index aa30cb58aef2a9f2af57cd12148519887c87292b..7feb2088c8726079134dd70d82d205fccdbc760a 100755 (executable)
@@ -719,7 +719,7 @@ class PlayerController(CoreController):
             return await player_prov.create_group(name, members=members)
         if ProviderFeature.SYNC_PLAYERS in player_prov.supported_features:
             # default syncgroup implementation
-            return await self._create_syncgroup(provider, name, members)
+            return await self._create_syncgroup(player_prov.instance_id, name, members)
         raise UnsupportedFeaturedException(
             f"Provider {player_prov.name} does not support creating groups"
         )
index 10eca9ff92c925ef9f3a181ff8d91f1d50d31102..5d2701f333a42d13e3c56e29aec971974864d719 100644 (file)
@@ -284,7 +284,7 @@ class AirplayProvider(PlayerProvider):
     async def _handle_player_register_callback(self, player: Player) -> None:
         """Handle player register callback from slimproto source player."""
         # TODO: Can we get better device info from mDNS ?
-        player.provider = self.domain
+        player.provider = self.instance_id
         player.device_info = DeviceInfo(
             model="Airplay device",
             address=player.device_info.address,
index 1bb7e826bce17ef1b8cf9b4d4d8ad2dc4e346990..491e8aaae8e2431295cc6c46dd16c4fafd289bfe 100644 (file)
@@ -426,7 +426,7 @@ class ChromecastProvider(PlayerProvider):
                 ),
                 player=Player(
                     player_id=player_id,
-                    provider=self.domain,
+                    provider=self.instance_id,
                     type=PlayerType.GROUP if cast_info.is_audio_group else PlayerType.PLAYER,
                     name=cast_info.friendly_name,
                     available=False,
index 53efeb7a52e66b78cf8b88e4bf38f0e4af7f597c..ced3fc2c34e7487312866723808dcc33ec4f4bcf 100644 (file)
@@ -584,7 +584,7 @@ class DLNAPlayerProvider(PlayerProvider):
                     udn=udn,
                     player=Player(
                         player_id=udn,
-                        provider=self.domain,
+                        provider=self.instance_id,
                         type=PlayerType.PLAYER,
                         name=udn,
                         available=False,
index 482187944662cc4e72675afdd691d6d4410558e5..e3b65d97e4198acf2da0646ed2d02622290ec3f4 100644 (file)
@@ -614,7 +614,7 @@ class SlimprotoProvider(PlayerProvider):
             # player does not yet exist, create it
             player = Player(
                 player_id=player_id,
-                provider=self.domain,
+                provider=self.instance_id,
                 type=PlayerType.PLAYER,
                 name=client.name,
                 available=True,
index fcd2f31aff60bf9436454ca036f4c87c186ee905..489692d50c09e2b4474e54a76d6718bcbc611955 100644 (file)
@@ -150,7 +150,7 @@ class SnapCastProvider(PlayerProvider):
             snap_client = cast(Snapclient, self._snapserver.client(player_id))
             player = Player(
                 player_id=player_id,
-                provider=self.domain,
+                provider=self.instance_id,
                 type=PlayerType.PLAYER,
                 name=snap_client.friendly_name,
                 available=True,
index 341d48475a064f159e61a0c59e66106581c4eac0..5fa2aa6cb31ba13d2d9f1745c0d0c5d2d32b659c 100644 (file)
@@ -505,7 +505,7 @@ class SonosPlayerProvider(PlayerProvider):
         if not (mass_player := self.mass.players.get(soco.uid)):
             mass_player = Player(
                 player_id=soco.uid,
-                provider=self.domain,
+                provider=self.instance_id,
                 type=PlayerType.PLAYER,
                 name=soco.player_name,
                 available=True,
index fb9aea0ed894f878538867b967cb62c2836b0596..2a1b2893fefeac3c6b9b0566ebd1668073b6441c 100644 (file)
@@ -115,7 +115,7 @@ class SonosPlayer:
         self.mass = sonos_prov.mass
         self.player_id = soco.uid
         self.soco = soco
-        self.logger = sonos_prov.logger.getChild(soco.uid)
+        self.logger = sonos_prov.logger
         self.household_id: str = soco.household_id
         self.subscriptions: list[SubscriptionBase] = []
         self.websocket: SonosWebsocket | None = None