Add option for not falling back on YouTube metadata

This commit is contained in:
Ritiek Malhotra
2018-12-31 23:56:11 +05:30
parent eb77880f9f
commit e56cd3caca
3 changed files with 43 additions and 15 deletions

View File

@@ -163,8 +163,6 @@ class Downloader:
if not refined_songname == " - ": if not refined_songname == " - ":
songname = refined_songname songname = refined_songname
else: else:
if not const.args.no_metadata:
log.warning("Could not find metadata")
songname = internals.sanitize_title(songname) songname = internals.sanitize_title(songname)
return songname return songname

View File

@@ -17,6 +17,7 @@ default_conf = {
"spotify-downloader": { "spotify-downloader": {
"manual": False, "manual": False,
"no-metadata": False, "no-metadata": False,
"no-fallback-metadata": False,
"avconv": False, "avconv": False,
"folder": internals.get_music_dir(), "folder": internals.get_music_dir(),
"overwrite": "prompt", "overwrite": "prompt",
@@ -132,7 +133,7 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True):
"-m", "-m",
"--manual", "--manual",
default=config["manual"], default=config["manual"],
help="choose the track to download manually from a list " "of matching tracks", help="choose the track to download manually from a list of matching tracks",
action="store_true", action="store_true",
) )
parser.add_argument( parser.add_argument(
@@ -142,6 +143,13 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True):
help="do not embed metadata in tracks", help="do not embed metadata in tracks",
action="store_true", action="store_true",
) )
parser.add_argument(
"-nf",
"--no-fallback-metadata",
default=config["no-fallback-metadata"],
help="use YouTube metadata as fallback if track not found on Spotify",
action="store_true",
)
parser.add_argument( parser.add_argument(
"-a", "-a",
"--avconv", "--avconv",
@@ -284,6 +292,9 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True):
if parsed.avconv and parsed.trim_silence: if parsed.avconv and parsed.trim_silence:
parser.error("--trim-silence can only be used with FFmpeg") parser.error("--trim-silence can only be used with FFmpeg")
if parsed.no_metadata and parsed.no_fallback_metadata:
parser.error('--no-metadata and --no-fallback-metadata cannot be used together')
parsed.log_level = log_leveller(parsed.log_level) parsed.log_level = log_leveller(parsed.log_level)
return parsed return parsed

View File

@@ -45,29 +45,48 @@ def go_pafy(raw_song, meta_tags=None):
return track_info return track_info
def match_video_and_metadata(track, force_pafy=True): def match_video_and_metadata(track):
""" Get and match track data from YouTube and Spotify. """ """ Get and match track data from YouTube and Spotify. """
meta_tags = None meta_tags = None
def fallback_metadata(meta_tags):
fallback_metadata_info = "Track not found on Spotify, falling back on YouTube metadata"
skip_fallback_metadata_warning = "Fallback condition not met, shall not embed metadata"
if meta_tags is None:
if const.args.no_fallback_metadata:
log.warning(skip_fallback_metadata_warning)
else:
log.info(fallback_metadata_info)
meta_tags = generate_metadata(content)
return meta_tags
if internals.is_youtube(track): if internals.is_youtube(track):
log.debug("Input song is a YouTube URL") log.debug("Input song is a YouTube URL")
content = go_pafy(track, meta_tags=None) content = go_pafy(track, meta_tags=None)
track = slugify(content.title).replace("-", " ") track = slugify(content.title).replace("-", " ")
if not const.args.no_metadata: if not const.args.no_metadata:
meta_tags = spotify_tools.generate_metadata(track) meta_tags = spotify_tools.generate_metadata(track)
if meta_tags is None: # and const.args.allow_youtube: meta_tags = fallback_metadata(meta_tags)
meta_tags = generate_metadata(content)
else:
# Let it generate metadata, youtube doesn't know spotify slang
if not const.args.no_metadata or internals.is_spotify(track):
meta_tags = spotify_tools.generate_metadata(track)
if force_pafy: elif internals.is_spotify(track):
content = go_pafy(track, meta_tags) log.debug("Input song is a Spotify URL")
if meta_tags is None: # and const.args.allow_youtube: # Let it generate metadata, YouTube doesn't know Spotify slang
meta_tags = generate_metadata(content) meta_tags = spotify_tools.generate_metadata(track)
content = go_pafy(track, meta_tags)
if const.args.no_metadata:
meta_tags = None
else:
log.debug("Input song is plain text based")
if const.args.no_metadata:
content = go_pafy(track, meta_tags=None)
else: else:
content = None meta_tags = spotify_tools.generate_metadata(track)
content = go_pafy(track, meta_tags=meta_tags)
meta_tags = fallback_metadata(meta_tags)
return content, meta_tags return content, meta_tags