summaryrefslogtreecommitdiff
path: root/tidal_dl_ng/helper/path.py
diff options
context:
space:
mode:
authorRobert Honz <exislow+github@gmail.com>2025-04-02 07:00:28 +0200
committerRobert Honz <exislow+github@gmail.com>2025-04-02 07:00:28 +0200
commit819655d8b7dc108fd1d9bc7e7deded6baa9bb624 (patch)
treea10a0b33847d47da604d66b1e34f5d7affba1ba8 /tidal_dl_ng/helper/path.py
parentd7a9227c0668dd49c966387d12ecd3c6a216bcff (diff)
downloadtidal-dl-ng-819655d8b7dc108fd1d9bc7e7deded6baa9bb624.tar.gz
✨ Implemented playlist track position naming (`{list_pos}`) for downloads. Fixes #165
Diffstat (limited to 'tidal_dl_ng/helper/path.py')
-rw-r--r--tidal_dl_ng/helper/path.py40
1 files changed, 32 insertions, 8 deletions
diff --git a/tidal_dl_ng/helper/path.py b/tidal_dl_ng/helper/path.py
index a02ebd2..7e90b61 100644
--- a/tidal_dl_ng/helper/path.py
+++ b/tidal_dl_ng/helper/path.py
@@ -51,7 +51,11 @@ def path_file_settings() -> str:
def format_path_media(
- fmt_template: str, media: Track | Album | Playlist | UserPlaylist | Video | Mix, album_track_num_pad_min: int = 0
+ fmt_template: str,
+ media: Track | Album | Playlist | UserPlaylist | Video | Mix,
+ album_track_num_pad_min: int = 0,
+ list_pos: int = 0,
+ list_total: int = 0,
) -> str:
result = fmt_template
@@ -61,7 +65,7 @@ def format_path_media(
for _matchNum, match in enumerate(matches, start=1):
template_str = match.group()
- result_fmt = format_str_media(match.group(1), media, album_track_num_pad_min)
+ result_fmt = format_str_media(match.group(1), media, album_track_num_pad_min, list_pos, list_total)
if result_fmt != match.group(1):
value = sanitize_filename(result_fmt)
@@ -71,7 +75,11 @@ def format_path_media(
def format_str_media(
- name: str, media: Track | Album | Playlist | UserPlaylist | Video | Mix, album_track_num_pad_min: int = 0
+ name: str,
+ media: Track | Album | Playlist | UserPlaylist | Video | Mix,
+ album_track_num_pad_min: int = 0,
+ list_pos: int = 0,
+ list_total: int = 0,
) -> str:
result: str = name
@@ -101,12 +109,11 @@ def format_str_media(
result = media.album.name
case "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(num_tracks)) + 1
- count_digits_computed: int = (
- count_digits if count_digits > album_track_num_pad_min else album_track_num_pad_min
+ result = calculate_number_padding(
+ album_track_num_pad_min,
+ media.track_num,
+ media.album.num_tracks if hasattr(media, "album") else 1,
)
- result = str(media.track_num).zfill(count_digits_computed)
case "album_num_tracks":
if isinstance(media, Track | Video):
result = str(media.album.num_tracks if hasattr(media, "album") else 1)
@@ -176,6 +183,10 @@ def format_str_media(
case "isrc":
if isinstance(media, Track):
result = media.isrc
+ case "list_pos":
+ if isinstance(media, Track | Video):
+ # TODO: Rename `album_track_num_pad_min` globally.
+ result = calculate_number_padding(album_track_num_pad_min, list_pos, list_total)
except Exception as e:
# TODO: Implement better exception logging.
print(e)
@@ -185,6 +196,19 @@ def format_str_media(
return result
+def calculate_number_padding(padding_minimum: int, item_position: int, items_max: int) -> str:
+ result: str
+
+ if items_max > 0:
+ count_digits: int = int(math.log10(items_max)) + 1
+ count_digits_computed: int = count_digits if count_digits > padding_minimum else padding_minimum
+ result = str(item_position).zfill(count_digits_computed)
+ else:
+ result = str(item_position)
+
+ return result
+
+
def get_format_template(
media: Track | Album | Playlist | UserPlaylist | Video | Mix | MediaType, settings
) -> str | bool: