diff --git a/spotdl/downloader.py b/spotdl/downloader.py index 8e8c243..9d0190d 100644 --- a/spotdl/downloader.py +++ b/spotdl/downloader.py @@ -163,8 +163,6 @@ class Downloader: if not refined_songname == " - ": songname = refined_songname else: - if not const.args.no_metadata: - log.warning("Could not find metadata") songname = internals.sanitize_title(songname) return songname diff --git a/spotdl/handle.py b/spotdl/handle.py index 4b6ceb6..c6ebc7e 100644 --- a/spotdl/handle.py +++ b/spotdl/handle.py @@ -17,6 +17,7 @@ default_conf = { "spotify-downloader": { "manual": False, "no-metadata": False, + "no-fallback-metadata": False, "avconv": False, "folder": internals.get_music_dir(), "overwrite": "prompt", @@ -132,7 +133,7 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): "-m", "--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", ) 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", 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( "-a", "--avconv", @@ -284,6 +292,9 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): if parsed.avconv and parsed.trim_silence: 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) return parsed diff --git a/spotdl/youtube_tools.py b/spotdl/youtube_tools.py index 8f19d3d..7b81d73 100644 --- a/spotdl/youtube_tools.py +++ b/spotdl/youtube_tools.py @@ -45,29 +45,48 @@ def go_pafy(raw_song, meta_tags=None): 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. """ 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): log.debug("Input song is a YouTube URL") content = go_pafy(track, meta_tags=None) track = slugify(content.title).replace("-", " ") if not const.args.no_metadata: meta_tags = spotify_tools.generate_metadata(track) - if meta_tags is None: # and const.args.allow_youtube: - 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) + meta_tags = fallback_metadata(meta_tags) - if force_pafy: - content = go_pafy(track, meta_tags) - if meta_tags is None: # and const.args.allow_youtube: - meta_tags = generate_metadata(content) + elif internals.is_spotify(track): + log.debug("Input song is a Spotify URL") + # Let it generate metadata, YouTube doesn't know Spotify slang + 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: - 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