Chore: unifi streamdetails function
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 4 Feb 2025 11:12:42 +0000 (12:12 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Tue, 4 Feb 2025 11:12:42 +0000 (12:12 +0100)
23 files changed:
music_assistant/models/music_provider.py
music_assistant/models/plugin.py
music_assistant/providers/_template_music_provider/__init__.py
music_assistant/providers/apple_music/__init__.py
music_assistant/providers/audible/__init__.py
music_assistant/providers/audiobookshelf/__init__.py
music_assistant/providers/builtin/__init__.py
music_assistant/providers/deezer/__init__.py
music_assistant/providers/ibroadcast/__init__.py
music_assistant/providers/jellyfin/__init__.py
music_assistant/providers/opensubsonic/sonic_provider.py
music_assistant/providers/plex/__init__.py
music_assistant/providers/podcastfeed/__init__.py
music_assistant/providers/qobuz/__init__.py
music_assistant/providers/radiobrowser/__init__.py
music_assistant/providers/siriusxm/__init__.py
music_assistant/providers/soundcloud/__init__.py
music_assistant/providers/spotify/__init__.py
music_assistant/providers/spotify_connect/__init__.py
music_assistant/providers/test/__init__.py
music_assistant/providers/tidal/__init__.py
music_assistant/providers/tunein/__init__.py
music_assistant/providers/ytmusic/__init__.py

index 49fa8862c05338988c7922f5efbbaed9a753ddc3..3afaed2013e271134bec5cbe43d00c6c5cac2e6f 100644 (file)
@@ -310,9 +310,7 @@ class MusicProvider(Provider):
         if ProviderFeature.SIMILAR_TRACKS in self.supported_features:
             raise NotImplementedError
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a track/radio/chapter/episode."""
         raise NotImplementedError
 
index 5978cfa9996ccf8b9f19a677196636ae1d0017b3..d7009bd6a93a687bb9de2c554af5b49cb13ab8b6 100644 (file)
@@ -5,11 +5,10 @@ from __future__ import annotations
 from collections.abc import AsyncGenerator
 from typing import TYPE_CHECKING
 
-from music_assistant_models.enums import MediaType
-
 from .provider import Provider
 
 if TYPE_CHECKING:
+    from music_assistant_models.enums import MediaType
     from music_assistant_models.media_items import PluginSource
     from music_assistant_models.streamdetails import StreamDetails
 
@@ -33,9 +32,7 @@ class PluginProvider(Provider):
         # Will only be called if ProviderFeature.AUDIO_SOURCE is declared
         raise NotImplementedError
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the streamdetails to stream an (audio)source provided by this plugin."""
         # Will only be called if ProviderFeature.AUDIO_SOURCE is declared
         raise NotImplementedError
index 2e3226d5dead476e35197c8b76b065dd65450cf0..ce6b9b08f6519481b4a3da7152a479fcf28a42f9 100644 (file)
@@ -368,9 +368,7 @@ class MyDemoMusicprovider(MusicProvider):
         # Get a list of similar tracks based on the provided track.
         # This is only called if the provider supports the SIMILAR_TRACKS feature.
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a track/radio."""
         # Get stream details for a track or radio.
         # Implementing this method is MANDATORY to allow playback.
index f39bec991ec3e5dabd902f4757644ce10fba2be1..fdda7cc03995a680b59504b63fbf4f5d2edb5071 100644 (file)
@@ -352,9 +352,7 @@ class AppleMusicProvider(MusicProvider):
                     found_tracks.append(self._parse_track(track))
         return found_tracks
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         stream_metadata = await self._fetch_song_stream_metadata(item_id)
         license_url = stream_metadata["hls-key-server-url"]
index e7d8820faa79569b687a1d2b67d5c7d982541237..b9f05e326c90fd0338acc20ae0f0db7f8052b1b7 100644 (file)
@@ -275,9 +275,7 @@ class Audibleprovider(MusicProvider):
             raise ValueError(f"Audiobook with id {prov_audiobook_id} not found")
         return audiobook
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.AUDIOBOOK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a audiobook based of asin."""
         return await self.helper.get_stream(asin=item_id)
 
index 0078fae7018f302aeb34d9ec0b37c6df6b5e4214..fa8f454cee5c86a48ef612e200c40ed9ccc1d853 100644 (file)
@@ -447,9 +447,7 @@ class Audiobookshelf(MusicProvider):
             path=stream_url,
         )
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get stream of item."""
         # self.logger.debug(f"Streamdetails: {item_id}")
         if media_type == MediaType.PODCAST_EPISODE:
index 4c47536ace953801912fe2e75bfa076dcb2769a6..1f2170a83c96e418e2213ee13754031fd7274f21 100644 (file)
@@ -541,9 +541,7 @@ class BuiltinProvider(MusicProvider):
         )
         return media_info
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a track/radio."""
         media_info = await self._get_media_info(item_id)
         is_radio = media_info.get("icy-name") or not media_info.duration
