using System; using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; using IF.Lastfm.Core.Api.Enums; using IF.Lastfm.Core.Api.Helpers; using IF.Lastfm.Core.Objects; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace IF.Lastfm.Core.Api.Commands.UserApi { internal class GetRecentScrobblesCommand : GetAsyncCommandBase> { public string Username { get; private set; } public DateTime From { get; private set; } public GetRecentScrobblesCommand(IAuth auth, string username, DateTime from) : base(auth) { Method = "user.getRecentTracks"; Username = username; From = from; } public async override Task> ExecuteAsync() { var parameters = new Dictionary { {"user", Username}, {"from", From.ToUnixTimestamp().ToString()} }; base.AddPagingParameters(parameters); var uristring = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters); Url = new Uri(uristring, UriKind.Absolute); return await ExecuteInternal(); } public async override Task> HandleResponse(HttpResponseMessage response) { var json = await response.Content.ReadAsStringAsync(); LastFmApiError error; if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode) { JToken jtoken = JsonConvert.DeserializeObject(json).SelectToken("recenttracks"); var tracksToken = jtoken.SelectToken("track"); var tracks = new List(); foreach (var track in tracksToken.Children()) { var t = Track.ParseJToken(track); var date = track.SelectToken("date"); var stamp = date.Value("uts"); t.TimePlayed = stamp.ToDateTimeUtc(); tracks.Add(t); } var pageresponse = PageResponse.CreateSuccessResponse(tracks); var attrToken = jtoken.SelectToken("@attr"); pageresponse.AddPageInfoFromJToken(attrToken); return pageresponse; } else { return PageResponse.CreateErrorResponse(error); } } } }