def save_shared_playlist(user_id): """ saves a shared playlist .""" #get session user and user #get the shared songs #add the shared songs to playlist db session_user = session['user'] shared_prefs = crud.get_shared_tracks(session_user, user_id) song_attributes = crud.get_song_attributes(session_user) stdev = crud.get_stdev(song_attributes) ## need to get the playlist name from form user_input = request.get_json() playlist_name = user_input['playlistName'] similar_songs = crud.get_all_similar_songs(session_user, user_id, 10) ## get song id for each item song_ids = [] for item in similar_songs: song_id = crud.get_song_id(item[1]) song_ids.append(song_id) playlist_1 = playlist_user.save_shared_playlist(session_user, user_id, song_ids, playlist_name) return jsonify({'status': 'saved'})
def get_similar_user(): """Returns the users that are most similar to the session user.""" # gets session user's info user_id = session['user'] user = crud.get_user_by_id(user_id) # get stdev data for user session_user_attributes = crud.get_song_attributes(user_id) session_user_stdev = crud.get_stdev(session_user_attributes) print(session_user_stdev) # get all users all_users = crud.get_users() #stores min difference min_diff = [1000, ''] # iterate through all users that are not the session user that have recs. for user_x in all_users: if user_x.user_id != user.user_id and crud.user_has_song_recs(user_x.user_id): user_diff = (abs(user.user_valence - user_x.user_valence)/session_user_stdev['valence']) + (abs(user.user_speechiness - user_x.user_speechiness)/session_user_stdev['speechiness']) + (abs(user.user_acousticness - user_x.user_acousticness)/session_user_stdev['acousticness']) + (abs(user.user_energy - user_x.user_energy)/session_user_stdev['energy']) + (abs(user.user_danceability - user_x.user_danceability)/session_user_stdev['danceability']) + (abs(user.user_loudness - user_x.user_loudness)/session_user_stdev['loudness']) # if the difference is smaller, update the array with the difference and ID if user_diff < min_diff[0]: min_diff = [user_diff, user_x.email] else: pass similar_user_email = min_diff[1] similar_user = crud.get_user_by_email(similar_user_email) # adjust loudness for graph adj_user_loudness = abs(user.user_loudness)/10 adj_similar_user_loudness = abs(similar_user.user_loudness)/10 return jsonify({'similar_user': similar_user_email, 'current_user_info': [user.user_valence, user.user_speechiness, user.user_acousticness, user.user_energy, user.user_danceability, adj_user_loudness], 'similar_user_info': [similar_user.user_valence, similar_user.user_speechiness, similar_user.user_acousticness, similar_user.user_energy, similar_user.user_danceability, adj_similar_user_loudness]} )
def show_shared_songs(user_email): """Show shared playlist for current user and selected user.""" ## how to feed in user id here ## probably need to get and post session_user = session['user'] ## get the user id user = crud.get_user_by_email(user_email) user_id = user.user_id # gets attributes of user's recommended tracks shared_prefs = crud.get_shared_tracks(session_user, user_id) song_attributes = crud.get_song_attributes(session_user) stdev = crud.get_stdev(song_attributes) similar_songs = crud.get_all_similar_songs(session_user, user_id, 10) return jsonify({'shared songs': similar_songs})
def view_combined_playlist(user_id): """Returns the combined playlist.""" user = crud.get_user_by_id(user_id) #jsonifies user info json_user = User.as_dict(user) session_user = session['user'] ## get the user id # gets attributes of user's recommended tracks shared_prefs = crud.get_shared_tracks(session_user, user_id) song_attributes = crud.get_song_attributes(session_user) stdev = crud.get_stdev(song_attributes) similar_songs = crud.get_all_similar_songs(session_user, user_id, 10) combined_dict = { 'user': json_user, 'playlist': similar_songs, } return jsonify(combined_dict)
def get_song_recs(): """Gets song recommendations for user.""" # # how to make this so it will update when user updates songs? automatic? user_id = session['user'] user = crud.get_user_by_id(user_id) song_recs = crud.get_recommended_tracks(user_id) # #adds each recommended song to DB for song_uri in song_recs: #gets song title title = api.get_song_title(song_uri) # gets adio features for song audio_fx = api.get_audio_features(song_uri) tempo = audio_fx['tempo'] valence = audio_fx['valence'] danceability = audio_fx['danceability'] energy = audio_fx['energy'] loudness = audio_fx['loudness'] acousticness = audio_fx['acousticness'] speechiness = audio_fx['speechiness'] # gets song artist artist = api.get_song_artist(song_uri) #creates instance of song in song db crud.create_song(title, song_uri, tempo, valence, danceability, energy, loudness, acousticness, speechiness, artist) #gets song id song_id = crud.get_song_id(song_uri) #creates instance of rec track in rec track db crud.create_recommended_track(user_id, song_uri, title, song_id) # gets all rec tracks for user user_song_recs = crud.get_user_song_recs(user_id) ## adds avg attribute values for user and commits to db user_1_attributes = crud.get_song_attributes(user_id) #gets the avg and stdev for user user_1_stdev = crud.get_stdev(user_1_attributes) user_1_avg = crud.get_average(user_1_attributes) # gets averages for each attribute and adds to db valence_avg = user_1_avg['valence'] user_details.update_valence_value(user, valence_avg) speechiness_avg = user_1_avg['speechiness'] user_details.update_speechiness_value(user, speechiness_avg) acousticness_avg = user_1_avg['acousticness'] user_details.update_acousticness_value(user, acousticness_avg) danceability_avg = user_1_avg['danceability'] user_details.update_danceability_value(user, danceability_avg) energy_avg = user_1_avg['energy'] user_details.update_energy_value(user, energy_avg) loudness_avg = user_1_avg['loudness'] user_details.update_loudness_value(user, loudness_avg) ## could add a try. if it errors, return error. or do something more nuanced return jsonify({'status': 'success'})
loudness = audio_features['loudness'] acousticness = audio_features['acousticness'] speechiness = audio_features['speechiness'] crud.create_song(title, song, tempo, valence, danceability, energy, loudness, acousticness, speechiness, artist) # get song ID and use to create recommended track song_id = crud.get_song_id(song) crud.create_recommended_track(user.user_id, song, title, song_id) # assign valence, danceable, etc values to the user # pulls attributes for each of the user's songs user_1_attributes = crud.get_song_attributes(user.user_id) #gets the avg and stdev for user user_1_avg = crud.get_average(user_1_attributes) user_1_stdev = crud.get_stdev(user_1_attributes) # gets averages for each attribute and adds to db valence_avg = user_1_avg['valence'] user_details.update_valence_value(user, valence_avg) speechiness_avg = user_1_avg['speechiness'] user_details.update_speechiness_value(user, speechiness_avg) acousticness_avg = user_1_avg['acousticness'] user_details.update_acousticness_value(user, acousticness_avg) danceability_avg = user_1_avg['danceability'] user_details.update_danceability_value(user, danceability_avg) energy_avg = user_1_avg['energy']