From a845533ec282c6abf4c5491a577e8ddff45c5417 Mon Sep 17 00:00:00 2001 From: Jozef Kruszynski <60214390+jozefKruszynski@users.noreply.github.com> Date: Sun, 24 Mar 2024 16:57:51 +0100 Subject: [PATCH] Tidal-api-0.7.5 (#1165) --- .../server/providers/tidal/__init__.py | 24 +++--- .../server/providers/tidal/helpers.py | 74 +++++++------------ .../server/providers/tidal/manifest.json | 2 +- requirements_all.txt | 2 +- 4 files changed, 40 insertions(+), 62 deletions(-) diff --git a/music_assistant/server/providers/tidal/__init__.py b/music_assistant/server/providers/tidal/__init__.py index a834a6be..0c9fd775 100644 --- a/music_assistant/server/providers/tidal/__init__.py +++ b/music_assistant/server/providers/tidal/__init__.py @@ -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 diff --git a/music_assistant/server/providers/tidal/helpers.py b/music_assistant/server/providers/tidal/helpers.py index d6fc506c..9b4db3a7 100644 --- a/music_assistant/server/providers/tidal/helpers.py +++ b/music_assistant/server/providers/tidal/helpers.py @@ -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) diff --git a/music_assistant/server/providers/tidal/manifest.json b/music_assistant/server/providers/tidal/manifest.json index 884286ff..e32fc95b 100644 --- a/music_assistant/server/providers/tidal/manifest.json +++ b/music_assistant/server/providers/tidal/manifest.json @@ -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 } diff --git a/requirements_all.txt b/requirements_all.txt index dac94141..852d9fd1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -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 -- 2.34.1