Files
tidal-dl/tidal_dl_ng/helper/tidal.py
T

142 lines
4.2 KiB
Python
Raw Normal View History

from tidalapi import Album, Mix, Playlist, Session, Track, UserPlaylist, Video
from tidalapi.artist import Role
2024-01-18 21:57:35 +01:00
from tidalapi.session import SearchTypes
2024-01-13 11:57:11 +01:00
2024-01-14 23:09:43 +01:00
from tidal_dl_ng.constants import MediaType
from tidal_dl_ng.helper.exceptions import MediaUnknown
2024-01-14 23:09:43 +01:00
2024-01-13 11:57:11 +01:00
2024-03-14 06:30:47 +01:00
def name_builder_artist(media: Track | Video | Album) -> str:
2024-01-13 11:57:11 +01:00
return ", ".join(artist.name for artist in media.artists)
def name_builder_album_artist(media: Track | Album) -> str:
artists_tmp: [str] = []
for artist in media.album.artists:
if Role.main in artist.roles:
artists_tmp.append(artist.name)
return ", ".join(artists_tmp)
2024-03-14 06:30:47 +01:00
def name_builder_title(media: Track | Video) -> str:
result: str = media.full_name if hasattr(media, "full_name") else media.name
return result
2024-01-13 11:57:11 +01:00
def name_builder_item(media: Track) -> str:
return f"{name_builder_artist(media)} - {name_builder_title(media)}"
2024-01-14 23:09:43 +01:00
def get_tidal_media_id(url_or_id_media: str) -> str:
id_dirty = url_or_id_media.rsplit("/", 1)[-1]
id_media = id_dirty.rsplit("?", 1)[0]
return id_media
def get_tidal_media_type(url_media: str) -> MediaType | bool:
result: MediaType | bool = False
url_split = url_media.split("/")[-2]
if len(url_split) > 1:
media_name = url_media.split("/")[-2]
if media_name == "track":
2024-01-16 06:33:23 +01:00
result = MediaType.TRACK
2024-01-14 23:09:43 +01:00
elif media_name == "video":
2024-01-16 06:33:23 +01:00
result = MediaType.VIDEO
2024-01-14 23:09:43 +01:00
elif media_name == "album":
2024-01-16 06:33:23 +01:00
result = MediaType.ALBUM
2024-01-14 23:09:43 +01:00
elif media_name == "playlist":
2024-01-16 06:33:23 +01:00
result = MediaType.PLAYLIST
2024-01-14 23:09:43 +01:00
elif media_name == "mix":
2024-01-16 06:33:23 +01:00
result = MediaType.MIX
2024-01-14 23:09:43 +01:00
return result
2024-01-18 21:57:35 +01:00
2024-01-18 22:14:46 +01:00
def search_results_all(session: Session, needle: str, types_media: SearchTypes = None) -> dict[str, [SearchTypes]]:
2024-01-18 21:57:35 +01:00
limit: int = 300
offset: int = 0
done: bool = False
result: dict[str, [SearchTypes]] = {}
while not done:
tmp_result: dict[str, [SearchTypes]] = session.search(
query=needle, models=types_media, limit=limit, offset=offset
)
tmp_done: bool = True
for key, value in tmp_result.items():
# Append pagination results, if there are any
if offset == 0:
result = tmp_result
tmp_done = False
elif bool(value):
result[key] += value
tmp_done = False
# Next page
offset += limit
done = tmp_done
return result
2024-01-18 22:14:46 +01:00
def items_results_all(media_list: [Mix | Playlist | Album], videos_include: bool = True) -> [Track | Video]:
2024-01-18 21:57:35 +01:00
limit: int = 100
offset: int = 0
done: bool = False
result: [Track | Video] = []
if isinstance(media_list, Mix):
result = media_list.items()
else:
while not done:
2024-01-18 22:14:46 +01:00
tmp_result: [Track | Video] = (
media_list.items(limit=limit, offset=offset)
if videos_include
else media_list.tracks(limit=limit, offset=offset)
)
2024-01-18 21:57:35 +01:00
if bool(tmp_result):
result += tmp_result
# Get the next page in the next iteration.
offset += limit
else:
done = True
return result
def user_media_lists(session: Session) -> [Playlist | UserPlaylist | Mix]:
user_playlists: [Playlist | UserPlaylist] = session.user.playlist_and_favorite_playlists()
user_mixes: [Mix] = session.mixes().categories[0].items
result: [Playlist | UserPlaylist | Mix] = user_playlists + user_mixes
return result
def instantiate_media(
session: Session,
media_type: type[MediaType.TRACK, MediaType.VIDEO, MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX],
id_media: str,
2024-03-13 06:48:11 +01:00
) -> Track | Video | Album | Playlist | Mix:
if media_type == MediaType.TRACK:
media = session.track(id_media, with_album=True)
elif media_type == MediaType.VIDEO:
media = session.video(id_media)
elif media_type == MediaType.ALBUM:
media = session.album(id_media)
elif media_type == MediaType.PLAYLIST:
media = session.playlist(id_media)
elif media_type == MediaType.MIX:
media = session.mix(id_media)
else:
raise MediaUnknown
return media