using System; using System.Collections.Generic; using System.Linq; 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 { public class UserApi : IUserApi { public IAuth Auth { get; private set; } public UserApi(IAuth auth) { Auth = auth; } /// /// TODO paging /// /// /// /// /// public async Task> GetTopAlbums(LastStatsTimeSpan span, int startIndex = 0, int amount = LastFm.DefaultPageLength) { const string apiMethod = "user.getTopAlbums"; var parameters = new Dictionary { {"user", Auth.User.Username}, {"period", span.GetApiName()} }; var apiUrl = LastFm.FormatApiUrl(apiMethod, Auth.ApiKey, parameters); var httpClient = new HttpClient(); var lastResponse = await httpClient.GetAsync(apiUrl); var json = await lastResponse.Content.ReadAsStringAsync(); LastFmApiError error; if (LastFm.IsResponseValid(json, out error) && lastResponse.IsSuccessStatusCode) { var jtoken = JsonConvert.DeserializeObject(json); var albumsToken = jtoken.SelectToken("topalbums").SelectToken("album"); var albums = albumsToken.Children().Select(Album.ParseJToken); return PageResponse.CreateSuccessResponse(albums); } else { return PageResponse.CreateErrorResponse(error); } } /// /// Gets scrobbles and stuff /// /// /// /// /// /// public async Task> GetRecentScrobbles(string username, DateTime since, int pagenumber, int count = LastFm.DefaultPageLength) { const string apiMethod = "user.getRecentTracks"; var parameters = new Dictionary { {"user", Auth.User.Username}, {"from", since.ToUnixTimestamp().ToString()}, {"page", pagenumber.ToString()}, {"limit", count.ToString()} }; var apiUrl = LastFm.FormatApiUrl(apiMethod, Auth.ApiKey, parameters); var httpClient = new HttpClient(); var lastResponse = await httpClient.GetAsync(apiUrl); var json = await lastResponse.Content.ReadAsStringAsync(); LastFmApiError error; if (LastFm.IsResponseValid(json, out error) && lastResponse.IsSuccessStatusCode) { var 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); } } public async Task> GetRecentStations(int pagenumber, int count = LastFm.DefaultPageLength) { 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); } } } }