Fix sync group toggle (#3142)
authorOzGav <gavnosp@hotmail.com>
Thu, 12 Feb 2026 07:24:36 +0000 (17:24 +1000)
committerGitHub <noreply@github.com>
Thu, 12 Feb 2026 07:24:36 +0000 (08:24 +0100)
* Fix dynamic sync group toggle having no effect on member checkboxes

PR #3118 made _attr_static_group_members unconditionally populated for
both dynamic and static groups. Since the frontend uses
static_group_members to determine which players are non-removable
(greyed out, no checkbox), this caused all members to appear locked
regardless of the dynamic toggle setting.

Restore the conditional assignment: dynamic groups get an empty
static_group_members list (all members removable), static groups get
the configured members list (all members locked). Fix the power-off
reset to read configured members directly from config instead of
_attr_static_group_members, so dynamic groups preserve their member
list on power-off without needing them marked as static.

https://claude.ai/code/session_01VVeBMzkvqTrutpg53aMtBY

* Remove added comments

https://claude.ai/code/session_01VVeBMzkvqTrutpg53aMtBY

---------

Co-authored-by: Claude <noreply@anthropic.com>
music_assistant/controllers/players/sync_groups.py

index aaac3ed90aa5e41858de9e138d4098c4f49c25e0..7ded94d51f3466dafcf7083893502a280a0cac71 100644 (file)
@@ -103,10 +103,11 @@ class SyncGroupPlayer(GroupPlayer):
         # Config is only available after the player was registered
         self._cache.clear()  # clear to prevent loading old is_dynamic
         static_members = cast("list[str]", self.config.get_value(CONF_GROUP_MEMBERS, []))
-        self._attr_static_group_members = static_members.copy()
         if self.is_dynamic:
+            self._attr_static_group_members = []
             self._attr_supported_features.add(PlayerFeature.SET_MEMBERS)
         else:
+            self._attr_static_group_members = static_members.copy()
             self._attr_supported_features.discard(PlayerFeature.SET_MEMBERS)
         if not self.powered:
             self._attr_group_members = static_members.copy()
@@ -300,10 +301,8 @@ class SyncGroupPlayer(GroupPlayer):
                     await self.mass.players._handle_cmd_power(member.player_id, False)
 
         if not powered:
-            # Reset to unfiltered static members list when powered off
-            # (the frontend will hide unavailable members)
-            self._attr_group_members = self._attr_static_group_members.copy()
-            # and clear the sync leader
+            configured_members = cast("list[str]", self.config.get_value(CONF_GROUP_MEMBERS, []))
+            self._attr_group_members = configured_members.copy()
             self.sync_leader = None
         self.update_state()