nielsdejong / neo4j-playlist-builder

A tool to dynamically generate Spotify playlists using Neo4j graph data science.
Apache License 2.0
9 stars 4 forks source link

Fetching Tracks Total Count is Off #5

Open technomorph opened 2 years ago

technomorph commented 2 years ago

My Spotify Playlist contains 226 tracks but the program only fetches 200:

I inserted the following logging in the getTracks()

def get_tracks():
    playlist = spotify.playlist(playlist_uri)
    results = playlist['tracks']
    print("Playlist Name:", playlist['name'])
    print("  total tracks", playlist['tracks']['total'])

    items = {}
    while results['next'] or results['previous'] is None:
        print("Current Results Items Total:", len(results["items"]))
        print("Current Results NEXT is:", results['next'])
        print("Current Results PREVIOUS is:", results['previous'])
        for track in results["items"]:
            if track['track']['id']:
                track['track']['artists'] = [artist if type(artist) == str else artist['id'] for artist in
                                             track['track']['artists']]
                track['track']['album'] = track['track']['album'] if type(track['track']['album']) == str else \
                    track['track']['album']['id']
                items[track['track']['id']] = track['track']
            for field in track['track']:
                if track is not None and type(track['track'][field]) == dict:
                    track['track'][field] = None
        if not results['next']:
            break
        results = spotify.next(results)
        print("Next Results NEXT is:", results['next'])
        print("Next Results PREVIOUS is:", results['previous'])
    return items

When run the output is:

creating tracks...
Playlist Name: Spotify G-Funk All
  total tracks 226
Current Results Items Total: 100
Current Results NEXT is: https://api.spotify.com/v1/playlists/5U2511keju1CfHJU90cGXS/tracks?offset=100&limit=100&additional_types=track
Current Results PREVIOUS is: None
Next Results NEXT is: https://api.spotify.com/v1/playlists/5U2511keju1CfHJU90cGXS/tracks?offset=200&limit=100&additional_types=track
Next Results PREVIOUS is: https://api.spotify.com/v1/playlists/5U2511keju1CfHJU90cGXS/tracks?offset=0&limit=100&additional_types=track
Current Results Items Total: 100
Current Results NEXT is: https://api.spotify.com/v1/playlists/5U2511keju1CfHJU90cGXS/tracks?offset=200&limit=100&additional_types=track
Current Results PREVIOUS is: https://api.spotify.com/v1/playlists/5U2511keju1CfHJU90cGXS/tracks?offset=0&limit=100&additional_types=track
Next Results NEXT is: None
Next Results PREVIOUS is: https://api.spotify.com/v1/playlists/5U2511keju1CfHJU90cGXS/tracks?offset=100&limit=100&additional_types=track
tracks count is: 200

the while results['next'] or results['previous'] is None: fails because both the NEXT and PREVIOUS values have URLs I'm not familiar with Python's Looping and Clauses. Especially where / the loop takes into the value of checking continuation..

technomorph commented 2 years ago

I was able to solve it by changing line 177

https://github.com/nielsdejong/neo4j-playlist-builder/blob/ef1d3fa317e3d93ece3ceb8ab3aa5af801225eab/neo4j_spotify_playlist_builder.py#L177

to: while len(results["items"]) > 0:

nielsdejong commented 2 years ago

Great, could you make a PR for this? I'm guessing I never had the issue as my playlists were smaller. Most likely more people could have a similar issue.