From 9e37c7c71559e228df051095f25470192d40450f Mon Sep 17 00:00:00 2001 From: jedomed <2604emily@gmail.com> Date: Sat, 5 Aug 2023 01:35:51 +0200 Subject: [PATCH] making tags closer to what you get from bandcamp: added 'album artist', switched 'artist' for 'album artist' in config template, removed artist name from title if album has different album artist and track artist, removed 'lyrics unavailable' message in track metadata if -e option is used but track doesn't have lyrics, don't put track number in metatada if there isn't one (singles had None in the track tag) --- README.rst | 3 ++- bandcamp_dl/bandcamp.py | 8 ++++---- bandcamp_dl/bandcampdownloader.py | 34 +++++++++++++++++++++++-------- bandcamp_dl/deps.txt | 2 +- bandcamp_dl/utils/config.py | 1 + 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/README.rst b/README.rst index 7d0c206..2cec2e1 100644 --- a/README.rst +++ b/README.rst @@ -100,7 +100,8 @@ output file names and directories. Templates can be built using special tokens with the format of ``%{artist}``. Here is a list of allowed tokens: -- ``artist``: The artist name. +- ``trackartist``: The artist name. +- ``artist``: The album artist name. - ``album``: The album name. - ``track``: The track number. - ``title``: The track title. diff --git a/bandcamp_dl/bandcamp.py b/bandcamp_dl/bandcamp.py index 4b89276..a0f2ceb 100644 --- a/bandcamp_dl/bandcamp.py +++ b/bandcamp_dl/bandcamp.py @@ -109,7 +109,7 @@ def get_track_lyrics(self, track_url): return track_lyrics.text else: logging.debug(" Lyrics not found..") - return "lyrics unavailable" + return "" def all_tracks_available(self) -> bool: """Verify that all tracks have a url @@ -133,6 +133,7 @@ def get_track_metadata(track: dict or None) -> dict: "duration": track['duration'], "track": str(track['track_num']), "title": track['title'], + "artist": track['artist'], "url": None } @@ -145,9 +146,8 @@ def get_track_metadata(track: dict or None) -> dict: track_metadata['url'] = None if track['has_lyrics'] is not False: - if track['lyrics'] is None: - track['lyrics'] = "lyrics unavailable" - track_metadata['lyrics'] = track['lyrics'].replace('\\r\\n', '\n') + if track['lyrics'] is not None: + track_metadata['lyrics'] = track['lyrics'].replace('\\r\\n', '\n') logging.debug(" Track metadata generated..") return track_metadata diff --git a/bandcamp_dl/bandcampdownloader.py b/bandcamp_dl/bandcampdownloader.py index 27e6c0c..5c4edf0 100644 --- a/bandcamp_dl/bandcampdownloader.py +++ b/bandcamp_dl/bandcampdownloader.py @@ -74,13 +74,15 @@ def slugify_preset(content): return slugged if self.config['--no-slugify']: - path = path.replace("%{artist}", track['artist']) + path = path.replace("%{trackartist}", track['artist']) + path = path.replace("%{artist}", track['albumartist']) path = path.replace("%{album}", track['album']) path = path.replace("%{title}", track['title']) path = path.replace("%{date}", track['date']) path = path.replace("%{label}", track['label']) else: - path = path.replace("%{artist}", slugify_preset(track['artist'])) + path = path.replace("%{trackartist}", slugify_preset(track['artist'])) + path = path.replace("%{artist}", slugify_preset(track['albumartist'])) path = path.replace("%{album}", slugify_preset(track['album'])) path = path.replace("%{title}", slugify_preset(track['title'])) path = path.replace("%{date}", slugify_preset(track['date'])) @@ -91,7 +93,10 @@ def slugify_preset(content): else: path = path.replace("%{track}", str(track['track']).zfill(2)) - path = f"{self.config['--base-dir']}/{path}.mp3" + if self.config['--base-dir'] is not None: + path = f"{self.config['--base-dir']}/{path}.mp3" + else: + path = f"{path}.mp3" logging.debug(" filepath/trackname generated..") logging.debug(f"\n\tPath: {path}") @@ -120,13 +125,14 @@ def download_album(self, album: dict) -> bool: """ for track_index, track in enumerate(album['tracks']): track_meta = { - "artist": album['artist'], + "artist": track['artist'], + "albumartist": album['artist'], "label": album['label'], "album": album['title'], - "title": track['title'], + "title": track['title'].replace(f"{track['artist']} - ", "", 1), "track": track['track'], # TODO: Find out why the 'lyrics' key seems to vanish. - "lyrics": track.get('lyrics', "lyrics unavailable"), + "lyrics": track.get('lyrics', ""), "date": album['date'] } @@ -247,10 +253,20 @@ def write_id3_tags(self, filepath: str, meta: dict): audio["APIC"] = APIC(encoding=3, mime='image/jpeg', type=3, desc='Cover', data=cover_bytes) audio.save() - audio = EasyMP3(filepath) - audio["tracknumber"] = meta['track'] + audio = EasyMP3(filepath) + + if meta['track'].isdigit(): + audio["tracknumber"] = meta['track'] + else: + audio["tracknumber"] = '1' + + if meta['artist'] is not None: + audio["artist"] = meta['artist'] + else: + audio["artist"] = meta['albumartist'] + audio["title"] = meta["title"] - audio["artist"] = meta['artist'] + audio["albumartist"] = meta['albumartist'] audio["album"] = meta['album'] audio["date"] = meta["date"] audio.save() diff --git a/bandcamp_dl/deps.txt b/bandcamp_dl/deps.txt index 3330930..b92f84e 100644 --- a/bandcamp_dl/deps.txt +++ b/bandcamp_dl/deps.txt @@ -2,7 +2,7 @@ beautifulsoup4==4.10.0 demjson3==3.0.5 docopt-ng==0.8.1 mutagen==1.45.1 -requests==2.26.0 +requests==2.31.0 unicode-slugify==0.1.5 mock==4.0.3 chardet==4.0.0 diff --git a/bandcamp_dl/utils/config.py b/bandcamp_dl/utils/config.py index 7e69d91..fd91e57 100644 --- a/bandcamp_dl/utils/config.py +++ b/bandcamp_dl/utils/config.py @@ -63,4 +63,5 @@ def init_config(arguments) -> json or dict: f.write("".join(str(arguments).split('\n'))) config = {key: arguments.get(key, config[key]) for key in config} + return config