restore state if sync failed
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 24 Oct 2024 11:19:30 +0000 (13:19 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 24 Oct 2024 11:19:30 +0000 (13:19 +0200)
music_assistant/server/controllers/players.py

index bdd9d557ec56036182cd48084cfa9d6481303b3a..fd454fe2156f0ae07a16fb74916d804b3143eacc 100644 (file)
@@ -636,6 +636,7 @@ class PlayerController(CoreController):
     async def cmd_sync_many(self, target_player: str, child_player_ids: list[str]) -> None:
         """Create temporary sync group by joining given players to target player."""
         parent_player: Player = self.get(target_player, True)
+        prev_group_childs = parent_player.group_childs.copy()
         if PlayerFeature.SYNC not in parent_player.supported_features:
             msg = f"Player {parent_player.name} does not support sync commands"
             raise UnsupportedFeaturedException(msg)
@@ -686,7 +687,11 @@ class PlayerController(CoreController):
         # forward command to the player provider after all (base) sanity checks
         player_provider = self.get_player_provider(target_player)
         async with self._player_throttlers[target_player]:
-            await player_provider.cmd_sync_many(target_player, final_player_ids)
+            try:
+                await player_provider.cmd_sync_many(target_player, final_player_ids)
+            finally:
+                # restore sync state if the command failed
+                parent_player.group_childs = prev_group_childs
 
     @api_command("players/cmd/unsync_many")
     async def cmd_unsync_many(self, player_ids: list[str]) -> None: