async with self._player_throttlers[target_player]:
try:
await player_provider.cmd_sync_many(target_player, final_player_ids)
- finally:
+ except Exception:
# restore sync state if the command failed
parent_player.group_childs = prev_group_childs
+ raise
@api_command("players/cmd/unsync_many")
async def cmd_unsync_many(self, player_ids: list[str]) -> None:
if sync_leader.player_id == member.player_id:
# skip sync leader
continue
- if member.synced_to == sync_leader.player_id:
+ if (
+ member.synced_to == sync_leader.player_id
+ and member.player_id in sync_leader.group_childs
+ ):
# already synced
continue
members_to_sync.append(member.player_id)
player = self.mass.players.get(player_id, raise_unavailable=True)
if player.synced_to:
group_leader = self.mass.players.get(player.synced_to, raise_unavailable=True)
- group_leader.group_childs.remove(player_id)
+ if player_id in group_leader.group_childs:
+ group_leader.group_childs.remove(player_id)
player.synced_to = None
if slimclient := self.slimproto.get_player(player_id):
await slimclient.stop()