mirror of
https://github.com/Sarsoo/IF.Lastfm.git
synced 2024-10-16 23:13:07 +01:00
Add optional parameters to the GetRecentTracks request
This commit is contained in:
parent
fe98ddbdc8
commit
c3aff5aa29
@ -45,7 +45,7 @@ public async Task ScrobblesSingle()
|
|||||||
};
|
};
|
||||||
var expectedJson = expectedTrack.TestSerialise();
|
var expectedJson = expectedTrack.TestSerialise();
|
||||||
|
|
||||||
var tracks = await Lastfm.User.GetRecentScrobbles(Lastfm.Auth.UserSession.Username, null, 1, 1);
|
var tracks = await Lastfm.User.GetRecentScrobbles(Lastfm.Auth.UserSession.Username, null, null, false, 1, 1);
|
||||||
var scrobbledTrack = tracks.Single(x => !x.IsNowPlaying.GetValueOrDefault(false));
|
var scrobbledTrack = tracks.Single(x => !x.IsNowPlaying.GetValueOrDefault(false));
|
||||||
|
|
||||||
TestHelper.AssertSerialiseEqual(trackPlayed, scrobbledTrack.TimePlayed);
|
TestHelper.AssertSerialiseEqual(trackPlayed, scrobbledTrack.TimePlayed);
|
||||||
|
@ -30,7 +30,7 @@ public async Task UpdatesNowPlaying()
|
|||||||
|
|
||||||
await Task.Delay(1000);
|
await Task.Delay(1000);
|
||||||
|
|
||||||
var tracks = await Lastfm.User.GetRecentScrobbles(Lastfm.Auth.UserSession.Username, null, 1, 1);
|
var tracks = await Lastfm.User.GetRecentScrobbles(Lastfm.Auth.UserSession.Username, null, null, false, 1, 1);
|
||||||
|
|
||||||
var expectedTrack = new LastTrack
|
var expectedTrack = new LastTrack
|
||||||
{
|
{
|
||||||
|
@ -34,7 +34,7 @@ protected string GetFileContents(string sampleFile)
|
|||||||
{
|
{
|
||||||
if (stream != null)
|
if (stream != null)
|
||||||
{
|
{
|
||||||
var reader = new StreamReader(stream);
|
using (var reader = new StreamReader(stream, Encoding.UTF8))
|
||||||
return reader.ReadToEnd();
|
return reader.ReadToEnd();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ public async Task HandleResponseMultiple()
|
|||||||
Name = "Superstition",
|
Name = "Superstition",
|
||||||
ArtistMbid = "1ee18fb3-18a6-4c7f-8ba0-bc41cdd0462e",
|
ArtistMbid = "1ee18fb3-18a6-4c7f-8ba0-bc41cdd0462e",
|
||||||
AlbumName = "Number Ones",
|
AlbumName = "Number Ones",
|
||||||
|
ArtistUrl = new Uri("http://www.last.fm/music/Stevie+Wonder", UriKind.Absolute),
|
||||||
Url = new Uri("http://www.last.fm/music/Stevie+Wonder/_/Superstition", UriKind.Absolute),
|
Url = new Uri("http://www.last.fm/music/Stevie+Wonder/_/Superstition", UriKind.Absolute),
|
||||||
Images = new LastImageSet(
|
Images = new LastImageSet(
|
||||||
"http://userserve-ak.last.fm/serve/34s/99695819.jpg",
|
"http://userserve-ak.last.fm/serve/34s/99695819.jpg",
|
||||||
@ -65,6 +66,7 @@ public async Task HandleResponseSingle()
|
|||||||
Name = "Sultans of Swing",
|
Name = "Sultans of Swing",
|
||||||
ArtistMbid = "614e3804-7d34-41ba-857f-811bad7c2b7a",
|
ArtistMbid = "614e3804-7d34-41ba-857f-811bad7c2b7a",
|
||||||
AlbumName = "Dire Straits (Remastered)",
|
AlbumName = "Dire Straits (Remastered)",
|
||||||
|
ArtistUrl = new Uri("http://www.last.fm/music/Dire+Straits", UriKind.Absolute),
|
||||||
Url = new Uri("http://www.last.fm/music/Dire+Straits/_/Sultans+of+Swing", UriKind.Absolute),
|
Url = new Uri("http://www.last.fm/music/Dire+Straits/_/Sultans+of+Swing", UriKind.Absolute),
|
||||||
Images = new LastImageSet(
|
Images = new LastImageSet(
|
||||||
"http://userserve-ak.last.fm/serve/34s/56827829.jpg",
|
"http://userserve-ak.last.fm/serve/34s/56827829.jpg",
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
using IF.Lastfm.Core.Api.Enums;
|
using IF.Lastfm.Core.Api.Enums;
|
||||||
using IF.Lastfm.Core.Objects;
|
using IF.Lastfm.Core.Objects;
|
||||||
using IF.Lastfm.Core.Tests.Resources;
|
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using IF.Lastfm.Core.Api.Commands.User;
|
using IF.Lastfm.Core.Api.Commands.User;
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
namespace IF.Lastfm.Core.Tests.Api.Commands
|
namespace IF.Lastfm.Core.Tests.Api.Commands
|
||||||
{
|
{
|
||||||
@ -81,6 +77,48 @@ public async Task HandleResponseSingle()
|
|||||||
TestHelper.AssertSerialiseEqual(expectedTrack, actual.Single());
|
TestHelper.AssertSerialiseEqual(expectedTrack, actual.Single());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task HandleExtendedResponse()
|
||||||
|
{
|
||||||
|
var command = new GetRecentTracksCommand(MAuth.Object, "rj")
|
||||||
|
{
|
||||||
|
Count = 1,
|
||||||
|
Extended = true
|
||||||
|
};
|
||||||
|
|
||||||
|
var expectedTrack = new LastTrack
|
||||||
|
{
|
||||||
|
ArtistName = "Republika",
|
||||||
|
ArtistMbid = "116a9ec8-148e-4b3d-8fb9-3d995cc4159e",
|
||||||
|
ArtistUrl = new Uri("https://www.last.fm/music/Republika", UriKind.Absolute),
|
||||||
|
ArtistImages = new LastImageSet(
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/34s/e45f11a32d134ed4aeb1ce7b25445fb2.png",
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/64s/e45f11a32d134ed4aeb1ce7b25445fb2.png",
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/174s/e45f11a32d134ed4aeb1ce7b25445fb2.png",
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/300x300/e45f11a32d134ed4aeb1ce7b25445fb2.png"),
|
||||||
|
TimePlayed = new DateTime(2018, 06, 27, 16, 32, 16, DateTimeKind.Utc),
|
||||||
|
Mbid = string.Empty,
|
||||||
|
Name = "Tak Długo Czekam (Ciało) (live)",
|
||||||
|
AlbumName = "Koncerty w Trójce - Republika",
|
||||||
|
Url = new Uri("https://www.last.fm/music/Republika/_/Tak+D%C5%82ugo+Czekam+(Cia%C5%82o)+(live)", UriKind.Absolute),
|
||||||
|
Images = new LastImageSet(
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/34s/1756f85e7332d469dd17b2e1e0a4d16c.png",
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/64s/1756f85e7332d469dd17b2e1e0a4d16c.png",
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/174s/1756f85e7332d469dd17b2e1e0a4d16c.png",
|
||||||
|
"https://lastfm-img2.akamaized.net/i/u/300x300/1756f85e7332d469dd17b2e1e0a4d16c.png"),
|
||||||
|
IsLoved = true
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
var file = GetFileContents("UserApi.UserGetRecentTracksExtended.json");
|
||||||
|
var response = CreateResponseMessage(file);
|
||||||
|
|
||||||
|
var actual = await command.HandleResponse(response);
|
||||||
|
|
||||||
|
Assert.IsTrue(actual.Success);
|
||||||
|
TestHelper.AssertSerialiseEqual(expectedTrack, actual.Single());
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public async Task HandleErrorResponse()
|
public async Task HandleErrorResponse()
|
||||||
{
|
{
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
{
|
||||||
|
"recenttracks": {
|
||||||
|
"track": {
|
||||||
|
"artist": {
|
||||||
|
"name": "Republika",
|
||||||
|
"mbid": "116a9ec8-148e-4b3d-8fb9-3d995cc4159e",
|
||||||
|
"url": "https://www.last.fm/music/Republika",
|
||||||
|
"image": [
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/e45f11a32d134ed4aeb1ce7b25445fb2.png",
|
||||||
|
"size": "small"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/e45f11a32d134ed4aeb1ce7b25445fb2.png",
|
||||||
|
"size": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/e45f11a32d134ed4aeb1ce7b25445fb2.png",
|
||||||
|
"size": "large"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/e45f11a32d134ed4aeb1ce7b25445fb2.png",
|
||||||
|
"size": "extralarge"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"loved": "1",
|
||||||
|
"name": "Tak D³ugo Czekam (Cia³o) (live)",
|
||||||
|
"streamable": "0",
|
||||||
|
"mbid": "",
|
||||||
|
"album": {
|
||||||
|
"#text": "Koncerty w Trójce - Republika",
|
||||||
|
"mbid": ""
|
||||||
|
},
|
||||||
|
"url": "https://www.last.fm/music/Republika/_/Tak+D%C5%82ugo+Czekam+(Cia%C5%82o)+(live)",
|
||||||
|
"image": [
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/1756f85e7332d469dd17b2e1e0a4d16c.png",
|
||||||
|
"size": "small"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/1756f85e7332d469dd17b2e1e0a4d16c.png",
|
||||||
|
"size": "medium"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/1756f85e7332d469dd17b2e1e0a4d16c.png",
|
||||||
|
"size": "large"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/1756f85e7332d469dd17b2e1e0a4d16c.png",
|
||||||
|
"size": "extralarge"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"date": {
|
||||||
|
"uts": "1530117136",
|
||||||
|
"#text": "27 Jun 2018, 16:32"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -46,7 +46,17 @@ public string Method
|
|||||||
{
|
{
|
||||||
public ILastAuth Auth { get; protected set; }
|
public ILastAuth Auth { get; protected set; }
|
||||||
|
|
||||||
public int Page { get; set; }
|
private int _page;
|
||||||
|
|
||||||
|
public int Page
|
||||||
|
{
|
||||||
|
get => _page == 0 ? LastFm.DefaultPage : _page;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value < 1) throw new ArgumentOutOfRangeException(nameof(value), "Page property cannot be less than 1");
|
||||||
|
_page = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int Count { get; set; }
|
public int Count { get; set; }
|
||||||
|
|
||||||
|
@ -16,6 +16,10 @@ internal class GetRecentTracksCommand : GetAsyncCommandBase<PageResponse<LastTra
|
|||||||
|
|
||||||
public DateTimeOffset? From { get; set; }
|
public DateTimeOffset? From { get; set; }
|
||||||
|
|
||||||
|
public DateTimeOffset? To { get; set; }
|
||||||
|
|
||||||
|
public bool Extended { get; set; }
|
||||||
|
|
||||||
public GetRecentTracksCommand(ILastAuth auth, string username) : base(auth)
|
public GetRecentTracksCommand(ILastAuth auth, string username) : base(auth)
|
||||||
{
|
{
|
||||||
Username = username;
|
Username = username;
|
||||||
@ -30,6 +34,11 @@ public override void SetParameters()
|
|||||||
Parameters.Add("from", From.Value.AsUnixTime().ToString());
|
Parameters.Add("from", From.Value.AsUnixTime().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (To.HasValue)
|
||||||
|
{
|
||||||
|
Parameters.Add("to", To.Value.AsUnixTime().ToString());
|
||||||
|
}
|
||||||
|
|
||||||
AddPagingParameters();
|
AddPagingParameters();
|
||||||
DisableCaching();
|
DisableCaching();
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,9 @@ Task<PageResponse<LastArtist>> GetTopArtists(string username,
|
|||||||
int pagenumber = 0,
|
int pagenumber = 0,
|
||||||
int count = LastFm.DefaultPageLength);
|
int count = LastFm.DefaultPageLength);
|
||||||
|
|
||||||
Task<PageResponse<LastTrack>> GetRecentScrobbles(string username, DateTimeOffset? since = null, int pagenumber = 0, int count = LastFm.DefaultPageLength);
|
Task<PageResponse<LastTrack>> GetRecentScrobbles(string username, DateTimeOffset? from = null,
|
||||||
|
DateTimeOffset? to = null, bool extendedResponse = false, int pagenumber = LastFm.DefaultPage,
|
||||||
|
int count = LastFm.DefaultPageLength);
|
||||||
|
|
||||||
Task<PageResponse<LastStation>> GetRecentStations(string username,
|
Task<PageResponse<LastStation>> GetRecentStations(string username,
|
||||||
int pagenumber,
|
int pagenumber,
|
||||||
|
@ -58,17 +58,24 @@ public async Task<PageResponse<LastArtist>> GetTopArtists(string username, LastS
|
|||||||
/// Gets a list of recent scrobbled tracks for this user in reverse date order.
|
/// Gets a list of recent scrobbled tracks for this user in reverse date order.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="username">Username to get scrobbles for.</param>
|
/// <param name="username">Username to get scrobbles for.</param>
|
||||||
/// <param name="since">Lower threshold for scrobbles. Will not return scrobbles from before this time.</param>
|
/// <param name="from">Lower threshold for scrobbles. Will not return scrobbles from before this time.</param>
|
||||||
|
/// <param name="to">Upper threshold for scrobbles. Will not return scrobbles from after this time.</param>
|
||||||
/// <param name="pagenumber">Page numbering starts from 1. If set to 0, will not include the "now playing" track</param>
|
/// <param name="pagenumber">Page numbering starts from 1. If set to 0, will not include the "now playing" track</param>
|
||||||
|
/// <param name="extendedResponse">Determines if the response will contain extended data in each artist
|
||||||
|
/// and whether or not the user has loved each track</param>
|
||||||
/// <param name="count">Amount of scrobbles to return for this page.</param>
|
/// <param name="count">Amount of scrobbles to return for this page.</param>
|
||||||
/// <returns>Enumerable of LastTrack</returns>
|
/// <returns>Enumerable of LastTrack</returns>
|
||||||
public async Task<PageResponse<LastTrack>> GetRecentScrobbles(string username, DateTimeOffset? since = null, int pagenumber = 1, int count = LastFm.DefaultPageLength)
|
public async Task<PageResponse<LastTrack>> GetRecentScrobbles(string username, DateTimeOffset? from = null,
|
||||||
|
DateTimeOffset? to = null, bool extendedResponse = false, int pagenumber = LastFm.DefaultPage,
|
||||||
|
int count = LastFm.DefaultPageLength)
|
||||||
{
|
{
|
||||||
var command = new GetRecentTracksCommand(Auth, username)
|
var command = new GetRecentTracksCommand(Auth, username)
|
||||||
{
|
{
|
||||||
Page = pagenumber,
|
Page = pagenumber,
|
||||||
Count = count,
|
Count = count,
|
||||||
From = since,
|
From = from,
|
||||||
|
To = to,
|
||||||
|
Extended = extendedResponse,
|
||||||
HttpClient = HttpClient
|
HttpClient = HttpClient
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,7 +27,9 @@ public static class LastFm
|
|||||||
private const string ResponseFormat = "json";
|
private const string ResponseFormat = "json";
|
||||||
|
|
||||||
public const string DefaultLanguageCode = "en";
|
public const string DefaultLanguageCode = "en";
|
||||||
|
|
||||||
public const int DefaultPageLength = 20;
|
public const int DefaultPageLength = 20;
|
||||||
|
public const int DefaultPage = 1;
|
||||||
|
|
||||||
public static string FormatApiUrl(string method, string apikey, Dictionary<string, string> parameters = null, bool secure = false)
|
public static string FormatApiUrl(string method, string apikey, Dictionary<string, string> parameters = null, bool secure = false)
|
||||||
{
|
{
|
||||||
|
@ -25,6 +25,10 @@ public class LastTrack : ILastfmObject
|
|||||||
|
|
||||||
public string ArtistMbid { get; set; }
|
public string ArtistMbid { get; set; }
|
||||||
|
|
||||||
|
public LastImageSet ArtistImages { get; set; }
|
||||||
|
|
||||||
|
public Uri ArtistUrl { get; set; }
|
||||||
|
|
||||||
public Uri Url { get; set; }
|
public Uri Url { get; set; }
|
||||||
|
|
||||||
public LastImageSet Images { get; set; }
|
public LastImageSet Images { get; set; }
|
||||||
@ -85,6 +89,17 @@ internal static LastTrack ParseJToken(JToken token)
|
|||||||
{
|
{
|
||||||
t.ArtistName = LastArtist.GetNameFromJToken(artistToken);
|
t.ArtistName = LastArtist.GetNameFromJToken(artistToken);
|
||||||
t.ArtistMbid = artistToken.Value<string>("mbid");
|
t.ArtistMbid = artistToken.Value<string>("mbid");
|
||||||
|
|
||||||
|
if (artistToken.Value<string>("url") != null)
|
||||||
|
{
|
||||||
|
t.ArtistUrl = new Uri(artistToken.Value<string>("url"), UriKind.Absolute);
|
||||||
|
}
|
||||||
|
|
||||||
|
var artistImages = artistToken.SelectToken("image", false);
|
||||||
|
if (artistImages != null)
|
||||||
|
{
|
||||||
|
t.ArtistImages = LastImageSet.ParseJToken(artistImages);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
t.ArtistName = artistToken.ToObject<string>();
|
t.ArtistName = artistToken.ToObject<string>();
|
||||||
@ -123,10 +138,16 @@ internal static LastTrack ParseJToken(JToken token)
|
|||||||
}
|
}
|
||||||
|
|
||||||
var lovedToken = token.SelectToken("userloved");
|
var lovedToken = token.SelectToken("userloved");
|
||||||
|
var extendedLovedToken = token.SelectToken("loved");
|
||||||
if (lovedToken != null)
|
if (lovedToken != null)
|
||||||
{
|
{
|
||||||
t.IsLoved = Convert.ToBoolean(lovedToken.Value<int>());
|
t.IsLoved = Convert.ToBoolean(lovedToken.Value<int>());
|
||||||
}
|
}
|
||||||
|
else if (extendedLovedToken != null)
|
||||||
|
{
|
||||||
|
t.IsLoved = Convert.ToBoolean(extendedLovedToken.Value<int>());
|
||||||
|
}
|
||||||
|
|
||||||
var attrToken = token.SelectToken("@attr");
|
var attrToken = token.SelectToken("@attr");
|
||||||
if (attrToken != null && attrToken.HasValues)
|
if (attrToken != null && attrToken.HasValues)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user