Update chromecast.py
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 28 Aug 2019 07:21:39 +0000 (09:21 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 28 Aug 2019 07:21:39 +0000 (09:21 +0200)
music_assistant/modules/playerproviders/chromecast.py

index 80eca0739ced8ceee8e6ea10c365dbd9473ed5c6..e2b9074c10e877724d4b09390f5297b306bfa3fd 100644 (file)
@@ -66,55 +66,54 @@ class ChromecastProvider(PlayerProvider):
 
     async def player_command(self, player_id, cmd:str, cmd_args=None):
         ''' issue command on player (play, pause, next, previous, stop, power, volume, mute) '''
-        if not player_id in self._players or not player_id in self._chromecasts:
-            return
-        try:
-            if cmd == 'play':
-                self._players[player_id].powered = True
-                if self._chromecasts[player_id].media_controller.status.player_is_playing:
-                    pass
-                elif self._chromecasts[player_id].media_controller.status.player_is_paused:
-                    self._chromecasts[player_id].media_controller.play()
-                else:
-                    await self.__resume_queue(player_id)
-                await self.mass.player.update_player(self._players[player_id])
-            elif cmd == 'pause':
-                self._chromecasts[player_id].media_controller.pause()
-            elif cmd == 'stop':
-                self._chromecasts[player_id].media_controller.stop()
-            elif cmd == 'next':
-                enable_crossfade = self.mass.config['player_settings'][player_id]["crossfade_duration"] > 0
-                if enable_crossfade:
-                    await self.__play_stream_queue(player_id, self._player_queue_index[player_id]+1)
-                else:
-                    self._chromecasts[player_id].media_controller.queue_next()
-            elif cmd == 'previous':
-                enable_crossfade = self.mass.config['player_settings'][player_id]["crossfade_duration"] > 0
-                if enable_crossfade:
-                    await self.__play_stream_queue(player_id, self._player_queue_index[player_id]-1)
-                else:
-                    self._chromecasts[player_id].media_controller.queue_prev()
-            elif cmd == 'power' and cmd_args == 'off':
-                self._players[player_id].powered = False
-                if not self._players[player_id].group_parent:
-                    self._chromecasts[player_id].quit_app() # power is not supported so send quit_app instead
-                await self.mass.player.update_player(self._players[player_id])
-            elif cmd == 'power':
-                self._players[player_id].powered = True
-                await self.mass.player.update_player(self._players[player_id])
-            elif cmd == 'volume':
-                new_volume = try_parse_int(cmd_args)
-                self._chromecasts[player_id].set_volume(new_volume/100)
-                self._players[player_id].volume_level = new_volume
-                await self.mass.player.update_player(self._players[player_id])
-            elif cmd == 'mute' and cmd_args == 'off':
-                self._chromecasts[player_id].set_volume_muted(False)
-            elif cmd == 'mute':
-                self._chromecasts[player_id].set_volume_muted(True)
-        except pychromecast.error.NotConnected:
-            # CC is not connected, trigger rescan
+        if (not player_id in self._chromecasts or 
+                not self._chromecasts[player_id].socket_client or 
+                not self._chromecasts[player_id].socket_client.is_connected):
             LOGGER.warning("command %s failed - %s is disconnected, rescan triggered" %(cmd, self._players[player_id].name))
             self.mass.event_loop.create_task(self.__chromecast_discovery())
+            return
+        if cmd == 'play':
+            self._players[player_id].powered = True
+            if self._chromecasts[player_id].media_controller.status.player_is_playing:
+                pass
+            elif self._chromecasts[player_id].media_controller.status.player_is_paused:
+                self._chromecasts[player_id].media_controller.play()
+            else:
+                await self.__resume_queue(player_id)
+            await self.mass.player.update_player(self._players[player_id])
+        elif cmd == 'pause':
+            self._chromecasts[player_id].media_controller.pause()
+        elif cmd == 'stop':
+            self._chromecasts[player_id].media_controller.stop()
+        elif cmd == 'next':
+            enable_crossfade = self.mass.config['player_settings'][player_id]["crossfade_duration"] > 0
+            if enable_crossfade:
+                await self.__play_stream_queue(player_id, self._player_queue_index[player_id]+1)
+            else:
+                self._chromecasts[player_id].media_controller.queue_next()
+        elif cmd == 'previous':
+            enable_crossfade = self.mass.config['player_settings'][player_id]["crossfade_duration"] > 0
+            if enable_crossfade:
+                await self.__play_stream_queue(player_id, self._player_queue_index[player_id]-1)
+            else:
+                self._chromecasts[player_id].media_controller.queue_prev()
+        elif cmd == 'power' and cmd_args == 'off':
+            self._players[player_id].powered = False
+            if not self._players[player_id].group_parent:
+                self._chromecasts[player_id].quit_app() # power is not supported so send quit_app instead
+            await self.mass.player.update_player(self._players[player_id])
+        elif cmd == 'power':
+            self._players[player_id].powered = True
+            await self.mass.player.update_player(self._players[player_id])
+        elif cmd == 'volume':
+            new_volume = try_parse_int(cmd_args)
+            self._chromecasts[player_id].set_volume(new_volume/100)
+            self._players[player_id].volume_level = new_volume
+            await self.mass.player.update_player(self._players[player_id])
+        elif cmd == 'mute' and cmd_args == 'off':
+            self._chromecasts[player_id].set_volume_muted(False)
+        elif cmd == 'mute':
+            self._chromecasts[player_id].set_volume_muted(True)
 
     async def player_queue(self, player_id, offset=0, limit=50):
         ''' return the current items in the player's queue '''
@@ -128,6 +127,13 @@ class ChromecastProvider(PlayerProvider):
         ''' 
             play media on a player
         '''
+        if (not player_id in self._chromecasts or 
+                not self._chromecasts[player_id].socket_client or 
+                not self._chromecasts[player_id].socket_client.is_connected):
+            LOGGER.warning("command %s failed - %s is disconnected, rescan triggered" %(cmd, self._players[player_id].name))
+            self.mass.event_loop.create_task(self.__chromecast_discovery())
+            return
+            
         castplayer = self._chromecasts[player_id]
         cur_queue_index = self._player_queue_index.get(player_id, 0)
         enable_crossfade = self.mass.config['player_settings'][player_id]["crossfade_duration"] > 0