From: Marcel van der Veldt Date: Sat, 10 Oct 2020 10:26:20 +0000 (+0200) Subject: more agressive reconnects for chromecast X-Git-Url: https://git.kitaultman.com/?a=commitdiff_plain;h=3b4fd5ddd0e16583a268289dc4b9fd49b6aaa816;p=music-assistant-server.git more agressive reconnects for chromecast --- diff --git a/music_assistant/__main__.py b/music_assistant/__main__.py index df4b264f..d8658479 100755 --- a/music_assistant/__main__.py +++ b/music_assistant/__main__.py @@ -37,7 +37,7 @@ def main(): # setup logger logger = logging.getLogger() logformat = logging.Formatter( - "%(asctime)-15s %(levelname)-5s %(name)s.%(module)s -- %(message)s" + "%(asctime)-15s %(levelname)-5s %(name)s -- %(message)s" ) consolehandler = logging.StreamHandler() consolehandler.setFormatter(logformat) diff --git a/music_assistant/constants.py b/music_assistant/constants.py index 4681c180..738a896b 100755 --- a/music_assistant/constants.py +++ b/music_assistant/constants.py @@ -1,6 +1,6 @@ """All constants for Music Assistant.""" -__version__ = "0.0.53" +__version__ = "0.0.54" REQUIRED_PYTHON_VER = "3.7" # configuration keys/attributes diff --git a/music_assistant/managers/config.py b/music_assistant/managers/config.py index c6d58422..3e4a6b6d 100755 --- a/music_assistant/managers/config.py +++ b/music_assistant/managers/config.py @@ -43,7 +43,7 @@ from music_assistant.models.player import PlayerControlType from music_assistant.models.provider import ProviderType from passlib.hash import pbkdf2_sha256 -LOGGER = logging.getLogger("config") +LOGGER = logging.getLogger("config_manager") DEFAULT_PLAYER_CONFIG_ENTRIES = [ ConfigEntry( diff --git a/music_assistant/models/player_queue.py b/music_assistant/models/player_queue.py index 4ca5c7bd..1f2dc891 100755 --- a/music_assistant/models/player_queue.py +++ b/music_assistant/models/player_queue.py @@ -29,7 +29,7 @@ from music_assistant.models.streamdetails import StreamDetails # pylint: disable=too-many-public-methods # pylint: disable=too-few-public-methods -LOGGER = logging.getLogger("mass") +LOGGER = logging.getLogger("player_queue") class QueueOption(Enum): @@ -163,9 +163,10 @@ class PlayerQueue: Returns None if queue is empty. """ - if self.cur_index is None or not len(self.items) > self.cur_index: + cur_item = self.cur_item + if not cur_item: return None - return self.items[self.cur_index].queue_item_id + return cur_item.queue_item_id @property def cur_item(self) -> Optional[QueueItem]: @@ -174,7 +175,11 @@ class PlayerQueue: Returns None if queue is empty. """ - if self.cur_index is None or not len(self.items) > self.cur_index: + if ( + self.cur_index is None + or not self.items + or not len(self.items) > self.cur_index + ): return None return self.items[self.cur_index] diff --git a/music_assistant/models/player_state.py b/music_assistant/models/player_state.py index 10224dba..50414c7a 100755 --- a/music_assistant/models/player_state.py +++ b/music_assistant/models/player_state.py @@ -45,7 +45,7 @@ from music_assistant.models.player import ( PlayerFeature, ) -LOGGER = logging.getLogger("mass") +LOGGER = logging.getLogger("player_state") # List of all player_state attributes PLAYER_ATTRIBUTES = [ diff --git a/music_assistant/providers/chromecast/__init__.py b/music_assistant/providers/chromecast/__init__.py index 2162ec6d..f09d52ad 100644 --- a/music_assistant/providers/chromecast/__init__.py +++ b/music_assistant/providers/chromecast/__init__.py @@ -76,6 +76,7 @@ class ChromecastProvider(PlayerProvider): # pylint: disable=unused-argument if uuid is None: return # Discovered chromecast without uuid + service = self._listener.services[cast_uuid] cast_info = ChromecastInfo( services=service[0], @@ -86,15 +87,13 @@ class ChromecastProvider(PlayerProvider): port=service[5], ) player_id = cast_info.uuid - player = self.mass.players.get_player(player_id) - if player: - # player already added, the player will take care of reconnects itself. - self.mass.add_job(player.set_cast_info, cast_info) - return LOGGER.debug( "Chromecast discovered: %s (%s)", cast_info.friendly_name, player_id ) - player = ChromecastPlayer(self.mass, cast_info) + player = self.mass.players.get_player(player_id) + if not player: + player = ChromecastPlayer(self.mass, cast_info) + # if player was already added, it player will take care of reconnects itself. self.mass.add_job(player.set_cast_info, cast_info) self.mass.add_job(self.mass.players.async_add_player(player)) diff --git a/music_assistant/providers/chromecast/player.py b/music_assistant/providers/chromecast/player.py index 968de855..f2d718ff 100644 --- a/music_assistant/providers/chromecast/player.py +++ b/music_assistant/providers/chromecast/player.py @@ -192,8 +192,11 @@ class ChromecastPlayer(Player): def set_cast_info(self, cast_info: ChromecastInfo) -> None: """Set the cast information and set up the chromecast object.""" self._cast_info = cast_info - if self._chromecast and not self._chromecast.socket_client.is_connected: - self.disconnect() + if self._chromecast and not self._available: + try: + self.disconnect() + except Exception as exc: # pylint: disable=broad-except + LOGGER.exception(exc) elif self._chromecast is not None: return LOGGER.debug( @@ -222,21 +225,21 @@ class ChromecastPlayer(Player): mz_controller = MultizoneController(chromecast.uuid) chromecast.register_handler(mz_controller) chromecast.mz_controller = mz_controller - self.mass.add_job(self._chromecast.start) + self._chromecast.start() def disconnect(self) -> None: """Disconnect Chromecast object if it is set.""" + self._available = False if self._chromecast is None: return LOGGER.warning( "[%s] Disconnecting from chromecast socket", self._cast_info.friendly_name ) - self._available = False if ( self._chromecast.socket_client and not self._chromecast.socket_client.is_stopped ): - self.mass.add_job(self._chromecast.disconnect) + self._chromecast.disconnect() self._invalidate() def _invalidate(self) -> None: @@ -455,15 +458,27 @@ class ChromecastPlayer(Player): """Try to execute Chromecast command.""" def handle_command(func, *args, **kwarg): - if not self._chromecast.socket_client.is_connected: - return + if ( + not self._chromecast + or not self._chromecast.socket_client + or not self._available + ): + LOGGER.error( + "Error while executing command on player %s: Chromecast is not available!" + ) try: return func(*args, **kwargs) - except Exception as exc: # pylint: disable=broad-except + except ( + pychromecast.NotConnected, + pychromecast.ChromecastConnectionError, + ) as exc: LOGGER.error( "Error while executing command on player %s: %s", self.name, str(exc), ) + self._available = False + except Exception as exc: # pylint: disable=broad-except + LOGGER.exception(exc) self.mass.add_job(handle_command, func, *args, **kwargs) diff --git a/music_assistant/providers/mass/__init__.py b/music_assistant/providers/mass/__init__.py index e864dabc..383bcc15 100644 --- a/music_assistant/providers/mass/__init__.py +++ b/music_assistant/providers/mass/__init__.py @@ -19,7 +19,7 @@ from music_assistant.models.provider import PlayerProvider PROV_ID = "mass" PROV_NAME = "Music Assistant" -LOGGER = logging.getLogger(PROV_ID) +LOGGER = logging.getLogger("mass_provider") CONFIG_ENTRIES = [] PLAYER_CONFIG_ENTRIES = [] @@ -311,7 +311,7 @@ class WebsocketsPlayer(Player): self._muted = data["muted"] if "state" in data: self._state = PlaybackState(data["state"]) - if "cur_time" in data: + if "elapsed_time" in data: self._elapsed_time = data["elapsed_time"] if "current_uri" in data: self._current_uri = data["current_uri"]