Beispiel #1
0
def download_list(tracks_file, skip_file=None, write_successful_file=None):
    """ Download all songs from the list. """

    log.info("Checking and removing any duplicate tracks")
    tracks = internals.get_unique_tracks(tracks_file)

    # override file with unique tracks
    with open(tracks_file, "w") as f:
        f.write("\n".join(tracks))

    # Remove tracks to skip from tracks list
    if skip_file is not None:
        skip_tracks = internals.get_unique_tracks(skip_file)
        len_before = len(tracks)
        tracks = [track for track in tracks if track not in skip_tracks]
        log.info("Skipping {} tracks".format(len_before - len(tracks)))

    log.info(u"Preparing to download {} songs".format(len(tracks)))
    downloaded_songs = []

    for number, raw_song in enumerate(tracks, 1):
        print("")
        try:
            download_single(raw_song, number=number)
        # token expires after 1 hour
        except spotipy.client.SpotifyException:
            # refresh token when it expires
            log.debug("Token expired, generating new one and authorizing")
            new_token = spotify_tools.generate_token()
            spotify_tools.spotify = spotipy.Spotify(auth=new_token)
            download_single(raw_song, number=number)
        # detect network problems
        except (urllib.request.URLError, TypeError, IOError):
            tracks.append(raw_song)
            # remove the downloaded song from file
            internals.trim_song(tracks_file)
            # and append it at the end of file
            with open(tracks_file, "a") as f:
                f.write("\n" + raw_song)
            log.warning("Failed to download song. Will retry after other songs\n")
            # wait 0.5 sec to avoid infinite looping
            time.sleep(0.5)
            continue

        downloaded_songs.append(raw_song)
        # Add track to file of successful downloads
        log.debug("Adding downloaded song to write successful file")
        if write_successful_file is not None:
            with open(write_successful_file, "a") as f:
                f.write("\n" + raw_song)
        log.debug("Removing downloaded song from tracks file")
        internals.trim_song(tracks_file)

    return downloaded_songs
Beispiel #2
0
def download_list(text_file):
    """ Download all songs from the list. """
    with open(text_file, 'r') as listed:
        # read tracks into a list and remove any duplicates
        lines = listed.read().splitlines()
        lines = list(set(lines))
    # ignore blank lines in text_file (if any)
    try:
        lines.remove('')
    except ValueError:
        pass

    log.info(u'Preparing to download {} songs'.format(len(lines)))
    downloaded_songs = []

    for number, raw_song in enumerate(lines, 1):
        print('')
        try:
            download_single(raw_song, number=number)
        # token expires after 1 hour
        except spotipy.client.SpotifyException:
            # refresh token when it expires
            log.debug('Token expired, generating new one and authorizing')
            new_token = spotify_tools.generate_token()
            spotify_tools.spotify = spotipy.Spotify(auth=new_token)
            download_single(raw_song, number=number)
        # detect network problems
        except (urllib.request.URLError, TypeError, IOError):
            lines.append(raw_song)
            # remove the downloaded song from file
            internals.trim_song(text_file)
            # and append it at the end of file
            with open(text_file, 'a') as myfile:
                myfile.write(raw_song + '\n')
            log.warning(
                'Failed to download song. Will retry after other songs\n')
            # wait 0.5 sec to avoid infinite looping
            time.sleep(0.5)
            continue

        downloaded_songs.append(raw_song)
        log.debug('Removing downloaded song from text file')
        internals.trim_song(text_file)

    return downloaded_songs
def test_generate_token():
    token = spotify_tools.generate_token()
    assert len(token) == 83