fix playerstate
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 18 Sep 2020 23:01:04 +0000 (01:01 +0200)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 18 Sep 2020 23:01:04 +0000 (01:01 +0200)
music_assistant/models/player_queue.py
music_assistant/player_manager.py
music_assistant/providers/squeezebox/socket_client.py

index da642fd4888b6e2942b0274f735d6f49f1ab5fed..c9b9a495901104cf3de6e2b7ae52fd02e78ce055 100755 (executable)
@@ -54,10 +54,10 @@ class QueueItem(Track):
 class PlayerQueue:
     """Class that holds the queue items for a player."""
 
-    def __init__(self, mass, player_id):
+    def __init__(self, mass, player):
         """Initialize class."""
         self.mass = mass
-        self.player_id = player_id
+        self._player = player
         self._items = []
         self._shuffle_enabled = False
         self._repeat_enabled = False
@@ -78,7 +78,12 @@ class PlayerQueue:
     @property
     def player(self):
         """Return handle to player."""
-        return self.mass.player_manager.get_player(self.player_id)
+        return self._player
+
+    @property
+    def player_id(self):
+        """Return handle to player."""
+        return self._player.player_id
 
     @property
     def shuffle_enabled(self):
index 0986f5d0ace28a50c2b41c344770a277ee279d8b..119b17b762c5e16cacd4484d7fd2e044749f814f 100755 (executable)
@@ -140,16 +140,14 @@ class PlayerManager:
 
     async def async_add_player(self, player: Player) -> None:
         """Register a new player or update an existing one."""
-        if not player:
+        if not player or not player.available:
             return
         is_new_player = player.player_id not in self._players
         await self.__async_create_player_state(player)
         if is_new_player:
             # create player queue
             if player.player_id not in self._player_queues:
-                self._player_queues[player.player_id] = PlayerQueue(
-                    self.mass, player.player_id
-                )
+                self._player_queues[player.player_id] = PlayerQueue(self.mass, player)
             # TODO: turn on player if it was previously turned on ?
             LOGGER.info(
                 "New player added: %s/%s",
@@ -161,6 +159,7 @@ class PlayerManager:
     async def async_remove_player(self, player_id: str):
         """Remove a player from the registry."""
         self._players.pop(player_id, None)
+        self._player_queues.pop(player_id, None)
         self._org_players.pop(player_id, None)
         LOGGER.info("Player removed: %s", player_id)
         self.mass.signal_event(EVENT_PLAYER_REMOVED, {"player_id": player_id})
@@ -703,9 +702,9 @@ class PlayerManager:
         if powered and active_parent != player.player_id:
             # use group state
             return self._players[active_parent].state
-        if player.state == PlayerState.Stopped and not powered:
+        if PlayerState(player.state) == PlayerState.Stopped and not powered:
             return PlayerState.Off
-        return player.state
+        return PlayerState(player.state)
 
     @callback
     @classmethod
index 89c3b5c6794e67667ffe955bbc1f542075c3c0e1..c0053044717e5e3b9701159d9b9c872c97be183a 100644 (file)
@@ -8,6 +8,7 @@ import time
 from enum import Enum
 from typing import Awaitable
 
+from music_assistant.models.player import PlayerState
 from music_assistant.utils import callback, run_periodic
 
 from .constants import PROV_ID
@@ -30,14 +31,6 @@ DEVICE_TYPE = {
 }
 
 
-class State(str, Enum):
-    """Enum for the playstate of a squeezebox player."""
-
-    Stopped = "stopped"
-    Paused = "paused"
-    Playing = "playing"
-
-
 class Event(Enum):
     """Enum with the various events the socket client fires."""
 
@@ -70,7 +63,7 @@ class SqueezeSocketClient:
         self._volume_level = 0
         self._powered = False
         self._muted = False
-        self._state = State.Stopped
+        self._state = PlayerState.Stopped
         self._elapsed_time = 0
         self._current_uri = ""
         self._tasks = [
@@ -356,7 +349,7 @@ class SqueezeSocketClient:
         """Process incoming stat STMf message (connection closed)."""
         # pylint: disable=unused-argument
         LOGGER.debug("STMf received - connection closed.")
-        self._state = State.Stopped
+        self._state = PlayerState.Stopped
         asyncio.create_task(self._event_callback(Event.EVENT_UPDATED, self))
 
     @callback
@@ -376,7 +369,7 @@ class SqueezeSocketClient:
         """Process incoming stat STMp message: Pause confirmed."""
         # pylint: disable=unused-argument
         LOGGER.debug("STMp received - pause confirmed.")
-        self._state = State.Paused
+        self._state = PlayerState.Paused
         asyncio.create_task(self._event_callback(Event.EVENT_UPDATED, self))
 
     @callback
@@ -384,7 +377,7 @@ class SqueezeSocketClient:
         """Process incoming stat STMr message: Resume confirmed."""
         # pylint: disable=unused-argument
         LOGGER.debug("STMr received - resume confirmed.")
-        self._state = State.Playing
+        self._state = PlayerState.Playing
         asyncio.create_task(self._event_callback(Event.EVENT_UPDATED, self))
 
     @callback
@@ -392,7 +385,7 @@ class SqueezeSocketClient:
         # pylint: disable=unused-argument
         """Process incoming stat STMs message: Playback of new track has started."""
         LOGGER.debug("STMs received - playback of new track has started.")
-        self._state = State.Playing
+        self._state = PlayerState.Playing
         asyncio.create_task(self._event_callback(Event.EVENT_UPDATED, self))
 
     @callback
@@ -419,7 +412,7 @@ class SqueezeSocketClient:
             server_timestamp,
             error_code,
         ) = struct.unpack("!BBBLLLLHLLLLHLLH", data)
-        if self._state == State.Playing and elapsed_seconds != self._elapsed_time:
+        if self._state == PlayerState.Playing and elapsed_seconds != self._elapsed_time:
             self._elapsed_time = elapsed_seconds
             asyncio.create_task(self._event_callback(Event.EVENT_UPDATED, self))
 
@@ -428,7 +421,7 @@ class SqueezeSocketClient:
         """Process incoming stat STMu message: Buffer underrun: Normal end of playback."""
         # pylint: disable=unused-argument
         LOGGER.debug("STMu received - end of playback.")
-        self.state = State.Stopped
+        self.state = PlayerState.Stopped
         asyncio.create_task(self._event_callback(Event.EVENT_UPDATED, self))
 
     @callback