Chore: code quality changes in airplay prov
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 24 Feb 2025 17:18:05 +0000 (18:18 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Mon, 24 Feb 2025 17:18:05 +0000 (18:18 +0100)
music_assistant/providers/airplay/provider.py

index 5806ea69f65771053b730fb47073b56224c40635..29e3ac98ca59208a3b9891057a662a3c87a7a36d 100644 (file)
@@ -18,6 +18,7 @@ from music_assistant_models.enums import (
     PlayerType,
     ProviderFeature,
 )
+from music_assistant_models.errors import PlayerUnavailableError
 from music_assistant_models.media_items import AudioFormat
 from music_assistant_models.player import DeviceInfo, Player, PlayerMedia
 from zeroconf import ServiceStateChange
@@ -37,7 +38,7 @@ from music_assistant.constants import (
 )
 from music_assistant.helpers.datetime import utc
 from music_assistant.helpers.ffmpeg import get_ffmpeg_stream
-from music_assistant.helpers.util import TaskManager, get_ip_pton, lock, select_free_port
+from music_assistant.helpers.util import get_ip_pton, lock, select_free_port
 from music_assistant.models.player_provider import PlayerProvider
 from music_assistant.providers.airplay.raop import RaopStreamSession
 from music_assistant.providers.player_group import PlayerGroupProvider
@@ -295,20 +296,23 @@ class AirplayProvider(PlayerProvider):
         media: PlayerMedia,
     ) -> None:
         """Handle PLAY MEDIA on given player."""
-        player = self.mass.players.get(player_id)
-        if not player:
-            return
+        if not (player := self.mass.players.get(player_id)):
+            # this should not happen, but guard anyways
+            raise PlayerUnavailableError
         if player.synced_to:
-            # should not happen, but just in case
+            # this should not happen, but guard anyways
             raise RuntimeError("Player is synced")
+        if not (airplay_player := self._players.get(player_id)):
+            # this should not happen, but guard anyways
+            raise PlayerUnavailableError
         # set the active source for the player to the media queue
         # this accounts for syncgroups and linked players (e.g. sonos)
         player.active_source = media.queue_id
         player.current_media = media
         # always stop existing stream first
-        async with TaskManager(self.mass) as tg:
-            for airplay_player in self._get_sync_clients(player_id):
-                tg.create_task(airplay_player.cmd_stop(update_state=False))
+        if airplay_player.raop_stream and airplay_player.raop_stream.running:
+            await airplay_player.cmd_stop()
+
         # select audio source
         if media.media_type == MediaType.ANNOUNCEMENT:
             # special case: stream announcement