From 832f5ce4433687551812e4208e1d565264130711 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Mon, 26 Feb 2024 06:04:41 +0100 Subject: [PATCH 1/2] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactored=20format=5F?= =?UTF-8?q?str=20method=20to=20one=20`format=5Fstr=5Fmedia`=20method.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/gui.py | 2 +- tidal_dl_ng/helper/path.py | 142 +++++++++++++++++++------------------ 2 files changed, 74 insertions(+), 70 deletions(-) diff --git a/tidal_dl_ng/gui.py b/tidal_dl_ng/gui.py index f7248fd..6afbe33 100644 --- a/tidal_dl_ng/gui.py +++ b/tidal_dl_ng/gui.py @@ -310,7 +310,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): else: self.s_tr_results_add_top_level_item.emit(child) - def populate_tree_result_child(self, item: [Mix | Album | Playlist], index_count_digits: int): + def populate_tree_result_child(self, item: [Track | Video | Mix | Album | Playlist], index_count_digits: int): # Format seconds to mm:ss. m, s = divmod(item.duration_sec, 60) duration: str = f"{m:02d}:{s:02d}" diff --git a/tidal_dl_ng/helper/path.py b/tidal_dl_ng/helper/path.py index 373f78c..81b7b1a 100644 --- a/tidal_dl_ng/helper/path.py +++ b/tidal_dl_ng/helper/path.py @@ -1,7 +1,7 @@ import glob +import math import os import re -from collections.abc import Callable from pathlib import Path from pathvalidate import sanitize_filename, sanitize_filepath @@ -66,85 +66,89 @@ def format_path_media(fmt_template: str, media: Track | Album | Playlist | UserP # Search track format template for placeholder. regex = r"\{(.+?)\}" matches = re.finditer(regex, fmt_template, re.MULTILINE) - fn_format = get_format_fn(media) for _matchNum, match in enumerate(matches, start=1): template_str = match.group() - result_fmt = fn_format(match.group(1), media) + result_fmt = format_str_media(match.group(1), media) - if result_fmt: + if result_fmt != match.group(1): value = sanitize_filename(result_fmt) result = result.replace(template_str, value) return result -def format_str_track(name: str, media: Track) -> str | bool: - result: str | bool = False +def format_str_media(name: str, media: Track | Album | Playlist | UserPlaylist | Video | Mix) -> str: + result: str = name - if name == "track_num": - result = str(media.track_num).rjust(2, "0") - elif name == "artist_name": - result = ", ".join(artist.name for artist in media.artists) - elif name == "track_title": - result = media.name - - return result - - -def format_str_album(name: str, media: Album) -> str | bool: - result: str | bool = False - - if name == "album_title": - result = media.name - elif name == "artist_name": - result = media.artist.name - - return result - - -def format_str_playlist(name: str, media: Playlist) -> str | bool: - result: str | bool = False - - if name == "playlist_name": - result = media.name - - return result - - -def format_str_mix(name: str, media: Mix) -> str | bool: - result: str | bool = False - - if name == "mix_name": - result = media.title - - return result - - -def format_str_video(name: str, media: Video) -> str | bool: - result: str | bool = False - - if name == "artist_name": - result = ", ".join(artist.name for artist in media.artists) - elif name == "track_title": - result = media.name - - return result - - -def get_format_fn(media: Track | Album | Playlist | UserPlaylist | Video | Mix) -> Callable: - result = None - - if isinstance(media, Track): - result = format_str_track - elif isinstance(media, Album): - result = format_str_album - elif isinstance(media, Playlist | UserPlaylist): - result = format_str_playlist - elif isinstance(media, Mix): - result = format_str_mix - elif isinstance(media, Video): - result = format_str_video + try: + if name == "artist_name": + if hasattr(media, "artists"): + result = ", ".join(artist.name for artist in media.artists) + elif hasattr(media, "artist"): + result = media.artist.name + elif name == "track_title": + if isinstance(media, Track | Video): + result = media.name + elif name == "mix_name": + if isinstance(media, Mix): + result = media.title + elif name == "playlist_name": + if isinstance(media, Playlist | UserPlaylist): + result = media.name + elif name == "album_title": + if isinstance(media, Album): + result = media.name + elif isinstance(media, Track): + result = media.album.name + elif name == "track_num": + if isinstance(media, Track | Video): + num_tracks: int = media.album.num_tracks if hasattr(media, "album") else 1 + count_digits: int = int(math.log10(len(str(num_tracks)))) + 1 + result = str(media.track_num).zfill(count_digits) + elif name == "track_id": + if isinstance(media, Track | Video): + result = media.id + elif name == "track_id": + if isinstance(media, Track): + result = media.id + elif name == "playlist_id": + if isinstance(media, Playlist): + result = media.id + elif name == "track_duration_seconds": + if isinstance(media, Track | Video): + result = str(media.duration) + elif name == "track_duration_minutes": + if isinstance(media, Track | Video): + m, s = divmod(media.duration, 60) + result = f"{m:01d}:{s:02d}" + elif name == "album_duration_seconds": + if isinstance(media, Album): + result = str(media.duration) + elif name == "album_duration_minutes": + if isinstance(media, Album): + m, s = divmod(media.duration, 60) + result = f"{m:01d}:{s:02d}" + elif name == "playlist_duration_seconds": + if isinstance(media, Album): + result = str(media.duration) + elif name == "playlist_duration_minutes": + if isinstance(media, Album): + m, s = divmod(media.duration, 60) + result = f"{m:01d}:{s:02d}" + elif name == "album_year": + if isinstance(media, Album): + result = str(media.release_date.year) + elif name == "video_quality": + if isinstance(media, Video): + result = media.video_quality + elif name == "track_quality": + if isinstance(media, Track): + result = ", ".join(tag for tag in media.media_metadata_tags) + except Exception as e: + # TODO: Implement better exception logging. + print(e) + pass return result From bbb6051fdd34fabf7565df480df66c128ffa4ef5 Mon Sep 17 00:00:00 2001 From: Robert Honz Date: Wed, 13 Mar 2024 06:38:13 +0100 Subject: [PATCH 2/2] =?UTF-8?q?=E2=9C=A8=20Track=20media=20items=20will=20?= =?UTF-8?q?be=20re-created=20with=20album=20information.=20Path=20format?= =?UTF-8?q?=20refactored.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tidal_dl_ng/download.py | 19 ++++++++++--------- tidal_dl_ng/helper/path.py | 11 ++++++----- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/tidal_dl_ng/download.py b/tidal_dl_ng/download.py index 7490753..82e1bee 100644 --- a/tidal_dl_ng/download.py +++ b/tidal_dl_ng/download.py @@ -156,20 +156,19 @@ class Download: def instantiate_media( self, - session: Session, media_type: type[MediaType.TRACK, MediaType.VIDEO, MediaType.ALBUM, MediaType.PLAYLIST, MediaType.MIX], id_media: str, - ) -> Track | Video: + ) -> Track | Video | Album | Playlist | Mix: if media_type == MediaType.TRACK: - media = Track(session, id_media) + media = self.session.track(id_media, with_album=True) elif media_type == MediaType.VIDEO: - media = Video(session, id_media) + media = self.session.video(id_media) elif media_type == MediaType.ALBUM: - media = Album(self.session, id_media) + media = self.session.album(id_media) elif media_type == MediaType.PLAYLIST: - media = Playlist(self.session, id_media) + media = self.session.playlist(id_media) elif media_type == MediaType.MIX: - media = Mix(self.session, id_media) + media = self.session.mix(id_media) else: raise MediaUnknown @@ -186,7 +185,9 @@ class Download: ) -> (bool, str): # If no media instance is provided, we need to create the media instance. if media_id and media_type: - media = self.instantiate_media(self.session, media_type, media_id) + media = self.instantiate_media(media_type, media_id) + elif isinstance(media, Track): + media = self.session.track(media.id, with_album=True) elif not media: raise MediaMissing @@ -342,7 +343,7 @@ class Download: ): # If no media instance is provided, we need to create the media instance. if media_id and media_type: - media = self.instantiate_media(self.session, media_type, media_id) + media = self.instantiate_media(media_type, media_id) elif not media: raise MediaMissing diff --git a/tidal_dl_ng/helper/path.py b/tidal_dl_ng/helper/path.py index 81b7b1a..65f9163 100644 --- a/tidal_dl_ng/helper/path.py +++ b/tidal_dl_ng/helper/path.py @@ -101,17 +101,17 @@ def format_str_media(name: str, media: Track | Album | Playlist | UserPlaylist | result = media.name elif isinstance(media, Track): result = media.album.name - elif name == "track_num": + elif name == "album_track_num": if isinstance(media, Track | Video): num_tracks: int = media.album.num_tracks if hasattr(media, "album") else 1 - count_digits: int = int(math.log10(len(str(num_tracks)))) + 1 + count_digits: int = int(math.log10(num_tracks)) + 1 result = str(media.track_num).zfill(count_digits) + elif name == "album_num_tracks": + if isinstance(media, Track | Video): + result = str(media.album.num_tracks if hasattr(media, "album") else 1) elif name == "track_id": if isinstance(media, Track | Video): result = media.id - elif name == "track_id": - if isinstance(media, Track): - result = media.id elif name == "playlist_id": if isinstance(media, Playlist): result = media.id @@ -148,6 +148,7 @@ def format_str_media(name: str, media: Track | Album | Playlist | UserPlaylist | except Exception as e: # TODO: Implement better exception logging. print(e) + pass return result