mirror of
https://github.com/Sarsoo/IF.Lastfm.git
synced 2024-10-16 23:13:07 +01:00
Implemented user.getTopArtists
This commit is contained in:
parent
4cfac6a411
commit
23be035257
@ -0,0 +1,185 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using IF.Lastfm.Core.Api.Commands.User;
|
||||
using IF.Lastfm.Core.Api.Enums;
|
||||
using IF.Lastfm.Core.Api.Helpers;
|
||||
using IF.Lastfm.Core.Objects;
|
||||
using IF.Lastfm.Core.Tests.Resources;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace IF.Lastfm.Core.Tests.Api.Commands
|
||||
{
|
||||
public class UserGetTopArtistsCommandTests : CommandTestsBase
|
||||
{
|
||||
private const string USER = "Aurvandil";
|
||||
private const LastStatsTimeSpan SPAN = LastStatsTimeSpan.Overall;
|
||||
|
||||
[Test]
|
||||
public void ParametersCorrect()
|
||||
{
|
||||
var expected = new Dictionary<string, string>
|
||||
{
|
||||
{"user", USER},
|
||||
{"period", SPAN.GetApiName()},
|
||||
{"page", "5"},
|
||||
{"limit", "10"}
|
||||
};
|
||||
|
||||
var command = new GetTopArtistsCommand(MAuth.Object, USER, SPAN)
|
||||
{
|
||||
Page = 5,
|
||||
Count = 10
|
||||
};
|
||||
|
||||
command.SetParameters();
|
||||
command.Parameters.Remove("disablecachetoken");
|
||||
|
||||
TestHelper.AssertSerialiseEqual(expected, command.Parameters);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task HandleResponseSingle()
|
||||
{
|
||||
var command = new GetTopArtistsCommand(MAuth.Object, USER, SPAN)
|
||||
{
|
||||
Page = 1,
|
||||
Count = 1
|
||||
};
|
||||
|
||||
command.SetParameters();
|
||||
|
||||
var expectedArtist = new LastArtist
|
||||
{
|
||||
Name = "Anathema",
|
||||
PlayCount = 5216,
|
||||
Mbid = "20aa23e3-3532-42ca-acf6-e8c2e9df2688",
|
||||
Url = new Uri("http://www.last.fm/music/Anathema"),
|
||||
MainImage =
|
||||
new LastImageSet("http://userserve-ak.last.fm/serve/34/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/64/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/126/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/252/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/_/12571597/Anathema+Judgement+promo.jpg")
|
||||
};
|
||||
|
||||
var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetTopArtistsSingle));
|
||||
var parsed = await command.HandleResponse(response);
|
||||
|
||||
Assert.IsTrue(parsed.Success);
|
||||
Assert.AreEqual(1, parsed.Page);
|
||||
Assert.AreEqual(1, parsed.PageSize);
|
||||
Assert.AreEqual(1124, parsed.TotalItems);
|
||||
Assert.AreEqual(1124, parsed.TotalPages);
|
||||
Assert.AreEqual(1, parsed.Content.Count);
|
||||
|
||||
var actualArtist = parsed.Content.First();
|
||||
|
||||
TestHelper.AssertSerialiseEqual(expectedArtist, actualArtist);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task HandleResponseMultiple()
|
||||
{
|
||||
var command = new GetTopArtistsCommand(MAuth.Object, USER, SPAN)
|
||||
{
|
||||
Page = 1,
|
||||
Count = 2
|
||||
};
|
||||
|
||||
command.SetParameters();
|
||||
|
||||
var expectedArtists = new List<LastArtist>
|
||||
{
|
||||
new LastArtist
|
||||
{
|
||||
Name = "Anathema",
|
||||
PlayCount = 5216,
|
||||
Mbid = "20aa23e3-3532-42ca-acf6-e8c2e9df2688",
|
||||
Url = new Uri("http://www.last.fm/music/Anathema"),
|
||||
MainImage =
|
||||
new LastImageSet("http://userserve-ak.last.fm/serve/34/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/64/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/126/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/252/12571597.jpg",
|
||||
"http://userserve-ak.last.fm/serve/_/12571597/Anathema+Judgement+promo.jpg")
|
||||
},
|
||||
new LastArtist
|
||||
{
|
||||
Name = "Insomnium",
|
||||
PlayCount = 4670,
|
||||
Mbid = "c1f8e226-75ea-4fe6-83ce-59c122bcbca4",
|
||||
Url = new Uri("http://www.last.fm/music/Insomnium"),
|
||||
MainImage =
|
||||
new LastImageSet("http://userserve-ak.last.fm/serve/34/70409268.jpg",
|
||||
"http://userserve-ak.last.fm/serve/64/70409268.jpg",
|
||||
"http://userserve-ak.last.fm/serve/126/70409268.jpg",
|
||||
"http://userserve-ak.last.fm/serve/252/70409268.jpg",
|
||||
"http://userserve-ak.last.fm/serve/500/70409268/Insomnium.jpg")
|
||||
},
|
||||
};
|
||||
|
||||
var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetTopArtistsMultiple));
|
||||
var parsed = await command.HandleResponse(response);
|
||||
|
||||
Assert.IsTrue(parsed.Success);
|
||||
Assert.AreEqual(1, parsed.Page);
|
||||
Assert.AreEqual(2, parsed.PageSize);
|
||||
Assert.AreEqual(1124, parsed.TotalItems);
|
||||
Assert.AreEqual(562, parsed.TotalPages);
|
||||
Assert.AreEqual(2, parsed.Content.Count);
|
||||
|
||||
var actualArtists = parsed.Content;
|
||||
|
||||
TestHelper.AssertSerialiseEqual(expectedArtists, actualArtists);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task HandleResponseEmpty()
|
||||
{
|
||||
const string USER_WITH_NO_PLAYS = "e";
|
||||
var command = new GetTopArtistsCommand(MAuth.Object, USER_WITH_NO_PLAYS, SPAN)
|
||||
{
|
||||
Page = 1,
|
||||
Count = 1
|
||||
};
|
||||
|
||||
command.SetParameters();
|
||||
|
||||
var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetTopArtistsEmpty));
|
||||
var parsed = await command.HandleResponse(response);
|
||||
|
||||
Assert.IsTrue(parsed.Success);
|
||||
Assert.AreEqual(1, parsed.Page);
|
||||
Assert.AreEqual(0, parsed.PageSize);
|
||||
Assert.AreEqual(0, parsed.TotalItems);
|
||||
Assert.AreEqual(1, parsed.TotalPages);
|
||||
Assert.AreEqual(0, parsed.Content.Count);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public async Task HandleResponseError()
|
||||
{
|
||||
var command = new GetTopArtistsCommand(MAuth.Object, USER, SPAN)
|
||||
{
|
||||
Page = 1,
|
||||
Count = 1
|
||||
};
|
||||
|
||||
command.SetParameters();
|
||||
|
||||
var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetTopArtistsError));
|
||||
var parsed = await command.HandleResponse(response);
|
||||
|
||||
Assert.IsFalse(parsed.Success);
|
||||
Assert.AreEqual(1, parsed.Page);
|
||||
Assert.AreEqual(0, parsed.PageSize);
|
||||
Assert.AreEqual(0, parsed.TotalItems);
|
||||
Assert.AreEqual(1, parsed.TotalPages);
|
||||
Assert.AreEqual(0, parsed.Content.Count);
|
||||
Assert.AreEqual(LastResponseStatus.MissingParameters, parsed.Status);
|
||||
}
|
||||
}
|
||||
}
|
@ -99,6 +99,7 @@
|
||||
<Compile Include="Api\Commands\UserGetRecentTracksCommandTests.cs" />
|
||||
<Compile Include="Api\Commands\UserGetRecommendedArtistsCommandTests.cs" />
|
||||
<Compile Include="Api\Commands\UserGetTopAlbumsCommandTests.cs" />
|
||||
<Compile Include="Api\Commands\UserGetTopArtistsCommandTests.cs" />
|
||||
<Compile Include="Api\Helpers\ApiHelperTests.cs" />
|
||||
<Compile Include="Api\LastMethodsNamesTests.cs" />
|
||||
<Compile Include="Api\LastAuthTests.cs" />
|
||||
@ -195,6 +196,10 @@
|
||||
<None Include="Resources\UserApi\UserGetTopAlbumsError.json" />
|
||||
<None Include="Resources\UserApi\UserGetTopAlbumsMultiple.json" />
|
||||
<None Include="Resources\UserApi\UserGetTopAlbumsSingle.json" />
|
||||
<None Include="Resources\UserApi\UserGetTopArtistsEmpty.json" />
|
||||
<None Include="Resources\UserApi\UserGetTopArtistsError.json" />
|
||||
<None Include="Resources\UserApi\UserGetTopArtistsMultiple.json" />
|
||||
<None Include="Resources\UserApi\UserGetTopArtistsSingle.json" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\IF.Lastfm.Core\IF.Lastfm.Core.csproj">
|
||||
|
@ -0,0 +1,11 @@
|
||||
{
|
||||
"topartists": {
|
||||
"#text": "\n ",
|
||||
"user": "e",
|
||||
"type": "overall",
|
||||
"page": "0",
|
||||
"perPage": "1",
|
||||
"totalPages": "0",
|
||||
"total": "0"
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
{
|
||||
"error": 6,
|
||||
"message": "No user with that name",
|
||||
"links": []
|
||||
}
|
@ -0,0 +1,78 @@
|
||||
{
|
||||
"topartists": {
|
||||
"artist": [
|
||||
{
|
||||
"name": "Anathema",
|
||||
"playcount": "5216",
|
||||
"mbid": "20aa23e3-3532-42ca-acf6-e8c2e9df2688",
|
||||
"url": "http://www.last.fm/music/Anathema",
|
||||
"streamable": "0",
|
||||
"image": [
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/34/12571597.jpg",
|
||||
"size": "small"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/64/12571597.jpg",
|
||||
"size": "medium"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/126/12571597.jpg",
|
||||
"size": "large"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/252/12571597.jpg",
|
||||
"size": "extralarge"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/_/12571597/Anathema+Judgement+promo.jpg",
|
||||
"size": "mega"
|
||||
}
|
||||
],
|
||||
"@attr": {
|
||||
"rank": "1"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Insomnium",
|
||||
"playcount": "4670",
|
||||
"mbid": "c1f8e226-75ea-4fe6-83ce-59c122bcbca4",
|
||||
"url": "http://www.last.fm/music/Insomnium",
|
||||
"streamable": "0",
|
||||
"image": [
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/34/70409268.jpg",
|
||||
"size": "small"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/64/70409268.jpg",
|
||||
"size": "medium"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/126/70409268.jpg",
|
||||
"size": "large"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/252/70409268.jpg",
|
||||
"size": "extralarge"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/500/70409268/Insomnium.jpg",
|
||||
"size": "mega"
|
||||
}
|
||||
],
|
||||
"@attr": {
|
||||
"rank": "2"
|
||||
}
|
||||
}
|
||||
],
|
||||
"@attr": {
|
||||
"user": "Aurvandil",
|
||||
"type": "overall",
|
||||
"page": "1",
|
||||
"perPage": "2",
|
||||
"totalPages": "562",
|
||||
"total": "1124"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
{
|
||||
"topartists": {
|
||||
"artist": {
|
||||
"name": "Anathema",
|
||||
"playcount": "5216",
|
||||
"mbid": "20aa23e3-3532-42ca-acf6-e8c2e9df2688",
|
||||
"url": "http://www.last.fm/music/Anathema",
|
||||
"streamable": "0",
|
||||
"image": [
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/34/12571597.jpg",
|
||||
"size": "small"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/64/12571597.jpg",
|
||||
"size": "medium"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/126/12571597.jpg",
|
||||
"size": "large"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/252/12571597.jpg",
|
||||
"size": "extralarge"
|
||||
},
|
||||
{
|
||||
"#text": "http://userserve-ak.last.fm/serve/_/12571597/Anathema+Judgement+promo.jpg",
|
||||
"size": "mega"
|
||||
}
|
||||
],
|
||||
"@attr": {
|
||||
"rank": "1"
|
||||
}
|
||||
},
|
||||
"@attr": {
|
||||
"user": "Aurvandil",
|
||||
"type": "overall",
|
||||
"page": "1",
|
||||
"perPage": "1",
|
||||
"totalPages": "1124",
|
||||
"total": "1124"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.0
|
||||
// Runtime Version:4.0.30319.34014
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
@ -169,5 +169,45 @@ public static byte[] UserGetTopAlbumsSingle {
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Byte[].
|
||||
/// </summary>
|
||||
public static byte[] UserGetTopArtistsEmpty {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("UserGetTopArtistsEmpty", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Byte[].
|
||||
/// </summary>
|
||||
public static byte[] UserGetTopArtistsError {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("UserGetTopArtistsError", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Byte[].
|
||||
/// </summary>
|
||||
public static byte[] UserGetTopArtistsMultiple {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("UserGetTopArtistsMultiple", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Byte[].
|
||||
/// </summary>
|
||||
public static byte[] UserGetTopArtistsSingle {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("UserGetTopArtistsSingle", resourceCulture);
|
||||
return ((byte[])(obj));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -151,4 +151,16 @@
|
||||
<data name="UserGetTopAlbumsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>userapi\usergettopalbumssingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="UserGetTopArtistsEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>UserApi\UserGetTopArtistsEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="UserGetTopArtistsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>UserApi\UserGetTopArtistsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="UserGetTopArtistsMultiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>UserApi\UserGetTopArtistsMultiple.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name="UserGetTopArtistsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>UserApi\UserGetTopArtistsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
</root>
|
51
src/IF.Lastfm.Core/Api/Commands/User/GetTopArtistsCommand.cs
Normal file
51
src/IF.Lastfm.Core/Api/Commands/User/GetTopArtistsCommand.cs
Normal file
@ -0,0 +1,51 @@
|
||||
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.User
|
||||
{
|
||||
[ApiMethodName("user.getTopArtists")]
|
||||
internal class GetTopArtistsCommand : GetAsyncCommandBase<PageResponse<LastArtist>>
|
||||
{
|
||||
public string Username { get; set; }
|
||||
public LastStatsTimeSpan TimeSpan { get; set; }
|
||||
|
||||
public GetTopArtistsCommand(ILastAuth auth, string username, LastStatsTimeSpan span)
|
||||
: base(auth)
|
||||
{
|
||||
Username = username;
|
||||
TimeSpan = span;
|
||||
}
|
||||
|
||||
public override void SetParameters()
|
||||
{
|
||||
Parameters.Add("user", Username);
|
||||
Parameters.Add("period", TimeSpan.GetApiName());
|
||||
|
||||
AddPagingParameters();
|
||||
DisableCaching();
|
||||
}
|
||||
|
||||
public async override Task<PageResponse<LastArtist>> HandleResponse(HttpResponseMessage response)
|
||||
{
|
||||
var json = await response.Content.ReadAsStringAsync();
|
||||
|
||||
LastResponseStatus status;
|
||||
if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode)
|
||||
{
|
||||
var jtoken = JsonConvert.DeserializeObject<JToken>(json);
|
||||
var topArtistsToken = jtoken.SelectToken("topartists");
|
||||
var itemsToken = topArtistsToken.SelectToken("artist");
|
||||
var pageInfoToken = topArtistsToken.SelectToken("@attr");
|
||||
|
||||
return PageResponse<LastArtist>.CreateSuccessResponse(itemsToken, pageInfoToken, LastArtist.ParseJToken, LastPageResultsType.Attr);
|
||||
}
|
||||
|
||||
return LastResponse.CreateErrorResponse<PageResponse<LastArtist>>(status);
|
||||
}
|
||||
}
|
||||
}
|
@ -19,6 +19,11 @@ Task<PageResponse<LastAlbum>> GetTopAlbums(string username,
|
||||
int startIndex = 0,
|
||||
int endIndex = LastFm.DefaultPageLength);
|
||||
|
||||
Task<PageResponse<LastArtist>> GetTopArtists(string username,
|
||||
LastStatsTimeSpan span,
|
||||
int pagenumber = 0,
|
||||
int count = LastFm.DefaultPageLength);
|
||||
|
||||
Task<PageResponse<LastTrack>> GetRecentScrobbles(string username, DateTimeOffset? since = null, int pagenumber = 0, int count = LastFm.DefaultPageLength);
|
||||
|
||||
Task<PageResponse<LastStation>> GetRecentStations(string username,
|
||||
|
@ -42,6 +42,18 @@ public async Task<PageResponse<LastAlbum>> GetTopAlbums(string username, LastSta
|
||||
return await command.ExecuteAsync();
|
||||
}
|
||||
|
||||
public async Task<PageResponse<LastArtist>> GetTopArtists(string username, LastStatsTimeSpan span, int pagenumber = 0, int count = LastFm.DefaultPageLength)
|
||||
{
|
||||
var command = new GetTopArtistsCommand(Auth, username, span)
|
||||
{
|
||||
Page = pagenumber,
|
||||
Count = count,
|
||||
HttpClient = HttpClient
|
||||
};
|
||||
|
||||
return await command.ExecuteAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a list of recent scrobbled tracks for this user in reverse date order.
|
||||
/// </summary>
|
||||
|
@ -68,6 +68,7 @@
|
||||
<Compile Include="Api\Commands\Track\UpdateNowPlayingCommand.cs" />
|
||||
<Compile Include="Api\Commands\UnauthenticatedPostAsyncCommandBase.cs" />
|
||||
<Compile Include="Api\Commands\User\GetRecommendedArtistsCommand.cs" />
|
||||
<Compile Include="Api\Commands\User\GetTopArtistsCommand.cs" />
|
||||
<Compile Include="Api\ILibraryApi.cs" />
|
||||
<Compile Include="Api\ITagApi.cs" />
|
||||
<Compile Include="Api\LastfmClient.cs" />
|
||||
|
Loading…
Reference in New Issue
Block a user