using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using IF.Lastfm.Core.Api.Commands.UserApi; 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 { public class UserApi : IUserApi { public IAuth Auth { get; private set; } public UserApi(IAuth auth) { Auth = auth; } /// /// Gets the top albums for the given user. /// /// /// /// /// /// public async Task> GetTopAlbums(string username, LastStatsTimeSpan span, int pagenumber = 0, int count = LastFm.DefaultPageLength) { var command = new GetTopAlbumsCommand(Auth, username, span) { Page = pagenumber, Count = count }; return await command.ExecuteAsync(); } /// /// Gets scrobbles and stuff /// /// /// /// /// /// public async Task> GetRecentScrobbles(string username, DateTime since, int pagenumber = 0, int count = LastFm.DefaultPageLength) { var command = new GetRecentScrobblesCommand(Auth, username, since) { Page = pagenumber, Count = count }; return await command.ExecuteAsync(); } public async Task> GetRecentStations(string username, int pagenumber = 0, int count = LastFm.DefaultPageLength) { var command = new GetRecentStationsCommand(Auth, username) { Page = pagenumber, Count = count }; return await command.ExecuteAsync(); const string apiMethod = "user.getRecentStations"; var methodParameters = new Dictionary { {"user", Auth.User.Username}, {"page", pagenumber.ToString()}, {"limit", count.ToString()}, {"sk", Auth.User.Token} }; var apisig = Auth.GenerateMethodSignature(apiMethod, methodParameters); var postContent = LastFm.CreatePostBody(apiMethod, Auth.ApiKey, apisig, methodParameters); var httpClient = new HttpClient(); var lastResponse = await httpClient.PostAsync(LastFm.ApiRoot, postContent); var json = await lastResponse.Content.ReadAsStringAsync(); LastFmApiError error; if (LastFm.IsResponseValid(json, out error) && lastResponse.IsSuccessStatusCode) { var jtoken = JsonConvert.DeserializeObject(json).SelectToken("recentstations"); var stationsToken = jtoken.SelectToken("station"); var stations = stationsToken.Children().Select(Station.ParseJToken).ToList(); var pageresponse = PageResponse.CreateSuccessResponse(stations); var attrToken = jtoken.SelectToken("@attr"); pageresponse.AddPageInfoFromJToken(attrToken); return pageresponse; } else { return PageResponse.CreateErrorResponse(error); } } } }