CONF_EXPIRY_TIME = "expiry_time"
CONF_QUALITY = "quality"
+BROWSE_URL = "https://tidal.com/browse"
+
async def setup(
mass: MusicAssistant, manifest: ProviderManifest, config: ProviderConfig
item_id=str(artist_id),
provider_domain=self.domain,
provider_instance=self.instance_id,
- url=f"http://www.tidal.com/artist/{artist_id}",
+ url=f"{BROWSE_URL}/artist/{artist_id}",
)
},
)
# metadata
if full_details and artist_obj.name != "Various Artists":
try:
- image_url = await self._get_image_url(artist_obj, 750)
+ image_url = await self._get_image_url(artist_obj, size=750)
artist.metadata.images = [
MediaItemImage(
type=ImageType.THUMB,
audio_format=AudioFormat(
content_type=ContentType.FLAC,
),
- url=f"http://www.tidal.com/album/{album_id}",
+ url=f"{BROWSE_URL}/album/{album_id}",
available=album_obj.available,
)
},
album.metadata.popularity = album_obj.popularity
if full_details:
try:
- image_url = await self._get_image_url(album_obj, 1280)
+ image_url = await self._get_image_url(album_obj, size=1280)
album.metadata.images = [
MediaItemImage(
type=ImageType.THUMB,
content_type=ContentType.FLAC,
bit_depth=24 if self._is_hi_res(track_obj=track_obj) else 16,
),
- url=f"http://www.tidal.com/tracks/{track_id}",
+ url=f"{BROWSE_URL}/track/{track_id}",
available=track_obj.available,
)
},
track.metadata.popularity = track_obj.popularity
track.metadata.copyright = track_obj.copyright
if full_details:
+ image_url = None
try:
if lyrics_obj := await self._get_lyrics(track_obj):
track.metadata.lyrics = lyrics_obj.text
except Exception:
self.logger.info(f"Track {track_obj.id} has no available lyrics")
- if not track.image and track_obj.album and (image_url := track_obj.album.image(640, None)):
- track.metadata.images = [
- MediaItemImage(
- type=ImageType.THUMB,
- path=image_url,
- )
- ]
+ try:
+ image_url = await self._get_track_image_url(track_obj, width=1080, height=720)
+ track.metadata.images = [
+ MediaItemImage(
+ type=ImageType.THUMB,
+ path=image_url,
+ )
+ ]
+ except Exception:
+ self.logger.info(f"Track {track_obj.id} has no available picture")
+ if image_url is None:
+ try:
+ image_url = await self._get_image_url(track_obj.album, size=1280)
+ track_obj.album.metadata.images = [
+ MediaItemImage(
+ type=ImageType.THUMB,
+ path=image_url,
+ )
+ ]
+ except Exception:
+ self.logger.info(f"Album {track_obj.album.id} has no available picture")
return track
item_id=str(playlist_id),
provider_domain=self.domain,
provider_instance=self.instance_id,
- url=f"http://www.tidal.com/playlists/{playlist_id}",
+ url=f"{BROWSE_URL}/playlist/{playlist_id}",
)
},
)
playlist.metadata.popularity = playlist_obj.popularity
if full_details:
try:
- image_url = await self._get_image_url(playlist_obj, 1080)
+ image_url = await self._get_image_url(playlist_obj, size=1080)
playlist.metadata.images = [
MediaItemImage(
type=ImageType.THUMB,
return playlist
async def _get_image_url(
- self, item: TidalArtist | TidalAlbum | TidalPlaylist, size: int
+ self, item: TidalArtist | TidalAlbum | TidalPlaylist, size: int = 0
+ ) -> str:
+ def inner() -> str:
+ return item.image(size)
+
+ return await asyncio.to_thread(inner)
+
+ async def _get_track_image_url(
+ self,
+ item: TidalTrack,
+ width: int = 0,
+ height: int = 0,
) -> str:
def inner() -> str:
- image_url: str = item.image(size)
- return image_url
+ return item.image(width, height)
return await asyncio.to_thread(inner)
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 tidalapi.exceptions import (
+ MetadataNotAvailable,
+ ObjectNotFound,
+ TooManyRequests,
+ URLNotAvailable,
+)
from music_assistant.common.models.enums import MediaType
from music_assistant.common.models.errors import MediaNotFoundError
try:
track_url: str = TidalTrack(session, prov_track_id).get_url()
return track_url
- except (ObjectNotFound, TooManyRequests) as err:
+ except (ObjectNotFound, TooManyRequests, URLNotAvailable) as err:
msg = f"Track {prov_track_id} not found"
raise MediaNotFoundError(msg) from err
limit=limit
)
return tracks
- except (ObjectNotFound, TooManyRequests) as err:
+ except (MetadataNotAvailable, ObjectNotFound, TooManyRequests) as err:
msg = f"Track {prov_track_id} not found"
raise MediaNotFoundError(msg) from err