halimbox/Spotify
0
1#!/usr/bin/env python32# -*- coding: utf-8 -*-3"""4Created on Sat Jul 23 10:15:02 20225 6@author: halimbouayad7"""8import spotipy9from spotipy.oauth2 import SpotifyOAuth10import json11import spotipy.util as util12from spotipy.oauth2 import SpotifyClientCredentials13import requests14from requests import *15import pandas as pd16import streamlit as st17import numpy as np18import time19 20def connect(scope, username):21 scope = "user-library-read" 22 token = SpotifyOAuth(scope=scope, username=username)23 spotifyObject = spotipy.Spotify(auth_manager=token)24 return spotifyObject25 26 27def get_features(a):28 29 feature_names = [f for f in a[0]]30 features = []31 32 for i in range(len(a)):33 34 features.append([a[i][f] for f in a[i]])35# features=list(np.pad(features, (0, max_length), 'constant'))36 37 #print(len(features))38 return features, feature_names39 40 41 42def get_artist(liste):43 for i, artists in enumerate(liste):44 if i ==0:45 artist=artists['name']46 else:47 artist=artist+", "+artists['name']48 return artist49 50@st.cache51def get_data(sp, username):52 playlists = sp.current_user_playlists(limit=50)53 54 tr_names=[]55 pl_urls=[]56 pl_names=[]57 #tracks=[]58 #links=[]59 date_added=[]60 popularity=[]61 ids=[]62 artist_list=[]63 #features=[]64 features=pd.DataFrame()65 df=pd.DataFrame()66 67 while playlists:68 69 70 71 for i, playlist in enumerate(playlists['items']):72 #print("%4d %s %s" % (i + 1 + playlists['offset'], playlist['uri'], playlist['name']))73 # urls.append(playlist['uri'])74 # names.append(playlist['name'])75 # tracks.append(playlist['tracks']['total'])76 # links.append(playlist['external_urls']['spotify'])77 # ids.append(playlist['id'])78 #print(playlist)79 #st.text(last)80 print(playlist)81 playlist_content=sp.playlist(playlist['uri'])82 for i,trax in enumerate(playlist_content['tracks']['items']):83 84 #Track name85 tr_names.append(trax['track']['name'])86 87 #Track ID88 ids.append(trax['track']['id'])89 90 date_added.append(trax['added_at'])91 92 popularity.append(trax['track']['popularity'])93 94 #Playlist Name95 pl_names.append(playlist['name'])96 97 #Track URI98 pl_urls.append(playlist['uri'])99 100 artist_list.append(get_artist(trax['track']['artists']))101 102 test='All done!'103 104 if playlists['next']:105 playlists = sp.next(playlists)106 else:107 playlists = None108 109 #audio_analysis110 111 112 df['playlist']=pl_names113 df['track']=tr_names114 df['artist']=artist_list115 df['playlist_url']=pl_urls116 df['track_id']=ids117 df['date_added']=date_added118 df['popularity']=popularity119 120 #Audio Features121 122 # start=0123 124 # for i in range(int(np.ceil(len(df)/50))):125 # end=max(start+50, len(df))126 127 128 129 # print('test='+str(i))130 # print(feat)131 132 #API only handles batch of 100 of ids133 for start in range(0, len(df), 100):134 135 if start+100>len(df):136 end=len(df)137 else:138 end=start+100139 140 141 142 audio_feat=sp.audio_features(df.track_id[start:end])143 144 ##print('audio feat=======')145 #print(audio_feat)146 147 #print('feat=======')148 feat, feat_names = get_features(audio_feat)149 print('-----feat')150 print(feat)151 print('-----features')152 print(features)153 features=pd.concat([features, pd.DataFrame(feat)], axis=0)154 print('-----features')155 print(features)156 157 #print(len(features))158 159 160 features.columns=feat_names161 162 df=pd.concat([df.reset_index(), features.reset_index()], axis=1)163 164 165 166 df=df.drop(columns=['index', 'index'])167 168 #df.to_pickle('./spotify.pkl')169 return df, test170 171# def playlist_details(sp, df, username):172 173 174 175# selected=st.selectbox('Please select to zoom', df.name)176# uri=df[df.name==selected].reset_index()['url'][0]177# #df_tracks=pd.DataFrame(playlist_content)178 179# # Connection to Spotipy180# #sp=connect(scope='user-library_read', username=username)181# playlist_content=sp.playlist(uri)182# names=[]183# releasedays=[]184# ids=[]185 186# for i,trax in enumerate(playlist_content['tracks']['items']):187 188# names.append(trax['track']['name'])189# #releasedays.append(trax['track']['added_at'])190# ids.append(trax['track']['id'])191 192# pl=pd.DataFrame()193# pl['name']=names194# #pl['release_date']=releasedays195# pl['id']=ids196# st.dataframe(pl)197# return df 198 199def EDA(df):200 st.header("EDA")201 #Key Metrics202 f_value=st.selectbox('Select a playlist', df.playlist.unique())203 dff=df[df.playlist==f_value]204 205 cols=['danceability','energy','acousticness','tempo','loudness','valence']206 for col in cols[:2]:207 temp=dff.describe().loc['mean',:][col]208 st.metric(col, '{:.1%}'.format(temp))209 210 st.text('Top songs from that album:')211 st.dataframe(dff)212 213 selected=st.selectbox('By playlist (click to select other filter)', df.columns)214 st.bar_chart(df[df.playlist==f_value].groupby(selected).agg({'danceability':'mean'}))215 216 217 218 219 220#if st.button('View playlist!'):221 222# def playlist_overview(sp, username):223# # scope = "user-library-read" 224# # token = SpotifyOAuth(scope=scope, username=username)225# # spotifyObject = spotipy.Spotify(auth_manager=token)226 227 228# playlists = sp.current_user_playlists(limit=50)229# print('=================')230# #response = requests.get("http://localhost:1234", timeout=10)231# #print(response.json())232# print('=================')233# df=pd.DataFrame() 234 235# urls=[]236# names=[]237# tracks=[]238# links=[]239# ids=[]240 241# while playlists:242 243# for i, playlist in enumerate(playlists['items']):244# #print("%4d %s %s" % (i + 1 + playlists['offset'], playlist['uri'], playlist['name']))245# urls.append(playlist['uri'])246# names.append(playlist['name'])247# tracks.append(playlist['tracks']['total'])248# links.append(playlist['external_urls']['spotify'])249# ids.append(playlist['id'])250# #print(playlist)251# #st.text(last)252 253 254 255# if playlists['next']:256# playlists = sp.next(playlists)257# else:258# playlists = None259 260# #audio_analysis261 262# df['name']=names263# df['tracks']=tracks264# df['url']=urls265# df['id']=ids266# st.dataframe(df) 267 268#[a[0][i] for i in a[0]] 269# 1seFIg83Eac87g1hmtBRjG270# 5ZwRTJD1bTACtIuW5Iibnu