using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Nancy; using Sony.Filtr.Contracts.Abstractions; using Sony.Filtr.Contracts.Entities; using Sony.Filtr.Core.TrackPopularity; using Sony.Filtr.SpotifyWebAPI; using Nancy.LightningCache.Extensions; namespace Sony.Filtr.AdminAPI.Modules.AnalyzeTrack { public class AnalyzeTrackModule : BaseModule { public AnalyzeTrackModule(IApplicationInstanceManager applicationInstanceManager, SpotifyTrackPopularityManager spotifyTrackPopularityManager, SpotifyWebApi spotifyWebApi) : base(applicationInstanceManager) { Get["AnalyzeTrackPopularity", "/analyze/spotifyTrackPopularity", true] = async (parameters, cancellationToken) => { var trackUri = (string)Request.Query.trackUri; if (string.IsNullOrWhiteSpace(trackUri)) return HttpStatusCode.BadRequest; var popularityLog = await spotifyTrackPopularityManager.GetPopularityLogAsync(new SpotifyLink(trackUri)); return Response.AsJson(popularityLog); }; Get["SpotifyTrackPopularityTopList", "/analyze/spotifyTrackPopularity/TopList", true] = async (parameters, cancellationToken) => (await GetSpotifyTrackPopularityTopList(spotifyTrackPopularityManager, spotifyWebApi)).AsCacheable(DateTime.Now.AddHours(1)); Get["SpotifyTrackPopularityIncreaseToplist", "/analyze/spotifyTrackPopularity/TopListChanging", true] = async (parameters, cancellationToken) => (await GetSpotifyTrackPopularityTopListChanging(spotifyTrackPopularityManager, spotifyWebApi)).AsCacheable(DateTime.Now.AddHours(1)); } private async Task GetSpotifyTrackPopularityTopListChanging(SpotifyTrackPopularityManager spotifyTrackPopularityManager, SpotifyWebApi spotifyWebApi) { var increasingTopList = await spotifyTrackPopularityManager.GetTopListMostChangingAsync(100); var viewModels = await BuildViewModelsAsync(spotifyWebApi, increasingTopList); return Response.AsJson(viewModels); } private async Task GetSpotifyTrackPopularityTopList(SpotifyTrackPopularityManager spotifyTrackPopularityManager, SpotifyWebApi spotifyWebApi) { var date = DateTime.Today; var dateQuery = (string) Request.Query.date; if (!string.IsNullOrWhiteSpace(dateQuery)) { DateTime tempDate; if (DateTime.TryParse(dateQuery, out tempDate)) { date = tempDate; } } var popularityLog = await spotifyTrackPopularityManager.GetTopListAsync(date, 100); var viewModels = await BuildViewModelsAsync(spotifyWebApi, popularityLog); return Response.AsJson(viewModels); } private static async Task> BuildViewModelsAsync(SpotifyWebApi spotifyWebApi, List popularityLog) { var spotifyTracks = await spotifyWebApi.GetAllTracksAsync(popularityLog.Select(p => p.TrackLink.ExtractTrackID()).Distinct().ToList()); var viewModels = popularityLog.Join(spotifyTracks, popVal => popVal.TrackLink.Uri, track => track.uri, (popVal, track) => new SpotifyTrackPopularityViewModel() { Artist = track.artists.First().name, Name = track.name, Popularity = popVal.Popularity }).ToList(); return viewModels; } public class SpotifyTrackPopularityViewModel { public int Popularity { get; set; } public string Artist { get; set; } public string Name { get; set; } } } }