From: OzGav Date: Thu, 12 Feb 2026 07:24:36 +0000 (+1000) Subject: Fix sync group toggle (#3142) X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=337cb5443a603181c301927d523e5e515dc756f0;p=music-assistant-server.git Fix sync group toggle (#3142) * 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 --- diff --git a/music_assistant/controllers/players/sync_groups.py b/music_assistant/controllers/players/sync_groups.py index aaac3ed9..7ded94d5 100644 --- a/music_assistant/controllers/players/sync_groups.py +++ b/music_assistant/controllers/players/sync_groups.py @@ -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()