♻️ Refactored download for CLI.

This commit is contained in:
Robert Honz
2024-01-14 23:09:43 +01:00
parent affaae101e
commit ec728d4dcd
9 changed files with 134 additions and 90 deletions
+56 -9
View File
@@ -8,8 +8,11 @@ from pathvalidate import sanitize_filename, sanitize_filepath
from pathvalidate.error import ValidationError
from tidalapi import Album, Mix, Playlist, Track, UserPlaylist, Video
from tidal_dl_ng import __name_display__
from tidal_dl_ng.constants import MediaType
def path_base():
def path_home() -> str:
if "XDG_CONFIG_HOME" in os.environ:
return os.environ["XDG_CONFIG_HOME"]
elif "HOME" in os.environ:
@@ -20,16 +23,41 @@ def path_base():
return os.path.abspath("./")
def path_file_log():
return os.path.join(path_base(), ".tidal-dl-ng.log")
def path_base() -> str:
path_config: str = ".config"
path_base: str = os.path.join(path_home(), path_config, __name_display__)
return path_base
def path_file_token():
return os.path.join(path_base(), ".tidal-dl-ng_token.json")
def path_file_log() -> str:
# TODO: Remove this soon. Only for migration to new dir.
old = os.path.join(path_home(), ".tidal-dl-ng.log")
if os.path.isfile(old):
os.makedirs(path_base(), exist_ok=True)
os.rename(old, os.path.join(path_base(), "app.log"))
return os.path.join(path_base(), "app.log")
def path_file_settings():
return os.path.join(path_base(), ".tidal-dl-ng_settings.json")
def path_file_token() -> str:
# TODO: Remove this soon. Only for migration to new dir.
old = os.path.join(path_home(), ".tidal-dl-ng_token.json")
if os.path.isfile(old):
os.makedirs(path_base(), exist_ok=True)
os.rename(old, os.path.join(path_base(), "token.json"))
return os.path.join(path_base(), "token.json")
def path_file_settings() -> str:
# TODO: Remove this soon. Only for migration to new dir.
old = os.path.join(path_home(), ".tidal-dl-ng_settings.json")
if os.path.isfile(old):
os.makedirs(path_base(), exist_ok=True)
os.rename(old, os.path.join(path_base(), "settings.json"))
return os.path.join(path_base(), "settings.json")
def format_path_media(fmt_template: str, media: Track | Album | Playlist | UserPlaylist | Video | Mix) -> str:
@@ -38,7 +66,7 @@ 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_fn_format(media)
fn_format = get_format_fn(media)
for _matchNum, match in enumerate(matches, start=1):
template_str = match.group()
@@ -104,7 +132,7 @@ def format_str_video(name: str, media: Video) -> str | bool:
return result
def get_fn_format(media: Track | Album | Playlist | UserPlaylist | Video | Mix) -> Callable:
def get_format_fn(media: Track | Album | Playlist | UserPlaylist | Video | Mix) -> Callable:
result = None
if isinstance(media, Track):
@@ -121,6 +149,25 @@ def get_fn_format(media: Track | Album | Playlist | UserPlaylist | Video | Mix)
return result
def get_format_template(
media: Track | Album | Playlist | UserPlaylist | Video | Mix | MediaType, settings
) -> str | bool:
result = False
if isinstance(media, Track) or media == MediaType.Track:
result = settings.data.format_track
elif isinstance(media, Album) or media == MediaType.Album:
result = settings.data.format_album
elif isinstance(media, Playlist | UserPlaylist) or media == MediaType.Playlist:
result = settings.data.format_playlist
elif isinstance(media, Mix) or media == MediaType.Mix:
result = settings.data.format_mix
elif isinstance(media, Video) or media == MediaType.Video:
result = settings.data.format_video
return result
def path_file_sanitize(path_file: str, adapt: bool = False) -> (bool, str):
# Split into path and filename
pathname, filename = os.path.split(path_file)
+30
View File
@@ -1,5 +1,7 @@
from tidalapi import Track
from tidal_dl_ng.constants import MediaType
def name_builder_artist(media: Track) -> str:
return ", ".join(artist.name for artist in media.artists)
@@ -11,3 +13,31 @@ def name_builder_title(media: Track) -> str:
def name_builder_item(media: Track) -> str:
return f"{name_builder_artist(media)} - {name_builder_title(media)}"
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":
result = MediaType.Track
elif media_name == "video":
result = MediaType.Video
elif media_name == "album":
result = MediaType.Album
elif media_name == "playlist":
result = MediaType.Playlist
elif media_name == "mix":
result = MediaType.Mix
return result
-15
View File
@@ -1,15 +0,0 @@
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) -> str | bool:
result = False
url_split = url_media.split("/")[-2]
if len(url_split) > 1:
result = url_media.split("/")[-2]
return result