我正在尝试使用元数据创建我在 Spotify 上保存的所有曲目的数据集。我已经获得了所有歌曲功能、曲目名称和曲目 ID。我想添加曲目艺术家和流派之一的列。
我尝试通过“liked_tracks.extend”添加它,但我无法让它工作。
cid =""
secret = ""
redirect_uri = 'http://localhost:8000/callback'
FEATURE_KEYS = ['danceability', 'energy', 'key', 'loudness', 'mode', 'speechiness', 'acousticness', 'instrumentalness', 'liveness', 'valence', 'tempo']
OFFSET=0
SAVED_TRACKS_LIMIT=50
FEATURE_LIMIT = 100
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(client_id=cid,
client_secret=secret,
redirect_uri=redirect_uri,
scope="user-library-read"))
liked_tracks = list()
print(liked_tracks)
while(True):
paged_tracks = sp.current_user_saved_tracks(offset=OFFSET, limit=SAVED_TRACKS_LIMIT)
liked_tracks.extend([{'name':el['track']['name'],
'id':el['track']['id']} for el in paged_tracks['items']])
print(f'Fetched {len(liked_tracks)} tracks')
OFFSET+=SAVED_TRACKS_LIMIT
if paged_tracks['next'] is None:
break
def get_windowed_track_ids(liked_tracks, limit):
for i in range(0, len(liked_tracks), limit):
track_window = liked_tracks[i:i + limit]
yield track_window, [t['id'] for t in track_window]
track_feature_list = list()
print('')
for track_window, track_window_ids in get_windowed_track_ids(liked_tracks, FEATURE_LIMIT):
track_features = sp.audio_features(tracks=track_window_ids)
for index, _track in enumerate(track_window):
_track.update({k:v for k,v in track_features[index].items() if k in FEATURE_KEYS})
track_feature_list.append(_track)
print(f'Fetched features for {len(track_feature_list)} tracks')
df = pd.DataFrame.from_dict(track_feature_list)
mysavedsongs = f'liked_tracks_{int(time())}.csv'
df.to_csv(mysavedsongs, index=False)
print('')
print(f'Saved features to {mysavedsongs}')
Spotify 和 Spotipy 都不提供
genre
作为歌曲的元数据;但是,genre
是作为艺术家的元数据提供的。您可以使用歌曲和搜索 API 来检索有关艺术家的数据;您可以在此处提取元数据以获取艺术家的流派。这并不总是完美的,但可能是专门使用 Spotipy 或 Spotify API 的最佳选择:
import spotipy
from spotipy.oauth2 import SpotifyClientCredentials
client_credentials_manager = SpotifyClientCredentials(client_id='YOUR_CLIENT_ID', client_secret='YOUR_CLIENT_SECRET')
sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)
song_name = 'Sicko Mode'
artist_name = 'Drake' #optional
# hit search API
results = sp.search(q=f'track:{song_name} artist:{artist_name}', type='track', limit=1)
if results['tracks']['items']:
# gets artist
artist_id = results['tracks']['items'][0]['artists'][0]['id']
# gets artist metadata
artist_info = sp.artist(artist_id)
# extracts genre
genres = artist_info['genres']
print(f"Genres for {artist_name}: {', '.join(genres)}")
else:
print("Song not found.")