Last active
August 22, 2016 01:46
-
-
Save sjstebbins/edff7038c9e3d7a1c23173d205af1971 to your computer and use it in GitHub Desktop.
Muse-recommendations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# API: get recommended tracks data based on seed and target values | |
recommendations_api_endpoint = SPOTIFY_API_URL + "/recommendations?seed_artists=" + ",".join(seed_artists) + "&target_energy=" + target_energy + "&target_liveness=" + target_liveness + "&target_tempo=" + target_tempo + "&target_speechiness=" + target_speechiness + "&target_acousticness=" + target_acousticness + "&target_instrumentalness=" + target_instrumentalness + "&target_danceability=" + target_danceability + "&target_loudness=" + target_loudness + "&limit=20" | |
recommendations_response = requests.get(recommendations_api_endpoint, headers=GLOBAL['authorization_header']) | |
recommendation_data['data'] = json.loads(recommendations_response.text)['tracks'] | |
# set recommended track title and ids | |
for track in recommendation_data['data']: | |
# Dont add duplicate recommendations or songs already in your playlist | |
if track['id'] not in recommendation_data['ids'] and track['id'] not in seed_data['song_ids']: | |
recommendation_data['titles'].append(track['name']) | |
recommendation_data['artists'].append(track['artists'][0]['name']) | |
recommendation_data['ids'].append(track['id']) | |
recommendation_data['images'].append(track['album']['images'][0]['url']) | |
# API: get collected tracks attributes | |
attributes_api_endpoint = SPOTIFY_API_URL + "/audio-features?ids=" + ",".join(recommendation_data['ids']) | |
attributes_response = requests.get(attributes_api_endpoint, headers=GLOBAL['authorization_header']) | |
recommendation_data['attributes'] = json.loads(attributes_response.text)['audio_features'] | |
# create tracks with just the float variables | |
recommendation_track_attributes = [] | |
for track in recommendation_data['attributes']: | |
track_float_values = {} | |
for attribute in target_attributes: | |
track_float_values[attribute] = track[attribute] | |
recommendation_track_attributes.append(track_float_values.values()) | |
# get recommendation_distances from phantom_average_track | |
recommendation_distances = [phantom_average_track.values()] + recommendation_track_attributes | |
dist = DistanceMetric.get_metric('euclidean') | |
distances = dist.pairwise(recommendation_distances)[0] | |
recommendation_data['distances'] = distances[1:len(distances)] | |
# sort recommendation_data object based on recommendation_data distances | |
sorted_recommendation_indexes = recommendation_data['distances'].argsort()[:len(recommendation_data['distances'])] | |
for key in recommendation_data.keys(): | |
if recommendation_data[key] != []: | |
recommendation_data[key] = [recommendation_data[key][i] for i in sorted_recommendation_indexes] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment