#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Sat Jul 23 10:15:02 2022 @author: halimbouayad """ import spotipy from spotipy.oauth2 import SpotifyOAuth import json import spotipy.util as util from spotipy.oauth2 import SpotifyClientCredentials import requests from requests import * import pandas as pd import streamlit as st import numpy as np import time def connect(scope, username): scope = "user-library-read" token = SpotifyOAuth(scope=scope, username=username) spotifyObject = spotipy.Spotify(auth_manager=token) return spotifyObject def get_features(a): feature_names = [f for f in a[0]] features = [] for i in range(len(a)): features.append([a[i][f] for f in a[i]]) # features=list(np.pad(features, (0, max_length), 'constant')) #print(len(features)) return features, feature_names def get_artist(liste): for i, artists in enumerate(liste): if i ==0: artist=artists['name'] else: artist=artist+", "+artists['name'] return artist @st.cache def get_data(sp, username): playlists = sp.current_user_playlists(limit=50) tr_names=[] pl_urls=[] pl_names=[] #tracks=[] #links=[] date_added=[] popularity=[] ids=[] artist_list=[] #features=[] features=pd.DataFrame() df=pd.DataFrame() while playlists: for i, playlist in enumerate(playlists['items']): #print("%4d %s %s" % (i + 1 + playlists['offset'], playlist['uri'], playlist['name'])) # urls.append(playlist['uri']) # names.append(playlist['name']) # tracks.append(playlist['tracks']['total']) # links.append(playlist['external_urls']['spotify']) # ids.append(playlist['id']) #print(playlist) #st.text(last) print(playlist) playlist_content=sp.playlist(playlist['uri']) for i,trax in enumerate(playlist_content['tracks']['items']): #Track name tr_names.append(trax['track']['name']) #Track ID ids.append(trax['track']['id']) date_added.append(trax['added_at']) popularity.append(trax['track']['popularity']) #Playlist Name pl_names.append(playlist['name']) #Track URI pl_urls.append(playlist['uri']) artist_list.append(get_artist(trax['track']['artists'])) test='All done!' if playlists['next']: playlists = sp.next(playlists) else: playlists = None #audio_analysis df['playlist']=pl_names df['track']=tr_names df['artist']=artist_list df['playlist_url']=pl_urls df['track_id']=ids df['date_added']=date_added df['popularity']=popularity #Audio Features # start=0 # for i in range(int(np.ceil(len(df)/50))): # end=max(start+50, len(df)) # print('test='+str(i)) # print(feat) #API only handles batch of 100 of ids for start in range(0, len(df), 100): if start+100>len(df): end=len(df) else: end=start+100 audio_feat=sp.audio_features(df.track_id[start:end]) ##print('audio feat=======') #print(audio_feat) #print('feat=======') feat, feat_names = get_features(audio_feat) print('-----feat') print(feat) print('-----features') print(features) features=pd.concat([features, pd.DataFrame(feat)], axis=0) print('-----features') print(features) #print(len(features)) features.columns=feat_names df=pd.concat([df.reset_index(), features.reset_index()], axis=1) df=df.drop(columns=['index', 'index']) #df.to_pickle('./spotify.pkl') return df, test # def playlist_details(sp, df, username): # selected=st.selectbox('Please select to zoom', df.name) # uri=df[df.name==selected].reset_index()['url'][0] # #df_tracks=pd.DataFrame(playlist_content) # # Connection to Spotipy # #sp=connect(scope='user-library_read', username=username) # playlist_content=sp.playlist(uri) # names=[] # releasedays=[] # ids=[] # for i,trax in enumerate(playlist_content['tracks']['items']): # names.append(trax['track']['name']) # #releasedays.append(trax['track']['added_at']) # ids.append(trax['track']['id']) # pl=pd.DataFrame() # pl['name']=names # #pl['release_date']=releasedays # pl['id']=ids # st.dataframe(pl) # return df def EDA(df): st.header("EDA") #Key Metrics f_value=st.selectbox('Select a playlist', df.playlist.unique()) dff=df[df.playlist==f_value] cols=['danceability','energy','acousticness','tempo','loudness','valence'] for col in cols[:2]: temp=dff.describe().loc['mean',:][col] st.metric(col, '{:.1%}'.format(temp)) st.text('Top songs from that album:') st.dataframe(dff) selected=st.selectbox('By playlist (click to select other filter)', df.columns) st.bar_chart(df[df.playlist==f_value].groupby(selected).agg({'danceability':'mean'})) #if st.button('View playlist!'): # def playlist_overview(sp, username): # # scope = "user-library-read" # # token = SpotifyOAuth(scope=scope, username=username) # # spotifyObject = spotipy.Spotify(auth_manager=token) # playlists = sp.current_user_playlists(limit=50) # print('=================') # #response = requests.get("http://localhost:1234", timeout=10) # #print(response.json()) # print('=================') # df=pd.DataFrame() # urls=[] # names=[] # tracks=[] # links=[] # ids=[] # while playlists: # for i, playlist in enumerate(playlists['items']): # #print("%4d %s %s" % (i + 1 + playlists['offset'], playlist['uri'], playlist['name'])) # urls.append(playlist['uri']) # names.append(playlist['name']) # tracks.append(playlist['tracks']['total']) # links.append(playlist['external_urls']['spotify']) # ids.append(playlist['id']) # #print(playlist) # #st.text(last) # if playlists['next']: # playlists = sp.next(playlists) # else: # playlists = None # #audio_analysis # df['name']=names # df['tracks']=tracks # df['url']=urls # df['id']=ids # st.dataframe(df) #[a[0][i] for i in a[0]] # 1seFIg83Eac87g1hmtBRjG # 5ZwRTJD1bTACtIuW5Iibnu