import asyncio
import logging
-from time import time
+import time
from typing import TYPE_CHECKING
from aiohttp import web
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")
):
"accountId": "",
},
},
- "reports": {"sendUpdateAfterMillis": 0, "sendPlaybackActions": True},
+ "reports": {
+ "sendUpdateAfterMillis": 0,
+ "periodicIntervalMillis": 10000,
+ "sendPlaybackActions": True,
+ },
"playbackPolicies": {
"canSkip": True,
"limitedSkips": False,
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)
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
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
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: