def test_other(self, tmpdir):
     expect_download = False
     file_name = internals.sanitize(title)
     download = youtube_tools.download_song(tmpdir,
                                            file_name + '.fake_extension',
                                            content)
     assert download == expect_download
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 test_sanitize(self, init_config):
     txt = '影師嗎'
     result = internals.sanitize(txt)
     assert result == 'Ying Shi Ma '
 def test_m4a(self, tmpdir):
     expect_download = True
     file_name = internals.sanitize(title)
     download = youtube_tools.download_song(tmpdir, file_name + '.m4a',
                                            content)
     assert download == expect_download
예제 #5
0
def _download_single(folder, 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)
        meta_tags['number'] = number
    else:
        meta_tags = spotify_tools.generate_metadata(raw_song)
        meta_tags['number'] = number
        content = youtube_tools.go_pafy(raw_song, meta_tags)

    if content is None:
        log.debug('Found no matching video')
        return

    if const.config.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.config.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(songname)

    if not _check_exists(folder, songname, raw_song, meta_tags):
        # deal with file formats containing slashes to non-existent directories
        songpath = os.path.join(folder, os.path.dirname(songname))
        os.makedirs(songpath, exist_ok=True)
        input_song = songname + const.config.input_ext
        output_song = songname + const.config.output_ext
        if youtube_tools.download_song(songpath, input_song, content):
            try:
                convert.song(input_song,
                             output_song,
                             folder,
                             avconv=const.config.avconv,
                             trim_silence=const.config.trim_silence)
            except FileNotFoundError:
                encoder = 'avconv' if const.config.avconv else 'ffmpeg'
                log.warning(
                    'Could not find {0}, skipping conversion'.format(encoder))
                const.config.output_ext = const.config.input_ext
                output_song = songname + const.config.output_ext

            if not const.config.input_ext == const.config.output_ext:
                os.remove(os.path.join(folder, input_song))
            if not const.config.no_metadata and meta_tags is not None:
                metadata.embed(os.path.join(folder, output_song), meta_tags)
            return True
        else:
            log.exception('Error downloading song {}'.format(raw_song))