♻️ Refactored format_str method to one format_str_media method.

This commit is contained in:
Robert Honz
2024-02-26 06:04:41 +01:00
parent d5d53c6c92
commit 832f5ce443
2 changed files with 74 additions and 70 deletions
+1 -1
View File
@@ -310,7 +310,7 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
else: else:
self.s_tr_results_add_top_level_item.emit(child) 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. # Format seconds to mm:ss.
m, s = divmod(item.duration_sec, 60) m, s = divmod(item.duration_sec, 60)
duration: str = f"{m:02d}:{s:02d}" duration: str = f"{m:02d}:{s:02d}"
+73 -69
View File
@@ -1,7 +1,7 @@
import glob import glob
import math
import os import os
import re import re
from collections.abc import Callable
from pathlib import Path from pathlib import Path
from pathvalidate import sanitize_filename, sanitize_filepath 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. # Search track format template for placeholder.
regex = r"\{(.+?)\}" regex = r"\{(.+?)\}"
matches = re.finditer(regex, fmt_template, re.MULTILINE) matches = re.finditer(regex, fmt_template, re.MULTILINE)
fn_format = get_format_fn(media)
for _matchNum, match in enumerate(matches, start=1): for _matchNum, match in enumerate(matches, start=1):
template_str = match.group() 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) value = sanitize_filename(result_fmt)
result = result.replace(template_str, value) result = result.replace(template_str, value)
return result return result
def format_str_track(name: str, media: Track) -> str | bool: def format_str_media(name: str, media: Track | Album | Playlist | UserPlaylist | Video | Mix) -> str:
result: str | bool = False result: str = name
if name == "track_num": try:
result = str(media.track_num).rjust(2, "0") if name == "artist_name":
elif name == "artist_name": if hasattr(media, "artists"):
result = ", ".join(artist.name for artist in media.artists) result = ", ".join(artist.name for artist in media.artists)
elif name == "track_title": elif hasattr(media, "artist"):
result = media.name result = media.artist.name
elif name == "track_title":
return result if isinstance(media, Track | Video):
result = media.name
elif name == "mix_name":
def format_str_album(name: str, media: Album) -> str | bool: if isinstance(media, Mix):
result: str | bool = False result = media.title
elif name == "playlist_name":
if name == "album_title": if isinstance(media, Playlist | UserPlaylist):
result = media.name result = media.name
elif name == "artist_name": elif name == "album_title":
result = media.artist.name if isinstance(media, Album):
result = media.name
return result elif isinstance(media, Track):
result = media.album.name
elif name == "track_num":
def format_str_playlist(name: str, media: Playlist) -> str | bool: if isinstance(media, Track | Video):
result: str | bool = False num_tracks: int = media.album.num_tracks if hasattr(media, "album") else 1
count_digits: int = int(math.log10(len(str(num_tracks)))) + 1
if name == "playlist_name": result = str(media.track_num).zfill(count_digits)
result = media.name elif name == "track_id":
if isinstance(media, Track | Video):
return result result = media.id
elif name == "track_id":
if isinstance(media, Track):
def format_str_mix(name: str, media: Mix) -> str | bool: result = media.id
result: str | bool = False elif name == "playlist_id":
if isinstance(media, Playlist):
if name == "mix_name": result = media.id
result = media.title elif name == "track_duration_seconds":
if isinstance(media, Track | Video):
return result result = str(media.duration)
elif name == "track_duration_minutes":
if isinstance(media, Track | Video):
def format_str_video(name: str, media: Video) -> str | bool: m, s = divmod(media.duration, 60)
result: str | bool = False result = f"{m:01d}:{s:02d}"
elif name == "album_duration_seconds":
if name == "artist_name": if isinstance(media, Album):
result = ", ".join(artist.name for artist in media.artists) result = str(media.duration)
elif name == "track_title": elif name == "album_duration_minutes":
result = media.name if isinstance(media, Album):
m, s = divmod(media.duration, 60)
return result result = f"{m:01d}:{s:02d}"
elif name == "playlist_duration_seconds":
if isinstance(media, Album):
def get_format_fn(media: Track | Album | Playlist | UserPlaylist | Video | Mix) -> Callable: result = str(media.duration)
result = None elif name == "playlist_duration_minutes":
if isinstance(media, Album):
if isinstance(media, Track): m, s = divmod(media.duration, 60)
result = format_str_track result = f"{m:01d}:{s:02d}"
elif isinstance(media, Album): elif name == "album_year":
result = format_str_album if isinstance(media, Album):
elif isinstance(media, Playlist | UserPlaylist): result = str(media.release_date.year)
result = format_str_playlist elif name == "video_quality":
elif isinstance(media, Mix): if isinstance(media, Video):
result = format_str_mix result = media.video_quality
elif isinstance(media, Video): elif name == "track_quality":
result = format_str_video 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 return result