index fcf12d124a76007c5288d5c824bb130a0c19af35..d435063b2347ff535122f1de9f3ed93879ce0205 100644 (file)
@@ -427,9 +427,7 @@ class DeezerProvider(MusicProvider):
         ]["data"][:limit]
         return [await self.get_track(track["SNG_ID"]) for track in tracks]
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         url_details, song_data = await self.gw_client.get_deezer_track_urls(item_id)
         url = url_details["sources"][0]["url"]
index 6954326eee776f9d38c7e4ba34e775520bb390a9..0e0440922a50217102b82f0a7ef4316dd42682d6 100644 (file)
@@ -230,9 +230,7 @@ class IBroadcastProvider(MusicProvider):
             return tracks
         return await self._get_tracks(playlist_obj["tracks"], True)
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         # How to buildup a stream url:
         # [streaming_server]/[url]?Expires=[now]&Signature=[user token]&file_id=[file ID]
index f3e53ac6fb9897df974eb52c540b87039547bc35..a4309ca470906aa9859230c7c792bc6e5c84b203 100644 (file)
@@ -435,9 +435,7 @@ class JellyfinProvider(MusicProvider):
             for album in albums["Items"]
         ]
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         jellyfin_track = await self._client.get_track(item_id)
         url = self._client.audio_url(
index ecc72dd92db8ade8f71518ec8c374473de6a925d..aba988493637c82e3899baf329aee044ba95eed1 100644 (file)
@@ -732,9 +732,7 @@ class OpenSonicProvider(MusicProvider):
             msg = f"Failed to remove songs from {prov_playlist_id}, check your permissions."
             raise ProviderPermissionDenied(msg) from ex
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get the details needed to process a specified track."""
         item: SonicSong | SonicEpisode
         if media_type == MediaType.TRACK:
index e6ce7cc5635cd0c95292a571a624c7752ea3b12c..d22121954977e3419c1d2e5aeaa43850d954fea3 100644 (file)
@@ -890,9 +890,7 @@ class PlexProvider(MusicProvider):
                 return albums
         return []
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a track."""
         plex_track = await self._get_data(item_id, PlexTrack)
         if not plex_track or not plex_track.media:
index 8bbcc27c5bab0108afe4b192e9b6c615d180b7bd..0314ecab0fadd914b8136189520f255d28d974db 100644 (file)
@@ -165,9 +165,7 @@ class PodcastMusicprovider(MusicProvider):
             episodes.append(await self._parse_episode(episode, idx))
         return episodes
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a track/radio."""
         for episode in self.parsed["episodes"]:
             if item_id == episode["guid"]:
index c984348f807ae177098905eb85267109c6846316..df820fda52c8e2cf75b8984ac6454ba020a8cf91 100644 (file)
@@ -401,9 +401,7 @@ class QobuzProvider(MusicProvider):
             playlist_track_ids=",".join(playlist_track_ids),
         )
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         streamdata = None
         for format_id in [27, 7, 6, 5]:
index 84cd3d0b35fdde742c5795ed8528d7bcbcb8ba0a..68a8a0100913affc86d85e93cfc6aa10d297d35f 100644 (file)
@@ -348,9 +348,7 @@ class RadioBrowserProvider(MusicProvider):
 
         return radio
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.RADIO
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a radio station."""
         stream = await self.radios.station(uuid=item_id)
         if not stream:
index 74fa2baab8e65dd1c7a5b7b5fa4edd9567ae95d3..998d26f2b17654cbba5c8191ec9d2a9fba5196d3 100644 (file)
@@ -211,9 +211,7 @@ class SiriusXMProvider(MusicProvider):
 
         return self._parse_radio(self._channels_by_id[prov_radio_id])
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.RADIO
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a track/radio."""
         # There's a chance that the SiriusXM auth session has expired
         # by the time the user clicks to play a station.  The sxm-client
index 0ec5c96f343f906cb0c83e55416516eccc305bc7..e4567654aa525a1cf56bfb0119bac78408597c6a 100644 (file)
@@ -304,9 +304,7 @@ class SoundcloudMusicProvider(MusicProvider):
 
         return tracks
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         url: str = await self._soundcloud.get_stream_url(track_id=item_id)
         return StreamDetails(
index fb4711d448f9285013c659fcaa9cd8c4bd441022..6c15b72ae11ed1b90a9b708866a512d3bfd1dfdc 100644 (file)
@@ -546,9 +546,7 @@ class SpotifyProvider(MusicProvider):
         items = await self._get_data(endpoint, seed_tracks=prov_track_id, limit=limit)
         return [self._parse_track(item) for item in items["tracks"] if (item and item["id"])]
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         return StreamDetails(
             item_id=item_id,
index 98be2b0aebde9d5087eac526d0227339143deefa..91b917ff0323b5ade7d71a37194cb8e2ffb7d2b7 100644 (file)
@@ -201,9 +201,7 @@ class SpotifyConnectProvider(MusicProvider):
             },
         )
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the streamdetails to stream an audiosource provided by this plugin."""
         self._current_streamdetails = streamdetails = StreamDetails(
             item_id=CONNECT_ITEM_ID,
index b1653db5c32a4ea6b4a6dc71774895c17337f5c2..f26d8f560d66e3b9c0f0b0de904bae307fa65e3b 100644 (file)
@@ -338,9 +338,7 @@ class TestProvider(MusicProvider):
             position=int(episode_idx),
         )
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a track/radio."""
         return StreamDetails(
             provider=self.lookup_key,
index 47529301784af537bba37d4d12b6cae4c7ad6a0c..5e27d37e2d141f94182f97b851ba0ee9de939542 100644 (file)
@@ -11,11 +11,7 @@ from datetime import datetime, timedelta
 from enum import StrEnum
 from typing import TYPE_CHECKING, ParamSpec, TypeVar, cast
 
-from music_assistant_models.config_entries import (
-    ConfigEntry,
-    ConfigValueOption,
-    ConfigValueType,
-)
+from music_assistant_models.config_entries import ConfigEntry, ConfigValueOption, ConfigValueType
 from music_assistant_models.enums import (
     AlbumType,
     CacheCategory,
@@ -52,10 +48,7 @@ from tidalapi import exceptions as tidal_exceptions
 
 from music_assistant.helpers.auth import AuthenticationHelper
 from music_assistant.helpers.tags import AudioTags, async_parse_tags
-from music_assistant.helpers.throttle_retry import (
-    ThrottlerManager,
-    throttle_with_retries,
-)
+from music_assistant.helpers.throttle_retry import ThrottlerManager, throttle_with_retries
 from music_assistant.models.music_provider import MusicProvider
 
 from .helpers import (
@@ -577,9 +570,7 @@ class TidalProvider(MusicProvider):
         )
         return self._parse_playlist(playlist_obj)
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         tidal_session = await self._get_tidal_session()
         # make sure a valid track is requested.
index d2cab65c1fdec4323234a1c551c403e10c991948..a0e3ea8b0b02a03ca23e5b31369480d1f5b35f60 100644 (file)
@@ -238,9 +238,7 @@ class TuneInProvider(MusicProvider):
         await self.mass.cache.set(preset_id, result, base_key=cache_base_key)
         return result
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.RADIO
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Get streamdetails for a radio station."""
         if item_id.startswith("http"):
             # custom url
index 97e9f99984448138e75f7b544c6bae0e0d1e6a08..3a2a06da43c5f4e80bcf466a4142488c320800db 100644 (file)
@@ -537,9 +537,7 @@ class YoutubeMusicProvider(MusicProvider):
             return tracks
         return []
 
-    async def get_stream_details(
-        self, item_id: str, media_type: MediaType = MediaType.TRACK
-    ) -> StreamDetails:
+    async def get_stream_details(self, item_id: str, media_type: MediaType) -> StreamDetails:
         """Return the content details for the given track when it will be streamed."""
         if media_type == MediaType.PODCAST_EPISODE:
             item_id = item_id.split(PODCAST_EPISODE_SPLITTER)[1]