From ea6d52999f1d820fcd3ac6f5a335889bbe08c341 Mon Sep 17 00:00:00 2001 From: ritiek Date: Tue, 9 Jan 2018 17:12:26 +0530 Subject: [PATCH] Refactor metadata --- core/metadata.py | 186 ++++++++++++++++++++++++----------------------- spotdl.py | 36 +++++---- 2 files changed, 114 insertions(+), 108 deletions(-) diff --git a/core/metadata.py b/core/metadata.py index 969f2e0..e7b795f 100755 --- a/core/metadata.py +++ b/core/metadata.py @@ -12,12 +12,9 @@ def compare(music_file, metadata): try: if music_file.endswith('.mp3'): audiofile = EasyID3(music_file) - # fetch track title metadata already_tagged = audiofile['title'][0] == metadata['name'] elif music_file.endswith('.m4a'): - tags = {'title': '\xa9nam'} audiofile = MP4(music_file) - # fetch track title metadata already_tagged = audiofile[tags['title']] == metadata['name'] except (KeyError, TypeError): pass @@ -26,102 +23,107 @@ def compare(music_file, metadata): def embed(music_file, meta_tags): """ Embed metadata. """ - if meta_tags is None: - log.warning('Could not find metadata') - return None - elif music_file.endswith('.m4a'): + embedder = EmbedMetadata(music_file, meta_tags) + if music_file.endswith('.m4a'): log.info('Applying metadata') - return embed_m4a(music_file, meta_tags) + return embedder.m4a() elif music_file.endswith('.mp3'): log.info('Applying metadata') - return embed_mp3(music_file, meta_tags) + return embedder.mp3() else: log.warning('Cannot embed metadata into given output extension') return False +class EmbedMetadata: + def __init__(self, music_file, meta_tags): + self.music_file = music_file + self.meta_tags = meta_tags -def embed_mp3(music_file, meta_tags): - """ Embed metadata to MP3 files. """ - # EasyID3 is fun to use ;) - audiofile = EasyID3(music_file) - audiofile['artist'] = meta_tags['artists'][0]['name'] - audiofile['albumartist'] = meta_tags['artists'][0]['name'] - audiofile['album'] = meta_tags['album']['name'] - audiofile['title'] = meta_tags['name'] - audiofile['tracknumber'] = [meta_tags['track_number'], - meta_tags['total_tracks']] - audiofile['discnumber'] = [meta_tags['disc_number'], 0] - audiofile['date'] = meta_tags['release_date'] - audiofile['originaldate'] = meta_tags['release_date'] - audiofile['media'] = meta_tags['type'] - audiofile['author'] = meta_tags['artists'][0]['name'] - audiofile['lyricist'] = meta_tags['artists'][0]['name'] - audiofile['arranger'] = meta_tags['artists'][0]['name'] - audiofile['performer'] = meta_tags['artists'][0]['name'] - audiofile['website'] = meta_tags['external_urls']['spotify'] - audiofile['length'] = str(meta_tags['duration_ms'] / 1000) - if meta_tags['publisher']: - audiofile['encodedby'] = meta_tags['publisher'] - if meta_tags['genre']: - audiofile['genre'] = meta_tags['genre'] - if meta_tags['copyright']: - audiofile['copyright'] = meta_tags['copyright'] - if meta_tags['external_ids']['isrc']: - audiofile['isrc'] = meta_tags['external_ids']['isrc'] - audiofile.save(v2_version=3) - audiofile = ID3(music_file) - try: - albumart = urllib.request.urlopen(meta_tags['album']['images'][0]['url']) - audiofile["APIC"] = APIC(encoding=3, mime='image/jpeg', type=3, - desc=u'Cover', data=albumart.read()) - albumart.close() - except IndexError: - pass - audiofile.save(v2_version=3) - return True + def mp3(self): + """ Embed metadata to MP3 files. """ + music_file = self.music_file + meta_tags = self.meta_tags + # EasyID3 is fun to use ;) + audiofile = EasyID3(music_file) + audiofile['artist'] = meta_tags['artists'][0]['name'] + audiofile['albumartist'] = meta_tags['artists'][0]['name'] + audiofile['album'] = meta_tags['album']['name'] + audiofile['title'] = meta_tags['name'] + audiofile['tracknumber'] = [meta_tags['track_number'], + meta_tags['total_tracks']] + audiofile['discnumber'] = [meta_tags['disc_number'], 0] + audiofile['date'] = meta_tags['release_date'] + audiofile['originaldate'] = meta_tags['release_date'] + audiofile['media'] = meta_tags['type'] + audiofile['author'] = meta_tags['artists'][0]['name'] + audiofile['lyricist'] = meta_tags['artists'][0]['name'] + audiofile['arranger'] = meta_tags['artists'][0]['name'] + audiofile['performer'] = meta_tags['artists'][0]['name'] + audiofile['website'] = meta_tags['external_urls']['spotify'] + audiofile['length'] = str(meta_tags['duration_ms'] / 1000) + if meta_tags['publisher']: + audiofile['encodedby'] = meta_tags['publisher'] + if meta_tags['genre']: + audiofile['genre'] = meta_tags['genre'] + if meta_tags['copyright']: + audiofile['copyright'] = meta_tags['copyright'] + if meta_tags['external_ids']['isrc']: + audiofile['isrc'] = meta_tags['external_ids']['isrc'] + audiofile.save(v2_version=3) + audiofile = ID3(music_file) + try: + albumart = urllib.request.urlopen(meta_tags['album']['images'][0]['url']) + audiofile["APIC"] = APIC(encoding=3, mime='image/jpeg', type=3, + desc=u'Cover', data=albumart.read()) + albumart.close() + except IndexError: + pass + audiofile.save(v2_version=3) + return True + def m4a(self): + """ Embed metadata to M4A files. """ + music_file = self.music_file + meta_tags = self.meta_tags + # Apple has specific tags - see mutagen docs - + # http://mutagen.readthedocs.io/en/latest/api/mp4.html + tags = {'album': '\xa9alb', + 'artist': '\xa9ART', + 'date': '\xa9day', + 'title': '\xa9nam', + 'originaldate': 'purd', + 'comment': '\xa9cmt', + 'group': '\xa9grp', + 'writer': '\xa9wrt', + 'genre': '\xa9gen', + 'tracknumber': 'trkn', + 'albumartist': 'aART', + 'disknumber': 'disk', + 'cpil': 'cpil', + 'albumart': 'covr', + 'copyright': 'cprt', + 'tempo': 'tmpo'} -def embed_m4a(music_file, meta_tags): - """ Embed metadata to M4A files. """ - # Apple has specific tags - see mutagen docs - - # http://mutagen.readthedocs.io/en/latest/api/mp4.html - tags = {'album': '\xa9alb', - 'artist': '\xa9ART', - 'date': '\xa9day', - 'title': '\xa9nam', - 'originaldate': 'purd', - 'comment': '\xa9cmt', - 'group': '\xa9grp', - 'writer': '\xa9wrt', - 'genre': '\xa9gen', - 'tracknumber': 'trkn', - 'albumartist': 'aART', - 'disknumber': 'disk', - 'cpil': 'cpil', - 'albumart': 'covr', - 'copyright': 'cprt', - 'tempo': 'tmpo'} - - audiofile = MP4(music_file) - audiofile[tags['artist']] = meta_tags['artists'][0]['name'] - audiofile[tags['albumartist']] = meta_tags['artists'][0]['name'] - audiofile[tags['album']] = meta_tags['album']['name'] - audiofile[tags['title']] = meta_tags['name'] - audiofile[tags['tracknumber']] = [(meta_tags['track_number'], - meta_tags['total_tracks'])] - audiofile[tags['disknumber']] = [(meta_tags['disc_number'], 0)] - audiofile[tags['date']] = meta_tags['release_date'] - audiofile[tags['originaldate']] = meta_tags['release_date'] - if meta_tags['genre']: - audiofile[tags['genre']] = meta_tags['genre'] - if meta_tags['copyright']: - audiofile[tags['copyright']] = meta_tags['copyright'] - try: - albumart = urllib.request.urlopen(meta_tags['album']['images'][0]['url']) - audiofile[tags['albumart']] = [MP4Cover( - albumart.read(), imageformat=MP4Cover.FORMAT_JPEG)] - albumart.close() - except IndexError: - pass - audiofile.save() - return True + audiofile = MP4(music_file) + audiofile[tags['artist']] = meta_tags['artists'][0]['name'] + audiofile[tags['albumartist']] = meta_tags['artists'][0]['name'] + audiofile[tags['album']] = meta_tags['album']['name'] + audiofile[tags['title']] = meta_tags['name'] + audiofile[tags['tracknumber']] = [(meta_tags['track_number'], + meta_tags['total_tracks'])] + audiofile[tags['disknumber']] = [(meta_tags['disc_number'], 0)] + audiofile[tags['date']] = meta_tags['release_date'] + audiofile[tags['originaldate']] = meta_tags['release_date'] + if meta_tags['genre']: + audiofile[tags['genre']] = meta_tags['genre'] + if meta_tags['copyright']: + audiofile[tags['copyright']] = meta_tags['copyright'] + try: + albumart = urllib.request.urlopen(meta_tags['album']['images'][0]['url']) + audiofile[tags['albumart']] = [MP4Cover( + albumart.read(), imageformat=MP4Cover.FORMAT_JPEG)] + albumart.close() + except IndexError: + pass + audiofile.save() + return True diff --git a/spotdl.py b/spotdl.py index 4d51d68..e69570f 100755 --- a/spotdl.py +++ b/spotdl.py @@ -56,7 +56,7 @@ def generate_youtube_url(raw_song, meta_tags, tries_remaining=5): if args.music_videos_only: query['videoCategoryId'] = '10' - if meta_tags is None: + if not meta_tags: song = raw_song query['q'] = song else: @@ -79,7 +79,7 @@ def generate_youtube_url(raw_song, meta_tags, tries_remaining=5): 'videotime':internals.videotime_from_seconds(duration_s), 'seconds': duration_s} videos.append(youtubedetails) - if meta_tags is None: + if not meta_tags: break if not videos: @@ -96,10 +96,10 @@ def generate_youtube_url(raw_song, meta_tags, tries_remaining=5): "http://youtube.com/watch?v="+v['link'])) # let user select the song to download result = internals.input_link(videos) - if result is None: + if not result: return None else: - if meta_tags is None: + if not meta_tags: # if the metadata could not be acquired, take the first result # from Youtube because the proper song length is unknown result = videos[0] @@ -139,10 +139,10 @@ def go_pafy(raw_song, meta_tags=None): else: track_url = generate_youtube_url(raw_song, meta_tags) - if track_url is None: - track_info = None - else: + if track_url: track_info = pafy.new(track_url) + else: + track_info = None return track_info @@ -150,10 +150,10 @@ def go_pafy(raw_song, meta_tags=None): def get_youtube_title(content, number=None): """ Get the YouTube video's title. """ title = content.title - if number is None: - return title - else: + if number: return '{0}. {1}'.format(number, title) + else: + return title def download_song(file_name, content): @@ -163,15 +163,15 @@ def download_song(file_name, content): else: return False - if link is None: - return False - else: + if link: log.debug('Downloading from URL: ' + link.url) filepath = '{0}{1}'.format(os.path.join(args.folder, file_name), args.input_ext) log.debug('Saving to: ' + filepath) link.download(filepath=filepath) return True + else: + return False def check_exists(music_file, raw_song, meta_tags): @@ -294,7 +294,7 @@ def grab_single(raw_song, number=None): meta_tags = spotify_tools.generate_metadata(raw_song) content = go_pafy(raw_song, meta_tags) - if content is None: + if not content: log.debug('Found no matching video') return @@ -305,7 +305,7 @@ def grab_single(raw_song, number=None): # generate file name of the song to download songname = content.title - if meta_tags is not None: + if meta_tags: refined_songname = generate_songname(meta_tags) log.debug('Refining songname from "{0}" to "{1}"'.format(songname, refined_songname)) if not refined_songname == ' - ': @@ -333,8 +333,12 @@ def grab_single(raw_song, number=None): if not args.input_ext == args.output_ext: os.remove(os.path.join(args.folder, input_song)) + if not args.no_metadata: - metadata.embed(os.path.join(args.folder, output_song), meta_tags) + if metadata: + metadata.embed(os.path.join(args.folder, output_song), meta_tags) + else: + log.warning('Could not find metadata') else: log.error('No audio streams available')