From 1d6758f0550175f78bcb9fc633793ddd17d842c6 Mon Sep 17 00:00:00 2001 From: Brian O'Connor Date: Mon, 21 Oct 2024 18:03:02 -0400 Subject: [PATCH] SiriusXM: live radio data in the stream title --- .../server/providers/siriusxm/__init__.py | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/music_assistant/server/providers/siriusxm/__init__.py b/music_assistant/server/providers/siriusxm/__init__.py index 6e94331c3..cfb5b6f17 100644 --- a/music_assistant/server/providers/siriusxm/__init__.py +++ b/music_assistant/server/providers/siriusxm/__init__.py @@ -42,7 +42,7 @@ import sxm.http from sxm import SXMClientAsync -from sxm.models import QualitySize, RegionChoice, XMChannel +from sxm.models import QualitySize, RegionChoice, XMChannel, XMLiveChannel CONF_SXM_USERNAME = "sxm_email_address" CONF_SXM_PASSWORD = "sxm_password" @@ -110,6 +110,8 @@ class SiriusXMProvider(MusicProvider): _sxm_server: Webserver _base_url: str + _stream_details: StreamDetails | None = None + @property def supported_features(self) -> tuple[ProviderFeature, ...]: """Return the features supported by this Provider.""" @@ -203,7 +205,7 @@ async def get_stream_details(self, item_id: str) -> StreamDetails: """Get streamdetails for a track/radio.""" hls_path = f"http://{self._base_url}/{item_id}.m3u8" - return StreamDetails( + self._stream_details = StreamDetails( item_id=item_id, provider=self.instance_id, audio_format=AudioFormat( @@ -215,6 +217,8 @@ async def get_stream_details(self, item_id: str) -> StreamDetails: can_seek=False, ) + return self._stream_details + async def browse(self, path: str) -> Sequence[MediaItemType | ItemMapping]: """Browse this provider's items. @@ -223,7 +227,27 @@ async def browse(self, path: str) -> Sequence[MediaItemType | ItemMapping]: return [self._parse_radio(channel) for channel in self._channels] def _channel_updated(self, live_channel_raw: dict[str, Any]) -> None: - self.logger.debug(f"channel updated {live_channel_raw}") + """Handle a channel update event.""" + live_data = XMLiveChannel.from_dict(live_channel_raw) + + self.logger.debug(f"Got update for SiriusXM channel {live_data.id}") + current_channel = self._stream_details.item_id + + if live_data.id != current_channel: + # This can happen when changing channels + self.logger.debug( + f"Received update for channel {live_data.id}, current channel is {current_channel}" + ) + return + + latest_cut_marker = live_data.get_latest_cut() + + if latest_cut_marker: + latest_cut = latest_cut_marker.cut + title = latest_cut.title + artists = ", ".join([a.name for a in latest_cut.artists]) + + self._stream_details.stream_title = f"{title} - {artists}" async def _refresh_channels(self) -> bool: self._channels = await self._client.channels