Skip to content

Commit

Permalink
SiriusXM: live radio data in the stream title
Browse files Browse the repository at this point in the history
  • Loading branch information
btoconnor committed Oct 21, 2024
1 parent 6b30402 commit 1d6758f
Showing 1 changed file with 27 additions and 3 deletions.
30 changes: 27 additions & 3 deletions music_assistant/server/providers/siriusxm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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."""
Expand Down Expand Up @@ -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(
Expand All @@ -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.
Expand All @@ -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
Expand Down

0 comments on commit 1d6758f

Please sign in to comment.