Some minor tweaks to handling prevent-playback of airplay
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 22 Feb 2026 23:56:07 +0000 (00:56 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sun, 22 Feb 2026 23:56:07 +0000 (00:56 +0100)
music_assistant/controllers/players/helpers.py
music_assistant/providers/airplay/provider.py

index beb9183d0b58d22e2cbdc87ecf916a7c0824029b..164bdabf203478e5705abc017e8d668ef8d83244 100644 (file)
@@ -92,7 +92,7 @@ def handle_player_command[PlayerControllerT: "PlayerController", **P, R](
                     kwargs["player_id"] = protocol_parent.player_id
                 else:
                     args = (protocol_parent.player_id, *args[1:])  # type: ignore[assignment]
-                self.logger.info(
+                self.logger.debug(
                     "Auto-resolved protocol player %s to linked parent %s for command %s",
                     player_id,
                     protocol_parent.player_id,
index 372087bc5fe17ee8ec8d816ee7a8c7e454729b90..2b9214aadd48d07200f6638800c69c6e6814d8a0 100644 (file)
@@ -313,18 +313,19 @@ class AirPlayProvider(PlayerProvider):
                 # Cancel any pending debounced pause since prevent-playback takes precedence
                 self.mass.cancel_timer(f"debounced_pause_{player_id}")
                 # Ignore during stream transition (stale message from old CLI process)
-                if player._transitioning:
+                if player._transitioning or not player.stream:
                     self.logger.debug("Ignoring prevent-playback during stream transition")
-                elif stream := player.stream:
-                    stream.prevent_playback = True
-                    if stream.session:
-                        # send power off which will take care of stopping the stream
-                        # and removing this player from any sync groups, etc.
+                else:
+                    player.stream.prevent_playback = True
+                    if player.stream.session:
                         self.logger.debug(
-                            "received prevent-playback from %s, powering off player",
+                            "Prevent playback command detected for player %s",
                             player.name,
                         )
-                        self.mass.create_task(self.mass.players.cmd_power(player_id, False))
+                        if player.state.synced_to or player.state.group_members:
+                            self.mass.create_task(self.mass.players.cmd_ungroup(player_id))
+                        else:
+                            self.mass.create_task(player.stream.session.stop())
             elif "device-prevent-playback=0" in path:
                 # device reports that its ready for playback again
                 if stream := player.stream: