Skip to content

Instantly share code, notes, and snippets.

@sjstebbins
Last active August 22, 2016 01:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sjstebbins/edff7038c9e3d7a1c23173d205af1971 to your computer and use it in GitHub Desktop.
Save sjstebbins/edff7038c9e3d7a1c23173d205af1971 to your computer and use it in GitHub Desktop.
Muse-recommendations
# 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