//Playlist creation from Audio Features public async Task <ActionResult> NewAdvPlaylist(AdvTrackCalc adv) { var g = adv.GenreList.ToArray(); var user = await GetCurrentUser(); var advTrack = new AdvTrack() { Acousticness = adv.AvgAcousticness, Danceability = adv.AvgDance, Energy = adv.AvgEnergy, Instrumentalness = adv.AvgInstrumentalness, Liveness = adv.AvgLiveness, Loudness = adv.AvgLoudness, Speechiness = adv.AvgSpeechiness, Tempo = adv.AvgTempo, Valence = adv.AvgValence, UserId = user.Id, GenreList = adv.GenreList, Genre = string.Join(",", g) }; return(PartialView("_AdvTrackFeatures", advTrack)); }
/// <summary> /// Get AdvTrackCalc from a playlist href /// </summary> /// <param name="href"></param> /// <returns></returns> public async Task <AdvTrackCalc> GetAdvAudioFeatures(string href) { var advTrackCalc = new AdvTrackCalc(); var allArtId = new List <string>(); var allArt = new List <ArtistFull>(); var testTrack = new List <AdvTrack>(); var res = await GetPlaylistTracks("https://api.spotify.com/v1/playlists/" + href); var tracks = new List <string>(); foreach (var t in res) { tracks.Add(t.Track.Id); testTrack.Add(new AdvTrack() { Id = t.Track.Id, Artist = t.Track.Artists.FirstOrDefault().Name, Name = t.Track.Name }); allArtId.Add(t.Track.Artists.FirstOrDefault().Id); } foreach (var id in allArtId) { allArt.Add(await GetArtistFull(id)); } foreach (var art in allArt) { foreach (var g in art.Genres) { if (!advTrackCalc.GenreCount.ContainsKey(g)) { advTrackCalc.GenreCount.Add(g, 0); } if (advTrackCalc.GenreCount.ContainsKey(g)) { advTrackCalc.GenreCount[g]++; } } } var genreList = advTrackCalc.GenreCount.ToList(); genreList.Sort((x, y) => x.Value.CompareTo(y.Value)); advTrackCalc.GenreCount.Clear(); var limit = 5; if (genreList.Count > limit) { genreList.RemoveRange(0, genreList.Count - limit); } foreach (var g in genreList) { advTrackCalc.GenreCount.Add(g.Key, g.Value); } //Jesus this is ugly var advTracks = await GetAudioFeatures(tracks.ToArray()); advTrackCalc.Total = advTracks.Count; foreach (var track in advTracks) { foreach (var t in testTrack) { if (track.Id == t.Id) { track.Name = t.Name; track.Artist = t.Artist; } } advTrackCalc.Acousticness.Add(track.Acousticness); advTrackCalc.TotAcousticness += track.Acousticness; advTrackCalc.Dance.Add(track.Danceability); advTrackCalc.TotDance += track.Danceability; advTrackCalc.Energy.Add(track.Energy); advTrackCalc.TotEnergy += track.Energy; advTrackCalc.Key.Add(track.Key); advTrackCalc.TotKey += track.Key; advTrackCalc.Mode.Add(track.Mode); advTrackCalc.TotMode += track.Mode; advTrackCalc.Loudness.Add(track.Loudness); advTrackCalc.TotLoudness += track.Loudness; advTrackCalc.Speechiness.Add(track.Speechiness); advTrackCalc.TotSpeechiness += track.Speechiness; advTrackCalc.Instrumentalness.Add(track.Instrumentalness); advTrackCalc.TotInstrumentalness += track.Instrumentalness; advTrackCalc.Liveness.Add(track.Liveness); advTrackCalc.TotLiveness += track.Liveness; advTrackCalc.Valence.Add(track.Valence); advTrackCalc.TotValence += track.Valence; advTrackCalc.Duration.Add(track.Duration_ms); advTrackCalc.TotDuration += track.Duration_ms; advTrackCalc.Tempo.Add(track.Tempo); advTrackCalc.TotTempo += track.Tempo; } advTrackCalc.Tracks = advTracks; advTrackCalc.AvgAcousticness = (advTrackCalc.TotAcousticness / advTrackCalc.Total); advTrackCalc.AvgDance = (advTrackCalc.TotDance / advTrackCalc.Total); advTrackCalc.AvgEnergy = (advTrackCalc.TotEnergy / advTrackCalc.Total); advTrackCalc.AvgKey = (advTrackCalc.TotKey / advTrackCalc.Total); advTrackCalc.AvgMode = (advTrackCalc.TotMode / advTrackCalc.Total); advTrackCalc.AvgLoudness = (advTrackCalc.TotLoudness / advTrackCalc.Total); advTrackCalc.AvgSpeechiness = (advTrackCalc.TotSpeechiness / advTrackCalc.Total); advTrackCalc.AvgInstrumentalness = (advTrackCalc.TotInstrumentalness / advTrackCalc.Total); advTrackCalc.AvgLiveness = (advTrackCalc.TotLiveness / advTrackCalc.Total); advTrackCalc.AvgLoudness = (advTrackCalc.TotLoudness / advTrackCalc.Total); advTrackCalc.AvgValence = (advTrackCalc.TotValence / advTrackCalc.Total); advTrackCalc.AvgDuration = (advTrackCalc.TotDuration / advTrackCalc.Total); advTrackCalc.AvgTempo = (advTrackCalc.TotTempo / advTrackCalc.Total); advTrackCalc.StdAcousticness = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotAcousticness / advTrackCalc.Total, advTrackCalc.Acousticness); advTrackCalc.StdDance = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotDance / advTrackCalc.Total, advTrackCalc.Dance); advTrackCalc.StdEnergy = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotEnergy / advTrackCalc.Total, advTrackCalc.Energy); advTrackCalc.StdKey = (int?)advTrackCalc.GetStdDev(advTrackCalc.TotKey / advTrackCalc.Total, advTrackCalc.Key); advTrackCalc.StdMode = (int?)advTrackCalc.GetStdDev(advTrackCalc.TotMode / advTrackCalc.Total, advTrackCalc.Mode); advTrackCalc.StdLoudness = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotLoudness / advTrackCalc.Total, advTrackCalc.Loudness); advTrackCalc.StdSpeechiness = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotSpeechiness / advTrackCalc.Total, advTrackCalc.Speechiness); advTrackCalc.StdInstrumentalness = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotInstrumentalness / advTrackCalc.Total, advTrackCalc.Instrumentalness); advTrackCalc.StdLiveness = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotLiveness / advTrackCalc.Total, advTrackCalc.Liveness); advTrackCalc.StdLoudness = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotLoudness / advTrackCalc.Total, advTrackCalc.Loudness); advTrackCalc.StdValence = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotValence / advTrackCalc.Total, advTrackCalc.Valence); advTrackCalc.StdDuration = (int?)advTrackCalc.GetStdDev(advTrackCalc.TotDuration / advTrackCalc.Total, advTrackCalc.Duration); advTrackCalc.StdTempo = (float?)advTrackCalc.GetStdDev(advTrackCalc.TotTempo / advTrackCalc.Total, advTrackCalc.Tempo); return(advTrackCalc); }