def test_all(self): string_format = '_{track_name}' + \ '_{artist}' + \ '_{album}' + \ '_{album_artist}' + \ '_{genre}' + \ '_{disc_number}' + \ '_{duration}' + \ '_{year}' + \ '_{original_date}' + \ '_{track_number}' + \ '_{total_tracks}' + \ '_{isrc}' + \ '_{number}' expected = '_my_name' + \ '_my_artists' + \ '_my_album' + \ '_my_artists' + \ '_my_genre' + \ '_my_disc_number' + \ '_my_duration' + \ '_my_year' + \ '_my_release_date' + \ '_my_track_number' + \ '_my_total_tracks' + \ '_my_isrc' + \ '_1' result = internals.format_string(string_format, TestFormatString.tags) assert result == expected
def test_some_tags(self): string_format = "{track_name}-{disc_number}-{album}" expected = 'my_name--my_album' result = internals.format_string( string_format, TestFormatString.some_tags) assert result == expected
def test_check_track_exists_before_download(tmpdir): expect_check = False const.config.folder = str(tmpdir) # prerequisites for determining filename songname = internals.format_string(file_format, meta_tags) global file_name file_name = internals.sanitize(songname) check = spotdl._check_exists(tmpdir, file_name, raw_song, meta_tags) assert check == expect_check
def __init__(self, raw_song, meta_tags): self.raw_song = raw_song self.meta_tags = meta_tags if meta_tags is None: self.search_query = raw_song else: self.search_query = internals.format_string( const.args.search_format, meta_tags)
def __init__(self, raw_song, meta_tags): self.raw_song = raw_song self.meta_tags = meta_tags if meta_tags is None: self.search_query = raw_song else: self.search_query = internals.format_string( const.config.search_format, meta_tags, force_spaces=True)
def download_single(raw_song, number=None, folder=None) -> bool: """ Logic behind downloading a song. """ meta_tags = spotify_tools.generate_metadata(raw_song) if const.args.download_only_metadata and meta_tags is None: log.info('Found no metadata. Skipping the download') return False # generate file name of the song to download songname = 'foo' 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 not check_exists(songname, raw_song, meta_tags, folder): # deal with file formats containing slashes to non-existent directories if folder: folder_path = folder else: folder_path = const.args.folder songpath = os.path.join(folder_path, os.path.dirname(songname)) os.makedirs(songpath, exist_ok=True) file_name = os.path.join(folder_path, songname + const.args.output_ext) play_time = player.play_and_record(meta_tags['uri'], file_name, songname) if not record.verify_length(file_name, meta_tags['duration'], play_time): log.error('Duration mismatch! Deleting: {}'.format(songname)) if duration_debug: fail_path = os.path.join(folder_path, 'mismatch') if not os.path.exists(fail_path): os.mkdir(fail_path) _, file_only = os.path.split(file_name) copyfile(file_name, os.path.join(fail_path, file_only)) os.remove(file_name) return False if not const.args.no_metadata and meta_tags is not None: metadata.embed(file_name, meta_tags) return True return True
def test_duplicate(self): string_format = "{track_name}-{track_name}" expected = 'my_name-my_name' result = internals.format_string(string_format, TestFormatString.tags) assert result == expected
def test_without_spaces(self): expect_title = 'David_Guetta_-_Flames' const.config.no_spaces = True title = internals.format_string(file_format, meta_tags) assert title == expect_title
def test_with_spaces(self): expect_title = 'David Guetta - Flames' title = internals.format_string(file_format, meta_tags) assert title == expect_title
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): print('') 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
def test_without_spaces(self): expect_title = 'David_André_Østby_-_Intro' const.args.no_spaces = True title = internals.format_string(const.args.file_format, meta_tags) assert title == expect_title
def test_with_spaces(self): expect_title = 'David André Østby - Intro' title = internals.format_string(const.args.file_format, meta_tags) assert title == expect_title