✨ Can download artists. Fixes #102

This commit is contained in:
Robert Honz
2024-05-22 06:33:40 +02:00
parent 3a6bf023d7
commit 776542de5c
3 changed files with 61 additions and 25 deletions
+24 -9
View File
@@ -13,7 +13,12 @@ from tidal_dl_ng.config import Settings, Tidal
from tidal_dl_ng.constants import CTX_TIDAL, MediaType from tidal_dl_ng.constants import CTX_TIDAL, MediaType
from tidal_dl_ng.download import Download from tidal_dl_ng.download import Download
from tidal_dl_ng.helper.path import get_format_template, path_file_settings from tidal_dl_ng.helper.path import get_format_template, path_file_settings
from tidal_dl_ng.helper.tidal import get_tidal_media_id, get_tidal_media_type from tidal_dl_ng.helper.tidal import (
all_artist_album_ids,
get_tidal_media_id,
get_tidal_media_type,
instantiate_media,
)
from tidal_dl_ng.helper.wrapper import LoggerWrapped from tidal_dl_ng.helper.wrapper import LoggerWrapped
from tidal_dl_ng.model.cfg import HelpSettings from tidal_dl_ng.model.cfg import HelpSettings
@@ -192,14 +197,24 @@ def download(
dl.item( dl.item(
media_id=item_id, media_type=media_type, file_template=file_template, download_delay=download_delay media_id=item_id, media_type=media_type, file_template=file_template, download_delay=download_delay
) )
elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX]: elif media_type in [MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX, MediaType.ARTIST]:
dl.items( item_ids: [int] = []
media_id=item_id,
media_type=media_type, if media_type == MediaType.ARTIST:
file_template=file_template, media = instantiate_media(ctx.obj[CTX_TIDAL].session, media_type, item_id)
video_download=ctx.obj[CTX_TIDAL].settings.data.video_download, media_type = MediaType.ALBUM
download_delay=settings.data.download_delay, item_ids = item_ids + all_artist_album_ids(media)
) else:
item_ids.append(item_id)
for item_id in item_ids:
dl.items(
media_id=item_id,
media_type=media_type,
file_template=file_template,
video_download=ctx.obj[CTX_TIDAL].settings.data.video_download,
download_delay=settings.data.download_delay,
)
# Stop Progress display. # Stop Progress display.
progress.stop() progress.stop()
+1 -1
View File
@@ -165,7 +165,7 @@ def get_format_template(
if isinstance(media, Track) or media == MediaType.TRACK: if isinstance(media, Track) or media == MediaType.TRACK:
result = settings.data.format_track result = settings.data.format_track
elif isinstance(media, Album) or media == MediaType.ALBUM: elif isinstance(media, Album) or media == MediaType.ALBUM or media == MediaType.ARTIST:
result = settings.data.format_album result = settings.data.format_album
elif isinstance(media, Playlist | UserPlaylist) or media == MediaType.PLAYLIST: elif isinstance(media, Playlist | UserPlaylist) or media == MediaType.PLAYLIST:
result = settings.data.format_playlist result = settings.data.format_playlist
+36 -15
View File
@@ -92,7 +92,9 @@ def search_results_all(session: Session, needle: str, types_media: SearchTypes =
return result return result
def items_results_all(media_list: [Mix | Playlist | Album], videos_include: bool = True) -> [Track | Video | Album]: def items_results_all(
media_list: [Mix | Playlist | Album | Artist], videos_include: bool = True
) -> [Track | Video | Album]:
result: [Track | Video | Album] = [] result: [Track | Video | Album] = []
if isinstance(media_list, Mix): if isinstance(media_list, Mix):
@@ -107,22 +109,41 @@ def items_results_all(media_list: [Mix | Playlist | Album], videos_include: bool
func_get_items_media.append(media_list.tracks) func_get_items_media.append(media_list.tracks)
else: else:
func_get_items_media.append(media_list.get_albums) func_get_items_media.append(media_list.get_albums)
func_get_items_media.append(media_list.get_albums_ep_singles) func_get_items_media.append(media_list.get_ep_singles)
for func_media in func_get_items_media: result = paginate_media(func_get_items_media)
limit: int = 100
offset: int = 0
done: bool = False
while not done: return result
tmp_result: [Track | Video | Album] = func_media(limit=limit, offset=offset)
if bool(tmp_result):
result += tmp_result def all_artist_album_ids(media_artist: Artist) -> [int | None]:
# Get the next page in the next iteration. result: [int] = []
offset += limit func_get_items_media: [Callable] = [media_artist.get_albums, media_artist.get_ep_singles]
else: albums: [Album] = paginate_media(func_get_items_media)
done = True
for album in albums:
result.append(album.id)
return result
def paginate_media(func_get_items_media) -> [Track | Video | Album]:
result: [Track | Video | Album] = []
for func_media in func_get_items_media:
limit: int = 100
offset: int = 0
done: bool = False
while not done:
tmp_result: [Track | Video | Album] = func_media(limit=limit, offset=offset)
if bool(tmp_result):
result += tmp_result
# Get the next page in the next iteration.
offset += limit
else:
done = True
return result return result
@@ -139,7 +160,7 @@ def instantiate_media(
session: Session, session: Session,
media_type: type[MediaType.TRACK, MediaType.VIDEO, MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX], media_type: type[MediaType.TRACK, MediaType.VIDEO, MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX],
id_media: str, id_media: str,
) -> Track | Video | Album | Playlist | Mix: ) -> Track | Video | Album | Playlist | Mix | Artist:
if media_type == MediaType.TRACK: if media_type == MediaType.TRACK:
media = session.track(id_media, with_album=True) media = session.track(id_media, with_album=True)
elif media_type == MediaType.VIDEO: elif media_type == MediaType.VIDEO: