Moving stuff to commands

This commit is contained in:
Rikki Tooley 2013-06-23 20:10:57 +01:00
parent e6cc245905
commit 6ee13480cc
8 changed files with 285 additions and 101 deletions

View File

@ -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<LastResponse<Album>> GetAlbumInfoAsync(string artistname, string albumname, bool autocorrect = false)
{
const string apiMethod = "album.getInfo";
var parameters = new Dictionary<string, string>
var command = new GetAlbumInfoCommand(Auth, artistname, albumname)
{
{"artist", artistname},
{"album", albumname},
{"autocorrect", Convert.ToInt32(autocorrect).ToString()}
Autocorrect = autocorrect
};
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<JToken>(json);
var album = Album.ParseJToken(jtoken.SelectToken("album"));
return LastResponse<Album>.CreateSuccessResponse(album);
}
else
{
return LastResponse<Album>.CreateErrorResponse(error);
}
return await command.ExecuteAsync();
}
public Task<LastResponse<Album>> GetAlbumInfoWithMbidAsync(string mbid, bool autocorrect = false)

View File

@ -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<LastResponse<Album>>
{
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<LastResponse<Album>> ExecuteAsync()
{
var parameters = new Dictionary<string, string>
{
{"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<LastResponse<Album>> HandleResponse(HttpResponseMessage response)
{
string json = await response.Content.ReadAsStringAsync();
LastFmApiError error;
if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode)
{
var jtoken = JsonConvert.DeserializeObject<JToken>(json);
var album = Album.ParseJToken(jtoken.SelectToken("album"));
return LastResponse<Album>.CreateSuccessResponse(album);
}
else
{
return LastResponse<Album>.CreateErrorResponse(error);
}
}
}
}

View File

@ -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<T> : IAsyncLastCommand<T>
{
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<T> ExecuteAsync();
protected async Task<T> ExecuteInternal()
{
var httpClient = new HttpClient();
var response = await httpClient.GetAsync(Url);
return await HandleResponse(response);
}
public abstract Task<T> HandleResponse(HttpResponseMessage response);
protected void AddPagingParameters(Dictionary<string, string> parameters)
{
parameters.Add("page", Page.ToString());
parameters.Add("limit", Count.ToString());
}
}
}

View File

@ -0,0 +1,13 @@
using System.Text;
using System.Threading.Tasks;
namespace IF.Lastfm.Core.Api.Commands
{
internal interface IAsyncLastCommand
{
}
internal interface IAsyncLastCommand<T>
{
}
}

View File

