From bef53929d9f15cafdbadb71e975485d5808c6d2f Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Sat, 24 Aug 2024 17:42:03 +0200 Subject: [PATCH] A few minor follow-up fixes for the new Sonos provider (#1602) --- .../server/providers/sonos/__init__.py | 35 ++++++++++++------- .../server/providers/sonos/manifest.json | 2 +- .../server/providers/sonos_s1/player.py | 12 ------- requirements_all.txt | 2 +- 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/music_assistant/server/providers/sonos/__init__.py b/music_assistant/server/providers/sonos/__init__.py index 796743ff..b61184ff 100644 --- a/music_assistant/server/providers/sonos/__init__.py +++ b/music_assistant/server/providers/sonos/__init__.py @@ -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) diff --git a/music_assistant/server/providers/sonos/manifest.json b/music_assistant/server/providers/sonos/manifest.json index 98bc17f0..06762142 100644 --- a/music_assistant/server/providers/sonos/manifest.json +++ b/music_assistant/server/providers/sonos/manifest.json @@ -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, diff --git a/music_assistant/server/providers/sonos_s1/player.py b/music_assistant/server/providers/sonos_s1/player.py index fcdf0703..6732a3ab 100644 --- a/music_assistant/server/providers/sonos_s1/player.py +++ b/music_assistant/server/providers/sonos_s1/player.py @@ -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: diff --git a/requirements_all.txt b/requirements_all.txt index ddb2dbe6..78d83da0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 -- 2.34.1