From 80c3308fd02057f1b62b9896efc5a01ef68cf41e Mon Sep 17 00:00:00 2001 From: Rikki Tooley Date: Sun, 21 Jun 2015 19:58:04 +0100 Subject: [PATCH] tag.getSimilar, tidying some tests --- PROGRESS.md | 6 +- .../Api/Commands/CommandTestsBase.cs | 38 +----- .../Library/LibraryGetTracksCommandTests.cs | 43 +++--- .../Commands/Tag/GetSimilarCommandTests.cs | 67 +++++++++ .../UserGetRecentTracksCommandTests.cs | 44 +++--- .../IF.Lastfm.Core.Tests.csproj | 12 ++ src/IF.Lastfm.Core.Tests/LastFmTests.cs | 1 - .../Resources/Tag/GetSimilarError.json | 5 + .../Resources/Tag/GetSimilarSuccess.json | 58 ++++++++ .../Resources/TagApiResponses.Designer.cs | 83 ++++++++++++ .../Resources/TagApiResponses.resx | 127 ++++++++++++++++++ .../Commands/Album/GetTagsByUserCommand.cs | 2 +- .../Api/Commands/Album/GetTopTagsCommand.cs | 2 +- .../Commands/Artist/GetTagsByUserCommand.cs | 2 +- .../Api/Commands/Artist/GetTopTagsCommand.cs | 2 +- .../Api/Commands/Tag/GetSimilarCommand.cs | 47 +++++++ src/IF.Lastfm.Core/IF.Lastfm.Core.csproj | 1 + src/IF.Lastfm.Core/Objects/LastAlbum.cs | 2 +- src/IF.Lastfm.Core/Objects/LastArtist.cs | 2 +- src/IF.Lastfm.Core/Objects/LastTag.cs | 19 ++- src/IF.Lastfm.Core/Objects/LastTrack.cs | 2 +- 21 files changed, 482 insertions(+), 83 deletions(-) create mode 100644 src/IF.Lastfm.Core.Tests/Api/Commands/Tag/GetSimilarCommandTests.cs create mode 100644 src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarError.json create mode 100644 src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarSuccess.json create mode 100644 src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.Designer.cs create mode 100644 src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.resx create mode 100644 src/IF.Lastfm.Core/Api/Commands/Tag/GetSimilarCommand.cs diff --git a/PROGRESS.md b/PROGRESS.md index d582406..f4d2206 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -1,4 +1,4 @@ -# Api Progress ![Progress](http://progressed.io/bar/27) +# Api Progress ![Progress](http://progressed.io/bar/28) These are all the Last.fm API methods currently available. @@ -6,7 +6,7 @@ These are all the Last.fm API methods currently available. - Methods ~~marked with strikethrough~~ aren't currently implemented. Pull requests are welcome! - Methods _marked with an asterisk *_ aren't listed on [the Last.fm documentation](http://www.last.fm/api), so they might not work! -This list is generated by the [ProgressReport](src/IF.Lastfm.ProgressReport) tool in the solution. Last updated on Saturday, 20 June 2015 10:32 +This list is generated by the [ProgressReport](src/IF.Lastfm.ProgressReport) tool in the solution. Last updated on Sunday, 21 June 2015 17:53 ## Album - [album.getInfo](http://www.last.fm/api/show/album.getInfo) @@ -113,8 +113,8 @@ This list is generated by the [ProgressReport](src/IF.Lastfm.ProgressReport) too ## Tag +- [tag.getSimilar](http://www.last.fm/api/show/tag.getSimilar) - ~~[tag.getInfo](http://www.last.fm/api/show/tag.getInfo)~~ -- ~~[tag.getSimilar](http://www.last.fm/api/show/tag.getSimilar)~~ - ~~[tag.getTopAlbums](http://www.last.fm/api/show/tag.getTopAlbums)~~ - ~~[tag.getTopArtists](http://www.last.fm/api/show/tag.getTopArtists)~~ - ~~[tag.getTopTags](http://www.last.fm/api/show/tag.getTopTags)~~ diff --git a/src/IF.Lastfm.Core.Tests/Api/Commands/CommandTestsBase.cs b/src/IF.Lastfm.Core.Tests/Api/Commands/CommandTestsBase.cs index 8a39eb2..58506c2 100644 --- a/src/IF.Lastfm.Core.Tests/Api/Commands/CommandTestsBase.cs +++ b/src/IF.Lastfm.Core.Tests/Api/Commands/CommandTestsBase.cs @@ -1,11 +1,5 @@ -using System.Threading.Tasks; -using IF.Lastfm.Core.Api; -using IF.Lastfm.Core.Api.Commands; -using IF.Lastfm.Core.Api.Helpers; -using IF.Lastfm.Core.Objects; -using NUnit.Framework; +using IF.Lastfm.Core.Api; using Moq; -using Newtonsoft.Json; using System.Net; using System.Net.Http; using System.Text; @@ -30,35 +24,5 @@ protected HttpResponseMessage CreateResponseMessage(string message) return response; } - - private static void JsonCompare(object expected, object actual) - { - var expectedJson = JsonConvert.SerializeObject(expected, Formatting.Indented); - var actualJson = JsonConvert.SerializeObject(actual, Formatting.Indented); - - Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson)); - } - - protected async Task CompareResultsSingle(GetAsyncCommandBase> command, object expected, byte[] resource) - { - var response = CreateResponseMessage(Encoding.UTF8.GetString(resource)); - - var parsed = await command.HandleResponse(response); - - Assert.IsTrue(parsed.Success); - var actual = parsed.Content; - JsonCompare(expected, actual); - } - - protected async Task CompareResultsMultiple(GetAsyncCommandBase> command, object expected, byte[] resource, int itemIndex) - { - var response = CreateResponseMessage(Encoding.UTF8.GetString(resource)); - - var parsed = await command.HandleResponse(response); - - Assert.IsTrue(parsed.Success); - var actual = parsed.Content[itemIndex]; - JsonCompare(expected, actual); - } } } diff --git a/src/IF.Lastfm.Core.Tests/Api/Commands/Library/LibraryGetTracksCommandTests.cs b/src/IF.Lastfm.Core.Tests/Api/Commands/Library/LibraryGetTracksCommandTests.cs index 00d1fdd..268f48e 100644 --- a/src/IF.Lastfm.Core.Tests/Api/Commands/Library/LibraryGetTracksCommandTests.cs +++ b/src/IF.Lastfm.Core.Tests/Api/Commands/Library/LibraryGetTracksCommandTests.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using System; using System.Collections.Generic; +using System.Linq; using System.Text; using System.Threading.Tasks; using IF.Lastfm.Core.Api.Commands.Library; @@ -12,20 +13,14 @@ namespace IF.Lastfm.Core.Tests.Api.Commands.Library { public class LibraryGetTracksCommandTests : CommandTestsBase { - private readonly GetTracksCommand _command; - - public LibraryGetTracksCommandTests() - { - _command = new GetTracksCommand(MAuth.Object, "rj", "", "", DateTimeOffset.MinValue) - { - Count = 1 - }; - } - [Test] public async Task HandleResponseMultiple() { - //Testing the second track returned + var command = new GetTracksCommand(MAuth.Object, "rj", "", "", DateTimeOffset.MinValue) + { + Count = 1 + }; + var expectedTrack = new LastTrack { ArtistName = "Stevie Wonder", @@ -44,12 +39,21 @@ public async Task HandleResponseMultiple() }; - await CompareResultsMultiple(_command, expectedTrack, LibraryApiResponses.LibraryGetTracksMultiple, 1); + var response = CreateResponseMessage(Encoding.UTF8.GetString(LibraryApiResponses.LibraryGetTracksMultiple)); + var actual = await command.HandleResponse(response); + + Assert.IsTrue(actual.Success); + TestHelper.AssertSerialiseEqual(expectedTrack, actual.Content[1]); // Testing the second track returned } [Test] public async Task HandleResponseSingle() { + var command = new GetTracksCommand(MAuth.Object, "rj", "", "", DateTimeOffset.MinValue) + { + Count = 1 + }; + var expectedTrack = new LastTrack { ArtistName = "Dire Straits", @@ -66,18 +70,25 @@ public async Task HandleResponseSingle() "http://userserve-ak.last.fm/serve/126/56827829.jpg", "http://userserve-ak.last.fm/serve/300x300/56827829.jpg") }; + + var response = CreateResponseMessage(Encoding.UTF8.GetString(LibraryApiResponses.LibraryGetTracksSingle)); + var actual = await command.HandleResponse(response); - var expected = new List { expectedTrack }; - - await CompareResultsSingle(_command, expected, LibraryApiResponses.LibraryGetTracksSingle); + Assert.IsTrue(actual.Success); + TestHelper.AssertSerialiseEqual(expectedTrack, actual.Single()); } [Test] public async Task HandleErrorResponse() { + var command = new GetTracksCommand(MAuth.Object, "rj", "", "", DateTimeOffset.MinValue) + { + Count = 1 + }; + var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetInfoMissing)); - var parsed = await _command.HandleResponse(response); + var parsed = await command.HandleResponse(response); Assert.IsFalse(parsed.Success); Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters); diff --git a/src/IF.Lastfm.Core.Tests/Api/Commands/Tag/GetSimilarCommandTests.cs b/src/IF.Lastfm.Core.Tests/Api/Commands/Tag/GetSimilarCommandTests.cs new file mode 100644 index 0000000..9c6e4e3 --- /dev/null +++ b/src/IF.Lastfm.Core.Tests/Api/Commands/Tag/GetSimilarCommandTests.cs @@ -0,0 +1,67 @@ +using System; +using System.Linq; +using IF.Lastfm.Core.Api.Enums; +using IF.Lastfm.Core.Tests.Resources; +using NUnit.Framework; +using System.Text; +using System.Threading.Tasks; +using IF.Lastfm.Core.Api.Commands.Tag; +using IF.Lastfm.Core.Objects; + +namespace IF.Lastfm.Core.Tests.Api.Commands.Tag +{ + public class GetSimilarCommandTests : CommandTestsBase + { + [Test] + public async Task HandleSuccessResponse() + { + const string tagName = "daria"; + var command = new GetSimilarCommand(MAuth.Object, tagName); + + var expectedTagNames = new[] + { + "road trip", + "longing", + "old school rap", + "pj harvey", + "girl band", + "alt rock", + "female rock", + "90s", + "post-grunge", + "acid jazz" + }; + var expectedTags = expectedTagNames.Select(tag => new LastTag + { + Name = tag, + Url = new Uri(String.Format("http://www.last.fm/tag/{0}", Uri.EscapeUriString(tag))), + RelatedTo = tagName, + Streamable = true + }).ToList(); + + expectedTags[0].Streamable = false; + expectedTags[1].Streamable = null; + + var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetSimilarSuccess)); + var actual = await command.HandleResponse(response); + + Assert.IsTrue(actual.Skip(2).All(t => t.Streamable.GetValueOrDefault())); + Assert.IsTrue(actual.All(t => t.RelatedTo == tagName)); + Assert.IsTrue(actual.Success); + TestHelper.AssertSerialiseEqual(expectedTags, actual.ToList()); + } + + [Test] + public async Task HandleErrorResponse() + { + var command = new GetSimilarCommand(MAuth.Object, "arroooo"); + + var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetSimilarError)); + + var parsed = await command.HandleResponse(response); + + Assert.IsFalse(parsed.Success); + Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters); + } + } +} diff --git a/src/IF.Lastfm.Core.Tests/Api/Commands/UserGetRecentTracksCommandTests.cs b/src/IF.Lastfm.Core.Tests/Api/Commands/UserGetRecentTracksCommandTests.cs index 37767d9..30fbff2 100644 --- a/src/IF.Lastfm.Core.Tests/Api/Commands/UserGetRecentTracksCommandTests.cs +++ b/src/IF.Lastfm.Core.Tests/Api/Commands/UserGetRecentTracksCommandTests.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using System; using System.Collections.Generic; +using System.Linq; using System.Text; using System.Threading.Tasks; using IF.Lastfm.Core.Api.Commands.User; @@ -11,23 +12,16 @@ namespace IF.Lastfm.Core.Tests.Api.Commands { - public class UserGetRecentTracksCommandTests : CommandTestsBase { - private GetRecentTracksCommand _command; - - [SetUp] - public void Initialise() - { - _command = new GetRecentTracksCommand(MAuth.Object, "rj") - { - Count = 1 - }; - } - [Test] public async Task HandleResponseMultiple() { + var command = new GetRecentTracksCommand(MAuth.Object, "rj") + { + Count = 1 + }; + var expectedTrack = new LastTrack { ArtistName = "The Who", @@ -44,12 +38,21 @@ public async Task HandleResponseMultiple() "http://userserve-ak.last.fm/serve/300x300/35234991.jpg") }; - await CompareResultsMultiple(_command, expectedTrack, UserApiResponses.UserGetRecentTracksMultiple, 2); + var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetRecentTracksMultiple)); + var actual = await command.HandleResponse(response); + + Assert.IsTrue(actual.Success); + TestHelper.AssertSerialiseEqual(expectedTrack, actual.Content[2]); } [Test] public async Task HandleResponseSingle() { + var command = new GetRecentTracksCommand(MAuth.Object, "rj") + { + Count = 1 + }; + var expectedTrack = new LastTrack { ArtistName = "Rick James", @@ -66,18 +69,25 @@ public async Task HandleResponseSingle() "http://userserve-ak.last.fm/serve/126/90462319.jpg", "http://userserve-ak.last.fm/serve/300x300/90462319.jpg") }; + + var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetRecentTracksSingle)); + var actual = await command.HandleResponse(response); - var expected = new List { expectedTrack }; - - await CompareResultsSingle(_command, expected, UserApiResponses.UserGetRecentTracksSingle); + Assert.IsTrue(actual.Success); + TestHelper.AssertSerialiseEqual(expectedTrack, actual.Single()); } [Test] public async Task HandleErrorResponse() { + var command = new GetRecentTracksCommand(MAuth.Object, "rj") + { + Count = 1 + }; + var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetRecentTracksError)); - var parsed = await _command.HandleResponse(response); + var parsed = await command.HandleResponse(response); Assert.IsFalse(parsed.Success); Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters); diff --git a/src/IF.Lastfm.Core.Tests/IF.Lastfm.Core.Tests.csproj b/src/IF.Lastfm.Core.Tests/IF.Lastfm.Core.Tests.csproj index f9ef721..f39dc14 100644 --- a/src/IF.Lastfm.Core.Tests/IF.Lastfm.Core.Tests.csproj +++ b/src/IF.Lastfm.Core.Tests/IF.Lastfm.Core.Tests.csproj @@ -92,6 +92,7 @@ + @@ -121,6 +122,11 @@ True LibraryApiResponses.resx + + True + True + TagApiResponses.resx + TrackApiResponses.resx True @@ -167,6 +173,8 @@ + + @@ -209,6 +217,10 @@ LibraryApiResponses.Designer.cs Designer + + ResXFileCodeGenerator + TagApiResponses.Designer.cs + PublicResXFileCodeGenerator TrackApiResponses.Designer.cs diff --git a/src/IF.Lastfm.Core.Tests/LastFmTests.cs b/src/IF.Lastfm.Core.Tests/LastFmTests.cs index 390c6c8..cb823fc 100644 --- a/src/IF.Lastfm.Core.Tests/LastFmTests.cs +++ b/src/IF.Lastfm.Core.Tests/LastFmTests.cs @@ -8,7 +8,6 @@ namespace IF.Lastfm.Core.Tests { - public class LastFmTests { [Test] diff --git a/src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarError.json b/src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarError.json new file mode 100644 index 0000000..34f9d3d --- /dev/null +++ b/src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarError.json @@ -0,0 +1,5 @@ +{ + "error": 6, + "message": "Invalid tag", + "links": [] +} \ No newline at end of file diff --git a/src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarSuccess.json b/src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarSuccess.json new file mode 100644 index 0000000..dae8bac --- /dev/null +++ b/src/IF.Lastfm.Core.Tests/Resources/Tag/GetSimilarSuccess.json @@ -0,0 +1,58 @@ +{ + "similartags": { + "tag": [ + { + "name": "road trip", + "url": "http://www.last.fm/tag/road%20trip", + "streamable": "0" + }, + { + "name": "longing", + "url": "http://www.last.fm/tag/longing" + }, + { + "name": "old school rap", + "url": "http://www.last.fm/tag/old%20school%20rap", + "streamable": "1" + }, + { + "name": "pj harvey", + "url": "http://www.last.fm/tag/pj%20harvey", + "streamable": "1" + }, + { + "name": "girl band", + "url": "http://www.last.fm/tag/girl%20band", + "streamable": "1" + }, + { + "name": "alt rock", + "url": "http://www.last.fm/tag/alt%20rock", + "streamable": "1" + }, + { + "name": "female rock", + "url": "http://www.last.fm/tag/female%20rock", + "streamable": "1" + }, + { + "name": "90s", + "url": "http://www.last.fm/tag/90s", + "streamable": "1" + }, + { + "name": "post-grunge", + "url": "http://www.last.fm/tag/post-grunge", + "streamable": "1" + }, + { + "name": "acid jazz", + "url": "http://www.last.fm/tag/acid%20jazz", + "streamable": "1" + } + ], + "@attr": { + "tag": "daria" + } + } +} \ No newline at end of file diff --git a/src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.Designer.cs b/src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.Designer.cs new file mode 100644 index 0000000..00d7889 --- /dev/null +++ b/src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.0 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace IF.Lastfm.Core.Tests.Resources { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class TagApiResponses { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal TagApiResponses() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("IF.Lastfm.Core.Tests.Resources.TagApiResponses", typeof(TagApiResponses).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] GetSimilarError { + get { + object obj = ResourceManager.GetObject("GetSimilarError", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] GetSimilarSuccess { + get { + object obj = ResourceManager.GetObject("GetSimilarSuccess", resourceCulture); + return ((byte[])(obj)); + } + } + } +} diff --git a/src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.resx b/src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.resx new file mode 100644 index 0000000..116977f --- /dev/null +++ b/src/IF.Lastfm.Core.Tests/Resources/TagApiResponses.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + tag\getsimilarerror.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tag\getsimilarsuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/IF.Lastfm.Core/Api/Commands/Album/GetTagsByUserCommand.cs b/src/IF.Lastfm.Core/Api/Commands/Album/GetTagsByUserCommand.cs index e71ac8d..0378f2e 100644 --- a/src/IF.Lastfm.Core/Api/Commands/Album/GetTagsByUserCommand.cs +++ b/src/IF.Lastfm.Core/Api/Commands/Album/GetTagsByUserCommand.cs @@ -50,7 +50,7 @@ public async override Task> HandleResponse(HttpResponseMes var resultsToken = jtoken.SelectToken("tags"); var itemsToken = resultsToken.SelectToken("tag"); - return PageResponse.CreateSuccessResponse(itemsToken, LastTag.ParseJToken); + return PageResponse.CreateSuccessResponse(itemsToken, token => LastTag.ParseJToken(token)); } else { diff --git a/src/IF.Lastfm.Core/Api/Commands/Album/GetTopTagsCommand.cs b/src/IF.Lastfm.Core/Api/Commands/Album/GetTopTagsCommand.cs index 26028d5..4f22bc5 100644 --- a/src/IF.Lastfm.Core/Api/Commands/Album/GetTopTagsCommand.cs +++ b/src/IF.Lastfm.Core/Api/Commands/Album/GetTopTagsCommand.cs @@ -58,7 +58,7 @@ public async override Task> HandleResponse(HttpResponseMes var resultsToken = jtoken.SelectToken("toptags"); var itemsToken = resultsToken.SelectToken("tag"); - return PageResponse.CreateSuccessResponse(itemsToken, resultsToken, LastTag.ParseJToken, LastPageResultsType.Attr); + return PageResponse.CreateSuccessResponse(itemsToken, resultsToken, token => LastTag.ParseJToken(token), LastPageResultsType.Attr); } else { diff --git a/src/IF.Lastfm.Core/Api/Commands/Artist/GetTagsByUserCommand.cs b/src/IF.Lastfm.Core/Api/Commands/Artist/GetTagsByUserCommand.cs index ce3f31a..52c18e5 100644 --- a/src/IF.Lastfm.Core/Api/Commands/Artist/GetTagsByUserCommand.cs +++ b/src/IF.Lastfm.Core/Api/Commands/Artist/GetTagsByUserCommand.cs @@ -46,7 +46,7 @@ public async override Task> HandleResponse(HttpResponseMes var resultsToken = jtoken.SelectToken("tags"); var itemsToken = resultsToken.SelectToken("tag"); - return PageResponse.CreateSuccessResponse(itemsToken, LastTag.ParseJToken); + return PageResponse.CreateSuccessResponse(itemsToken, token => LastTag.ParseJToken(token)); } else { diff --git a/src/IF.Lastfm.Core/Api/Commands/Artist/GetTopTagsCommand.cs b/src/IF.Lastfm.Core/Api/Commands/Artist/GetTopTagsCommand.cs index 7d41a6b..2f02f53 100644 --- a/src/IF.Lastfm.Core/Api/Commands/Artist/GetTopTagsCommand.cs +++ b/src/IF.Lastfm.Core/Api/Commands/Artist/GetTopTagsCommand.cs @@ -38,7 +38,7 @@ public async override Task> HandleResponse(HttpResponseMes var resultsToken = jtoken.SelectToken("toptags"); var itemsToken = resultsToken.SelectToken("tag"); - return PageResponse.CreateSuccessResponse(itemsToken, LastTag.ParseJToken); + return PageResponse.CreateSuccessResponse(itemsToken, token => LastTag.ParseJToken(token)); } else { diff --git a/src/IF.Lastfm.Core/Api/Commands/Tag/GetSimilarCommand.cs b/src/IF.Lastfm.Core/Api/Commands/Tag/GetSimilarCommand.cs new file mode 100644 index 0000000..9f951f5 --- /dev/null +++ b/src/IF.Lastfm.Core/Api/Commands/Tag/GetSimilarCommand.cs @@ -0,0 +1,47 @@ +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.Tag +{ + [ApiMethodName("tag.getSimilar")] + internal class GetSimilarCommand : GetAsyncCommandBase> + { + public string TagName { get; set; } + + public GetSimilarCommand(ILastAuth auth, string tagname) + : base(auth) + { + TagName = tagname; + } + + public override void SetParameters() + { + Parameters.Add("tag", TagName); + + DisableCaching(); + } + + public async override Task> HandleResponse(HttpResponseMessage response) + { + var json = await response.Content.ReadAsStringAsync(); + + LastResponseStatus status; + if (LastFm.IsResponseValid(json, out status) && response.IsSuccessStatusCode) + { + var jtoken = JsonConvert.DeserializeObject(json).SelectToken("similartags"); + var itemsToken = jtoken.SelectToken("tag"); + var attrToken = jtoken.SelectToken("@attr"); + var relatedTag = attrToken.SelectToken("tag").Value(); + + return PageResponse.CreateSuccessResponse(itemsToken, jt => LastTag.ParseJToken(jt, relatedTag)); + } + + return LastResponse.CreateErrorResponse>(status); + } + } +} diff --git a/src/IF.Lastfm.Core/IF.Lastfm.Core.csproj b/src/IF.Lastfm.Core/IF.Lastfm.Core.csproj index cfc2a59..f7d4c41 100644 --- a/src/IF.Lastfm.Core/IF.Lastfm.Core.csproj +++ b/src/IF.Lastfm.Core/IF.Lastfm.Core.csproj @@ -63,6 +63,7 @@ + diff --git a/src/IF.Lastfm.Core/Objects/LastAlbum.cs b/src/IF.Lastfm.Core/Objects/LastAlbum.cs index 56cdf6c..5175485 100644 --- a/src/IF.Lastfm.Core/Objects/LastAlbum.cs +++ b/src/IF.Lastfm.Core/Objects/LastAlbum.cs @@ -67,7 +67,7 @@ internal static LastAlbum ParseJToken(JToken token) { a.TopTags = tagToken.Type == JTokenType.Array - ? tagToken.Children().Select(LastTag.ParseJToken) + ? tagToken.Children().Select(token1 => LastTag.ParseJToken(token1)) : new List { LastTag.ParseJToken(tagToken) }; } } diff --git a/src/IF.Lastfm.Core/Objects/LastArtist.cs b/src/IF.Lastfm.Core/Objects/LastArtist.cs index ddbb984..908653d 100644 --- a/src/IF.Lastfm.Core/Objects/LastArtist.cs +++ b/src/IF.Lastfm.Core/Objects/LastArtist.cs @@ -104,7 +104,7 @@ internal static LastArtist ParseJToken(JToken token) { a.Tags = tagToken.Type == JTokenType.Array - ? tagToken.Children().Select(LastTag.ParseJToken) + ? tagToken.Children().Select(token1 => LastTag.ParseJToken(token1)) : new List { LastTag.ParseJToken(tagToken) }; } } diff --git a/src/IF.Lastfm.Core/Objects/LastTag.cs b/src/IF.Lastfm.Core/Objects/LastTag.cs index c0e8012..acb9170 100644 --- a/src/IF.Lastfm.Core/Objects/LastTag.cs +++ b/src/IF.Lastfm.Core/Objects/LastTag.cs @@ -13,6 +13,10 @@ public class LastTag : ILastfmObject public int? Count { get; set; } + public string RelatedTo { get; set; } + + public bool? Streamable { get; set; } + #endregion public LastTag() @@ -26,7 +30,7 @@ public LastTag(string name, string uri, int? count = null) Count = count; } - internal static LastTag ParseJToken(JToken token) + internal static LastTag ParseJToken(JToken token, string relatedTag = null) { var name = token.Value("name"); var url = token.Value("url"); @@ -38,7 +42,18 @@ internal static LastTag ParseJToken(JToken token) count = countToken.ToObject(); } - return new LastTag(name, url, count); + bool? streamable = null; + var streamableToken = token.SelectToken("streamable"); + if (streamableToken != null) + { + streamable = Convert.ToBoolean(streamableToken.Value()); + } + + return new LastTag(name, url, count) + { + Streamable = streamable, + RelatedTo = relatedTag + }; } } } \ No newline at end of file diff --git a/src/IF.Lastfm.Core/Objects/LastTrack.cs b/src/IF.Lastfm.Core/Objects/LastTrack.cs index 34cb03d..7d1e0d3 100644 --- a/src/IF.Lastfm.Core/Objects/LastTrack.cs +++ b/src/IF.Lastfm.Core/Objects/LastTrack.cs @@ -94,7 +94,7 @@ internal static LastTrack ParseJToken(JToken token) { t.TopTags = tagToken.Type == JTokenType.Array - ? tagToken.Children().Select(LastTag.ParseJToken) + ? tagToken.Children().Select(token1 => LastTag.ParseJToken(token1)) : new List { LastTag.ParseJToken(tagToken) }; } }