A few minor follow-up fixes for the new Sonos provider (#1602)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Sat, 24 Aug 2024 15:42:03 +0000 (17:42 +0200)
committerGitHub <noreply@github.com>
Sat, 24 Aug 2024 15:42:03 +0000 (17:42 +0200)
music_assistant/server/providers/sonos/__init__.py
music_assistant/server/providers/sonos/manifest.json
music_assistant/server/providers/sonos_s1/player.py
requirements_all.txt

index 796743ff3473936c170d9df63b91473eaf01dda5..b61184ff9b722a412361e9c3893bcc38d959902f 100644 (file)
@@ -4,7 +4,7 @@ from __future__ import annotations
 
 import asyncio
 import logging
-from time import time
+import time
 from typing import TYPE_CHECKING
 
 from aiohttp import web
@@ -233,7 +233,14 @@ class SonosPlayer:
             else:
                 self.mass_player.active_source = SOURCE_UNKNOWN
 
+        if self.mass_player.active_source == self.player_id and active_group.active_session_id:
+            # active source is the mass queue
+            # media details are updated through the time played callback
+            return
+
         # parse current media
+        self.mass_player.elapsed_time = self.client.player.group.position
+        self.mass_player.elapsed_time_last_updated = time.time()
         if (current_item := active_group.playback_metadata.get("currentItem")) and (
             (track := current_item.get("track")) and track.get("name")
         ):
@@ -697,7 +704,11 @@ class SonosPlayerProvider(PlayerProvider):
                     "accountId": "",
                 },
             },
-            "reports": {"sendUpdateAfterMillis": 0, "sendPlaybackActions": True},
+            "reports": {
+                "sendUpdateAfterMillis": 0,
+                "periodicIntervalMillis": 10000,
+                "sendPlaybackActions": True,
+            },
             "playbackPolicies": {
                 "canSkip": True,
                 "limitedSkips": False,
@@ -724,17 +735,17 @@ class SonosPlayerProvider(PlayerProvider):
         json_body = await request.json()
         sonos_playback_id = request.headers["X-Sonos-Playback-Id"]
         sonos_player_id = sonos_playback_id.split(":")[0]
-        mass_player = self.mass.players.get(sonos_player_id)
-        for item in json_body["items"]:
-            if "positionMillis" not in item:
-                continue
-            if mass_player.current_media:
-                mass_player.current_media.queue_item_id = item["id"]
-                mass_player.current_media.uri = item["mediaUrl"]
-                mass_player.current_media.queue_id = sonos_playback_id
+        if mass_player := self.mass.players.get(sonos_player_id):
+            for item in json_body["items"]:
+                if "positionMillis" not in item:
+                    continue
+                mass_player.current_media = PlayerMedia(
+                    uri=item["mediaUrl"], queue_id=sonos_playback_id, queue_item_id=item["id"]
+                )
                 mass_player.elapsed_time = item["positionMillis"] / 1000
-                mass_player.elapsed_time_last_updated = time()
-            break
+                mass_player.elapsed_time_last_updated = time.time()
+                self.mass.players.update(sonos_player_id)
+                break
         return web.Response(status=204)
 
 
index 98bc17f0d30088e86a32291f6943140302738c47..067621429a531ef9f5a0bf819ad6d5f59dba6131 100644 (file)
@@ -4,7 +4,7 @@
   "name": "SONOS",
   "description": "SONOS Player provider for Music Assistant.",
   "codeowners": ["@music-assistant"],
-  "requirements": ["aiosonos==0.1.1"],
+  "requirements": ["aiosonos==0.1.2"],
   "documentation": "https://music-assistant.io/player-support/sonos/",
   "multi_instance": false,
   "builtin": false,
index fcdf07030716082086e0b856cee12387b95bcdc7..6732a3ab7288bdc626ae325690bb10b658324c58 100644 (file)
@@ -25,7 +25,6 @@ from soco.core import (
     SoCo,
 )
 from soco.data_structures import DidlAudioBroadcast, DidlPlaylistContainer
-from sonos_websocket import SonosWebsocket
 
 from music_assistant.common.helpers.datetime import utc
 from music_assistant.common.models.enums import PlayerFeature, PlayerState
@@ -104,7 +103,6 @@ class SonosPlayer:
         self.logger = sonos_prov.logger
         self.household_id: str = soco.household_id
         self.subscriptions: list[SubscriptionBase] = []
-        self.websocket: SonosWebsocket | None = None
         self.mass_player: Player = mass_player
         self.available: bool = True
         # cached attributes
@@ -177,16 +175,6 @@ class SonosPlayer:
         if not self.sync_coordinator:
             self.poll_media()
 
-        async def do_async_setup() -> None:
-            """Complete setup in async context."""
-            self.websocket = SonosWebsocket(
-                self.soco.ip_address,
-                player_id=self.soco.uid,
-                session=self.mass.http_session,
-            )
-
-        future = asyncio.run_coroutine_threadsafe(do_async_setup(), self.mass.loop)
-        future.result(timeout=10)
         asyncio.run_coroutine_threadsafe(self.subscribe(), self.mass.loop)
 
     async def offline(self) -> None:
index ddb2dbe6e592d55919512afb2120fd8a269c4a54..78d83da01f296c1a860c87ac7f59ed17991a0c2a 100644 (file)
@@ -7,7 +7,7 @@ aiohttp==3.10.4
 aiojellyfin==0.10.1
 aiorun==2024.8.1
 aioslimproto==3.0.1
-aiosonos==0.1.1
+aiosonos==0.1.2
 aiosqlite==0.20.0
 async-upnp-client==0.40.0
 bidict==0.23.1