From 6ee13480cc4992b32645b5a8e7e5affd244f1638 Mon Sep 17 00:00:00 2001 From: Rikki Tooley Date: Sun, 23 Jun 2013 20:10:57 +0100 Subject: [PATCH] Moving stuff to commands --- IF.Lastfm.Core/Api/AlbumApi.cs | 32 ++----- .../Commands/AlbumApi/GetAbumInfoCommand.cs | 63 +++++++++++++ .../Api/Commands/GetAsyncCommandBase.cs | 39 ++++++++ .../Api/Commands/IAsyncLastCommand.cs | 13 +++ .../UserApi/GetRecentScrobblesCommand.cs | 76 ++++++++++++++++ .../Commands/UserApi/GetTopAlbumsCommand.cs | 63 +++++++++++++ IF.Lastfm.Core/Api/UserApi.cs | 91 ++++--------------- IF.Lastfm.Core/IF.Lastfm.Core.csproj | 9 ++ 8 files changed, 285 insertions(+), 101 deletions(-) create mode 100644 IF.Lastfm.Core/Api/Commands/AlbumApi/GetAbumInfoCommand.cs create mode 100644 IF.Lastfm.Core/Api/Commands/GetAsyncCommandBase.cs create mode 100644 IF.Lastfm.Core/Api/Commands/IAsyncLastCommand.cs create mode 100644 IF.Lastfm.Core/Api/Commands/UserApi/GetRecentScrobblesCommand.cs create mode 100644 IF.Lastfm.Core/Api/Commands/UserApi/GetTopAlbumsCommand.cs diff --git a/IF.Lastfm.Core/Api/AlbumApi.cs b/IF.Lastfm.Core/Api/AlbumApi.cs index 9cdb903..40f1816 100644 --- a/IF.Lastfm.Core/Api/AlbumApi.cs +++ b/IF.Lastfm.Core/Api/AlbumApi.cs @@ -4,6 +4,7 @@ using System.Net.Http.Headers; using System.Threading; using System.Threading.Tasks; +using IF.Lastfm.Core.Api.Commands.AlbumApi; using IF.Lastfm.Core.Api.Enums; using IF.Lastfm.Core.Api.Helpers; using IF.Lastfm.Core.Objects; @@ -25,33 +26,12 @@ public AlbumApi(IAuth auth) public async Task> GetAlbumInfoAsync(string artistname, string albumname, bool autocorrect = false) { - const string apiMethod = "album.getInfo"; + var command = new GetAlbumInfoCommand(Auth, artistname, albumname) + { + Autocorrect = autocorrect + }; - var parameters = new Dictionary - { - {"artist", artistname}, - {"album", albumname}, - {"autocorrect", Convert.ToInt32(autocorrect).ToString()} - }; - - var httpClient = new HttpClient(); - var apiUrl = LastFm.FormatApiUrl(apiMethod, Auth.ApiKey, parameters); - 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 album = Album.ParseJToken(jtoken.SelectToken("album")); - - return LastResponse.CreateSuccessResponse(album); - } - else - { - return LastResponse.CreateErrorResponse(error); - } + return await command.ExecuteAsync(); } public Task> GetAlbumInfoWithMbidAsync(string mbid, bool autocorrect = false) diff --git a/IF.Lastfm.Core/Api/Commands/AlbumApi/GetAbumInfoCommand.cs b/IF.Lastfm.Core/Api/Commands/AlbumApi/GetAbumInfoCommand.cs new file mode 100644 index 0000000..6fa534f --- /dev/null +++ b/IF.Lastfm.Core/Api/Commands/AlbumApi/GetAbumInfoCommand.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +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.AlbumApi +{ + internal class GetAlbumInfoCommand : GetAsyncCommandBase> + { + public string ArtistName { get; private set; } + public string AlbumName { get; private set; } + public bool Autocorrect { get; set; } + + public GetAlbumInfoCommand(IAuth auth, string artistname, string albumname) : base(auth) + { + Method = "album.getInfo"; + ArtistName = artistname; + AlbumName = albumname; + } + + public async override Task> ExecuteAsync() + { + var parameters = new Dictionary + { + {"artist", ArtistName}, + {"album", AlbumName}, + {"autocorrect", Convert.ToInt32(Autocorrect).ToString()} + }; + + var apiUrl = LastFm.FormatApiUrl(Method, Auth.ApiKey, parameters); + Url = new Uri(apiUrl, UriKind.Absolute); + + return await ExecuteInternal(); + } + + public async override Task> HandleResponse(HttpResponseMessage response) + { + string json = await response.Content.ReadAsStringAsync(); + + LastFmApiError error; + if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode) + { + var jtoken = JsonConvert.DeserializeObject(json); + + var album = Album.ParseJToken(jtoken.SelectToken("album")); + + return LastResponse.CreateSuccessResponse(album); + } + else + { + return LastResponse.CreateErrorResponse(error); + } + } + } + +} diff --git a/IF.Lastfm.Core/Api/Commands/GetAsyncCommandBase.cs b/IF.Lastfm.Core/Api/Commands/GetAsyncCommandBase.cs new file mode 100644 index 0000000..d15fc37 --- /dev/null +++ b/IF.Lastfm.Core/Api/Commands/GetAsyncCommandBase.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; + +namespace IF.Lastfm.Core.Api.Commands +{ + internal abstract class GetAsyncCommandBase : IAsyncLastCommand + { + public string Method { get; protected set; } + public Uri Url { get; protected set; } + public IAuth Auth { get; protected set; } + + public int Page { get; set; } + public int Count { get; set; } + + protected GetAsyncCommandBase(IAuth auth) + { + Auth = auth; + } + + public abstract Task ExecuteAsync(); + + protected async Task ExecuteInternal() + { + var httpClient = new HttpClient(); + var response = await httpClient.GetAsync(Url); + return await HandleResponse(response); + } + + public abstract Task HandleResponse(HttpResponseMessage response); + + protected void AddPagingParameters(Dictionary parameters) + { + parameters.Add("page", Page.ToString()); + parameters.Add("limit", Count.ToString()); + } + } +} \ No newline at end of file diff --git a/IF.Lastfm.Core/Api/Commands/IAsyncLastCommand.cs b/IF.Lastfm.Core/Api/Commands/IAsyncLastCommand.cs new file mode 100644 index 0000000..3bb6566 --- /dev/null +++ b/IF.Lastfm.Core/Api/Commands/IAsyncLastCommand.cs @@ -0,0 +1,13 @@ +using System.Text; +using System.Threading.Tasks; + +namespace IF.Lastfm.Core.Api.Commands +{ + internal interface IAsyncLastCommand + { + } + + internal interface IAsyncLastCommand + { + } +} diff --git a/IF.Lastfm.Core/Api/Commands/UserApi/GetRecentScrobblesCommand.cs b/IF.Lastfm.Core/Api/Commands/UserApi/GetRecentScrobblesCommand.cs new file mode 100644 index 0000000..7bedfde --- /dev/null +++ b/IF.Lastfm.Core/Api/Commands/UserApi/GetRecentScrobblesCommand.cs @@ -0,0 +1,76 @@ +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); + } + } + } +} \ No newline at end of file diff --git a/IF.Lastfm.Core/Api/Commands/UserApi/GetTopAlbumsCommand.cs b/IF.Lastfm.Core/Api/Commands/UserApi/GetTopAlbumsCommand.cs new file mode 100644 index 0000000..550600f --- /dev/null +++ b/IF.Lastfm.Core/Api/Commands/UserApi/GetTopAlbumsCommand.cs @@ -0,0 +1,63 @@ +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.Commands.UserApi +{ + internal class GetTopAlbumsCommand : GetAsyncCommandBase> + { + public string Username { get; set; } + public LastStatsTimeSpan TimeSpan { get; set; } + + public GetTopAlbumsCommand(IAuth auth, string username, LastStatsTimeSpan span) : base(auth) + { + Method = "user.getTopAlbums"; + Username = username; + TimeSpan = span; + } + + public async override Task> ExecuteAsync() + { + var parameters = new Dictionary + { + {"username", Username}, + {"period", TimeSpan.GetApiName()} + }; + + 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) + { + string json = await response.Content.ReadAsStringAsync(); + + LastFmApiError error; + if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode) + { + JToken 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); + } + } + } +} \ No newline at end of file diff --git a/IF.Lastfm.Core/Api/UserApi.cs b/IF.Lastfm.Core/Api/UserApi.cs index d37da28..37add49 100644 --- a/IF.Lastfm.Core/Api/UserApi.cs +++ b/IF.Lastfm.Core/Api/UserApi.cs @@ -3,6 +3,7 @@ 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; @@ -27,37 +28,15 @@ public UserApi(IAuth auth) /// /// /// - public async Task> GetTopAlbums(LastStatsTimeSpan span, int startIndex = 0, int amount = LastFm.DefaultPageLength) + public async Task> GetTopAlbums(LastStatsTimeSpan span, int pagenumber = 0, int count = LastFm.DefaultPageLength) { - const string apiMethod = "user.getTopAlbums"; + var command = new GetTopAlbumsCommand(Auth, Auth.User.Username, span) + { + Page = pagenumber, + Count = count + }; - 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); - } + return await command.ExecuteAsync(); } /// @@ -68,56 +47,18 @@ public async Task> GetTopAlbums(LastStatsTimeSpan span, int /// /// /// - public async Task> GetRecentScrobbles(string username, DateTime since, int pagenumber, int count = LastFm.DefaultPageLength) + public async Task> GetRecentScrobbles(string username, DateTime since, int pagenumber = 0, int count = LastFm.DefaultPageLength) { - const string apiMethod = "user.getRecentTracks"; + var command = new GetRecentScrobblesCommand(Auth, username, since) + { + Page = pagenumber, + Count = count + }; - 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); - } + return await command.ExecuteAsync(); } - public async Task> GetRecentStations(int pagenumber, int count = LastFm.DefaultPageLength) + public async Task> GetRecentStations(int pagenumber = 0, int count = LastFm.DefaultPageLength) { const string apiMethod = "user.getRecentStations"; diff --git a/IF.Lastfm.Core/IF.Lastfm.Core.csproj b/IF.Lastfm.Core/IF.Lastfm.Core.csproj index 533e2f3..192a76e 100644 --- a/IF.Lastfm.Core/IF.Lastfm.Core.csproj +++ b/IF.Lastfm.Core/IF.Lastfm.Core.csproj @@ -40,9 +40,14 @@ + + + + + @@ -100,6 +105,10 @@ ..\lib\xBrainLab.Security.Cryptography.dll + + + +