more agressive reconnects for chromecast
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 10 Oct 2020 10:26:20 +0000 (12:26 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 10 Oct 2020 10:26:20 +0000 (12:26 +0200)
music_assistant/__main__.py
music_assistant/constants.py
music_assistant/managers/config.py
music_assistant/models/player_queue.py
music_assistant/models/player_state.py
music_assistant/providers/chromecast/__init__.py
music_assistant/providers/chromecast/player.py
music_assistant/providers/mass/__init__.py

index df4b264ffe75fca131aeceecb6e7695502e40651..d8658479a8b39d32fc3c5ab04fdf6eb9e3b93499 100755 (executable)
@@ -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)
index 4681c18038caabb1a8ac9b985a59ce75e12960ed..738a896b9b20f89d97d6ea599948bc52e980edb6 100755 (executable)
@@ -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
index c6d58422f4e0c42764452d370c021155de63bb23..3e4a6b6d70500086583e5ba6356ebab8cdd95996 100755 (executable)
@@ -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(
index 4ca5c7bd72b14efcb0baf5975298c1a3e17f3a4c..1f2dc891f08a3ae5ec41719f44d66f347d9c00fd 100755 (executable)
@@ -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]
 
index 10224dbac615dba44ca8e5693a8f83941432921c..50414c7abbb59d439f168c9011b464e2c0d7874e 100755 (executable)
@@ -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 = [
index 2162ec6dc0f41a4c906d67dd054a721f45e163a5..f09d52ad5c8bf2cf0a26c9667cc0e8e39631704d 100644 (file)
@@ -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))
 
index 968de855b19d53de7a051c702a9b3b6a414293da..f2d718fff8128912f3572665c5efc4a999e8137f 100644 (file)
@@ -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)
index e864dabc84fad56be69b031763a18862ade8c226..383bcc15e79b39d10728a92fc12bc67195b20c19 100644 (file)
@@ -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"]