@ -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<PageResponse<Track>>
{
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<PageResponse<Track>> ExecuteAsync()
{
var parameters = new Dictionary<string, string>
{
{"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<PageResponse<Track>> HandleResponse(HttpResponseMessage response)
{
var json = await response.Content.ReadAsStringAsync();
LastFmApiError error;
if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode)
{
JToken jtoken = JsonConvert.DeserializeObject<JToken>(json).SelectToken("recenttracks");
var tracksToken = jtoken.SelectToken("track");
var tracks = new List<Track>();
foreach (var track in tracksToken.Children())
{
var t = Track.ParseJToken(track);
var date = track.SelectToken("date");
var stamp = date.Value<double>("uts");
t.TimePlayed = stamp.ToDateTimeUtc();
tracks.Add(t);
}
var pageresponse = PageResponse<Track>.CreateSuccessResponse(tracks);
var attrToken = jtoken.SelectToken("@attr");
pageresponse.AddPageInfoFromJToken(attrToken);
return pageresponse;
}
else
{
return PageResponse<Track>.CreateErrorResponse(error);
}
}
}
}

View File

@ -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<PageResponse<Album>>
{
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<PageResponse<Album>> ExecuteAsync()
{
var parameters = new Dictionary<string, string>
{
{"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<PageResponse<Album>> HandleResponse(HttpResponseMessage response)
{
string json = await response.Content.ReadAsStringAsync();
LastFmApiError error;
if (LastFm.IsResponseValid(json, out error) && response.IsSuccessStatusCode)
{
JToken jtoken = JsonConvert.DeserializeObject<JToken>(json);
var albumsToken = jtoken.SelectToken("topalbums").SelectToken("album");
var albums = albumsToken.Children().Select(Album.ParseJToken);
return PageResponse<Album>.CreateSuccessResponse(albums);
}
else
{
return PageResponse<Album>.CreateErrorResponse(error);
}
}
}
}

View File

@ -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)
/// <param name="startIndex"></param>
/// <param name="amount"></param>
/// <returns></returns>
public async Task<PageResponse<Album>> GetTopAlbums(LastStatsTimeSpan span, int startIndex = 0, int amount = LastFm.DefaultPageLength)
public async Task<PageResponse<Album>> GetTopAlbums(LastStatsTimeSpan span, int pagenumber = 0, int count = LastFm.DefaultPageLength)
{
const string apiMethod = "user.getTopAlbums";
var parameters = new Dictionary<string, string>
var command = new GetTopAlbumsCommand(Auth, Auth.User.Username, span)
{
{"user", Auth.User.Username},
{"period", span.GetApiName()}
Page = pagenumber,
Count = count
};
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<JToken>(json);
var albumsToken = jtoken.SelectToken("topalbums").SelectToken("album");
var albums = albumsToken.Children().Select(Album.ParseJToken);
return PageResponse<Album>.CreateSuccessResponse(albums);
}
else
{
return PageResponse<Album>.CreateErrorResponse(error);
}
return await command.ExecuteAsync();
}
/// <summary>
@ -68,56 +47,18 @@ public async Task<PageResponse<Album>> GetTopAlbums(LastStatsTimeSpan span, int
/// <param name="pagenumber"></param>
/// <param name="endIndex"></param>
/// <returns></returns>
public async Task<PageResponse<Track>> GetRecentScrobbles(string username, DateTime since, int pagenumber, int count = LastFm.DefaultPageLength)
public async Task<PageResponse<Track>> GetRecentScrobbles(string username, DateTime since, int pagenumber = 0, int count = LastFm.DefaultPageLength)
{
const string apiMethod = "user.getRecentTracks";
var parameters = new Dictionary<string, string>
var command = new GetRecentScrobblesCommand(Auth, username, since)
{
{"user", Auth.User.Username},
{"from", since.ToUnixTimestamp().ToString()},
{"page", pagenumber.ToString()},
{"limit", count.ToString()}
Page = pagenumber,
Count = count
};
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<JToken>(json).SelectToken("recenttracks");
var tracksToken = jtoken.SelectToken("track");
var tracks = new List<Track>();
foreach (var track in tracksToken.Children())
{
var t = Track.ParseJToken(track);
var date = track.SelectToken("date");
var stamp = date.Value<double>("uts");
t.TimePlayed = stamp.ToDateTimeUtc();
tracks.Add(t);
return await command.ExecuteAsync();
}
var pageresponse = PageResponse<Track>.CreateSuccessResponse(tracks);
var attrToken = jtoken.SelectToken("@attr");
pageresponse.AddPageInfoFromJToken(attrToken);
return pageresponse;
}
else
{
return PageResponse<Track>.CreateErrorResponse(error);
}
}
public async Task<PageResponse<Station>> GetRecentStations(int pagenumber, int count = LastFm.DefaultPageLength)
public async Task<PageResponse<Station>> GetRecentStations(int pagenumber = 0, int count = LastFm.DefaultPageLength)
{
const string apiMethod = "user.getRecentStations";

View File

@ -40,9 +40,14 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Api\AlbumApi.cs" />
<Compile Include="Api\Commands\AlbumApi\GetAbumInfoCommand.cs" />
<Compile Include="Api\Commands\GetAsyncCommandBase.cs" />
<Compile Include="Api\Commands\UserApi\GetRecentScrobblesCommand.cs" />
<Compile Include="Api\Commands\UserApi\GetTopAlbumsCommand.cs" />
<Compile Include="Api\Helpers\ApiExtensions.cs" />
<Compile Include="Api\Helpers\ApiNameAttribute.cs" />
<Compile Include="Api\Auth.cs" />
<Compile Include="Api\Commands\IAsyncLastCommand.cs" />
<Compile Include="Api\Helpers\LastResponse.cs" />
<Compile Include="Api\Helpers\PageResponse.cs" />
<Compile Include="Api\IAlbumApi.cs" />
@ -100,6 +105,10 @@
<HintPath>..\lib\xBrainLab.Security.Cryptography.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Folder Include="Api\Commands\ArtistApi\" />
<Folder Include="Api\Commands\TrackApi\" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.7\tools\Microsoft.Bcl.Build.targets" />