few improvements
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 11 Feb 2021 22:56:07 +0000 (23:56 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 11 Feb 2021 22:56:07 +0000 (23:56 +0100)
music_assistant/constants.py
music_assistant/helpers/compare.py
music_assistant/managers/players.py
music_assistant/models/player.py
music_assistant/providers/chromecast/__init__.py
music_assistant/providers/chromecast/player.py

index e0e2ac82223bec5e4974463041bacbb97205a608..186735fddf3b5f0f70caa7d2b45087f334eec3af 100755 (executable)
@@ -1,6 +1,6 @@
 """All constants for Music Assistant."""
 
-__version__ = "0.0.82"
+__version__ = "0.0.83"
 REQUIRED_PYTHON_VER = "3.7"
 
 # configuration keys/attributes
index fe3ae5a87f967fe553ce6e246df48426d699104c..1e357437febc9e7edc6da6e0ad76d2586309e061 100644 (file)
@@ -37,12 +37,13 @@ def compare_version(left_version: str, right_version: str):
 
 
 def compare_artists(left_artists: List[Artist], right_artists: List[Artist]):
-    """Compare two lists of artist and return True if a match was found."""
+    """Compare two lists of artist and return True if both lists match."""
+    matches = 0
     for left_artist in left_artists:
         for right_artist in right_artists:
             if compare_strings(left_artist.name, right_artist.name):
-                return True
-    return False
+                matches += 1
+    return len(left_artists) == matches
 
 
 def compare_albums(left_albums: List[Album], right_albums: List[Album]):
@@ -97,10 +98,10 @@ def compare_track(left_track: Track, right_track: Track):
     # album match OR near exact duration match
     left_albums = left_track.albums or [left_track.album]
     right_albums = right_track.albums or [right_track.album]
-    if not (
+    if (
         compare_albums(left_albums, right_albums)
-        or abs(left_track.duration - right_track.duration) <= 3
-    ):
-        return False
-    # 100% match, all criteria passed
-    return True
+        and abs(left_track.duration - right_track.duration) < 3
+    ) or abs(left_track.duration - right_track.duration) < 1:
+        # 100% match, all criteria passed
+        return True
+    return False
index a9243ce270da34439945ec262b5f8ce67c034d11..bc6a745659f3ff8897a644c76d746ec69b69b9fe 100755 (executable)
@@ -4,6 +4,7 @@ import logging
 from typing import List, Optional, Union
 
 from music_assistant.constants import (
+    CONF_ENABLED,
     CONF_POWER_CONTROL,
     CONF_VOLUME_CONTROL,
     EVENT_PLAYER_ADDED,
@@ -152,10 +153,19 @@ class PlayerManager:
             return
         if player.player_id in self._player_states:
             return await self.async_update_player(player)
-        # set the mass object on the player
+        player_enabled = self.mass.config.get_player_config(player.player_id)[
+            CONF_ENABLED
+        ]
+        if not player_enabled:
+            # do not add the player to states if it's disabled/unavailable
+            return
+        # set the mass object on the player and call on_add function
         player.mass = self.mass
+        await player.async_on_add()
         # create playerstate and queue object
-        self._player_states[player.player_id] = PlayerState(self.mass, player)
+        player_state = PlayerState(self.mass, player)
+        self._player_states[player.player_id] = player_state
+
         self._player_queues[player.player_id] = PlayerQueue(self.mass, player.player_id)
         # TODO: turn on player if it was previously turned on ?
         LOGGER.info(
index 633b41f59c7c731491796b323517c9199d3c3b4a..56c5c5e880b94e27d47caf0530ae9a0006e7fe25 100755 (executable)
@@ -150,6 +150,9 @@ class Player:
         """Call when player is periodically polled by the player manager (should_poll=True)."""
         self.update_state()
 
+    async def async_on_add(self) -> None:
+        """Call when player is added to the player manager."""
+
     async def async_on_remove(self) -> None:
         """Call when player is removed from the player manager."""
 
index e0ec075181dd79f24d4e325d5b22073910cdfbb0..f6efdc4ea91942104f46bc88af5f4a1761ecafe7 100644 (file)
@@ -93,7 +93,7 @@ class ChromecastProvider(PlayerProvider):
         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.
+        # if player was already added, the player will take care of reconnects itself.
         self.mass.add_job(player.async_set_cast_info, cast_info)
         self.mass.add_job(self.mass.players.async_add_player(player))
 
index a0e4949e4228005537b085653f33e52822bfc1db..43748c293f4fc6e95b8330f4dc361094991b2875 100644 (file)
@@ -192,9 +192,8 @@ class ChromecastPlayer(Player):
         """Return player specific config entries (if any)."""
         return PLAYER_CONFIG_ENTRIES
 
-    async def async_set_cast_info(self, cast_info: ChromecastInfo) -> None:
-        """Set the cast information and set up the chromecast object."""
-        self._cast_info = cast_info
+    async def async_on_add(self) -> None:
+        """Call when player is added to the player manager."""
         # Only setup the chromecast once, changes will automatically be picked up.
         if self._chromecast is not None:
             return
@@ -208,9 +207,9 @@ class ChromecastPlayer(Player):
             pychromecast.get_chromecast_from_service,
             (
                 self.services,
-                cast_info.uuid,
-                cast_info.model_name,
-                cast_info.friendly_name,
+                self._cast_info.uuid,
+                self._cast_info.model_name,
+                self._cast_info.friendly_name,
                 None,
                 None,
             ),
@@ -228,6 +227,10 @@ class ChromecastPlayer(Player):
         chromecast.mz_controller = mz_controller
         self._chromecast.start()
 
+    async def async_set_cast_info(self, cast_info: ChromecastInfo) -> None:
+        """Set (or update) the cast discovery info."""
+        self._cast_info = cast_info
+
     async def async_disconnect(self):
         """Disconnect Chromecast object if it is set."""
         if self._chromecast is None: