from datetime import datetime, timedelta import spotipy import plotly.express as px import pandas from spotipy.oauth2 import SpotifyClientCredentials # To access authorised Spotify data def convert_timedelta(duration): days, seconds = duration.days, duration.seconds hours = days * 24 + seconds // 3600 minutes = (seconds % 3600) // 60 seconds = (seconds % 60) return hours, minutes, seconds client_id = '305ca60e10514ba48a291cc3071fd6bd' client_secret = 'b8ef5a7c9c394767b425e138d3b4e2f5' client_credentials_manager = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret) spotify = spotipy.Spotify(client_credentials_manager=client_credentials_manager) # Spotify object to access API name = 'Dua Lipa' result = spotify.search(name) artist_id = result['tracks']['items'][0]['artists'][0]['id'] print(artist_id) artist = spotify.artist(artist_id) print(str(artist['type']).capitalize() + ' ' + artist['name'] + ' has ' + str( artist['followers']['total']) + ' followers.') all_albums = spotify.artist_albums(artist_id) albums = list(filter(lambda x: (x['album_type'] == 'album'), all_albums['items'])) print(str(artist['type']).capitalize() + ' ' + artist['name'] + ' has ' + str(len(albums)) + ' album(s).') tracks_uris = [] for album in albums[:2]: print() print(album['name']) album_tracks = spotify.album_tracks(album['id']) # getting tracks from album print(album['uri']) print('Album has ' + str(album['total_tracks']) + ' tracks.') print( 'Has been dropped on ' + str(datetime.strptime(album['release_date'], '%Y-%m-%d').strftime('%-d %B %Y')) + '.') print('Album cover: ' + album['images'][0]['url']) print('Tracks:') for track in album_tracks['items']: hours, minutes, seconds = convert_timedelta(timedelta(milliseconds=track['duration_ms'])) print('\t' + track['name'] + ' - {0} minutes, {1} seconds'.format(minutes, seconds)) print('\t' + track['uri'] + '\n') tracks_uris.append(track['uri']) # print('\t' + track['preview_url']) # we also could get the preview link track_list = [] audio_features = spotify.audio_features(tracks_uris) print('\nAudio features:') for track in audio_features: popularity = spotify.track(track['id'])['popularity'] title = spotify.track(track['id'])['name'] track['popularity'] = popularity track_info = [track['popularity'], track['tempo'], track['danceability'], title] track_list.append(track_info) print(title, end='') print(' has energy rate ' + str(track['energy']), end=',') print('\ninstrumentalness rate ' + str(track['instrumentalness']), end=',') print('\npopulatity rate ' + str(popularity), end=',') print('\ntempo ' + str(track['tempo']), end='\n\n') track_list = pandas.DataFrame(track_list, columns=['popularity', 'tempo', 'danceability', 'title']) fig = px.scatter(track_list, x=track_list['tempo'], y=track_list['danceability'], color=track_list['popularity'], size=track_list['popularity'], text=track_list['title'], title='Plot of Song Popularity based on its Tempo and Danceability') fig.show()