Tidal-api-0.7.5 (#1165)
authorJozef Kruszynski <60214390+jozefKruszynski@users.noreply.github.com>
Sun, 24 Mar 2024 15:57:51 +0000 (16:57 +0100)
committerGitHub <noreply@github.com>
Sun, 24 Mar 2024 15:57:51 +0000 (16:57 +0100)
music_assistant/server/providers/tidal/__init__.py
music_assistant/server/providers/tidal/helpers.py
music_assistant/server/providers/tidal/manifest.json
requirements_all.txt

index a834a6be1886357f07c926d519b938ec7c43f3d4..0c9fd7756f6f99fda039badc898ef72906c3a128 100644 (file)
@@ -102,7 +102,7 @@ async def tidal_code_login(auth_helper: AuthenticationHelper, quality: str) -> T
     """Async wrapper around the tidalapi Session function."""
 
     def inner() -> TidalSession:
-        config = TidalConfig(quality=TidalQuality[quality], item_limit=10000, alac=False)
+        config = TidalConfig(quality=quality, item_limit=10000, alac=False)
         session = TidalSession(config=config)
         login, future = session.login_oauth()
         auth_helper.send_url(f"https://{login.verification_uri_complete}")
@@ -154,19 +154,15 @@ async def get_config_entries(
             required=True,
             description="The Tidal Quality you wish to use",
             options=(
+                ConfigValueOption(title=TidalQuality.low_96k, value=TidalQuality.low_96k),
+                ConfigValueOption(title=TidalQuality.low_320k, value=TidalQuality.low_320k),
                 ConfigValueOption(
-                    title=TidalQuality.low_96k.value, value=TidalQuality.low_96k.name
+                    title=TidalQuality.high_lossless,
+                    value=TidalQuality.high_lossless,
                 ),
-                ConfigValueOption(
-                    title=TidalQuality.low_320k.value, value=TidalQuality.low_320k.name
-                ),
-                ConfigValueOption(
-                    title=TidalQuality.high_lossless.value,
-                    value=TidalQuality.high_lossless.name,
-                ),
-                ConfigValueOption(title=TidalQuality.hi_res.value, value=TidalQuality.hi_res.name),
+                ConfigValueOption(title=TidalQuality.hi_res, value=TidalQuality.hi_res),
             ),
-            default_value=TidalQuality.high_lossless.name,
+            default_value=TidalQuality.high_lossless,
             value=values.get(CONF_QUALITY) if values else None,
         ),
         ConfigEntry(
@@ -525,7 +521,7 @@ class TidalProvider(MusicProvider):
     async def _load_tidal_session(
         self,
         token_type: str,
-        quality: TidalQuality,
+        quality: str,
         access_token: str,
         refresh_token: str,
         expiry_time: datetime | None = None,
@@ -533,7 +529,7 @@ class TidalProvider(MusicProvider):
         """Load the tidalapi Session."""
 
         def inner() -> TidalSession:
-            config = TidalConfig(quality=TidalQuality[quality], item_limit=10000, alac=False)
+            config = TidalConfig(quality=quality, item_limit=10000, alac=False)
             session = TidalSession(config=config)
             session.load_oauth_session(token_type, access_token, refresh_token, expiry_time)
             return session
@@ -786,5 +782,5 @@ class TidalProvider(MusicProvider):
 
     def _is_hi_res(self, track_obj: TidalTrack) -> bool:
         """Check if track is hi-res."""
-        hi_res: bool = track_obj.audio_quality.value == "HI_RES"
+        hi_res: bool = track_obj.audio_quality == "HI_RES"
         return hi_res
index d6fc506c19fc3787d88f48085a557764617c1f74..9b4db3a7de1abd242a93a95e60056734760bccea 100644 (file)
@@ -12,7 +12,6 @@ tidalapi: https://github.com/tamland/python-tidal
 import asyncio
 import logging
 
-from requests import HTTPError
 from tidalapi import Album as TidalAlbum
 from tidalapi import Artist as TidalArtist
 from tidalapi import Favorites as TidalFavorites
@@ -21,6 +20,7 @@ from tidalapi import Playlist as TidalPlaylist
 from tidalapi import Session as TidalSession
 from tidalapi import Track as TidalTrack
 from tidalapi import UserPlaylist as TidalUserPlaylist
+from tidalapi.exceptions import ObjectNotFound, TooManyRequests
 
 from music_assistant.common.models.enums import MediaType
 from music_assistant.common.models.errors import MediaNotFoundError
@@ -89,11 +89,9 @@ async def get_artist(session: TidalSession, prov_artist_id: str) -> TidalArtist:
     def inner() -> TidalArtist:
         try:
             return TidalArtist(session, prov_artist_id)
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Artist {prov_artist_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Artist {prov_artist_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
@@ -111,11 +109,9 @@ async def get_artist_albums(session: TidalSession, prov_artist_id: str) -> list[
             all_albums.extend(albums)
             all_albums.extend(eps_singles)
             all_albums.extend(compilations)
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Artist {prov_artist_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Artist {prov_artist_id} not found"
+            raise MediaNotFoundError(msg) from err
         else:
             return all_albums
 
@@ -156,11 +152,9 @@ async def get_album(session: TidalSession, prov_album_id: str) -> TidalAlbum:
     def inner() -> TidalAlbum:
         try:
             return TidalAlbum(session, prov_album_id)
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Album {prov_album_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Album {prov_album_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
@@ -171,11 +165,9 @@ async def get_track(session: TidalSession, prov_track_id: str) -> TidalTrack:
     def inner() -> TidalTrack:
         try:
             return TidalTrack(session, prov_track_id)
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Track {prov_track_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Track {prov_track_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
@@ -187,11 +179,9 @@ async def get_track_url(session: TidalSession, prov_track_id: str) -> str:
         try:
             track_url: str = TidalTrack(session, prov_track_id).get_url()
             return track_url
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Track {prov_track_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Track {prov_track_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
@@ -205,11 +195,9 @@ async def get_album_tracks(session: TidalSession, prov_album_id: str) -> list[Ti
                 limit=DEFAULT_LIMIT
             )
             return tracks
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Album {prov_album_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Album {prov_album_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
@@ -248,11 +236,9 @@ async def get_playlist(session: TidalSession, prov_playlist_id: str) -> TidalPla
     def inner() -> TidalPlaylist:
         try:
             return TidalPlaylist(session, prov_playlist_id)
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Playlist {prov_playlist_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Playlist {prov_playlist_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
@@ -271,11 +257,9 @@ async def get_playlist_tracks(
                 limit=limit, offset=offset
             )
             return tracks
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Playlist {prov_playlist_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Playlist {prov_playlist_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
@@ -317,11 +301,9 @@ async def get_similar_tracks(
                 limit=limit
             )
             return tracks
-        except HTTPError as err:
-            if err.response.status_code == 404:
-                msg = f"Track {prov_track_id} not found"
-                raise MediaNotFoundError(msg) from err
-            raise
+        except (ObjectNotFound, TooManyRequests) as err:
+            msg = f"Track {prov_track_id} not found"
+            raise MediaNotFoundError(msg) from err
 
     return await asyncio.to_thread(inner)
 
index 884286ffc57281f1cba6f18bd74dae77ab3786c8..e32fc95bd1d6a5b1a59d36a0ceac8b0bc05d65ec 100644 (file)
@@ -4,7 +4,7 @@
   "name": "Tidal",
   "description": "Support for the Tidal streaming provider in Music Assistant.",
   "codeowners": ["@jozefKruszynski"],
-  "requirements": ["tidalapi==0.7.4"],
+  "requirements": ["tidalapi==0.7.5"],
   "documentation": "https://music-assistant.io/music-providers/tidal/",
   "multi_instance": true
 }
index dac9414176d735903929189fc0a6ed96aab13506..852d9fd11a5b7f8266ceae452ebbc8535e0150eb 100644 (file)
@@ -35,7 +35,7 @@ shortuuid==1.0.12
 snapcast==2.3.6
 soco==0.30.2
 sonos-websocket==0.1.3
-tidalapi==0.7.4
+tidalapi==0.7.5
 unidecode==1.3.8
 xmltodict==0.13.0
 ytmusicapi==1.6.0