Fix player grouping (#2307)
authorMaxim Raznatovski <nda.mr43@gmail.com>
Fri, 8 Aug 2025 09:07:23 +0000 (11:07 +0200)
committerGitHub <noreply@github.com>
Fri, 8 Aug 2025 09:07:23 +0000 (11:07 +0200)
music_assistant/controllers/players.py
music_assistant/providers/airplay/player.py
music_assistant/providers/bluesound/player.py
music_assistant/providers/musiccast/player.py
music_assistant/providers/snapcast/player.py
music_assistant/providers/sonos/player.py
music_assistant/providers/sonos_s1/player.py
music_assistant/providers/squeezelite/player.py
music_assistant/providers/universal_group/player.py

index 1473e7b8f31872264d1db88f6179ba6134865983..efe09ebd033bf2da656ca62dda8f793fac2ce5b5 100644 (file)
@@ -956,7 +956,7 @@ class PlayerController(CoreController):
             # check if player can be synced/grouped with the target player
             if not (
                 child_player_id in parent_player.can_group_with
-                or child_player.provider.instance_id in parent_player.can_group_with
+                or child_player.provider.lookup_key in parent_player.can_group_with
                 or "*" in parent_player.can_group_with
             ):
                 raise UnsupportedFeaturedException(
index 868a6de0f2837aebc32f9559d4184523a7ff061b..be1eeab04e80ed69e1329b48b2be66fc91f87d48 100644 (file)
@@ -101,7 +101,7 @@ class AirPlayPlayer(Player):
             PlayerFeature.VOLUME_SET,
         }
         self._attr_volume_level = initial_volume
-        self._attr_can_group_with = {provider.instance_id}
+        self._attr_can_group_with = {provider.lookup_key}
         self._attr_enabled_by_default = not is_broken_raop_model(manufacturer, model)
 
     async def get_config_entries(self) -> list[ConfigEntry]:
index e3cf08d2995d0581935f3c79ca5d6d4479ad2718..b874c2fd22bccc56868b46d2b9f9ebc71f9efef1 100644 (file)
@@ -93,7 +93,7 @@ class BluesoundPlayer(Player):
         self._attr_available = True
         self._attr_needs_poll = True
         self._attr_poll_interval = 30
-        self._attr_can_group_with = {provider.instance_id}
+        self._attr_can_group_with = {provider.lookup_key}
 
     async def setup(self) -> None:
         """Set up the player."""
index 1a06c857c7935f28e632005c16daedc24a41f38c..6c2855f3bfeeb0efbec620cb4345a83c18371888 100644 (file)
@@ -114,7 +114,7 @@ class MusicCastPlayer(Player):
             self._attr_name = self.zone_device.zone_data.name
 
         # group
-        self._attr_can_group_with = {self.provider.instance_id}
+        self._attr_can_group_with = {self.provider.lookup_key}
 
         self._attr_available = True
 
index b4a1de5eae1ca2604e636c4e84a943ae529a06b3..b4d8175474eae3794027082ba26d192213ef9224 100644 (file)
@@ -88,7 +88,7 @@ class SnapCastPlayer(Player):
             PlayerFeature.VOLUME_MUTE,
             PlayerFeature.PLAY_ANNOUNCEMENT,
         }
-        self._attr_can_group_with = {self.provider.instance_id}
+        self._attr_can_group_with = {self.provider.lookup_key}
 
     async def volume_set(self, volume_level: int) -> None:
         """Send VOLUME_SET command to given player."""
index 9a2081c75bc9605d3870d667930ca513b610414e..a5d3631148a0f8bfa77838f528107b029d9ba3e5 100644 (file)
@@ -143,7 +143,7 @@ class SonosPlayer(Player):
         )
         self._attr_device_info.model = self.discovery_info["device"]["modelDisplayName"]
         self._attr_device_info.manufacturer = self._provider.manifest.name
-        self._attr_can_group_with = {self._provider.instance_id}
+        self._attr_can_group_with = {self._provider.lookup_key}
 
         if SonosCapability.LINE_IN in self.discovery_info["device"]["capabilities"]:
             self._attr_source_list.append(PLAYER_SOURCE_MAP[SOURCE_LINE_IN])
@@ -582,7 +582,7 @@ class SonosPlayer(Player):
                     if x.player_id != airplay_player.player_id
                 )
             else:
-                self._attr_can_group_with = {self._provider.instance_id}
+                self._attr_can_group_with = {self._provider.lookup_key}
         else:
             # player is group child (synced to another player)
             group_parent: SonosPlayer = self.mass.players.get(
index 2a070cd674547c1acc91c9463004462ffc5777dd..8debf9259bfc08f9d71cf5c90c43ace5d28fc967 100644 (file)
@@ -99,7 +99,7 @@ class SonosPlayer(Player):
             ip_address=soco.ip_address,
         )
         self._attr_available = True
-        self._attr_can_group_with = {provider.instance_id}
+        self._attr_can_group_with = {provider.lookup_key}
 
         # Cached attributes
         self.crossfade: bool = False
index df123888d9bb575ac021a49872f9c7ef2cf4c235..67a39a4a98cdb7150f24d0122d98fe45c59592e9 100644 (file)
@@ -106,7 +106,7 @@ class SqueezelitePlayer(Player):
             ip_address=client.device_address,
             manufacturer=client.device_type,
         )
-        self._attr_can_group_with = {provider.instance_id}
+        self._attr_can_group_with = {provider.lookup_key}
 
     async def setup(self) -> None:
         """Set up the player."""
index d0df12c5114b2bf784b17a29a703f8ef7f029550..ad9d29204f5b07bd5ac11d8210558a761ec195be 100644 (file)
@@ -73,9 +73,9 @@ class UniversalGroupPlayer(GroupPlayer):
         )
         # allow grouping with all providers, except the ugp provider itself
         self._attr_can_group_with = {
-            x.instance_id
+            x.lookup_key
             for x in self.mass.players.providers
-            if x.instance_id != self.provider.instance_id
+            if x.lookup_key != self.provider.lookup_key
         }
         self._set_attributes()