fix: sanlitize the meta dict's hard-copy before format the path, otherwise strange album name such as 'xxx \ cccc' would not get cleaned by last process and crush the os.

pull/8/head
Xie, Tianshi 4 months ago
parent c6bc6e957e
commit 39976d144b
  1. 21
      src/utils.py

@ -13,6 +13,8 @@ from src.exceptions import NotTimeSyncedLyricsException
from src.models import PlaylistInfo from src.models import PlaylistInfo
from src.types import * from src.types import *
from copy import deepcopy
def check_url(url): def check_url(url):
pattern = regex.compile( pattern = regex.compile(
@ -146,17 +148,26 @@ def playlist_metadata_to_params(playlist: PlaylistInfo):
return {"playlistName": playlist.data[0].attributes.name, return {"playlistName": playlist.data[0].attributes.name,
"playlistCuratorName": playlist.data[0].attributes.curatorName} "playlistCuratorName": playlist.data[0].attributes.curatorName}
def get_path_safe_dict(param: dict):
new_param = deepcopy(param)
for key, val in new_param.items():
if isinstance(val, str):
new_param[key] = get_valid_filename(str(val))
return new_param
def get_song_name_and_dir_path(codec: str, config: Download, metadata, playlist: PlaylistInfo = None): def get_song_name_and_dir_path(codec: str, config: Download, metadata, playlist: PlaylistInfo = None):
if playlist: if playlist:
safe_meta = get_path_safe_dict(metadata.model_dump())
safe_pl_meta = get_path_safe_dict(playlist_metadata_to_params(playlist))
song_name = config.playlistSongNameFormat.format(codec=codec, playlistSongIndex=metadata.playlistIndex, song_name = config.playlistSongNameFormat.format(codec=codec, playlistSongIndex=metadata.playlistIndex,
**metadata.model_dump()) **safe_meta)
dir_path = Path(config.playlistDirPathFormat.format(codec=codec, dir_path = Path(config.playlistDirPathFormat.format(codec=codec,
**metadata.model_dump(), **safe_meta,
**playlist_metadata_to_params(playlist))) **safe_pl_meta))
else: else:
song_name = config.songNameFormat.format(codec=codec, **metadata.model_dump()) safe_meta = get_path_safe_dict(metadata.model_dump())
dir_path = Path(config.dirPathFormat.format(codec=codec, **metadata.model_dump())) song_name = config.songNameFormat.format(codec=codec, **safe_meta)
dir_path = Path(config.dirPathFormat.format(codec=codec, **safe_meta))
if sys.platform == "win32": if sys.platform == "win32":
song_name = get_valid_filename(song_name) song_name = get_valid_filename(song_name)
dir_path = Path(*[get_valid_filename(part) if ":\\" not in part else part for part in dir_path.parts]) dir_path = Path(*[get_valid_filename(part) if ":\\" not in part else part for part in dir_path.parts])

Loading…
Cancel
Save