def go_pafy(raw_song, meta_tags=None): """ Parse track from YouTube. """ if internals.is_youtube(raw_song): track_info = pafy.new(raw_song) else: track_url = generate_youtube_url(raw_song, meta_tags) if track_url: track_info = pafy.new(track_url) else: track_info = None return track_info
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) sys.stdout.flush() else: log.info(fallback_metadata_info) sys.stdout.flush() meta_tags = generate_metadata(content) return meta_tags if internals.is_youtube(track): log.debug("Input song is a YouTube URL") sys.stdout.flush() 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) meta_tags = fallback_metadata(meta_tags) elif internals.is_spotify(track): log.debug("Input song is a Spotify URL") sys.stdout.flush() # 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") sys.stdout.flush() if const.args.no_metadata: content = go_pafy(track, meta_tags=None) else: 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
def match_video_and_metadata(track, force_pafy=True): """ Get and match track data from YouTube and Spotify. """ meta_tags = None 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) else: if not const.args.no_metadata: meta_tags = spotify_tools.generate_metadata(track) if force_pafy: content = go_pafy(track, meta_tags) else: content = None return content, meta_tags
def download_single(raw_song, number=None): """ Logic behind downloading a song. """ if internals.is_youtube(raw_song): log.debug('Input song is a YouTube URL') content = youtube_tools.go_pafy(raw_song, meta_tags=None) raw_song = slugify(content.title).replace('-', ' ') meta_tags = spotify_tools.generate_metadata(raw_song) else: meta_tags = spotify_tools.generate_metadata(raw_song) content = youtube_tools.go_pafy(raw_song, meta_tags) if content is None: log.debug('Found no matching video') return if const.args.download_only_metadata and meta_tags is None: log.info('Found no metadata. Skipping the download') return # "[number]. [artist] - [song]" if downloading from list # otherwise "[artist] - [song]" youtube_title = youtube_tools.get_youtube_title(content, number) log.info('{} ({})'.format(youtube_title, content.watchv_url)) # generate file name of the song to download songname = content.title if meta_tags is not None: refined_songname = internals.format_string(const.args.file_format, meta_tags, slugification=True) log.debug('Refining songname from "{0}" to "{1}"'.format( songname, refined_songname)) if not refined_songname == ' - ': songname = refined_songname else: log.warning('Could not find metadata') songname = internals.sanitize_title(songname) if const.args.dry_run: return if not check_exists(songname, raw_song, meta_tags): # deal with file formats containing slashes to non-existent directories songpath = os.path.join(const.args.folder, os.path.dirname(songname)) os.makedirs(songpath, exist_ok=True) input_song = songname + const.args.input_ext output_song = songname + const.args.output_ext if youtube_tools.download_song(input_song, content): try: convert.song(input_song, output_song, const.args.folder, avconv=const.args.avconv, trim_silence=const.args.trim_silence) except FileNotFoundError: encoder = 'avconv' if const.args.avconv else 'ffmpeg' log.warning( 'Could not find {0}, skipping conversion'.format(encoder)) const.args.output_ext = const.args.input_ext output_song = songname + const.args.output_ext if not const.args.input_ext == const.args.output_ext: os.remove(os.path.join(const.args.folder, input_song)) if not const.args.no_metadata and meta_tags is not None: metadata.embed(os.path.join(const.args.folder, output_song), meta_tags) return True