Refactor metadata

This commit is contained in:
ritiek
2018-01-09 17:12:26 +05:30
parent 84fbb30412
commit ea6d52999f
2 changed files with 114 additions and 108 deletions

View File

@@ -12,12 +12,9 @@ def compare(music_file, metadata):
try: try:
if music_file.endswith('.mp3'): if music_file.endswith('.mp3'):
audiofile = EasyID3(music_file) audiofile = EasyID3(music_file)
# fetch track title metadata
already_tagged = audiofile['title'][0] == metadata['name'] already_tagged = audiofile['title'][0] == metadata['name']
elif music_file.endswith('.m4a'): elif music_file.endswith('.m4a'):
tags = {'title': '\xa9nam'}
audiofile = MP4(music_file) audiofile = MP4(music_file)
# fetch track title metadata
already_tagged = audiofile[tags['title']] == metadata['name'] already_tagged = audiofile[tags['title']] == metadata['name']
except (KeyError, TypeError): except (KeyError, TypeError):
pass pass
@@ -26,22 +23,26 @@ def compare(music_file, metadata):
def embed(music_file, meta_tags): def embed(music_file, meta_tags):
""" Embed metadata. """ """ Embed metadata. """
if meta_tags is None: embedder = EmbedMetadata(music_file, meta_tags)
log.warning('Could not find metadata') if music_file.endswith('.m4a'):
return None
elif music_file.endswith('.m4a'):
log.info('Applying metadata') log.info('Applying metadata')
return embed_m4a(music_file, meta_tags) return embedder.m4a()
elif music_file.endswith('.mp3'): elif music_file.endswith('.mp3'):
log.info('Applying metadata') log.info('Applying metadata')
return embed_mp3(music_file, meta_tags) return embedder.mp3()
else: else:
log.warning('Cannot embed metadata into given output extension') log.warning('Cannot embed metadata into given output extension')
return False 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): def mp3(self):
""" Embed metadata to MP3 files. """ """ Embed metadata to MP3 files. """
music_file = self.music_file
meta_tags = self.meta_tags
# EasyID3 is fun to use ;) # EasyID3 is fun to use ;)
audiofile = EasyID3(music_file) audiofile = EasyID3(music_file)
audiofile['artist'] = meta_tags['artists'][0]['name'] audiofile['artist'] = meta_tags['artists'][0]['name']
@@ -80,9 +81,10 @@ def embed_mp3(music_file, meta_tags):
audiofile.save(v2_version=3) audiofile.save(v2_version=3)
return True return True
def m4a(self):
def embed_m4a(music_file, meta_tags):
""" Embed metadata to M4A files. """ """ Embed metadata to M4A files. """
music_file = self.music_file
meta_tags = self.meta_tags
# Apple has specific tags - see mutagen docs - # Apple has specific tags - see mutagen docs -
# http://mutagen.readthedocs.io/en/latest/api/mp4.html # http://mutagen.readthedocs.io/en/latest/api/mp4.html
tags = {'album': '\xa9alb', tags = {'album': '\xa9alb',

View File

@@ -56,7 +56,7 @@ def generate_youtube_url(raw_song, meta_tags, tries_remaining=5):
if args.music_videos_only: if args.music_videos_only:
query['videoCategoryId'] = '10' query['videoCategoryId'] = '10'
if meta_tags is None: if not meta_tags:
song = raw_song song = raw_song
query['q'] = song query['q'] = song
else: else:
@@ -79,7 +79,7 @@ def generate_youtube_url(raw_song, meta_tags, tries_remaining=5):
'videotime':internals.videotime_from_seconds(duration_s), 'videotime':internals.videotime_from_seconds(duration_s),
'seconds': duration_s} 'seconds': duration_s}
videos.append(youtubedetails) videos.append(youtubedetails)
if meta_tags is None: if not meta_tags:
break break
if not videos: 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'])) "http://youtube.com/watch?v="+v['link']))
# let user select the song to download # let user select the song to download
result = internals.input_link(videos) result = internals.input_link(videos)
if result is None: if not result:
return None return None
else: else:
if meta_tags is None: if not meta_tags:
# if the metadata could not be acquired, take the first result # if the metadata could not be acquired, take the first result
# from Youtube because the proper song length is unknown # from Youtube because the proper song length is unknown
result = videos[0] result = videos[0]
@@ -139,10 +139,10 @@ def go_pafy(raw_song, meta_tags=None):
else: else:
track_url = generate_youtube_url(raw_song, meta_tags) track_url = generate_youtube_url(raw_song, meta_tags)
if track_url is None: if track_url:
track_info = None
else:
track_info = pafy.new(track_url) track_info = pafy.new(track_url)
else:
track_info = None
return track_info return track_info
@@ -150,10 +150,10 @@ def go_pafy(raw_song, meta_tags=None):
def get_youtube_title(content, number=None): def get_youtube_title(content, number=None):
""" Get the YouTube video's title. """ """ Get the YouTube video's title. """
title = content.title title = content.title
if number is None: if number:
return title
else:
return '{0}. {1}'.format(number, title) return '{0}. {1}'.format(number, title)
else:
return title
def download_song(file_name, content): def download_song(file_name, content):
@@ -163,15 +163,15 @@ def download_song(file_name, content):
else: else:
return False return False
if link is None: if link:
return False
else:
log.debug('Downloading from URL: ' + link.url) log.debug('Downloading from URL: ' + link.url)
filepath = '{0}{1}'.format(os.path.join(args.folder, file_name), filepath = '{0}{1}'.format(os.path.join(args.folder, file_name),
args.input_ext) args.input_ext)
log.debug('Saving to: ' + filepath) log.debug('Saving to: ' + filepath)
link.download(filepath=filepath) link.download(filepath=filepath)
return True return True
else:
return False
def check_exists(music_file, raw_song, meta_tags): 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) meta_tags = spotify_tools.generate_metadata(raw_song)
content = go_pafy(raw_song, meta_tags) content = go_pafy(raw_song, meta_tags)
if content is None: if not content:
log.debug('Found no matching video') log.debug('Found no matching video')
return return
@@ -305,7 +305,7 @@ def grab_single(raw_song, number=None):
# generate file name of the song to download # generate file name of the song to download
songname = content.title songname = content.title
if meta_tags is not None: if meta_tags:
refined_songname = generate_songname(meta_tags) refined_songname = generate_songname(meta_tags)
log.debug('Refining songname from "{0}" to "{1}"'.format(songname, refined_songname)) log.debug('Refining songname from "{0}" to "{1}"'.format(songname, refined_songname))
if not 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: if not args.input_ext == args.output_ext:
os.remove(os.path.join(args.folder, input_song)) os.remove(os.path.join(args.folder, input_song))
if not args.no_metadata: if not args.no_metadata:
if metadata:
metadata.embed(os.path.join(args.folder, output_song), meta_tags) metadata.embed(os.path.join(args.folder, output_song), meta_tags)
else:
log.warning('Could not find metadata')
else: else:
log.error('No audio streams available') log.error('No audio streams available')