Added tests

This commit is contained in:
Johan Klinge 2018-12-03 00:03:15 +01:00
parent f8e02745e2
commit e429bbcaa9
116 changed files with 10971 additions and 0 deletions

View File

@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.Linq;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Album;
using Newtonsoft.Json;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.AlbumApi
{
public class GetAlbumInfoCommandTests : CommandTestsBase
{
private GetInfoCommand _command;
public GetAlbumInfoCommandTests()
{
_command = new GetInfoCommand(MAuth.Object)
{
AlbumName = "Ray of Light",
ArtistName = "Madonna"
};
_command.SetParameters();
}
[Test]
public async Task HandleSuccessResponse()
{
var expectedAlbum = new LastAlbum
{
ArtistName = "Madonna",
ListenerCount = 509271,
PlayCount = 7341494,
Mbid = "ddb3168d-66a9-4b2d-af02-05278da8a23d",
Url = new Uri("http://www.last.fm/music/Madonna/Ray+of+Light", UriKind.Absolute),
Name = "Ray of Light",
ReleaseDateUtc = new DateTime(2005, 09, 13, 0, 0, 0),
Id = "1934",
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/37498173.png",
"http://userserve-ak.last.fm/serve/64s/37498173.png",
"http://userserve-ak.last.fm/serve/174s/37498173.png",
"http://userserve-ak.last.fm/serve/300x300/37498173.png",
"http://userserve-ak.last.fm/serve/_/37498173/Ray+of+Light.png"),
TopTags = new List<LastTag>
{
new LastTag("albums i own", "http://www.last.fm/tag/albums%20i%20own"),
new LastTag("pop", "http://www.last.fm/tag/pop"),
new LastTag("electronic", "http://www.last.fm/tag/electronic"),
new LastTag("dance", "http://www.last.fm/tag/dance"),
new LastTag("madonna", "http://www.last.fm/tag/madonna")
}
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetInfoSuccess));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
var actual = parsed.Content;
Assert.IsTrue(actual.Tracks.Count() == 13);
actual.Tracks = null;
var expectedJson = JsonConvert.SerializeObject(expectedAlbum, Formatting.Indented);
var actualJson = JsonConvert.SerializeObject(parsed.Content, Formatting.Indented);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleSuccessResponseForUser()
{
_command = new GetInfoCommand(MAuth.Object)
{
AlbumName = "Ray of Light",
ArtistName = "Madonna",
UserName = "user"
};
var expectedAlbum = new LastAlbum
{
ArtistName = "Madonna",
ListenerCount = 509271,
PlayCount = 7341494,
UserPlayCount = 321,
Mbid = "ddb3168d-66a9-4b2d-af02-05278da8a23d",
Url = new Uri("http://www.last.fm/music/Madonna/Ray+of+Light", UriKind.Absolute),
Name = "Ray of Light",
ReleaseDateUtc = new DateTime(2005, 09, 13, 0, 0, 0),
Id = "1934",
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/37498173.png",
"http://userserve-ak.last.fm/serve/64s/37498173.png",
"http://userserve-ak.last.fm/serve/174s/37498173.png",
"http://userserve-ak.last.fm/serve/300x300/37498173.png",
"http://userserve-ak.last.fm/serve/_/37498173/Ray+of+Light.png"),
TopTags = new List<LastTag>
{
new LastTag("albums i own", "http://www.last.fm/tag/albums%20i%20own"),
new LastTag("pop", "http://www.last.fm/tag/pop"),
new LastTag("electronic", "http://www.last.fm/tag/electronic"),
new LastTag("dance", "http://www.last.fm/tag/dance"),
new LastTag("madonna", "http://www.last.fm/tag/madonna")
}
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetInfoForUser));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
var actual = parsed.Content;
Assert.IsTrue(actual.Tracks.Count() == 13);
actual.Tracks = null;
var expectedJson = JsonConvert.SerializeObject(expectedAlbum, Formatting.Indented);
var actualJson = JsonConvert.SerializeObject(parsed.Content, Formatting.Indented);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleErrorResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetInfoMissing));
var parsed = await _command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,84 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Album;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using Newtonsoft.Json;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.AlbumApi
{
public class GetAlbumShoutsCommandTests : CommandTestsBase
{
private GetShoutsCommand _command;
public GetAlbumShoutsCommandTests()
{
_command = new GetShoutsCommand(MAuth.Object, "Visions", "Grimes");
}
[Test]
public async Task HandleSuccessResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetShoutsMultiple));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
var expectedShouts = new List<LastShout>
{
new LastShout("uhIgor", "Nunca vou cansar disso.", "Thu, 23 Oct 2014 02:20:30"),
new LastShout("Zachary-K",
"Oblivion is the best song on whole album. Maybe i dig it but i don't want to really. Or i'm not in the right mood for it.",
"Wed, 17 Sep 2014 21:04:36")
};
var expectedJson = JsonConvert.SerializeObject(expectedShouts, Formatting.Indented);
var actualJson = JsonConvert.SerializeObject(parsed.Content, Formatting.Indented);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseSingle()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetShoutsSingle));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(parsed.Content.Count() == 1);
}
[Test]
public async Task HandleEmptyResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetShoutsEmpty));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
[Test]
public async Task HandleErrorResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetShoutsAlbumMissing));
var parsed = await _command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
}
}

View File

@ -0,0 +1,70 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Tests.Resources;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Album;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.AlbumApi
{
public class GetAlbumTopTagsCommandTest : CommandTestsBase
{
private GetTopTagsCommand _command;
public GetAlbumTopTagsCommandTest()
{
_command = new GetTopTagsCommand(MAuth.Object)
{
AlbumName = "Believe",
ArtistName = "Cher"
};
_command.SetParameters();
}
[Test]
public void Constructor()
{
Assert.AreEqual(_command.Method, "album.getTopTags");
Assert.AreEqual(_command.Parameters["album"], "Believe");
Assert.AreEqual(_command.Parameters["artist"], "Cher");
}
[Test]
public async Task HandleSuccessResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetTopTags));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
}
[Test]
public async Task HandleEmptyResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetTopTagsEmpty));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
[Test]
public async Task HandleErrorResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetTopTagsError));
var parsed = await _command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
}
}

View File

@ -0,0 +1,86 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Tests.Resources;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Album;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.AlbumApi
{
public class SearchAlbumsCommandTests : CommandTestsBase
{
private SearchCommand _command;
public SearchAlbumsCommandTests()
{
_command = new SearchCommand(MAuth.Object, "By the throat")
{
Page = 2,
Count = 3
};
_command.SetParameters();
}
[Test]
public void Constructor()
{
Assert.AreEqual(_command.Method, "album.search");
Assert.AreEqual(_command.Parameters["album"], "By the throat");
Assert.AreEqual(_command.Parameters["page"], "2");
Assert.AreEqual(_command.Parameters["limit"], "3");
}
[Test]
public async Task HandleSuccessResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumSearch));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(parsed.Page == 2);
Assert.IsTrue(parsed.Content.Count() == 3);
}
[Test]
public async Task HandleResponseSingle()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumSearchSingle));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(parsed.Content.Count() == 1);
}
[Test]
public async Task HandleEmptyResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumSearchEmpty));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
[Test]
public async Task HandleErrorResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumSearchError));
var parsed = await _command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
}
}

View File

@ -0,0 +1,82 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Album;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public class AlbumGetTagsByUserCommandTests : CommandTestsBase
{
private GetTagsByUserCommand _command;
[SetUp]
public void Initialise()
{
_command = new GetTagsByUserCommand(MAuth.Object, "", "", "");
}
[Test]
public async Task HandleResponseSingle()
{
var expectedTags = new List<LastTag>
{
new LastTag("Test Tag", "http://www.last.fm/tag/test%20tag")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetTagsSingle));
var parsed = await _command.HandleResponse(response);
var expectedJson = expectedTags.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
parsed.AssertValues(true, 1, 1, 1, 1);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseMultiple()
{
var expectedTags = new List<LastTag>
{
new LastTag("test tag 2: electric boogaloo", "http://www.last.fm/tag/test%20tag%202%3A%20electric%20boogaloo"),
new LastTag("Test Tag", "http://www.last.fm/tag/test%20tag")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetTagsMultiple));
var parsed = await _command.HandleResponse(response);
var expectedJson = expectedTags.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
parsed.AssertValues(true, 2, 2, 1, 1);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseEmpty()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetTagsEmpty));
var parsed = await _command.HandleResponse(response);
parsed.AssertValues(true, 0, 0, 1, 1);
Assert.IsTrue(!parsed.Content.Any());
}
[Test]
public async Task HandleResponseError()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(AlbumApiResponses.AlbumGetTagsError));
var parsed = await _command.HandleResponse(response);
parsed.AssertValues(false, 0, 0, 1, 1);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
Assert.IsTrue(!parsed.Content.Any());
}
}
}

View File

@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Artist;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.Artist
{
public class GetInfoCommandTests : CommandTestsBase
{
private GetInfoCommand _command;
[SetUp]
public void Initialise()
{
_command = new GetInfoCommand(MAuth.Object)
{
ArtistName = "Frightened Rabbit"
};
}
[Test]
public async Task HandleSuccessResponse()
{
var expectedArtist = new LastArtist()
{
Name = "Frightened Rabbit",
Mbid = "dc21d171-7204-4759-9fd0-77d031aeb40c",
Url = new Uri("http://www.last.fm/music/Frightened+Rabbit"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/50340089.jpg",
"http://userserve-ak.last.fm/serve/64/50340089.jpg",
"http://userserve-ak.last.fm/serve/126/50340089.jpg",
"http://userserve-ak.last.fm/serve/252/50340089.jpg",
"http://userserve-ak.last.fm/serve/_/50340089/Frightened+Rabbit+frabbit.jpg"),
// todo streamable
OnTour = false,
Similar = new List<LastArtist>
{
new LastArtist
{
Name = "Admiral Fallow",
Url = new Uri("http://www.last.fm/music/Admiral+Fallow"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/48454975.jpg",
"http://userserve-ak.last.fm/serve/64/48454975.jpg",
"http://userserve-ak.last.fm/serve/126/48454975.jpg",
"http://userserve-ak.last.fm/serve/252/48454975.jpg",
"http://userserve-ak.last.fm/serve/500/48454975/Admiral+Fallow+l_1185fb2755064ccfbab2871ecec8.jpg")
},
new LastArtist
{
Name = "The Twilight Sad",
Url = new Uri("http://www.last.fm/music/The+Twilight+Sad"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/18201771.jpg",
"http://userserve-ak.last.fm/serve/64/18201771.jpg",
"http://userserve-ak.last.fm/serve/126/18201771.jpg",
"http://userserve-ak.last.fm/serve/252/18201771.jpg",
"http://userserve-ak.last.fm/serve/500/18201771/The+Twilight+Sad+hi+how+are+you.jpg"),
},
new LastArtist
{
Name = "Owl John",
Url = new Uri("http://www.last.fm/music/Owl+John"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/101981791.png",
"http://userserve-ak.last.fm/serve/64/101981791.png",
"http://userserve-ak.last.fm/serve/126/101981791.png",
"http://userserve-ak.last.fm/serve/252/101981791.png",
"http://userserve-ak.last.fm/serve/500/101981791/Owl+John+owl.png"),
},
new LastArtist
{
Name = "We Were Promised Jetpacks",
Url = new Uri("http://www.last.fm/music/We+Were+Promised+Jetpacks"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/53527397.jpg",
"http://userserve-ak.last.fm/serve/64/53527397.jpg",
"http://userserve-ak.last.fm/serve/126/53527397.jpg",
"http://userserve-ak.last.fm/serve/252/53527397.jpg",
"http://userserve-ak.last.fm/serve/_/53527397/We+Were+Promised+Jetpacks+wwpj.jpg"),
},
new LastArtist
{
Name = "Meursault",
Url = new Uri("http://www.last.fm/music/Meursault"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/41921789.jpg",
"http://userserve-ak.last.fm/serve/64/41921789.jpg",
"http://userserve-ak.last.fm/serve/126/41921789.jpg",
"http://userserve-ak.last.fm/serve/252/41921789.jpg",
"http://userserve-ak.last.fm/serve/_/41921789/Meursault+lovely+fuckwits.jpg"),
}
},
Tags = new List<LastTag>
{
new LastTag("indie", "http://www.last.fm/tag/indie"),
new LastTag("scottish", "http://www.last.fm/tag/scottish"),
new LastTag("indie rock", "http://www.last.fm/tag/indie%20rock"),
new LastTag("folk", "http://www.last.fm/tag/folk"),
new LastTag("folk rock", "http://www.last.fm/tag/folk%20rock"),
},
Bio = new LastWiki
{
Content = "Frightened Rabbit are an <a href=\"http://www.last.fm/tag/indie%20rock\" class=\"bbcode_tag\" rel=\"tag\">indie rock</a> band which formed in 2003 in Glasgow, Scotland. The band currently consists of Scott Hutchison (vocals, guitar), Billy Kennedy (guitar, keyboards), Grant Hutchison (drums, vocals), Andy Monaghan (guitar, keyboards) and Gordon Skene (guitar, keyboards). The band has released four albums: &quot;Sing the Greys&quot; (2006), &quot;The Midnight Organ Fight&quot; (2008), &quot;The Winter of Mixed Drinks&quot; (2010) and &quot;Pedestrian Verse&quot; (2013). \n\n <a href=\"http://www.last.fm/music/Frightened+Rabbit\">Read more about Frightened Rabbit on Last.fm</a>.\n \n \nUser-contributed text is available under the Creative Commons By-SA License and may also be available under the GNU FDL.",
Summary = "Frightened Rabbit are an <a href=\"http://www.last.fm/tag/indie%20rock\" class=\"bbcode_tag\" rel=\"tag\">indie rock</a> band which formed in 2003 in Glasgow, Scotland. The band currently consists of Scott Hutchison (vocals, guitar), Billy Kennedy (guitar, keyboards), Grant Hutchison (drums, vocals), Andy Monaghan (guitar, keyboards) and Gordon Skene (guitar, keyboards). The band has released four albums: &quot;Sing the Greys&quot; (2006), &quot;The Midnight Organ Fight&quot; (2008), &quot;The Winter of Mixed Drinks&quot; (2010) and &quot;Pedestrian Verse&quot; (2013). \n\n <a href=\"http://www.last.fm/music/Frightened+Rabbit\">Read more about Frightened Rabbit on Last.fm</a>.",
Published = new DateTimeOffset(2013, 2, 6, 0, 4, 40, TimeSpan.Zero),
YearFormed = 2003
},
Stats = new LastStats
{
Listeners = 513447,
Plays = 0
}
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetInfoSuccess));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
var expectedJson = expectedArtist.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleErrorResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetInfoMissing));
var parsed = await _command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,82 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Artist;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public class ArtistGetTagsByUserCommandTests : CommandTestsBase
{
private GetTagsByUserCommand _command;
[SetUp]
public void Initialise()
{
_command = new GetTagsByUserCommand(MAuth.Object, "", "");
}
[Test]
public async Task HandleResponseSingle()
{
var expectedTags = new List<LastTag>
{
new LastTag("the fate of the world is safe in crystal castles", "http://www.last.fm/tag/the%20fate%20of%20the%20world%20is%20safe%20in%20crystal%20castles")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTagsSingle));
var parsed = await _command.HandleResponse(response);
var expectedJson = expectedTags.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
parsed.AssertValues(true, 1, 1, 1, 1);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseMultiple()
{
var expectedTags = new List<LastTag>
{
new LastTag("the fate of the world is safe in crystal castles", "http://www.last.fm/tag/the%20fate%20of%20the%20world%20is%20safe%20in%20crystal%20castles"),
new LastTag("if this were a pokemon i would catch it", "http://www.last.fm/tag/if%20this%20were%20a%20pokemon%20i%20would%20catch%20it")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTagsMultiple));
var parsed = await _command.HandleResponse(response);
var expectedJson = expectedTags.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
parsed.AssertValues(true, 2, 2, 1, 1);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseEmpty()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTagsEmpty));
var parsed = await _command.HandleResponse(response);
parsed.AssertValues(true, 0, 0, 1, 1);
Assert.IsTrue(!parsed.Content.Any());
}
[Test]
public async Task HandleResponseError()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTagsError));
var parsed = await _command.HandleResponse(response);
parsed.AssertValues(false, 0, 0, 1, 1);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
Assert.IsTrue(!parsed.Content.Any());
}
}
}

View File

@ -0,0 +1,87 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Artist;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public class ArtistGetTopTagsCommandTests : CommandTestsBase
{
private GetTopTagsCommand _command;
[SetUp]
public void Initialise()
{
_command = new GetTopTagsCommand(MAuth.Object);
}
[Test]
public async Task HandleResponseSingle()
{
var expectedTags = new List<LastTag>
{
new LastTag("electronic", "http://www.last.fm/tag/electronic", 100)
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTopTagsSingle));
var parsed = await _command.HandleResponse(response);
var expectedJson = expectedTags.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
parsed.AssertValues(true, 1, 1, 1, 1);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseMultiple()
{
var expectedTags = new List<LastTag>
{
new LastTag("electronic", "http://www.last.fm/tag/electronic", 100),
new LastTag("experimental", "http://www.last.fm/tag/experimental", 100),
new LastTag("Bandcamp", "http://www.last.fm/tag/bandcamp", 100),
new LastTag("ambient", "http://www.last.fm/tag/ambient", 50),
new LastTag("psychedelic", "http://www.last.fm/tag/psychedelic", 50)
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTopTagsMultiple));
var parsed = await _command.HandleResponse(response);
var expectedJson = expectedTags.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
parsed.AssertValues(true, 5, 5, 1, 1);
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseEmpty()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTopTagsEmpty));
var parsed = await _command.HandleResponse(response);
parsed.AssertValues(true, 0, 0, 1, 1);
Assert.IsTrue(!parsed.Content.Any());
}
[Test]
public async Task HandleResponseError()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTopTagsError));
var parsed = await _command.HandleResponse(response);
parsed.AssertValues(false, 0, 0, 1, 1);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
Assert.IsTrue(!parsed.Content.Any());
}
}
}

View File

@ -0,0 +1,28 @@
using IF.Lastfm.Core.Api;
using Moq;
using System.Net;
using System.Net.Http;
using System.Text;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public abstract class CommandTestsBase
{
public Mock<ILastAuth> MAuth { get; private set; }
protected CommandTestsBase()
{
MAuth = new Mock<ILastAuth>();
}
protected HttpResponseMessage CreateResponseMessage(string message)
{
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(message, Encoding.UTF8)
};
return response;
}
}
}

View File

@ -0,0 +1,86 @@
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Library;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.Library
{
public class GetArtistsCommandTests : CommandTestsBase
{
[Test]
public async Task HandleResponseMultiple()
{
var command = new GetArtistsCommand(MAuth.Object, "user");
var expectedArtist = new LastArtist
{
Name = "Crystal Castles",
PlayCount = 4219,
Mbid = "b1570544-93ab-4b2b-8398-131735394202",
Url = new Uri("https://www.last.fm/music/Crystal+Castles"),
MainImage = new LastImageSet(
"https://lastfm-img2.akamaized.net/i/u/34s/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/64s/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/174s/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/300x300/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/f36a92bfbd7f8b579c91942c6a428d69.png")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(LibraryApiResponses.LibraryGetArtistsMultiple));
var actual = await command.HandleResponse(response);
Assert.IsTrue(actual.Success);
TestHelper.AssertSerialiseEqual(expectedArtist, actual.Content[1]); // Testing the second track returned
}
[Test]
public async Task HandleResponseSingle()
{
var command = new GetArtistsCommand(MAuth.Object, "user")
{
Page = 2,
Count = 1
};
var expectedArtist = new LastArtist
{
Name = "Crystal Castles",
PlayCount = 4219,
Mbid = "b1570544-93ab-4b2b-8398-131735394202",
Url = new Uri("https://www.last.fm/music/Crystal+Castles"),
MainImage = new LastImageSet(
"https://lastfm-img2.akamaized.net/i/u/34s/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/64s/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/174s/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/300x300/f36a92bfbd7f8b579c91942c6a428d69.png",
"https://lastfm-img2.akamaized.net/i/u/f36a92bfbd7f8b579c91942c6a428d69.png")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(LibraryApiResponses.LibraryGetArtistsSingle));
var actual = await command.HandleResponse(response);
Assert.IsTrue(actual.Success);
TestHelper.AssertSerialiseEqual(expectedArtist, actual.Content.Single()); // Testing the second track returned
}
[Test]
public async Task HandleResponseError()
{
var command = new GetTracksCommand(MAuth.Object, "rj", "", "", DateTimeOffset.MinValue)
{
Count = 1
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(LibraryApiResponses.LibraryGetArtistsError));
var parsed = await command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,97 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
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;
namespace IF.Lastfm.Core.Tests.Api.Commands.Library
{
public class GetTracksCommandTests : CommandTestsBase
{
[Test]
public async Task HandleResponseMultiple()
{
var command = new GetTracksCommand(MAuth.Object, "rj", "", "", DateTimeOffset.MinValue)
{
Count = 1
};
var expectedTrack = new LastTrack
{
ArtistName = "Stevie Wonder",
Duration = new TimeSpan(0, 4, 8),
PlayCount = 56,
Mbid = "0161855d-0b98-4f2d-b2ab-446dbd8d6759",
Name = "Superstition",
ArtistMbid = "1ee18fb3-18a6-4c7f-8ba0-bc41cdd0462e",
AlbumName = "Number Ones",
Url = new Uri("http://www.last.fm/music/Stevie+Wonder/_/Superstition", UriKind.Absolute),
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/99695819.jpg",
"http://userserve-ak.last.fm/serve/64s/99695819.jpg",
"http://userserve-ak.last.fm/serve/126/99695819.jpg",
"http://userserve-ak.last.fm/serve/300x300/99695819.jpg")
};
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",
Duration = new TimeSpan(0, 5, 47),
PlayCount = 81,
Mbid = "0317e524-7f70-4910-bc12-95dd468a29fc",
Name = "Sultans of Swing",
ArtistMbid = "614e3804-7d34-41ba-857f-811bad7c2b7a",
AlbumName = "Dire Straits (Remastered)",
Url = new Uri("http://www.last.fm/music/Dire+Straits/_/Sultans+of+Swing", UriKind.Absolute),
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/56827829.jpg",
"http://userserve-ak.last.fm/serve/64s/56827829.jpg",
"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);
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);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using IF.Lastfm.Core.Api.Commands.Library;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.Library
{
public class RemoveScrobbleCommandTests : CommandTestsBase
{
private readonly RemoveScrobbleCommand _command;
private const string ARTIST = "Hot Chip";
private const string TRACK = "Over and Over";
private static DateTimeOffset _timePlayed = new DateTimeOffset(2015, 04, 10, 18, 0, 0, TimeSpan.Zero);
public RemoveScrobbleCommandTests()
{
_command = new RemoveScrobbleCommand(MAuth.Object, "Hot Chip", "Over and Over", _timePlayed);
}
[Test]
public void ParametersCorrect()
{
var expected = new Dictionary<string, string>
{
{"artist", ARTIST},
{"track", TRACK},
{"timestamp", "1428688800"}
};
_command.SetParameters();
_command.Parameters.Remove("disablecachetoken");
TestHelper.AssertSerialiseEqual(expected, _command.Parameters);
}
}
}

View File

@ -0,0 +1,34 @@
using System.Collections.Generic;
using IF.Lastfm.Core.Api.Commands.Library;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.Library
{
public class RemoveTrackCommandTests : CommandTestsBase
{
private readonly RemoveTrackCommand _command;
private const string ARTIST = "Hot Chip";
private const string TRACK = "Over and Over";
public RemoveTrackCommandTests()
{
_command = new RemoveTrackCommand(MAuth.Object, "Hot Chip", "Over and Over");
}
[Test]
public void ParametersCorrect()
{
var expected = new Dictionary<string, string>
{
{"artist", ARTIST},
{"track", TRACK}
};
_command.SetParameters();
_command.Parameters.Remove("disablecachetoken");
TestHelper.AssertSerialiseEqual(expected, _command.Parameters);
}
}
}

View File

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Tag;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.Tag
{
public class GetInfoCommandTests: CommandTestsBase
{
[Test]
public async Task HandleSuccessResponse()
{
//Arrange
const string tagName = "disco";
const string tagUri = "http://www.last.fm/tag/disco";
var command = new GetInfoCommand(MAuth.Object, tagName);
var expectedTag=new LastTag(tagName,tagUri)
{
Reach = 34671,
Count = 172224,
Streamable = true
};
//Act
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetInfoSuccess));
var lastResponse = await command.HandleResponse(response);
var tag = lastResponse.Content;
//Assert
Assert.IsTrue(lastResponse.Success);
Assert.AreEqual(expectedTag.Reach,tag.Reach);
Assert.AreEqual(expectedTag.Name, tag.Name);
Assert.AreEqual(expectedTag.Count, tag.Count);
Assert.AreEqual(expectedTag.Streamable, tag.Streamable);
}
[Test]
public async Task HandleErrorResponse()
{
var command = new GetInfoCommand(MAuth.Object, "errorTag");
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetInfoError));
var parsed = await command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -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);
}
}
}

View File

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Tag;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.Tag
{
public class GetTopAlbumsCommandTests: CommandTestsBase
{
[Test]
public async Task HandleSingleResultResponse()
{
//Arrange
GetTopAlbumsCommand command = new GetTopAlbumsCommand(MAuth.Object, "disco");
//Act
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetTopAlbumsSingle));
var parsed = await command.HandleResponse(response);
//Assert
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
}
[Test]
public async Task HandleSuccessResponse()
{
//Arrange
GetTopAlbumsCommand command = new GetTopAlbumsCommand(MAuth.Object, "disco");
//Act
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetTopAlbumsSuccess));
var parsed = await command.HandleResponse(response);
//Assert
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
}
[Test]
public async Task HandleErrorResponse()
{
var command = new GetTopAlbumsCommand(MAuth.Object, "errorTag");
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetTopAlbumsError));
var parsed = await command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,58 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Tag;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands.Tag
{
public class GetTopArtistsCommandTests: CommandTestsBase
{
[Test]
public async Task HandleSingleResultResponse()
{
//Arrange
GetTopArtistsCommand command = new GetTopArtistsCommand(MAuth.Object, "disco");
//Act
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetTopArtistsSingle));
var parsed = await command.HandleResponse(response);
//Assert
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
}
[Test]
public async Task HandleSuccessResponse()
{
//Arrange
GetTopArtistsCommand command = new GetTopArtistsCommand(MAuth.Object, "disco");
//Act
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetTopArtistsSuccess));
var parsed = await command.HandleResponse(response);
//Assert
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
}
[Test]
public async Task ErrorIfTagIsEmpty()
{
var command = new GetTopArtistsCommand(MAuth.Object, "errorTag");
var response = CreateResponseMessage(Encoding.UTF8.GetString(TagApiResponses.GetTopArtistsError));
var parsed = await command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,91 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.Track;
namespace IF.Lastfm.Core.Tests.Api.Commands.TrackApi
{
public class GetTrackShoutsCommandTests : CommandTestsBase
{
private GetShoutsCommand _command;
public GetTrackShoutsCommandTests()
{
_command = new GetShoutsCommand(MAuth.Object, "Genesis", "Grimes")
{
Autocorrect = true,
Page = 5,
Count = 7
};
_command.SetParameters();
}
[Test]
public void Constructor()
{
Assert.AreEqual(_command.Method, "track.getShouts");
Assert.AreEqual(_command.Parameters["track"], "Genesis");
Assert.AreEqual(_command.Parameters["artist"], "Grimes");
Assert.AreEqual(_command.Parameters["autocorrect"], "1");
Assert.AreEqual(_command.Parameters["page"], "5");
Assert.AreEqual(_command.Parameters["limit"], "7");
//Assert.AreEqual(_command.Parameters["disablecachetoken"], "1");
}
[Test]
public async Task HandleSuccessResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(TrackApiResponses.TrackGetShouts));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(parsed.Page == 5);
Assert.IsTrue(parsed.Content.Count() == 7);
}
[Test]
public async Task HandleResponseSingle()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(TrackApiResponses.TrackGetShoutsSingle));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(parsed.Content.Count() == 1);
}
[Test]
public async Task HandleEmptyResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(TrackApiResponses.TrackGetShoutsEmpty));
var parsed = await _command.HandleResponse(response);
Assert.IsTrue(parsed.Success);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
[Test]
public async Task HandleErrorResponse()
{
var response = CreateResponseMessage(Encoding.UTF8.GetString(TrackApiResponses.TrackGetShoutsError));
var parsed = await _command.HandleResponse(response);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
Assert.IsNotNull(parsed.Content);
Assert.IsTrue(!parsed.Content.Any());
}
}
}

View File

@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.Linq;
using IF.Lastfm.Core.Api;
using IF.Lastfm.Core.Api.Commands.Track;
using IF.Lastfm.Core.Api.Helpers;
using IF.Lastfm.Core.Objects;
using NUnit.Framework;
using System.Threading.Tasks;
using System.Text;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Scrobblers;
using IF.Lastfm.Core.Tests.Resources;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public class TrackScrobbleCommandTests : CommandTestsBase
{
private DateTimeOffset _scrobblePlayed;
private Scrobble _testScrobble;
private ScrobbleCommand _command;
public TrackScrobbleCommandTests()
{
_scrobblePlayed = DateTimeOffset.UtcNow;
_testScrobble = new Scrobble("Kate Nash", "Made of Bricks", "Foundations", _scrobblePlayed)
{
AlbumArtist = "Kate Nash"
};
_command = new ScrobbleCommand(MAuth.Object, _testScrobble);
}
[Test]
public void ParametersCorrect()
{
var expected = new Dictionary<string, string>
{
{"artist[0]", "Kate Nash"},
{"albumArtist[0]", "Kate Nash"},
{"album[0]", "Made of Bricks"},
{"track[0]", "Foundations"},
{"chosenByUser[0]", "0"},
{"timestamp[0]", _scrobblePlayed.AsUnixTime().ToString()}
};
_command.SetParameters();
TestHelper.AssertSerialiseEqual(expected, _command.Parameters);
}
[Test]
public async Task HandlesRejectedResponse()
{
var responseMessage = CreateResponseMessage(Encoding.UTF8.GetString(TrackApiResponses.TrackScrobbleRejected));
var response = await _command.HandleResponse(responseMessage) as ScrobbleResponse;
Assert.IsTrue(response.Success);
Assert.AreEqual(1, response.Ignored.Count());
Assert.AreEqual("Artist name failed filter: Various", response.Ignored.First().IgnoredReason);
}
[Test]
public async Task HandlesSuccessResponse()
{
var responseMessage = CreateResponseMessage(Encoding.UTF8.GetString(TrackApiResponses.TrackScrobbleSuccess));
var response = await _command.HandleResponse(responseMessage);
Assert.IsTrue(response.Success);
Assert.AreEqual(1, response.AcceptedCount);
}
[Test]
public async Task HandlesSuccessResponseWhenMissingAlbumProperty()
{
var responseMessage = CreateResponseMessage(Encoding.UTF8.GetString(TrackApiResponses.TrackScrobbleSuccessNoAlbumProperty));
var response = await _command.HandleResponse(responseMessage);
Assert.IsTrue(response.Success);
Assert.AreEqual(1, response.AcceptedCount);
}
}
}

View File

@ -0,0 +1,93 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
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;
using Newtonsoft.Json.Linq;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
//using System.Web.Configuration;
class UserGetLovedTracksCommandTests : CommandTestsBase
{
[Test]
public async Task HandleResponseMultiple()
{
var command = new GetLovedTracksCommand(MAuth.Object, "rj")
{
Count = 3
};
var expectedTrack = new LastTrack
{
ArtistName = "The Rolling Stones",
TimePlayed = new DateTime(2014, 12, 19, 16, 16, 56, DateTimeKind.Utc),
Mbid = "3dde65c8-22c3-4637-b67e-b234177c847b",
Name = "Love in Vain",
ArtistMbid = "b071f9fa-14b0-4217-8e97-eb41da73f598",
AlbumName = "Let It Bleed",
Url = new Uri("http://www.last.fm/music/The+Rolling+Stones/_/Love+in+Vain"),
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/101739037.png",
"http://userserve-ak.last.fm/serve/64s/101739037.png",
"http://userserve-ak.last.fm/serve/126/101739037.png",
"http://userserve-ak.last.fm/serve/300x300/101739037.png")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetLovedTracksMultiple));
var actual = await command.HandleResponse(response);
Assert.IsTrue(actual.Success);
TestHelper.AssertSerialiseEqual(expectedTrack, actual.Content[1]);
}
[Test]
public async Task HandleResponseSingle()
{
var command = new GetLovedTracksCommand(MAuth.Object, "rj")
{
Count = 1
};
var expectedTrack = new LastTrack
{
ArtistName = "Rick James",
Mbid = "",
Name = "Super Freak (Part 1) - 1981 Single Version",
ArtistMbid = "cba9cec2-be8d-41bd-91b4-a1cd7de39b0c",
TimePlayed = new DateTime(2014, 12, 20, 10, 16, 52, DateTimeKind.Utc),
AlbumName = "The Definitive Collection",
Url = new Uri("http://www.last.fm/music/Rick+James/_/Super+Freak+(Part+1)+-+1981+Single+Version", UriKind.Absolute),
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/90462319.jpg",
"http://userserve-ak.last.fm/serve/64s/90462319.jpg",
"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.UserGetLovedTracksSingle));
var actual = await command.HandleResponse(response);
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);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,96 @@
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
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;
using Newtonsoft.Json.Linq;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public class UserGetRecentTracksCommandTests : CommandTestsBase
{
[Test]
public async Task HandleResponseMultiple()
{
var command = new GetRecentTracksCommand(MAuth.Object, "rj")
{
Count = 1
};
var expectedTrack = new LastTrack
{
ArtistName = "The Who",
TimePlayed = new DateTime(2014, 12, 19, 16, 13, 55,DateTimeKind.Utc),
Mbid = "79f3dc97-2297-47ee-8556-9a1bb4b48d53",
Name = "Pinball Wizard",
ArtistMbid = "9fdaa16b-a6c4-4831-b87c-bc9ca8ce7eaa",
AlbumName = "Tommy (Remastered)",
Url = new Uri("http://www.last.fm/music/The+Who/_/Pinball+Wizard", UriKind.Absolute),
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/35234991.jpg",
"http://userserve-ak.last.fm/serve/64s/35234991.jpg",
"http://userserve-ak.last.fm/serve/126/35234991.jpg",
"http://userserve-ak.last.fm/serve/300x300/35234991.jpg")
};
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",
Mbid = "",
Name = "Super Freak (Part 1) - 1981 Single Version",
ArtistMbid = "cba9cec2-be8d-41bd-91b4-a1cd7de39b0c",
TimePlayed = new DateTime(2014,12,20,10,16,52, DateTimeKind.Utc),
AlbumName = "The Definitive Collection",
Url = new Uri("http://www.last.fm/music/Rick+James/_/Super+Freak+(Part+1)+-+1981+Single+Version", UriKind.Absolute),
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/90462319.jpg",
"http://userserve-ak.last.fm/serve/64s/90462319.jpg",
"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);
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);
Assert.IsFalse(parsed.Success);
Assert.IsTrue(parsed.Status == LastResponseStatus.MissingParameters);
}
}
}

View File

@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api.Commands.User;
using IF.Lastfm.Core.Objects;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public class UserGetRecommendedArtistsCommandTests : CommandTestsBase
{
private GetRecommendedArtistsCommand _commmand;
[SetUp]
public void Initialise()
{
_commmand = new GetRecommendedArtistsCommand(MAuth.Object);
}
[Test]
public async Task HandleResponseSingle()
{
var expectedArtist = new LastArtist
{
Name = "Liars",
Mbid = "03098741-08b3-4dd7-b3f6-1b0bfa2c879c",
Url = new Uri("http://www.last.fm/music/Liars"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/2261874.jpg",
"http://userserve-ak.last.fm/serve/64/2261874.jpg",
"http://userserve-ak.last.fm/serve/126/2261874.jpg",
"http://userserve-ak.last.fm/serve/252/2261874.jpg",
"http://userserve-ak.last.fm/serve/_/2261874/Liars.jpg")
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetRecommendedArtistsSingle));
var parsed = await _commmand.HandleResponse(response);
Assert.IsTrue(parsed.Success);
var expectedJson = expectedArtist.WrapEnumerable().TestSerialise();
var actualJson = parsed.Content.TestSerialise();
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
[Test]
public async Task HandleResponseMultiple()
{
var expectedArtists = new List<LastArtist>
{
new LastArtist
{
Name = "Liars",
Mbid = "03098741-08b3-4dd7-b3f6-1b0bfa2c879c",
Url = new Uri("http://www.last.fm/music/Liars"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/2261874.jpg",
"http://userserve-ak.last.fm/serve/64/2261874.jpg",
"http://userserve-ak.last.fm/serve/126/2261874.jpg",
"http://userserve-ak.last.fm/serve/252/2261874.jpg",
"http://userserve-ak.last.fm/serve/_/2261874/Liars.jpg")
},
new LastArtist
{
Name = "The Haxan Cloak",
Mbid = "c9224968-d1b7-455f-84f4-2ceefa7d3a4e",
Url = new Uri("http://www.last.fm/music/The+Haxan+Cloak"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/92960643.png",
"http://userserve-ak.last.fm/serve/64/92960643.png",
"http://userserve-ak.last.fm/serve/126/92960643.png",
"http://userserve-ak.last.fm/serve/252/92960643.png",
"http://userserve-ak.last.fm/serve/500/92960643/The+Haxan+Cloak+THC_PNG_080913_04.png")
},
new LastArtist
{
Name = "Cloetta Paris",
Mbid = "24a9af30-cb7a-4456-ba3d-6daba1245b26",
Url = new Uri("http://www.last.fm/music/Cloetta+Paris"),
MainImage = new LastImageSet("http://userserve-ak.last.fm/serve/34/10586607.jpg",
"http://userserve-ak.last.fm/serve/64/10586607.jpg",
"http://userserve-ak.last.fm/serve/126/10586607.jpg",
"http://userserve-ak.last.fm/serve/252/10586607.jpg",
"http://userserve-ak.last.fm/serve/500/10586607/Cloetta+Paris+CloettaParis.jpg")
},
};
var response = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetRecommendedArtistsMultiple));
var parsed = await _commmand.HandleResponse(response);
Assert.IsTrue(parsed.Success);
var expectedJson = expectedArtists.TestSerialise();
var actualJson = parsed.Content.TestSerialise();
Assert.AreEqual(expectedJson, actualJson, expectedJson.DifferencesTo(actualJson));
}
}
}

View File

@ -0,0 +1,115 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using IF.Lastfm.Core.Api;
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;
using Moq;
namespace IF.Lastfm.Core.Tests.Api.Commands
{
public class UserGetTopAlbumsCommandTests : CommandTestsBase
{
private const string USER = "test";
private const LastStatsTimeSpan SPAN = LastStatsTimeSpan.Month;
private GetTopAlbumsCommand _command;
private Mock<ILastAuth> _mockAuth;
[SetUp]
public void TestInitialise()
{
_mockAuth = new Mock<ILastAuth>();
_command = new GetTopAlbumsCommand(_mockAuth.Object, USER, SPAN)
{
Page = 5,
Count = 20
};
_command.SetParameters();
}
[Test]
public void CorrectParameters()
{
var expected = new Dictionary<string, string>
{
{"user", USER},
{"period", SPAN.GetApiName()},
{"limit", "20"},
{"page", "5"},
{"disablecachetoken", ""}
};
_command.Parameters["disablecachetoken"] = "";
TestHelper.AssertSerialiseEqual(expected, _command.Parameters);
}
[Test]
public async Task HandleErrorResponse()
{
var http = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetTopAlbumsError));
var response = await _command.HandleResponse(http);
Assert.IsFalse(response.Success);
}
[Test]
public async Task HandleResponseEmpty()
{
var http = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetTopAlbumsEmpty));
var response = await _command.HandleResponse(http);
Assert.IsTrue(response.Success);
Assert.IsTrue(!response.Content.Any());
Assert.AreEqual(0, response.TotalItems);
Assert.AreEqual(1, response.TotalPages);
}
[Test]
public async Task HandleResponseSingle()
{
var expectedAlbum = new LastAlbum
{
ArtistName = "Crystal Castles",
Name = "Crystal Castles",
PlayCount = 2206,
Mbid = "a432a420-f374-4556-8421-b4ea097c7fe9",
Url = new Uri("http://www.last.fm/music/Crystal+Castles/Crystal+Castles"),
ListenerCount = null,
Images = new LastImageSet(
"http://userserve-ak.last.fm/serve/34s/78606386.png",
"http://userserve-ak.last.fm/serve/64s/78606386.png",
"http://userserve-ak.last.fm/serve/126/78606386.png",
"http://userserve-ak.last.fm/serve/300x300/78606386.png"),
Tracks = Enumerable.Empty<LastTrack>(),
ReleaseDateUtc = null,
TopTags = Enumerable.Empty<LastTag>()
};
var http = CreateResponseMessage(Encoding.UTF8.GetString(UserApiResponses.UserGetTopAlbumsSingle));
var response = await _command.HandleResponse(http);
Assert.IsTrue(response.Success);
Assert.AreEqual(1, response.Content.Count);
var actualAlbum = response.Content.First();
TestHelper.AssertSerialiseEqual(expectedAlbum, actualAlbum);
}
[Test]
//[Ignore]
public async Task HandleResponseMultiple()
{
}
}
}

View File

@ -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);
}
}
}

View File

@ -0,0 +1,42 @@
using IF.Lastfm.Core.Api.Helpers;
using NUnit.Framework;
namespace IF.Lastfm.Core.Tests.Api.Helpers
{
internal enum TestApiEnum
{
Unknown = 0,
[ApiName("dogs")]
Dogs,
[ApiName("cats")]
Cats
}
public class ApiHelperTests
{
[Test]
public void GetApiNameReturnsAttribute()
{
var enumValue = TestApiEnum.Dogs;
var expected = "dogs";
var actual = enumValue.GetApiName();
Assert.AreEqual(expected, actual);
}
[Test]
public void GetApiNameReturnsValueIfNoAttribute()
{
var enumValue = TestApiEnum.Unknown;
var expected = "Unknown";
var actual = enumValue.GetApiName();
Assert.AreEqual(expected, actual);
}
}
}

View File

@ -0,0 +1,34 @@
using IF.Lastfm.Core.Api;
using NUnit.Framework;
using System.Collections.Generic;
namespace IF.Lastfm.Core.Tests.Api
{
public class LastAuthTests
{
private ILastAuth _auth;
[SetUp]
public void Initialise()
{
_auth = new LastAuth("user", "pass");
}
[Test]
public void GeneratesCorrectMethodSignature()
{
const string method = "test.method";
var parameters = new Dictionary<string, string>
{
{"test", "value"},
{"test2", "value2"}
};
const string expectedHash = "41919D4DF853702763556BFE2085406B";
var actual = _auth.GenerateMethodSignature(method, parameters);
Assert.AreEqual(expectedHash, actual);
}
}
}

View File

@ -0,0 +1,27 @@
using IF.Lastfm.Core.Api;
using IF.Lastfm.Core.Api.Commands;
using IF.Lastfm.Core.Api.Helpers;
using NUnit.Framework;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace IF.Lastfm.Core.Tests.Api
{
public class LastMethodsNamesTests
{
[Test]
public void EnsureEachCommandHasAnApiMethodNameAttribute()
{
var commandBaseType = typeof(LastAsyncCommandBase);
var allCommands = commandBaseType.Assembly.DefinedTypes
.Where(t => t != commandBaseType && commandBaseType.IsAssignableFrom(t))
.Where(t => t.IsClass && !t.IsAbstract);
var commandsWithoutAttribute = allCommands.Where(x => !x.GetCustomAttributes<ApiMethodNameAttribute>().Any());
Assert.IsFalse(commandsWithoutAttribute.Any(), "Warning, all commands should have anApiMethodNameAttribute.");
}
}
}

View File

@ -0,0 +1,19 @@
using IF.Lastfm.Core.Api;
using Moq;
namespace IF.Lastfm.Core.Tests.Api
{
public class MockAlbumApi
{
public AlbumApi Object { get; private set; }
public Mock<ILastAuth> Auth { get; private set; }
public MockAlbumApi(Mock<ILastAuth> auth)
{
Auth = auth;
Object = new AlbumApi(Auth.Object);
}
}
}

View File

@ -7,6 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="moq" Version="4.10.0" />
<PackageReference Include="nunit" Version="3.10.1" /> <PackageReference Include="nunit" Version="3.10.1" />
<PackageReference Include="NUnit3TestAdapter" Version="3.10.0" /> <PackageReference Include="NUnit3TestAdapter" Version="3.10.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
@ -16,4 +17,15 @@
<ProjectReference Include="..\IF.Lastfm.Core\IF.Lastfm.Core.csproj" /> <ProjectReference Include="..\IF.Lastfm.Core\IF.Lastfm.Core.csproj" />
</ItemGroup> </ItemGroup>
<!--
<ItemGroup>
<Reference Include="Moq, Version=4.2.1502.911, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>../../packages/Moq.4.2.1502.0911/lib/net40/Moq.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>../../packages/Newtonsoft.Json.9.0.1/lib/net45/Newtonsoft.Json.dll</HintPath>
</Reference>
</ItemGroup>
-->
</Project> </Project>

View File

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.Text;
using IF.Lastfm.Core.Api.Enums;
using IF.Lastfm.Core.Tests.Resources;
using NUnit.Framework;
using Moq;
namespace IF.Lastfm.Core.Tests
{
public class LastFmTests
{
[Test]
public void ApiUrlFormatReturnsCorrectly()
{
const string expected = "https://ws.audioscrobbler.com/2.0/?method=tobias.funke&api_key=suddenvalley&blue=performance&format=json&uncle=t-bag";
var actual = LastFm.FormatApiUrl("tobias.funke", "suddenvalley", new Dictionary<string, string>
{
{"uncle", "t-bag"},
{"blue", "performance"}
}, true);
Assert.AreEqual(expected, actual);
}
[Test]
public void IsResponseValid()
{
LastResponseStatus status;
Assert.IsFalse(LastFm.IsResponseValid(null, out status));
Assert.IsFalse(LastFm.IsResponseValid("{invalid json", out status));
var error6 = Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetTagsError);
Assert.IsFalse(LastFm.IsResponseValid(error6, out status));
Assert.AreEqual(LastResponseStatus.MissingParameters, status);
var goodResponse = Encoding.UTF8.GetString(ArtistApiResponses.ArtistGetInfoSuccess);
Assert.IsTrue(LastFm.IsResponseValid(goodResponse, out status));
Assert.AreEqual(LastResponseStatus.Successful, status);
}
}
}

View File

@ -0,0 +1,15 @@
using IF.Lastfm.Core.Api;
using Moq;
namespace IF.Lastfm.Core.Tests
{
public class MockLastFm
{
public Mock<ILastAuth> Auth { get; set; }
public MockLastFm()
{
Auth = new Mock<ILastAuth>();
}
}
}

View File

@ -0,0 +1,302 @@
{
"album": {
"name": "Ray of Light",
"artist": "Madonna",
"id": "1934",
"mbid": "ddb3168d-66a9-4b2d-af02-05278da8a23d",
"url": "http://www.last.fm/music/Madonna/Ray+of+Light",
"releasedate": " 13 Sep 2005, 00:00",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/37498173.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/37498173.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/174s/37498173.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/37498173.png",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/_/37498173/Ray+of+Light.png",
"size": "mega"
}
],
"listeners": "509271",
"playcount": "7341494",
"userplaycount": "321",
"tracks": {
"track": [
{
"name": "Drowned World/Substitute for Love",
"duration": "308",
"mbid": "",
"url": "http://www.last.fm/music/Madonna/_/Drowned+World%2FSubstitute+for+Love",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "1"
}
},
{
"name": "Swim",
"duration": "300",
"mbid": "296cace4-5e5e-40cc-accc-74d9a31e5f8e",
"url": "http://www.last.fm/music/Madonna/_/Swim",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "2"
}
},
{
"name": "Ray of Light",
"duration": "321",
"mbid": "20bf8ce2-2e2c-48f4-ba81-4a1b24cf8fae",
"url": "http://www.last.fm/music/Madonna/_/Ray+of+Light",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "3"
}
},
{
"name": "Candy Perfume Girl",
"duration": "276",
"mbid": "9d9e6392-50c2-4e44-a560-c23ffd7833da",
"url": "http://www.last.fm/music/Madonna/_/Candy+Perfume+Girl",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "4"
}
},
{
"name": "Skin",
"duration": "381",
"mbid": "b42b3682-7964-4e2b-8f51-039656c32c2f",
"url": "http://www.last.fm/music/Madonna/_/Skin",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "5"
}
},
{
"name": "Nothing Really Matters",
"duration": "266",
"mbid": "3309c939-3b88-4e92-99b8-46dd1052ec09",
"url": "http://www.last.fm/music/Madonna/_/Nothing+Really+Matters",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "6"
}
},
{
"name": "Sky Fits Heaven",
"duration": "287",
"mbid": "2a5437aa-6ad5-4d71-b838-dc0ed928ead4",
"url": "http://www.last.fm/music/Madonna/_/Sky+Fits+Heaven",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "7"
}
},
{
"name": "Shanti/Ashtangi",
"duration": "268",
"mbid": "4e354e70-bd0e-461f-b63d-7887ff444edf",
"url": "http://www.last.fm/music/Madonna/_/Shanti%2FAshtangi",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "8"
}
},
{
"name": "Frozen",
"duration": "372",
"mbid": "646550f5-8242-4e6d-8ad9-533548a4af41",
"url": "http://www.last.fm/music/Madonna/_/Frozen",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "9"
}
},
{
"name": "The Power of Good-Bye",
"duration": "252",
"mbid": "912db777-e783-4856-b5e3-03548355d951",
"url": "http://www.last.fm/music/Madonna/_/The+Power+of+Good-Bye",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "10"
}
},
{
"name": "To Have and Not to Hold",
"duration": "322",
"mbid": "bc580d40-0283-47b0-9b7c-2580354f0875",
"url": "http://www.last.fm/music/Madonna/_/To+Have+and+Not+to+Hold",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "11"
}
},
{
"name": "Little Star",
"duration": "318",
"mbid": "19be8b9b-f265-448a-b120-939e4a6ba4c3",
"url": "http://www.last.fm/music/Madonna/_/Little+Star",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "12"
}
},
{
"name": "Mer Girl",
"duration": "331",
"mbid": "28bf1e1c-5f72-441a-abe7-8e3bef2554b8",
"url": "http://www.last.fm/music/Madonna/_/Mer+Girl",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "13"
}
}
]
},
"toptags": {
"tag": [
{
"name": "albums i own",
"url": "http://www.last.fm/tag/albums%20i%20own"
},
{
"name": "pop",
"url": "http://www.last.fm/tag/pop"
},
{
"name": "electronic",
"url": "http://www.last.fm/tag/electronic"
},
{
"name": "dance",
"url": "http://www.last.fm/tag/dance"
},
{
"name": "madonna",
"url": "http://www.last.fm/tag/madonna"
}
]
},
"wiki": {
"published": "Sat, 14 Jul 2012 12:33:01 +0000",
"summary": "Ray of Light is the seventh studio album by American singer-songwriter Madonna, released on March 3, 1998 by Maverick Records. The album is a pop and dance record, yet, it contains elements of electronic music within its composition, making it a departure from her previous work. Additionally, it incorporates several genres and subgenres, including techno and ambient. The album has several themes, including spirituality. ",
"content": "Ray of Light is the seventh studio album by American singer-songwriter Madonna, released on March 3, 1998 by Maverick Records. The album is a pop and dance record, yet, it contains elements of electronic music within its composition, making it a departure from her previous work. Additionally, it incorporates several genres and subgenres, including techno and ambient. The album has several themes, including spirituality. \n \n After giving birth to her daughter Lourdes, Madonna collaborated with Patrick Leonard and William Orbit in developing the album. After failed sessions with other producers, Madonna pursued a new musical direction with Orbit and incorporated his extensive usage of trance and electronic music in her songs. The recording took place over four months, but experienced problems with the Pro Tools arrangement by Orbit as well as the absence of live bands.\n \n However, upon release, the album was lauded by contemporary critics as a music masterpiece of the decade. Reviewers complimented the album for its mature, restrained nature as well as commending Madonna's musical direction, calling it her &quot;most adventurous&quot; record. In such a way, the album has been included in many critic lists and polls, including Rolling Stone magazine's &quot;The 500 Greatest Albums of All Time&quot;.\n \n Commercially, the album was a success on the world charts, peaking at number one in countries like the United Kingdom, Canada, Australia, New Zealand and mainland Europe. On the U.S. Billboard 200, the album debuted and peaked at number two. The Recording Industry Association of America (RIAA) certified it Quadruple Platinum on March 16, 2000, recognizing four million shipments in the United States, making it her fifth best-selling recording there. Worldwide sales of the album have surpassed 20 million copies.\n \n Five singles were released from the album. The first single &quot;Frozen&quot; was an international success, as was the second one, &quot;Ray of Light&quot;, which won a number of awards for its music video. In 1999, the album received three Grammy Awards, including &quot;Best Pop Vocal Album&quot;, and &quot;Best Dance Recording.&quot; In 2003, the album was ranked #363 on Rolling Stone's 500 Greatest Albums of All Time. Madonna has performed songs from this album on a number of her world tours, most recently the Sticky &amp; Sweet Tour (2008-09).\n \nUser-contributed text is available under the Creative Commons By-SA License and may also be available under the GNU FDL."
}
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Album not found",
"links": []
}

View File

@ -0,0 +1,301 @@
{
"album": {
"name": "Ray of Light",
"artist": "Madonna",
"id": "1934",
"mbid": "ddb3168d-66a9-4b2d-af02-05278da8a23d",
"url": "http://www.last.fm/music/Madonna/Ray+of+Light",
"releasedate": " 13 Sep 2005, 00:00",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/37498173.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/37498173.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/174s/37498173.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/37498173.png",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/_/37498173/Ray+of+Light.png",
"size": "mega"
}
],
"listeners": "509271",
"playcount": "7341494",
"tracks": {
"track": [
{
"name": "Drowned World/Substitute for Love",
"duration": "308",
"mbid": "",
"url": "http://www.last.fm/music/Madonna/_/Drowned+World%2FSubstitute+for+Love",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "1"
}
},
{
"name": "Swim",
"duration": "300",
"mbid": "296cace4-5e5e-40cc-accc-74d9a31e5f8e",
"url": "http://www.last.fm/music/Madonna/_/Swim",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "2"
}
},
{
"name": "Ray of Light",
"duration": "321",
"mbid": "20bf8ce2-2e2c-48f4-ba81-4a1b24cf8fae",
"url": "http://www.last.fm/music/Madonna/_/Ray+of+Light",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "3"
}
},
{
"name": "Candy Perfume Girl",
"duration": "276",
"mbid": "9d9e6392-50c2-4e44-a560-c23ffd7833da",
"url": "http://www.last.fm/music/Madonna/_/Candy+Perfume+Girl",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "4"
}
},
{
"name": "Skin",
"duration": "381",
"mbid": "b42b3682-7964-4e2b-8f51-039656c32c2f",
"url": "http://www.last.fm/music/Madonna/_/Skin",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "5"
}
},
{
"name": "Nothing Really Matters",
"duration": "266",
"mbid": "3309c939-3b88-4e92-99b8-46dd1052ec09",
"url": "http://www.last.fm/music/Madonna/_/Nothing+Really+Matters",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "6"
}
},
{
"name": "Sky Fits Heaven",
"duration": "287",
"mbid": "2a5437aa-6ad5-4d71-b838-dc0ed928ead4",
"url": "http://www.last.fm/music/Madonna/_/Sky+Fits+Heaven",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "7"
}
},
{
"name": "Shanti/Ashtangi",
"duration": "268",
"mbid": "4e354e70-bd0e-461f-b63d-7887ff444edf",
"url": "http://www.last.fm/music/Madonna/_/Shanti%2FAshtangi",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "8"
}
},
{
"name": "Frozen",
"duration": "372",
"mbid": "646550f5-8242-4e6d-8ad9-533548a4af41",
"url": "http://www.last.fm/music/Madonna/_/Frozen",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "9"
}
},
{
"name": "The Power of Good-Bye",
"duration": "252",
"mbid": "912db777-e783-4856-b5e3-03548355d951",
"url": "http://www.last.fm/music/Madonna/_/The+Power+of+Good-Bye",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "10"
}
},
{
"name": "To Have and Not to Hold",
"duration": "322",
"mbid": "bc580d40-0283-47b0-9b7c-2580354f0875",
"url": "http://www.last.fm/music/Madonna/_/To+Have+and+Not+to+Hold",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "11"
}
},
{
"name": "Little Star",
"duration": "318",
"mbid": "19be8b9b-f265-448a-b120-939e4a6ba4c3",
"url": "http://www.last.fm/music/Madonna/_/Little+Star",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "12"
}
},
{
"name": "Mer Girl",
"duration": "331",
"mbid": "28bf1e1c-5f72-441a-abe7-8e3bef2554b8",
"url": "http://www.last.fm/music/Madonna/_/Mer+Girl",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Madonna",
"mbid": "79239441-bfd5-4981-a70c-55c3f15c1287",
"url": "http://www.last.fm/music/Madonna"
},
"@attr": {
"rank": "13"
}
}
]
},
"toptags": {
"tag": [
{
"name": "albums i own",
"url": "http://www.last.fm/tag/albums%20i%20own"
},
{
"name": "pop",
"url": "http://www.last.fm/tag/pop"
},
{
"name": "electronic",
"url": "http://www.last.fm/tag/electronic"
},
{
"name": "dance",
"url": "http://www.last.fm/tag/dance"
},
{
"name": "madonna",
"url": "http://www.last.fm/tag/madonna"
}
]
},
"wiki": {
"published": "Sat, 14 Jul 2012 12:33:01 +0000",
"summary": "Ray of Light is the seventh studio album by American singer-songwriter Madonna, released on March 3, 1998 by Maverick Records. The album is a pop and dance record, yet, it contains elements of electronic music within its composition, making it a departure from her previous work. Additionally, it incorporates several genres and subgenres, including techno and ambient. The album has several themes, including spirituality. ",
"content": "Ray of Light is the seventh studio album by American singer-songwriter Madonna, released on March 3, 1998 by Maverick Records. The album is a pop and dance record, yet, it contains elements of electronic music within its composition, making it a departure from her previous work. Additionally, it incorporates several genres and subgenres, including techno and ambient. The album has several themes, including spirituality. \n \n After giving birth to her daughter Lourdes, Madonna collaborated with Patrick Leonard and William Orbit in developing the album. After failed sessions with other producers, Madonna pursued a new musical direction with Orbit and incorporated his extensive usage of trance and electronic music in her songs. The recording took place over four months, but experienced problems with the Pro Tools arrangement by Orbit as well as the absence of live bands.\n \n However, upon release, the album was lauded by contemporary critics as a music masterpiece of the decade. Reviewers complimented the album for its mature, restrained nature as well as commending Madonna's musical direction, calling it her &quot;most adventurous&quot; record. In such a way, the album has been included in many critic lists and polls, including Rolling Stone magazine's &quot;The 500 Greatest Albums of All Time&quot;.\n \n Commercially, the album was a success on the world charts, peaking at number one in countries like the United Kingdom, Canada, Australia, New Zealand and mainland Europe. On the U.S. Billboard 200, the album debuted and peaked at number two. The Recording Industry Association of America (RIAA) certified it Quadruple Platinum on March 16, 2000, recognizing four million shipments in the United States, making it her fifth best-selling recording there. Worldwide sales of the album have surpassed 20 million copies.\n \n Five singles were released from the album. The first single &quot;Frozen&quot; was an international success, as was the second one, &quot;Ray of Light&quot;, which won a number of awards for its music video. In 1999, the album received three Grammy Awards, including &quot;Best Pop Vocal Album&quot;, and &quot;Best Dance Recording.&quot; In 2003, the album was ranked #363 on Rolling Stone's 500 Greatest Albums of All Time. Madonna has performed songs from this album on a number of her world tours, most recently the Sticky &amp; Sweet Tour (2008-09).\n \nUser-contributed text is available under the Creative Commons By-SA License and may also be available under the GNU FDL."
}
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Album not found",
"links": []
}

View File

@ -0,0 +1,11 @@
{
"shouts": {
"#text": "\n",
"artist": "Solar Fields",
"album": "[ Origin #01 ]",
"page": "0",
"perPage": "1",
"totalPages": "0",
"total": "0"
}
}

View File

@ -0,0 +1,24 @@
{
"shouts": {
"shout": [
{
"body": "Nunca vou cansar disso.",
"author": "uhIgor",
"date": "Thu, 23 Oct 2014 02:20:30"
},
{
"body": "Oblivion is the best song on whole album. Maybe i dig it but i don't want to really. Or i'm not in the right mood for it.",
"author": "Zachary-K",
"date": "Wed, 17 Sep 2014 21:04:36"
}
],
"@attr": {
"artist": "Grimes",
"album": "Visions",
"page": "0",
"perPage": "2",
"totalPages": "78",
"total": "155"
}
}
}

View File

@ -0,0 +1,17 @@
{
"shouts": {
"shout": {
"body": "Nunca vou cansar disso.",
"author": "uhIgor",
"date": "Thu, 23 Oct 2014 02:20:30"
},
"@attr": {
"artist": "Grimes",
"album": "Visions",
"page": "0",
"perPage": "1",
"totalPages": "155",
"total": "155"
}
}
}

View File

@ -0,0 +1,7 @@
{
"tags": {
"#text": "\n",
"artist": "Hot Chip",
"album": "Made in the Dark"
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Invalid user supplied",
"links": []
}

View File

@ -0,0 +1,18 @@
{
"tags": {
"tag": [
{
"name": "test tag 2: electric boogaloo",
"url": "http://www.last.fm/tag/test%20tag%202%3A%20electric%20boogaloo"
},
{
"name": "Test Tag",
"url": "http://www.last.fm/tag/test%20tag"
}
],
"@attr": {
"artist": "Hot Chip",
"album": "Coming on Strong"
}
}
}

View File

@ -0,0 +1,12 @@
{
"tags": {
"tag": {
"name": "Test Tag",
"url": "http://www.last.fm/tag/test%20tag"
},
"@attr": {
"artist": "Hot Chip",
"album": "The Warning"
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,8 @@
{
"toptags":
{
"#text":"\n",
"artist":"Amit Sana",
"album":"Chal Diye"
}
}

View File

@ -0,0 +1 @@
{"error":6,"message":"You must supply either an album & artist name or an album mbid.","links":[]}

View File

@ -0,0 +1,95 @@
{
"results": {
"opensearch:Query": {
"#text": "",
"role": "request",
"searchTerms": "By the throat",
"startPage": "2"
},
"opensearch:totalResults": "7",
"opensearch:startIndex": "3",
"opensearch:itemsPerPage": "3",
"albummatches": {
"album": [
{
"name": "Taken by the Throat",
"artist": "Accuser",
"id": "2235702",
"url": "http:\/\/www.last.fm\/music\/Accuser\/Taken+by+the+Throat",
"image": [
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/34s\/99533223.jpg",
"size": "small"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/64s\/99533223.jpg",
"size": "medium"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/126\/99533223.jpg",
"size": "large"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/300x300\/99533223.jpg",
"size": "extralarge"
}
], "streamable": "0",
"mbid": ""
},
{
"name": "Taken By The Throat",
"artist": "Accu\u00a7er",
"id": "9824542",
"url": "http:\/\/www.last.fm\/music\/Accu%C2%A7er\/Taken+By+The+Throat",
"image": [
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/34s\/61678047.gif",
"size": "small"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/64s\/61678047.gif",
"size": "medium"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/126\/61678047.gif",
"size": "large"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/300x300\/61678047.gif",
"size": "extralarge"
}
], "streamable": "0",
"mbid": "640e49df-d858-467b-9820-6b8260e10e12"
},
{
"name": "Seizing Fate By the Throat",
"artist": "Bryce Beverlin II",
"id": "274975959",
"url": "http:\/\/www.last.fm\/music\/Bryce+Beverlin+II\/Seizing+Fate+By+the+Throat",
"image": [
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/34s\/96513473.jpg",
"size": "small"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/64s\/96513473.jpg",
"size": "medium"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/126\/96513473.jpg",
"size": "large"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/300x300\/96513473.jpg",
"size": "extralarge"
}
], "streamable": "0",
"mbid": ""
}
]
},
"@attr": {
"for": "By the throat"
}
}
}

View File

@ -0,0 +1,17 @@
{
"results": {
"opensearch:Query": {
"#text": "",
"role": "request",
"searchTerms": "tvmikhkjj",
"startPage": "2"
},
"opensearch:totalResults": "0",
"opensearch:startIndex": "50",
"opensearch:itemsPerPage": "50",
"albummatches": "\n",
"@attr": {
"for": "tvmikhkjj"
}
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Invalid parameters - Your request is missing the [album] parameter",
"links": []
}

View File

@ -0,0 +1,43 @@
{
"results": {
"opensearch:Query": {
"#text": "",
"role": "request",
"searchTerms": "By the throat",
"startPage": "2"
},
"opensearch:totalResults": "7",
"opensearch:startIndex": "1",
"opensearch:itemsPerPage": "1",
"albummatches": {
"album": {
"name": "By The Throat",
"artist": "Ben Frost",
"id": "70542676",
"url": "http:\/\/www.last.fm\/music\/Ben+Frost\/By+The+Throat",
"image": [
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/34s\/86191845.png",
"size": "small"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/64s\/86191845.png",
"size": "medium"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/126\/86191845.png",
"size": "large"
},
{
"#text": "http:\/\/userserve-ak.last.fm\/serve\/300x300\/86191845.png",
"size": "extralarge"
}
], "streamable": "0",
"mbid": "cc4c47b5-1e7a-44d1-823b-1e7b20d10c4b"
}
},
"@attr": {
"for": "By the throat"
}
}
}

View File

@ -0,0 +1,243 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace IF.Lastfm.Core.Tests.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class AlbumApiResponses {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal AlbumApiResponses() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public 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.AlbumApiResponses", typeof(AlbumApiResponses).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetInfoForUser {
get {
object obj = ResourceManager.GetObject("AlbumGetInfoForUser", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetInfoMissing {
get {
object obj = ResourceManager.GetObject("AlbumGetInfoMissing", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetInfoSuccess {
get {
object obj = ResourceManager.GetObject("AlbumGetInfoSuccess", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetShoutsAlbumMissing {
get {
object obj = ResourceManager.GetObject("AlbumGetShoutsAlbumMissing", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetShoutsEmpty {
get {
object obj = ResourceManager.GetObject("AlbumGetShoutsEmpty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetShoutsMultiple {
get {
object obj = ResourceManager.GetObject("AlbumGetShoutsMultiple", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetShoutsSingle {
get {
object obj = ResourceManager.GetObject("AlbumGetShoutsSingle", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetTagsEmpty {
get {
object obj = ResourceManager.GetObject("AlbumGetTagsEmpty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetTagsError {
get {
object obj = ResourceManager.GetObject("AlbumGetTagsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetTagsMultiple {
get {
object obj = ResourceManager.GetObject("AlbumGetTagsMultiple", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetTagsSingle {
get {
object obj = ResourceManager.GetObject("AlbumGetTagsSingle", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetTopTags {
get {
object obj = ResourceManager.GetObject("AlbumGetTopTags", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetTopTagsEmpty {
get {
object obj = ResourceManager.GetObject("AlbumGetTopTagsEmpty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumGetTopTagsError {
get {
object obj = ResourceManager.GetObject("AlbumGetTopTagsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumSearch {
get {
object obj = ResourceManager.GetObject("AlbumSearch", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumSearchEmpty {
get {
object obj = ResourceManager.GetObject("AlbumSearchEmpty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumSearchError {
get {
object obj = ResourceManager.GetObject("AlbumSearchError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] AlbumSearchSingle {
get {
object obj = ResourceManager.GetObject("AlbumSearchSingle", resourceCulture);
return ((byte[])(obj));
}
}
}
}

View File

@ -0,0 +1,175 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="AlbumGetInfoForUser" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetInfoForUser.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetInfoMissing" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetInfoMissing.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetInfoSuccess" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetInfoSuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetShoutsAlbumMissing" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>albumapi\albumgetshoutsalbummissing.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetShoutsEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetShoutsEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetShoutsMultiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>albumapi\albumgetshoutsmultiple.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetShoutsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>albumapi\albumgetshoutssingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetTagsEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetTagsEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetTagsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetTagsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetTagsMultiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetTagsMultiple.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetTagsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetTagsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetTopTags" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetTopTags.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetTopTagsEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetTopTagsEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumGetTopTagsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumGetTopTagsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumSearch" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumSearch.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumSearchEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumSearchEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumSearchError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumSearchError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="AlbumSearchSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>AlbumApi\AlbumSearchSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "The artist you supplied could not be found",
"links": []
}

View File

@ -0,0 +1,237 @@
{
"artist": {
"name": "Frightened Rabbit",
"mbid": "dc21d171-7204-4759-9fd0-77d031aeb40c",
"bandmembers": {
"member": [
{
"name": "Scott Hutchison",
"yearfrom": "2003"
},
{
"name": "Billy Kennedy",
"yearfrom": "2006"
},
{
"name": "Grant Hutchison",
"yearfrom": "2004"
},
{
"name": "Andy Monaghan",
"yearfrom": "2008"
},
{
"name": "Gordon Skene",
"yearfrom": "2009"
}
]
},
"url": "http://www.last.fm/music/Frightened+Rabbit",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34/50340089.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64/50340089.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/50340089.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/252/50340089.jpg",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/_/50340089/Frightened+Rabbit+frabbit.jpg",
"size": "mega"
}
],
"streamable": "0",
"ontour": "0",
"stats": {
"listeners": "513447",
"playcount": "16319896"
},
"similar": {
"artist": [
{
"name": "Admiral Fallow",
"url": "http://www.last.fm/music/Admiral+Fallow",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34/48454975.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64/48454975.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/48454975.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/252/48454975.jpg",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/500/48454975/Admiral+Fallow+l_1185fb2755064ccfbab2871ecec8.jpg",
"size": "mega"
}
]
},
{
"name": "The Twilight Sad",
"url": "http://www.last.fm/music/The+Twilight+Sad",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34/18201771.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64/18201771.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/18201771.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/252/18201771.jpg",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/500/18201771/The+Twilight+Sad+hi+how+are+you.jpg",
"size": "mega"
}
]
},
{
"name": "Owl John",
"url": "http://www.last.fm/music/Owl+John",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34/101981791.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64/101981791.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/101981791.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/252/101981791.png",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/500/101981791/Owl+John+owl.png",
"size": "mega"
}
]
},
{
"name": "We Were Promised Jetpacks",
"url": "http://www.last.fm/music/We+Were+Promised+Jetpacks",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34/53527397.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64/53527397.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/53527397.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/252/53527397.jpg",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/_/53527397/We+Were+Promised+Jetpacks+wwpj.jpg",
"size": "mega"
}
]
},
{
"name": "Meursault",
"url": "http://www.last.fm/music/Meursault",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34/41921789.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64/41921789.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/41921789.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/252/41921789.jpg",
"size": "extralarge"
},
{
"#text": "http://userserve-ak.last.fm/serve/_/41921789/Meursault+lovely+fuckwits.jpg",
"size": "mega"
}
]
}
]
},
"tags": {
"tag": [
{
"name": "indie",
"url": "http://www.last.fm/tag/indie"
},
{
"name": "scottish",
"url": "http://www.last.fm/tag/scottish"
},
{
"name": "indie rock",
"url": "http://www.last.fm/tag/indie%20rock"
},
{
"name": "folk",
"url": "http://www.last.fm/tag/folk"
},
{
"name": "folk rock",
"url": "http://www.last.fm/tag/folk%20rock"
}
]
},
"bio": {
"links": {
"link": {
"#text": "",
"rel": "original",
"href": "http://www.last.fm/music/Frightened+Rabbit/+wiki"
}
},
"published": "Wed, 6 Feb 2013 00:04:40 +0000",
"summary": "\n Frightened Rabbit are an <a href=\"http://www.last.fm/tag/indie%20rock\" class=\"bbcode_tag\" rel=\"tag\">indie rock</a> band which formed in 2003 in Glasgow, Scotland. The band currently consists of Scott Hutchison (vocals, guitar), Billy Kennedy (guitar, keyboards), Grant Hutchison (drums, vocals), Andy Monaghan (guitar, keyboards) and Gordon Skene (guitar, keyboards). The band has released four albums: &quot;Sing the Greys&quot; (2006), &quot;The Midnight Organ Fight&quot; (2008), &quot;The Winter of Mixed Drinks&quot; (2010) and &quot;Pedestrian Verse&quot; (2013). \n\n <a href=\"http://www.last.fm/music/Frightened+Rabbit\">Read more about Frightened Rabbit on Last.fm</a>.\n \n ",
"content": "\n Frightened Rabbit are an <a href=\"http://www.last.fm/tag/indie%20rock\" class=\"bbcode_tag\" rel=\"tag\">indie rock</a> band which formed in 2003 in Glasgow, Scotland. The band currently consists of Scott Hutchison (vocals, guitar), Billy Kennedy (guitar, keyboards), Grant Hutchison (drums, vocals), Andy Monaghan (guitar, keyboards) and Gordon Skene (guitar, keyboards). The band has released four albums: &quot;Sing the Greys&quot; (2006), &quot;The Midnight Organ Fight&quot; (2008), &quot;The Winter of Mixed Drinks&quot; (2010) and &quot;Pedestrian Verse&quot; (2013). \n\n <a href=\"http://www.last.fm/music/Frightened+Rabbit\">Read more about Frightened Rabbit on Last.fm</a>.\n \n \nUser-contributed text is available under the Creative Commons By-SA License and may also be available under the GNU FDL.\n ",
"placeformed": "Glasgow, Scotland",
"yearformed": "2003",
"formationlist": {
"formation": {
"yearfrom": "2003",
"yearto": ""
}
}
}
}
}

View File

@ -0,0 +1,6 @@
{
"tags": {
"#text": "\n",
"artist": "Hot Chip",
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Invalid user supplied",
"links": []
}

View File

@ -0,0 +1,17 @@
{
"tags": {
"tag": [
{
"name": "the fate of the world is safe in crystal castles",
"url": "http://www.last.fm/tag/the%20fate%20of%20the%20world%20is%20safe%20in%20crystal%20castles"
},
{
"name": "if this were a pokemon i would catch it",
"url": "http://www.last.fm/tag/if%20this%20were%20a%20pokemon%20i%20would%20catch%20it"
}
],
"@attr": {
"artist": "Crim3s"
}
}
}

View File

@ -0,0 +1,11 @@
{
"tags": {
"tag": {
"name": "the fate of the world is safe in crystal castles",
"url": "http://www.last.fm/tag/the%20fate%20of%20the%20world%20is%20safe%20in%20crystal%20castles"
},
"@attr": {
"artist": "Crim3s"
}
}
}

View File

@ -0,0 +1,6 @@
{
"toptags": {
"#text": "\n",
"artist": "Jamie Ryan"
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "The artist you supplied could not be found",
"links": []
}

View File

@ -0,0 +1,34 @@
{
"toptags": {
"tag": [
{
"name": "electronic",
"count": "100",
"url": "http://www.last.fm/tag/electronic"
},
{
"name": "experimental",
"count": "100",
"url": "http://www.last.fm/tag/experimental"
},
{
"name": "Bandcamp",
"count": "100",
"url": "http://www.last.fm/tag/bandcamp"
},
{
"name": "ambient",
"count": "50",
"url": "http://www.last.fm/tag/ambient"
},
{
"name": "psychedelic",
"count": "50",
"url": "http://www.last.fm/tag/psychedelic"
}
],
"@attr": {
"artist": "Cristobal Tapia de Veer"
}
}
}

View File

@ -0,0 +1,12 @@
{
"toptags": {
"tag": {
"name": "electronic",
"count": "100",
"url": "http://www.last.fm/tag/electronic"
},
"@attr": {
"artist": "Cristobal Tapia de Veer"
}
}
}

View File

@ -0,0 +1,163 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace IF.Lastfm.Core.Tests.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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()]
public class ArtistApiResponses {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal ArtistApiResponses() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public 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.ArtistApiResponses", typeof(ArtistApiResponses).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetInfoMissing {
get {
object obj = ResourceManager.GetObject("ArtistGetInfoMissing", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetInfoSuccess {
get {
object obj = ResourceManager.GetObject("ArtistGetInfoSuccess", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTagsEmpty {
get {
object obj = ResourceManager.GetObject("ArtistGetTagsEmpty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTagsError {
get {
object obj = ResourceManager.GetObject("ArtistGetTagsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTagsMultiple {
get {
object obj = ResourceManager.GetObject("ArtistGetTagsMultiple", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTagsSingle {
get {
object obj = ResourceManager.GetObject("ArtistGetTagsSingle", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTopTagsEmpty {
get {
object obj = ResourceManager.GetObject("ArtistGetTopTagsEmpty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTopTagsError {
get {
object obj = ResourceManager.GetObject("ArtistGetTopTagsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTopTagsMultiple {
get {
object obj = ResourceManager.GetObject("ArtistGetTopTagsMultiple", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] ArtistGetTopTagsSingle {
get {
object obj = ResourceManager.GetObject("ArtistGetTopTagsSingle", resourceCulture);
return ((byte[])(obj));
}
}
}
}

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="ArtistGetInfoMissing" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetInfoMissing.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetInfoSuccess" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetInfoSuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTagsEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTagsEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTagsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTagsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTagsMultiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTagsMultiple.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTagsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTagsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTopTagsEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTopTagsEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTopTagsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTopTagsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTopTagsMultiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTopTagsMultiple.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="ArtistGetTopTagsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>ArtistApi\ArtistGetTopTagsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "No tag with that name",
"links": []
}

View File

@ -0,0 +1,42 @@
{
"topalbums": {
"album": {
"name": "Number Ones",
"mbid": "12cc16cb-5649-4e1a-bd10-a8a496280990",
"url": "http://www.last.fm/music/Bee+Gees/Number+Ones",
"artist": {
"name": "Bee Gees",
"mbid": "bf0f7e29-dfe1-416c-b5c6-f9ebc19ea810",
"url": "http://www.last.fm/music/Bee+Gees"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/100167607.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/100167607.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/100167607.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/100167607.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "1"
}
},
"@attr": {
"tag": "Disco",
"page": "0",
"perPage": "1",
"totalPages": "1000",
"total": "1000"
}
}
}

View File

@ -0,0 +1,633 @@
{
"topalbums": {
"album": [
{
"name": "Number Ones",
"mbid": "12cc16cb-5649-4e1a-bd10-a8a496280990",
"url": "http://www.last.fm/music/Bee+Gees/Number+Ones",
"artist": {
"name": "Bee Gees",
"mbid": "bf0f7e29-dfe1-416c-b5c6-f9ebc19ea810",
"url": "http://www.last.fm/music/Bee+Gees"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/100167607.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/100167607.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/100167607.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/100167607.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "1"
}
},
{
"name": "Gold: Greatest Hits",
"mbid": "ffb8aad2-b7fd-434c-951b-fd1dc1c0095f",
"url": "http://www.last.fm/music/ABBA/Gold:+Greatest+Hits",
"artist": {
"name": "ABBA",
"mbid": "d87e52c5-bb8d-4da8-b941-9f4928627dc8",
"url": "http://www.last.fm/music/ABBA"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/100145365.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/100145365.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/100145365.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/100145365.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "2"
}
},
{
"name": "Greatest Hits",
"mbid": "b05fbfb7-833e-4f40-acbf-103539bec01b",
"url": "http://www.last.fm/music/Earth,+Wind+&+Fire/Greatest+Hits",
"artist": {
"name": "Earth, Wind & Fire",
"mbid": "535afeda-2538-435d-9dd1-5e10be586774",
"url": "http://www.last.fm/music/Earth,+Wind+&+Fire"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/9699191.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/9699191.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/9699191.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/9699191.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "3"
}
},
{
"name": "Remix 2005",
"mbid": "08b95338-faa4-489e-87b3-7ea3a69aa7b6",
"url": "http://www.last.fm/music/Boney+M./Remix+2005",
"artist": {
"name": "Boney M.",
"mbid": "1a79fc33-3cfb-4736-9042-b6b9e8ce4fe9",
"url": "http://www.last.fm/music/Boney+M."
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/9102817.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/9102817.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/9102817.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/9102817.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "4"
}
},
{
"name": "Greatest Hits",
"mbid": "11f1262d-9be0-46d4-8e74-a273f803a327",
"url": "http://www.last.fm/music/KC+and+The+Sunshine+Band/Greatest+Hits",
"artist": {
"name": "KC and The Sunshine Band",
"mbid": "25ad6e44-40a9-4b67-82cd-d20bb3b27afa",
"url": "http://www.last.fm/music/KC+and+The+Sunshine+Band"
},
"image": [
{
"#text": "http://images.amazon.com/images/P/B00002NDAL.01.MZZZZZZZ.jpg",
"size": "small"
},
{
"#text": "http://images.amazon.com/images/P/B00002NDAL.01.MZZZZZZZ.jpg",
"size": "medium"
},
{
"#text": "http://images.amazon.com/images/P/B00002NDAL.01.MZZZZZZZ.jpg",
"size": "large"
},
{
"#text": "http://images.amazon.com/images/P/B00002NDAL.01.MZZZZZZZ.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "5"
}
},
{
"name": "On the Radio (Greatest Hits)",
"mbid": "",
"url": "http://www.last.fm/music/Donna+Summer/On+the+Radio+(Greatest+Hits)",
"artist": {
"name": "Donna Summer",
"mbid": "00bf0071-e5a2-44d7-bcd1-ad9e8d46e960",
"url": "http://www.last.fm/music/Donna+Summer"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/99649711.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/99649711.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/99649711.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/99649711.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "6"
}
},
{
"name": "Bad Girls",
"mbid": "70d781c3-94a8-43a1-a823-2a0ce110e8e1",
"url": "http://www.last.fm/music/Donna+Summer/Bad+Girls",
"artist": {
"name": "Donna Summer",
"mbid": "00bf0071-e5a2-44d7-bcd1-ad9e8d46e960",
"url": "http://www.last.fm/music/Donna+Summer"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/56577403.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/56577403.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/56577403.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/56577403.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "7"
}
},
{
"name": "Off the Wall",
"mbid": "ead57fd6-b1f5-4087-aa4c-5f0a0cce1964",
"url": "http://www.last.fm/music/Michael+Jackson/Off+the+Wall",
"artist": {
"name": "Michael Jackson",
"mbid": "210769a3-4aca-4199-a2e1-676ef376e078",
"url": "http://www.last.fm/music/Michael+Jackson"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/57606053.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/57606053.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/57606053.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/57606053.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "8"
}
},
{
"name": "Live At The Budokan",
"mbid": "7464156c-347b-4323-85f3-04d0ef9914cb",
"url": "http://www.last.fm/music/Chic/Live+At+The+Budokan",
"artist": {
"name": "Chic",
"mbid": "a4ed036b-5f18-439c-b1e1-96d205bab255",
"url": "http://www.last.fm/music/Chic"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/103093173.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/103093173.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/103093173.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/103093173.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "9"
}
},
{
"name": "Grandmix: The Millennium Edition (Mixed by Ben Liebrand) (disc 2)",
"mbid": "",
"url": "http://www.last.fm/music/Ben+Liebrand/Grandmix:+The+Millennium+Edition+(Mixed+by+Ben+Liebrand)+(disc+2)",
"artist": {
"name": "Ben Liebrand",
"mbid": "a9abe28b-5774-41ea-8393-8b26903fee72",
"url": "http://www.last.fm/music/Ben+Liebrand"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/4576293.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/4576293.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/4576293.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/4576293.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "10"
}
},
{
"name": "Grandmix: The Summer Edition (Mixed by Ben Liebrand) (disc 1)",
"mbid": "",
"url": "http://www.last.fm/music/Ben+Liebrand/Grandmix:+The+Summer+Edition+(Mixed+by+Ben+Liebrand)+(disc+1)",
"artist": {
"name": "Ben Liebrand",
"mbid": "a9abe28b-5774-41ea-8393-8b26903fee72",
"url": "http://www.last.fm/music/Ben+Liebrand"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/4162885.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/4162885.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/4162885.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/4162885.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "11"
}
},
{
"name": "I Will Survive",
"mbid": "48780f4d-53a9-48ae-90b8-68d684b21581",
"url": "http://www.last.fm/music/Gloria+Gaynor/I+Will+Survive",
"artist": {
"name": "Gloria Gaynor",
"mbid": "0efc0853-78ed-40f7-b5be-b1b4cc866dba",
"url": "http://www.last.fm/music/Gloria+Gaynor"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/101897739.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/101897739.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/101897739.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/101897739.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "12"
}
},
{
"name": "The Final Album",
"mbid": "67ea5fce-5ad6-4311-bdfa-4b605bc0d5c2",
"url": "http://www.last.fm/music/Modern+Talking/The+Final+Album",
"artist": {
"name": "Modern Talking",
"mbid": "98913495-8867-43b3-aa8d-db88ee4d4cdc",
"url": "http://www.last.fm/music/Modern+Talking"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/47771735.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/47771735.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/47771735.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/47771735.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "13"
}
},
{
"name": "Take the Heat Off Me",
"mbid": "002a65d3-ab21-4fdd-adbf-ca6d5f39033a",
"url": "http://www.last.fm/music/Boney+M./Take+the+Heat+Off+Me",
"artist": {
"name": "Boney M.",
"mbid": "1a79fc33-3cfb-4736-9042-b6b9e8ce4fe9",
"url": "http://www.last.fm/music/Boney+M."
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/85837663.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/85837663.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/85837663.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/85837663.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "14"
}
},
{
"name": "We Are Family",
"mbid": "2c570dcb-8812-4898-850d-929f8a5f706a",
"url": "http://www.last.fm/music/Sister+Sledge/We+Are+Family",
"artist": {
"name": "Sister Sledge",
"mbid": "1ed00158-c6a3-45cd-819c-2f91997fc480",
"url": "http://www.last.fm/music/Sister+Sledge"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/68619144.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/68619144.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/68619144.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/68619144.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "15"
}
},
{
"name": "Platinum & Gold Collection Series",
"mbid": "",
"url": "http://www.last.fm/music/The+Pointer+Sisters/Platinum+&+Gold+Collection+Series",
"artist": {
"name": "The Pointer Sisters",
"mbid": "5b71c3d3-1fbf-4516-baae-471f6aeb913c",
"url": "http://www.last.fm/music/The+Pointer+Sisters"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/8003551.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/8003551.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/8003551.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/8003551.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "16"
}
},
{
"name": "Endless Summer",
"mbid": "58f354bc-0aa9-4434-8d47-8698f8731225",
"url": "http://www.last.fm/music/Donna+Summer/Endless+Summer",
"artist": {
"name": "Donna Summer",
"mbid": "00bf0071-e5a2-44d7-bcd1-ad9e8d46e960",
"url": "http://www.last.fm/music/Donna+Summer"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/99650463.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/99650463.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/99650463.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/99650463.png",
"size": "extralarge"
}
],
"@attr": {
"rank": "17"
}
},
{
"name": "GOLD 20 Super Hits",
"mbid": "",
"url": "http://www.last.fm/music/Boney+M./GOLD+20+Super+Hits",
"artist": {
"name": "Boney M.",
"mbid": "1a79fc33-3cfb-4736-9042-b6b9e8ce4fe9",
"url": "http://www.last.fm/music/Boney+M."
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/81385545.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/81385545.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/81385545.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/81385545.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "18"
}
},
{
"name": "The Best of Village People",
"mbid": "e8e0f45e-5624-4068-8b50-fb4e13f95c07",
"url": "http://www.last.fm/music/Village+People/The+Best+of+Village+People",
"artist": {
"name": "Village People",
"mbid": "f19d3d49-be22-4ca6-9903-64d86984fbf2",
"url": "http://www.last.fm/music/Village+People"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/49902793.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/49902793.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/49902793.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/49902793.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "19"
}
},
{
"name": "20 Hottest Hits",
"mbid": "a4a32dc8-e049-4dd6-94ff-5b948e60db22",
"url": "http://www.last.fm/music/Hot+Chocolate/20+Hottest+Hits",
"artist": {
"name": "Hot Chocolate",
"mbid": "6bf5d00c-78c6-4adb-b2e6-1fbd93dcb8b1",
"url": "http://www.last.fm/music/Hot+Chocolate"
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/6301769.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/6301769.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/6301769.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/6301769.jpg",
"size": "extralarge"
}
],
"@attr": {
"rank": "20"
}
}
],
"@attr": {
"tag": "Disco",
"page": "0",
"perPage": "20",
"totalPages": "50",
"total": "1000"
}
}
}

View File

@ -0,0 +1,12 @@
{
"topartists": {
"artist": [],
"@attr": {
"tag": "",
"page": "1",
"perPage": "1",
"totalPages": "0",
"total": "0"
}
}
}

View File

@ -0,0 +1,44 @@
{
"topartists": {
"artist": [
{
"name": "Bee Gees",
"mbid": "bf0f7e29-dfe1-416c-b5c6-f9ebc19ea810",
"url": "http://www.last.fm/music/Bee+Gees",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/f578a22860c84a6bb0d253489b901487.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/f578a22860c84a6bb0d253489b901487.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/f578a22860c84a6bb0d253489b901487.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/f578a22860c84a6bb0d253489b901487.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/f578a22860c84a6bb0d253489b901487.png",
"size": "mega"
}
],
"@attr": {
"rank": "1"
}
}
],
"@attr": {
"tag": "disco",
"page": "1",
"perPage": "1",
"totalPages": "5474",
"total": "5474"
}
}
}

View File

@ -0,0 +1,633 @@
{
"topartists": {
"artist": [
{
"name": "Bee Gees",
"mbid": "bf0f7e29-dfe1-416c-b5c6-f9ebc19ea810",
"url": "http://www.last.fm/music/Bee+Gees",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/f578a22860c84a6bb0d253489b901487.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/f578a22860c84a6bb0d253489b901487.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/f578a22860c84a6bb0d253489b901487.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/f578a22860c84a6bb0d253489b901487.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/f578a22860c84a6bb0d253489b901487.png",
"size": "mega"
}
],
"@attr": {
"rank": "1"
}
},
{
"name": "Boney M.",
"mbid": "5403bf6e-bc1d-4e62-b31f-926a2bf66a14",
"url": "http://www.last.fm/music/Boney+M.",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/de3d471c7aef48678a55d574ed9951cf.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/de3d471c7aef48678a55d574ed9951cf.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/de3d471c7aef48678a55d574ed9951cf.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/de3d471c7aef48678a55d574ed9951cf.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/de3d471c7aef48678a55d574ed9951cf.png",
"size": "mega"
}
],
"@attr": {
"rank": "2"
}
},
{
"name": "Donna Summer",
"mbid": "b60527cc-54f3-4bbe-a01b-dcf34c95ae14",
"url": "http://www.last.fm/music/Donna+Summer",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/7509c48ae4b7431aad25b440afdab948.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/7509c48ae4b7431aad25b440afdab948.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/7509c48ae4b7431aad25b440afdab948.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/7509c48ae4b7431aad25b440afdab948.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/7509c48ae4b7431aad25b440afdab948.png",
"size": "mega"
}
],
"@attr": {
"rank": "3"
}
},
{
"name": "Grace Jones",
"mbid": "b1c124b3-cf60-41a6-8699-92728c8a3fe0",
"url": "http://www.last.fm/music/Grace+Jones",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/e6ed01b476bd456a9f77c2a427978eb7.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/e6ed01b476bd456a9f77c2a427978eb7.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/e6ed01b476bd456a9f77c2a427978eb7.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/e6ed01b476bd456a9f77c2a427978eb7.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/e6ed01b476bd456a9f77c2a427978eb7.png",
"size": "mega"
}
],
"@attr": {
"rank": "4"
}
},
{
"name": "KC and The Sunshine Band",
"mbid": "76a5a114-ed6a-4eb6-8a81-ad5768d4b41c",
"url": "http://www.last.fm/music/KC+and+The+Sunshine+Band",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/b594797fb7a84332c3b5b61bc9b337dd.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/b594797fb7a84332c3b5b61bc9b337dd.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/b594797fb7a84332c3b5b61bc9b337dd.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/b594797fb7a84332c3b5b61bc9b337dd.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/b594797fb7a84332c3b5b61bc9b337dd.png",
"size": "mega"
}
],
"@attr": {
"rank": "5"
}
},
{
"name": "Giorgio Moroder",
"mbid": "38dd6337-19ae-4793-ab4b-313eff523457",
"url": "http://www.last.fm/music/Giorgio+Moroder",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/c8b9259e354ed2574317cfc01cf5789c.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/c8b9259e354ed2574317cfc01cf5789c.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/c8b9259e354ed2574317cfc01cf5789c.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/c8b9259e354ed2574317cfc01cf5789c.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/c8b9259e354ed2574317cfc01cf5789c.png",
"size": "mega"
}
],
"@attr": {
"rank": "6"
}
},
{
"name": "Chic",
"mbid": "a4ed036b-5f18-439c-b1e1-96d205bab255",
"url": "http://www.last.fm/music/Chic",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/f8500e970464411893b153fbe43d369a.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/f8500e970464411893b153fbe43d369a.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/f8500e970464411893b153fbe43d369a.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/f8500e970464411893b153fbe43d369a.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/f8500e970464411893b153fbe43d369a.png",
"size": "mega"
}
],
"@attr": {
"rank": "7"
}
},
{
"name": "The Pointer Sisters",
"mbid": "81bac815-97c5-4723-8f0b-4d8edfad1010",
"url": "http://www.last.fm/music/The+Pointer+Sisters",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/2ba2c14bae894091922851833ab69d16.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/2ba2c14bae894091922851833ab69d16.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/2ba2c14bae894091922851833ab69d16.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/2ba2c14bae894091922851833ab69d16.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/2ba2c14bae894091922851833ab69d16.png",
"size": "mega"
}
],
"@attr": {
"rank": "8"
}
},
{
"name": "Gloria Gaynor",
"mbid": "d5c51c36-ac67-4727-91ed-ee9f0df81a2d",
"url": "http://www.last.fm/music/Gloria+Gaynor",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/31da00e6d84848fcc897eeae8dcbb7b5.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/31da00e6d84848fcc897eeae8dcbb7b5.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/31da00e6d84848fcc897eeae8dcbb7b5.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/31da00e6d84848fcc897eeae8dcbb7b5.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/31da00e6d84848fcc897eeae8dcbb7b5.png",
"size": "mega"
}
],
"@attr": {
"rank": "9"
}
},
{
"name": "Hot Chocolate",
"mbid": "a749130e-c2d8-4a7c-b740-908ea4574961",
"url": "http://www.last.fm/music/Hot+Chocolate",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/d356df071f5e45c59c59591bee990baf.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/d356df071f5e45c59c59591bee990baf.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/d356df071f5e45c59c59591bee990baf.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/d356df071f5e45c59c59591bee990baf.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/d356df071f5e45c59c59591bee990baf.png",
"size": "mega"
}
],
"@attr": {
"rank": "10"
}
},
{
"name": "Village People",
"mbid": "f19d3d49-be22-4ca6-9903-64d86984fbf2",
"url": "http://www.last.fm/music/Village+People",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/e299e0d3630f468f9fed9fa0b73595a1.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/e299e0d3630f468f9fed9fa0b73595a1.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/e299e0d3630f468f9fed9fa0b73595a1.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/e299e0d3630f468f9fed9fa0b73595a1.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/e299e0d3630f468f9fed9fa0b73595a1.png",
"size": "mega"
}
],
"@attr": {
"rank": "11"
}
},
{
"name": "Sister Sledge",
"mbid": "1ed00158-c6a3-45cd-819c-2f91997fc480",
"url": "http://www.last.fm/music/Sister+Sledge",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/ec67c493a44a4bd38b1340a8ca1422d3.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/ec67c493a44a4bd38b1340a8ca1422d3.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/ec67c493a44a4bd38b1340a8ca1422d3.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/ec67c493a44a4bd38b1340a8ca1422d3.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/ec67c493a44a4bd38b1340a8ca1422d3.png",
"size": "mega"
}
],
"@attr": {
"rank": "12"
}
},
{
"name": "Lipps, Inc.",
"mbid": "9f47e427-c31c-49fe-90d6-92ab6029d405",
"url": "http://www.last.fm/music/Lipps,+Inc.",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/ceb986e3184989759ec0b8e2331fa8c3.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/ceb986e3184989759ec0b8e2331fa8c3.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/ceb986e3184989759ec0b8e2331fa8c3.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/ceb986e3184989759ec0b8e2331fa8c3.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/ceb986e3184989759ec0b8e2331fa8c3.png",
"size": "mega"
}
],
"@attr": {
"rank": "13"
}
},
{
"name": "Santa Esmeralda",
"mbid": "b233a9a9-2538-4c5b-986a-5843650e2611",
"url": "http://www.last.fm/music/Santa+Esmeralda",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/7da928d4c68144958765c8f288430fe9.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/7da928d4c68144958765c8f288430fe9.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/7da928d4c68144958765c8f288430fe9.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/7da928d4c68144958765c8f288430fe9.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/7da928d4c68144958765c8f288430fe9.png",
"size": "mega"
}
],
"@attr": {
"rank": "14"
}
},
{
"name": "Shalamar",
"mbid": "8e57b7d5-4548-4e2b-b32d-af4b4a51cb80",
"url": "http://www.last.fm/music/Shalamar",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/d3e255993db84229a442c6a64eb357bf.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/d3e255993db84229a442c6a64eb357bf.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/d3e255993db84229a442c6a64eb357bf.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/d3e255993db84229a442c6a64eb357bf.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/d3e255993db84229a442c6a64eb357bf.png",
"size": "mega"
}
],
"@attr": {
"rank": "15"
}
},
{
"name": "Baccara",
"mbid": "d17a5888-7775-4541-85d6-f6344f9e93b7",
"url": "http://www.last.fm/music/Baccara",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/1fb5f7e9213447f681faa2c5bf8efa1a.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/1fb5f7e9213447f681faa2c5bf8efa1a.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/1fb5f7e9213447f681faa2c5bf8efa1a.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/1fb5f7e9213447f681faa2c5bf8efa1a.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/1fb5f7e9213447f681faa2c5bf8efa1a.png",
"size": "mega"
}
],
"@attr": {
"rank": "16"
}
},
{
"name": "The Trammps",
"mbid": "8799413d-7df8-4eb9-8542-af8cea6b0feb",
"url": "http://www.last.fm/music/The+Trammps",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/7f5e23562f1542d8afdb88ea65396f8e.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/7f5e23562f1542d8afdb88ea65396f8e.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/7f5e23562f1542d8afdb88ea65396f8e.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/7f5e23562f1542d8afdb88ea65396f8e.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/7f5e23562f1542d8afdb88ea65396f8e.png",
"size": "mega"
}
],
"@attr": {
"rank": "17"
}
},
{
"name": "Carl Douglas",
"mbid": "2100ca6c-5a1d-463e-b50b-7e649debc454",
"url": "http://www.last.fm/music/Carl+Douglas",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/d5aaab08b6f7406a9256a799907e60a5.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/d5aaab08b6f7406a9256a799907e60a5.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/d5aaab08b6f7406a9256a799907e60a5.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/d5aaab08b6f7406a9256a799907e60a5.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/d5aaab08b6f7406a9256a799907e60a5.png",
"size": "mega"
}
],
"@attr": {
"rank": "18"
}
},
{
"name": "Tavares",
"mbid": "f1bb3057-05ab-4cce-b5cc-921bb1b6e1b7",
"url": "http://www.last.fm/music/Tavares",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/b395bd2946f849a695b09d7873cd8c91.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/b395bd2946f849a695b09d7873cd8c91.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/b395bd2946f849a695b09d7873cd8c91.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/b395bd2946f849a695b09d7873cd8c91.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/b395bd2946f849a695b09d7873cd8c91.png",
"size": "mega"
}
],
"@attr": {
"rank": "19"
}
},
{
"name": "Dschinghis Khan",
"mbid": "5898a370-5c9e-4924-97b1-c72b7e0452ca",
"url": "http://www.last.fm/music/Dschinghis+Khan",
"streamable": "0",
"image": [
{
"#text": "http://img2-ak.lst.fm/i/u/34s/fbca141c5b0747ad99b2926c642478d0.png",
"size": "small"
},
{
"#text": "http://img2-ak.lst.fm/i/u/64s/fbca141c5b0747ad99b2926c642478d0.png",
"size": "medium"
},
{
"#text": "http://img2-ak.lst.fm/i/u/174s/fbca141c5b0747ad99b2926c642478d0.png",
"size": "large"
},
{
"#text": "http://img2-ak.lst.fm/i/u/300x300/fbca141c5b0747ad99b2926c642478d0.png",
"size": "extralarge"
},
{
"#text": "http://img2-ak.lst.fm/i/u/fbca141c5b0747ad99b2926c642478d0.png",
"size": "mega"
}
],
"@attr": {
"rank": "20"
}
}
],
"@attr": {
"tag": "disco",
"page": "1",
"perPage": "20",
"totalPages": "274",
"total": "5474"
}
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "page param out of bounds (1-1000000)",
"links": []
}

View File

@ -0,0 +1,613 @@
{
"artists": {
"artist": [
{
"name": "Solar Fields",
"playcount": "5346",
"tagcount": "0",
"mbid": "a8b39181-6939-451e-9641-2db231b73706",
"url": "https://www.last.fm/music/Solar+Fields",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/ad665aeba8a94e32a4df4b590f024f30.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/ad665aeba8a94e32a4df4b590f024f30.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/ad665aeba8a94e32a4df4b590f024f30.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/ad665aeba8a94e32a4df4b590f024f30.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/ad665aeba8a94e32a4df4b590f024f30.png",
"size": "mega"
}
]
},
{
"name": "Crystal Castles",
"playcount": "4219",
"tagcount": "0",
"mbid": "b1570544-93ab-4b2b-8398-131735394202",
"url": "https://www.last.fm/music/Crystal+Castles",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "mega"
}
]
},
{
"name": "The Knife",
"playcount": "3709",
"tagcount": "0",
"mbid": "cf16d0a3-9d9c-44d4-b610-f0baccc27912",
"url": "https://www.last.fm/music/The+Knife",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/7bb894b4901b4493a1d6bb987cc22a05.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/7bb894b4901b4493a1d6bb987cc22a05.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/7bb894b4901b4493a1d6bb987cc22a05.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/7bb894b4901b4493a1d6bb987cc22a05.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/7bb894b4901b4493a1d6bb987cc22a05.png",
"size": "mega"
}
]
},
{
"name": "Cut Copy",
"playcount": "3063",
"tagcount": "0",
"mbid": "caaba574-dfbc-4681-8e56-19b5150897d2",
"url": "https://www.last.fm/music/Cut+Copy",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/1a1e3b63a54c491cb01605f09b1e179b.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/1a1e3b63a54c491cb01605f09b1e179b.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/1a1e3b63a54c491cb01605f09b1e179b.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/1a1e3b63a54c491cb01605f09b1e179b.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/1a1e3b63a54c491cb01605f09b1e179b.png",
"size": "mega"
}
]
},
{
"name": "Hot Chip",
"playcount": "2985",
"tagcount": "0",
"mbid": "d8915e13-d67a-4aa0-9c0b-1f126af951af",
"url": "https://www.last.fm/music/Hot+Chip",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/b45da8e2c7764cb2cc13a83862494fa0.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/b45da8e2c7764cb2cc13a83862494fa0.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/b45da8e2c7764cb2cc13a83862494fa0.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/b45da8e2c7764cb2cc13a83862494fa0.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/b45da8e2c7764cb2cc13a83862494fa0.png",
"size": "mega"
}
]
},
{
"name": "Feist",
"playcount": "2941",
"tagcount": "0",
"mbid": "f463a056-ae06-445b-bab2-449b11482bf2",
"url": "https://www.last.fm/music/Feist",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/f69cc769bb864da586175ee928751e81.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/f69cc769bb864da586175ee928751e81.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/f69cc769bb864da586175ee928751e81.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/f69cc769bb864da586175ee928751e81.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/f69cc769bb864da586175ee928751e81.png",
"size": "mega"
}
]
},
{
"name": "Carbon Based Lifeforms",
"playcount": "2558",
"tagcount": "0",
"mbid": "8229a8f1-b315-4fae-af57-b3eb71efdaf4",
"url": "https://www.last.fm/music/Carbon+Based+Lifeforms",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/ebb99f2912c84bf38e02b33a845be87e.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/ebb99f2912c84bf38e02b33a845be87e.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/ebb99f2912c84bf38e02b33a845be87e.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/ebb99f2912c84bf38e02b33a845be87e.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/ebb99f2912c84bf38e02b33a845be87e.png",
"size": "mega"
}
]
},
{
"name": "Björk",
"playcount": "2424",
"tagcount": "0",
"mbid": "87c5dedd-371d-4a53-9f7f-80522fb7f3cb",
"url": "https://www.last.fm/music/Bj%C3%B6rk",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/4997929a3d1b04b09b3c46674a7cc19b.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/4997929a3d1b04b09b3c46674a7cc19b.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/4997929a3d1b04b09b3c46674a7cc19b.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/4997929a3d1b04b09b3c46674a7cc19b.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/4997929a3d1b04b09b3c46674a7cc19b.png",
"size": "mega"
}
]
},
{
"name": "M83",
"playcount": "2408",
"tagcount": "0",
"mbid": "6d7b7cd4-254b-4c25-83f6-dd20f98ceacd",
"url": "https://www.last.fm/music/M83",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/f1ac608faf0841d3c1fd37c74c7c8750.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/f1ac608faf0841d3c1fd37c74c7c8750.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/f1ac608faf0841d3c1fd37c74c7c8750.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/f1ac608faf0841d3c1fd37c74c7c8750.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/f1ac608faf0841d3c1fd37c74c7c8750.png",
"size": "mega"
}
]
},
{
"name": "Fuck Buttons",
"playcount": "2305",
"tagcount": "0",
"mbid": "f4640b20-b76b-40d3-9ffc-a38b6718b273",
"url": "https://www.last.fm/music/Fuck+Buttons",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/9b2362e651404de29c258bbaf61b6c08.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/9b2362e651404de29c258bbaf61b6c08.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/9b2362e651404de29c258bbaf61b6c08.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/9b2362e651404de29c258bbaf61b6c08.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/9b2362e651404de29c258bbaf61b6c08.png",
"size": "mega"
}
]
},
{
"name": "Broken Social Scene",
"playcount": "1931",
"tagcount": "0",
"mbid": "2eada8f8-056a-4093-bbc2-004909ce743b",
"url": "https://www.last.fm/music/Broken+Social+Scene",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/fbb8f6f3174f4df5a170afb170129b8a.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/fbb8f6f3174f4df5a170afb170129b8a.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/fbb8f6f3174f4df5a170afb170129b8a.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/fbb8f6f3174f4df5a170afb170129b8a.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/fbb8f6f3174f4df5a170afb170129b8a.png",
"size": "mega"
}
]
},
{
"name": "Röyksopp",
"playcount": "1803",
"tagcount": "0",
"mbid": "1c70a3fc-fa3c-4be1-8b55-c3192db8a884",
"url": "https://www.last.fm/music/R%C3%B6yksopp",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/e58b1bd565b94e8d8dfd2d34e54571fe.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/e58b1bd565b94e8d8dfd2d34e54571fe.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/e58b1bd565b94e8d8dfd2d34e54571fe.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/e58b1bd565b94e8d8dfd2d34e54571fe.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/e58b1bd565b94e8d8dfd2d34e54571fe.png",
"size": "mega"
}
]
},
{
"name": "Yeah Yeah Yeahs",
"playcount": "1662",
"tagcount": "0",
"mbid": "584c04d2-4acc-491b-8a0a-e63133f4bfc4",
"url": "https://www.last.fm/music/Yeah+Yeah+Yeahs",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/884f2faa565b4cf5a3f7bb758bfbc99d.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/884f2faa565b4cf5a3f7bb758bfbc99d.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/884f2faa565b4cf5a3f7bb758bfbc99d.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/884f2faa565b4cf5a3f7bb758bfbc99d.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/884f2faa565b4cf5a3f7bb758bfbc99d.png",
"size": "mega"
}
]
},
{
"name": "65daysofstatic",
"playcount": "1551",
"tagcount": "0",
"mbid": "0cd12ab3-9628-45ef-a97b-ff18624f14a0",
"url": "https://www.last.fm/music/65daysofstatic",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/5415bcccc22c4d399d9936ef4df1f32b.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/5415bcccc22c4d399d9936ef4df1f32b.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/5415bcccc22c4d399d9936ef4df1f32b.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/5415bcccc22c4d399d9936ef4df1f32b.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/5415bcccc22c4d399d9936ef4df1f32b.png",
"size": "mega"
}
]
},
{
"name": "Boards of Canada",
"playcount": "1540",
"tagcount": "0",
"mbid": "69158f97-4c07-4c4e-baf8-4e4ab1ed666e",
"url": "https://www.last.fm/music/Boards+of+Canada",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/6c40c81945324658b1cc2d1ee9b138e6.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/6c40c81945324658b1cc2d1ee9b138e6.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/6c40c81945324658b1cc2d1ee9b138e6.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/6c40c81945324658b1cc2d1ee9b138e6.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/6c40c81945324658b1cc2d1ee9b138e6.png",
"size": "mega"
}
]
},
{
"name": "Bonobo",
"playcount": "1534",
"tagcount": "0",
"mbid": "9a709693-b4f8-4da9-8cc1-038c911a61be",
"url": "https://www.last.fm/music/Bonobo",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/c6ef7926ef994113a0561ad23a5588a4.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/c6ef7926ef994113a0561ad23a5588a4.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/c6ef7926ef994113a0561ad23a5588a4.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/c6ef7926ef994113a0561ad23a5588a4.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/c6ef7926ef994113a0561ad23a5588a4.png",
"size": "mega"
}
]
},
{
"name": "Fever Ray",
"playcount": "1198",
"tagcount": "0",
"mbid": "f7df5df4-4dfa-459d-972b-1ba051c15ddc",
"url": "https://www.last.fm/music/Fever+Ray",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/4b63cc373d604d0ea0f43154041ece8c.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/4b63cc373d604d0ea0f43154041ece8c.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/4b63cc373d604d0ea0f43154041ece8c.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/4b63cc373d604d0ea0f43154041ece8c.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/4b63cc373d604d0ea0f43154041ece8c.png",
"size": "mega"
}
]
},
{
"name": "Grimes",
"playcount": "1159",
"tagcount": "0",
"mbid": "7e5a2a59-6d9f-4a17-b7c2-e1eedb7bd222",
"url": "https://www.last.fm/music/Grimes",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/a0d0fbda61844af5ca816bd42ec942b5.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/a0d0fbda61844af5ca816bd42ec942b5.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/a0d0fbda61844af5ca816bd42ec942b5.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/a0d0fbda61844af5ca816bd42ec942b5.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/a0d0fbda61844af5ca816bd42ec942b5.png",
"size": "mega"
}
]
},
{
"name": "God Is An Astronaut",
"playcount": "1134",
"tagcount": "0",
"mbid": "e9dfc148-d5f6-425e-b80b-f99ed2bd7c09",
"url": "https://www.last.fm/music/God+Is+An+Astronaut",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/137d3ac511544cad9490a208fb5b279d.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/137d3ac511544cad9490a208fb5b279d.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/137d3ac511544cad9490a208fb5b279d.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/137d3ac511544cad9490a208fb5b279d.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/137d3ac511544cad9490a208fb5b279d.png",
"size": "mega"
}
]
},
{
"name": "Cristobal Tapia de Veer",
"playcount": "1060",
"tagcount": "0",
"mbid": "17c75aa5-5e1a-4ad3-b9b3-6c4adb8f7817",
"url": "https://www.last.fm/music/Cristobal+Tapia+de+Veer",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/6ce77abdc5c145178e1426fb7e3eeb98.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/6ce77abdc5c145178e1426fb7e3eeb98.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/6ce77abdc5c145178e1426fb7e3eeb98.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/6ce77abdc5c145178e1426fb7e3eeb98.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/6ce77abdc5c145178e1426fb7e3eeb98.png",
"size": "mega"
}
]
}
],
"@attr": {
"user": "tehrikkit",
"page": "1",
"perPage": "20",
"totalPages": "129",
"total": "2567"
}
}
}

View File

@ -0,0 +1,43 @@
{
"artists": {
"artist": [
{
"name": "Crystal Castles",
"playcount": "4219",
"tagcount": "0",
"mbid": "b1570544-93ab-4b2b-8398-131735394202",
"url": "https://www.last.fm/music/Crystal+Castles",
"streamable": "0",
"image": [
{
"#text": "https://lastfm-img2.akamaized.net/i/u/34s/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "small"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/64s/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "medium"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/174s/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "large"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/300x300/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "extralarge"
},
{
"#text": "https://lastfm-img2.akamaized.net/i/u/f36a92bfbd7f8b579c91942c6a428d69.png",
"size": "mega"
}
]
}
],
"@attr": {
"user": "tehrikkit",
"page": "2",
"perPage": "1",
"totalPages": "2567",
"total": "2567"
}
}
}

View File

@ -0,0 +1,793 @@
{
"tracks": {
"track": [
{
"name": "Sultans of Swing",
"duration": "347000",
"playcount": "81",
"tagcount": "0",
"mbid": "0317e524-7f70-4910-bc12-95dd468a29fc",
"url": "http://www.last.fm/music/Dire+Straits/_/Sultans+of+Swing",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dire Straits",
"mbid": "614e3804-7d34-41ba-857f-811bad7c2b7a",
"url": "http://www.last.fm/music/Dire+Straits"
},
"album": {
"name": "Dire Straits (Remastered)",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/56827829.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/56827829.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/56827829.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/56827829.jpg",
"size": "extralarge"
}
]
},
{
"name": "Superstition",
"duration": "248000",
"playcount": "56",
"tagcount": "0",
"mbid": "0161855d-0b98-4f2d-b2ab-446dbd8d6759",
"url": "http://www.last.fm/music/Stevie+Wonder/_/Superstition",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Stevie Wonder",
"mbid": "1ee18fb3-18a6-4c7f-8ba0-bc41cdd0462e",
"url": "http://www.last.fm/music/Stevie+Wonder"
},
"album": {
"name": "Number Ones",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/99695819.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/99695819.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/99695819.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/99695819.jpg",
"size": "extralarge"
}
]
},
{
"name": "Pull Me Under",
"duration": "494000",
"playcount": "56",
"tagcount": "0",
"mbid": "4b2c1184-8d48-4dfa-84c4-f26e9729a626",
"url": "http://www.last.fm/music/Dream+Theater/_/Pull+Me+Under",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dream Theater",
"mbid": "28503ab7-8bf2-4666-a7bd-2644bfc7cb1d",
"url": "http://www.last.fm/music/Dream+Theater"
},
"album": {
"name": "Images and Words",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/42406513.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/42406513.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/42406513.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/42406513.png",
"size": "extralarge"
}
]
},
{
"name": "The Pusher",
"duration": "349000",
"playcount": "55",
"tagcount": "1",
"mbid": "a1deb801-caea-4b66-9d35-537cb42c03b6",
"url": "http://www.last.fm/music/Steppenwolf/_/The+Pusher",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Steppenwolf",
"mbid": "12ff8858-bfcb-4812-a8dd-7e9debf0cbee",
"url": "http://www.last.fm/music/Steppenwolf"
},
"album": {
"name": "16 Greatest Hits",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/84527157.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/84527157.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/84527157.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/84527157.jpg",
"size": "extralarge"
}
]
},
{
"name": "Take the Time",
"duration": "501000",
"playcount": "54",
"tagcount": "0",
"mbid": "55f96185-3de8-40d2-98dd-0f54846e1951",
"url": "http://www.last.fm/music/Dream+Theater/_/Take+the+Time",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dream Theater",
"mbid": "28503ab7-8bf2-4666-a7bd-2644bfc7cb1d",
"url": "http://www.last.fm/music/Dream+Theater"
},
"album": {
"name": "Images and Words",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/42406513.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/42406513.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/42406513.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/42406513.png",
"size": "extralarge"
}
]
},
{
"name": "Another Day",
"duration": "263000",
"playcount": "54",
"tagcount": "0",
"mbid": "33f634b9-588c-49fd-83af-b1b1219b4db0",
"url": "http://www.last.fm/music/Dream+Theater/_/Another+Day",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dream Theater",
"mbid": "28503ab7-8bf2-4666-a7bd-2644bfc7cb1d",
"url": "http://www.last.fm/music/Dream+Theater"
},
"album": {
"name": "Images and Words",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/42406513.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/42406513.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/42406513.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/42406513.png",
"size": "extralarge"
}
]
},
{
"name": "Learning to Live",
"duration": "690000",
"playcount": "54",
"tagcount": "0",
"mbid": "7aa216d0-94dc-48d2-bb3c-7116843b8bf3",
"url": "http://www.last.fm/music/Dream+Theater/_/Learning+to+Live",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dream Theater",
"mbid": "28503ab7-8bf2-4666-a7bd-2644bfc7cb1d",
"url": "http://www.last.fm/music/Dream+Theater"
},
"album": {
"name": "Images and Words",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/42406513.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/42406513.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/42406513.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/42406513.png",
"size": "extralarge"
}
]
},
{
"name": "Three Minute Warning",
"duration": "1716000",
"playcount": "54",
"tagcount": "0",
"mbid": "b4ad3a39-5fd1-4021-b80d-e71eb8b2e20f",
"url": "http://www.last.fm/music/Liquid+Tension+Experiment/_/Three+Minute+Warning",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Liquid Tension Experiment",
"mbid": "bc641be9-ca36-4c61-9394-5230433f6646",
"url": "http://www.last.fm/music/Liquid+Tension+Experiment"
},
"album": {
"name": "Liquid Tension Experiment",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/88566859.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/88566859.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/88566859.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/88566859.jpg",
"size": "extralarge"
}
]
},
{
"name": "Cowboys",
"duration": "279000",
"playcount": "53",
"tagcount": "0",
"mbid": "eca7d591-1fd9-4cea-9cbe-0f31f474041d",
"url": "http://www.last.fm/music/Portishead/_/Cowboys",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Portishead",
"mbid": "17e0ef75-fae9-4fa3-b6f6-39a8c986d686",
"url": "http://www.last.fm/music/Portishead"
},
"album": {
"name": "Portishead",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/66825870.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/66825870.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/66825870.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/66825870.png",
"size": "extralarge"
}
]
},
{
"name": "Under a Glass Moon",
"duration": "423000",
"playcount": "47",
"tagcount": "0",
"mbid": "b0f7db49-8397-42c5-8e63-cb3b6f92b825",
"url": "http://www.last.fm/music/Dream+Theater/_/Under+a+Glass+Moon",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dream Theater",
"mbid": "28503ab7-8bf2-4666-a7bd-2644bfc7cb1d",
"url": "http://www.last.fm/music/Dream+Theater"
},
"album": {
"name": "Images and Words",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/42406513.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/42406513.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/42406513.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/42406513.png",
"size": "extralarge"
}
]
},
{
"name": "Money for Nothing",
"duration": "503000",
"playcount": "46",
"tagcount": "0",
"mbid": "06622908-5da7-4bb9-9b6b-53bc8dc039ee",
"url": "http://www.last.fm/music/Dire+Straits/_/Money+for+Nothing",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dire Straits",
"mbid": "614e3804-7d34-41ba-857f-811bad7c2b7a",
"url": "http://www.last.fm/music/Dire+Straits"
},
"album": {
"name": "Brothers In Arms - 20th Anniversary Edition",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/8801435.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/8801435.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/8801435.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/8801435.jpg",
"size": "extralarge"
}
]
},
{
"name": "Steamroller",
"duration": "177000",
"playcount": "44",
"tagcount": "0",
"mbid": "47cd0ce0-ff26-4bb0-adea-3b049f2321fd",
"url": "http://www.last.fm/music/James+Taylor/_/Steamroller",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "James Taylor",
"mbid": "0217fabf-0e84-4c36-b197-f1b6e1263506",
"url": "http://www.last.fm/music/James+Taylor"
},
"album": {
"name": "Greatest Hits",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/87576587.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/87576587.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/87576587.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/87576587.jpg",
"size": "extralarge"
}
]
},
{
"name": "Fire and Rain",
"duration": "272000",
"playcount": "43",
"tagcount": "0",
"mbid": "6d8b6dc1-0aff-4e72-a180-0839af79e8c1",
"url": "http://www.last.fm/music/James+Taylor/_/Fire+and+Rain",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "James Taylor",
"mbid": "0217fabf-0e84-4c36-b197-f1b6e1263506",
"url": "http://www.last.fm/music/James+Taylor"
},
"album": {
"name": "Sweet Baby James",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/69242572.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/69242572.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/69242572.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/69242572.png",
"size": "extralarge"
}
]
},
{
"name": "Gin And Juice",
"duration": "211000",
"playcount": "43",
"tagcount": "0",
"mbid": "1e9cc395-2fb9-45f2-8ac5-05cefa9668f1",
"url": "http://www.last.fm/music/Snoop+Dogg/_/Gin+And+Juice",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Snoop Dogg",
"mbid": "17d17695-f0e1-46fd-815f-bf577cc5f50d",
"url": "http://www.last.fm/music/Snoop+Dogg"
},
"album": {
"name": "Doggystyle",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/100162457.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/100162457.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/100162457.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/100162457.png",
"size": "extralarge"
}
]
},
{
"name": "Wait for Sleep",
"duration": "153000",
"playcount": "43",
"tagcount": "0",
"mbid": "8ec3f9d2-945f-43bb-9ef2-63b6cbbe2653",
"url": "http://www.last.fm/music/Dream+Theater/_/Wait+for+Sleep",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dream Theater",
"mbid": "28503ab7-8bf2-4666-a7bd-2644bfc7cb1d",
"url": "http://www.last.fm/music/Dream+Theater"
},
"album": {
"name": "Images and Words",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/42406513.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/42406513.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/42406513.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/42406513.png",
"size": "extralarge"
}
]
},
{
"name": "I Wish You Were Here",
"duration": "268000",
"playcount": "42",
"tagcount": "0",
"mbid": "890b1c78-6f6c-4917-a627-48e7f44c2568",
"url": "http://www.last.fm/music/Alpha+Blondy/_/I+Wish+You+Were+Here",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Alpha Blondy",
"mbid": "3906105b-189a-444e-b34a-e6dc5aa2c2e4",
"url": "http://www.last.fm/music/Alpha+Blondy"
},
"album": {
"name": "Jah Victory",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/93692707.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/93692707.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/93692707.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/93692707.jpg",
"size": "extralarge"
}
]
},
{
"name": "Walk of Life",
"duration": "249000",
"playcount": "40",
"tagcount": "0",
"mbid": "0ed233bf-41c0-4b0c-b330-32d7444eab2a",
"url": "http://www.last.fm/music/Dire+Straits/_/Walk+of+Life",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dire Straits",
"mbid": "614e3804-7d34-41ba-857f-811bad7c2b7a",
"url": "http://www.last.fm/music/Dire+Straits"
},
"album": {
"name": "Brothers In Arms - 20th Anniversary Edition",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/8801435.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/8801435.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/8801435.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/8801435.jpg",
"size": "extralarge"
}
]
},
{
"name": "You've Got a Friend",
"duration": "307000",
"playcount": "39",
"tagcount": "0",
"mbid": "2e3a3cb0-5e5a-415b-89cd-dc0ae74c91be",
"url": "http://www.last.fm/music/James+Taylor/_/You%27ve+Got+a+Friend",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "James Taylor",
"mbid": "0217fabf-0e84-4c36-b197-f1b6e1263506",
"url": "http://www.last.fm/music/James+Taylor"
},
"album": {
"name": "Mud Slide Slim and the Blue Horizon",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/83767473.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/83767473.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/83767473.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/83767473.png",
"size": "extralarge"
}
]
},
{
"name": "Telegraph Road",
"duration": "860000",
"playcount": "39",
"tagcount": "0",
"mbid": "f134485c-bf29-494c-888a-d4467d152609",
"url": "http://www.last.fm/music/Dire+Straits/_/Telegraph+Road",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dire Straits",
"mbid": "614e3804-7d34-41ba-857f-811bad7c2b7a",
"url": "http://www.last.fm/music/Dire+Straits"
},
"album": {
"name": "The Best of Dire Straits & Mark Knopfler - Private Investigations",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/98006973.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/98006973.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/98006973.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/98006973.jpg",
"size": "extralarge"
}
]
},
{
"name": "Midas Touch",
"duration": "234000",
"playcount": "39",
"tagcount": "0",
"mbid": "0128cb40-46b0-45c4-b451-a2d661f19732",
"url": "http://www.last.fm/music/Midnight+Star/_/Midas+Touch",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Midnight Star",
"mbid": "3d30a740-e36b-45b9-a395-a3b3696d1d7c",
"url": "http://www.last.fm/music/Midnight+Star"
},
"album": {
"name": "Soul Hits Of The 80's",
"position": ""
},
"image": [
{
"#text": "http://cdn.last.fm/flatness/catalogue/noimage/2/default_album_medium.png",
"size": "small"
},
{
"#text": "http://cdn.last.fm/flatness/catalogue/noimage/2/default_album_medium.png",
"size": "medium"
},
{
"#text": "http://cdn.last.fm/flatness/catalogue/noimage/2/default_album_medium.png",
"size": "large"
},
{
"#text": "http://cdn.last.fm/flatness/catalogue/noimage/2/default_album_medium.png",
"size": "extralarge"
}
]
}
],
"@attr": {
"user": "RJ",
"page": "0",
"perPage": "20",
"totalPages": "1949",
"total": "38966"
}
}
}

View File

@ -0,0 +1,50 @@
{
"tracks": {
"track": {
"name": "Sultans of Swing",
"duration": "347000",
"playcount": "81",
"tagcount": "0",
"mbid": "0317e524-7f70-4910-bc12-95dd468a29fc",
"url": "http://www.last.fm/music/Dire+Straits/_/Sultans+of+Swing",
"streamable": {
"#text": "0",
"fulltrack": "0"
},
"artist": {
"name": "Dire Straits",
"mbid": "614e3804-7d34-41ba-857f-811bad7c2b7a",
"url": "http://www.last.fm/music/Dire+Straits"
},
"album": {
"name": "Dire Straits (Remastered)",
"position": ""
},
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/56827829.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/56827829.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/56827829.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/56827829.jpg",
"size": "extralarge"
}
]
},
"@attr": {
"user": "RJ",
"page": "0",
"perPage": "1",
"totalPages": "38949",
"total": "38949"
}
}
}

View File

@ -0,0 +1,113 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace IF.Lastfm.Core.Tests.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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()]
public class LibraryApiResponses {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal LibraryApiResponses() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public 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.LibraryApiResponses", typeof(LibraryApiResponses).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] LibraryGetArtistsError {
get {
object obj = ResourceManager.GetObject("LibraryGetArtistsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] LibraryGetArtistsMultiple {
get {
object obj = ResourceManager.GetObject("LibraryGetArtistsMultiple", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] LibraryGetArtistsSingle {
get {
object obj = ResourceManager.GetObject("LibraryGetArtistsSingle", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] LibraryGetTracksMultiple {
get {
object obj = ResourceManager.GetObject("LibraryGetTracksMultiple", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] LibraryGetTracksSingle {
get {
object obj = ResourceManager.GetObject("LibraryGetTracksSingle", resourceCulture);
return ((byte[])(obj));
}
}
}
}

View File

@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="LibraryGetArtistsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>LibraryApi\LibraryGetArtistsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LibraryGetArtistsMultiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>LibraryApi\LibraryGetArtistsMultiple.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LibraryGetArtistsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>LibraryApi\LibraryGetArtistsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LibraryGetTracksMultiple" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>libraryapi\librarygettracksmultiple.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="LibraryGetTracksSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>libraryapi\librarygettrackssingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Invalid tag",
"links": []
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Invalid tag",
"links": []
}

View File

@ -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"
}
}
}

View File

@ -0,0 +1,163 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace IF.Lastfm.Core.Tests.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[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;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetInfoError {
get {
object obj = ResourceManager.GetObject("GetInfoError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetInfoSuccess {
get {
object obj = ResourceManager.GetObject("GetInfoSuccess", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetSimilarError {
get {
object obj = ResourceManager.GetObject("GetSimilarError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetSimilarSuccess {
get {
object obj = ResourceManager.GetObject("GetSimilarSuccess", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetTopAlbumsError {
get {
object obj = ResourceManager.GetObject("GetTopAlbumsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetTopAlbumsSingle {
get {
object obj = ResourceManager.GetObject("GetTopAlbumsSingle", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetTopAlbumsSuccess {
get {
object obj = ResourceManager.GetObject("GetTopAlbumsSuccess", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetTopArtistsError {
get {
object obj = ResourceManager.GetObject("GetTopArtistsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetTopArtistsSingle {
get {
object obj = ResourceManager.GetObject("GetTopArtistsSingle", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
internal static byte[] GetTopArtistsSuccess {
get {
object obj = ResourceManager.GetObject("GetTopArtistsSuccess", resourceCulture);
return ((byte[])(obj));
}
}
}
}

View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="GetInfoError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Tag\GetInfoError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetInfoSuccess" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Tag\GetInfoSuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetSimilarError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>tag\getsimilarerror.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetSimilarSuccess" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>tag\getsimilarsuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetTopAlbumsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>GetTopAlbumsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetTopAlbumsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>GetTopAlbumsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetTopAlbumsSuccess" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>GetTopAlbumsSuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetTopArtistsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>GetTopArtistsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetTopArtistsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>GetTopArtistsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="GetTopArtistsSuccess" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>GetTopArtistsSuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -0,0 +1,49 @@
{
"shouts": {
"shout": [
{
"body": "Timeless!",
"author": "lukasz_pulawski",
"date": "Thu, 29 Aug 2013 21:21:06"
},
{
"body": "i have a weird feeling listening this song. kinda nostalgic, happy and sad at the same time [3]",
"author": "Einarr123",
"date": "Thu, 29 Aug 2013 02:00:33"
},
{
"body": "LEGEND",
"author": "hlopez90",
"date": "Fri, 23 Aug 2013 23:15:37"
},
{
"body": "This song gets stucked in you head for ages",
"author": "Go_diego",
"date": "Fri, 23 Aug 2013 19:02:17"
},
{
"body": "Personal soundtrack",
"author": "guialoud",
"date": "Mon, 19 Aug 2013 00:24:32"
},
{
"body": "Pop Anthem",
"author": "HazieI",
"date": "Sun, 28 Jul 2013 07:27:34"
},
{
"body": "i have a weird feeling listening this song. kinda nostalgic, happy and sad at the same time [2]",
"author": "HazieI",
"date": "Sun, 28 Jul 2013 07:18:05"
}
],
"@attr": {
"artist": "Grimes",
"track": "Genesis",
"page": "5",
"perPage": "7",
"totalPages": "15",
"total": "105"
}
}
}

View File

@ -0,0 +1,11 @@
{
"shouts": {
"#text": "\n",
"artist": "Cristobal Tapia de Veer",
"track": "The Experiment",
"page": "0",
"perPage": "50",
"totalPages": "0",
"total": "0"
}
}

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Artist not found",
"links": []
}

View File

@ -0,0 +1,17 @@
{
"shouts": {
"shout": {
"body": "i have a weird feeling listening this song. kinda nostalgic, happy and sad at the same time [2]",
"author": "HazieI",
"date": "Sun, 28 Jul 2013 07:18:05"
},
"@attr": {
"artist": "Grimes",
"track": "Genesis",
"page": "7",
"perPage": "10",
"totalPages": "7",
"total": "61"
}
}
}

View File

@ -0,0 +1,5 @@
{
"error": 4,
"message": "Bad auth",
"links": []
}

View File

@ -0,0 +1 @@
method=track.scrobble&api_key=59dd1140db864fd4a68ca820709eaf98&api_sig=0CBBA3F49026129060210E3863BF8283&format=json&artist[0]=65daysofstatic&album[0]=The Fall of Math&track[0]=Hole&api_key=59dd1140db864fd4a68ca820709eaf98&chosenByUser[0]=1&timestamp[0]=1506168000&artist[1]=やくしまるえつこ&album[1]=X次元へようこそ&track[1]=X次元へようこそ&albumArtist[1]=やくしまるえつこ&chosenByUser[1]=0&timestamp[1]=1506171600&artist[2]=Björk&album[2]=Hyperballad&track[2]=Post&albumArtist[2]=Björk&chosenByUser[2]=0&timestamp[2]=1506175200&artist[3]=Broken Social Scene&album[3]=Sentimental X's&track[3]=Forgiveness Rock Record&albumArtist[3]=Broken Social Scene&chosenByUser[3]=0&timestamp[3]=1506178800&artist[4]=Rubies&album[4]=Stand in a Line&track[4]=Teppan-Yaki (A Collection of Remixes)&albumArtist[4]=Schinichi Osawa&chosenByUser[4]=0&timestamp[4]=1506182400&method=track.scrobble&sk=071a119a9aac4942b1b05328a5591f55

View File

@ -0,0 +1,31 @@
{
"scrobbles": {
"scrobble": {
"track": {
"#text": "Again",
"corrected": "0"
},
"artist": {
"#text": "Various",
"corrected": "0"
},
"album": {
"#text": "",
"corrected": "0"
},
"albumArtist": {
"#text": "",
"corrected": "0"
},
"timestamp": "1425152860",
"ignoredMessage": {
"#text": "Artist name failed filter: Various",
"code": "1"
}
},
"@attr": {
"accepted": "0",
"ignored": "1"
}
}
}

View File

@ -0,0 +1 @@
method=track.scrobble&api_key=59dd1140db864fd4a68ca820709eaf98&api_sig=D0249D5268AACF909FDB67CCF5104F4D&format=json&artist[0]=65daysofstatic&album[0]=The Fall of Math&track[0]=Hole&api_key=59dd1140db864fd4a68ca820709eaf98&chosenByUser[0]=1&timestamp[0]=1506168000&method=track.scrobble&sk=071a119a9aac4942b1b05328a5591f55

View File

@ -0,0 +1,31 @@
{
"scrobbles": {
"scrobble": {
"track": {
"#text": "Hole",
"corrected": "0"
},
"artist": {
"#text": "65daysofstatic",
"corrected": "0"
},
"album": {
"#text": "The Fall of Math",
"corrected": "0"
},
"albumArtist": {
"#text": "",
"corrected": "0"
},
"timestamp": "1506168000",
"ignoredMessage": {
"#text": "",
"code": "0"
}
},
"@attr": {
"accepted": "1",
"ignored": "0"
}
}
}

View File

@ -0,0 +1,56 @@
{
"scrobbles": {
"scrobble": [
{
"track": {
"#text": "Hole",
"corrected": "0"
},
"artist": {
"#text": "65daysofstatic",
"corrected": "0"
},
"album": {
"#text": "The Fall of Math",
"corrected": "0"
},
"albumArtist": {
"#text": "",
"corrected": "0"
},
"timestamp": "1506168000",
"ignoredMessage": {
"#text": "",
"code": "0"
}
},
{
"track": {
"#text": "X次元へようこそ",
"corrected": "0"
},
"artist": {
"#text": "やくしまるえつこ",
"corrected": "0"
},
"album": {
"#text": "X次元へようこそ",
"corrected": "0"
},
"albumArtist": {
"#text": "やくしまるえつこ",
"corrected": "0"
},
"timestamp": "1506171600",
"ignoredMessage": {
"#text": "",
"code": "0"
}
}
],
"@attr": {
"accepted": "2",
"ignored": "0"
}
}
}

View File

@ -0,0 +1,27 @@
{
"scrobbles": {
"scrobble": {
"track": {
"#text": "Hole",
"corrected": "0"
},
"artist": {
"#text": "65daysofstatic",
"corrected": "0"
},
"albumArtist": {
"#text": "",
"corrected": "0"
},
"timestamp": "1428175531",
"ignoredMessage": {
"#text": "",
"code": "0"
}
},
"@attr": {
"accepted": "1",
"ignored": "0"
}
}
}

View File

@ -0,0 +1 @@
method=track.scrobble&api_key=59dd1140db864fd4a68ca820709eaf98&api_sig=59AC0D646B80B8FF6F01C5C5B1667ADE&format=json&artist[0]=65daysofstatic&album[0]=The Fall of Math&track[0]=Hole&api_key=59dd1140db864fd4a68ca820709eaf98&chosenByUser[0]=1&timestamp[0]=1506168000&artist[1]=やくしまるえつこ&album[1]=X次元へようこそ&track[1]=X次元へようこそ&albumArtist[1]=やくしまるえつこ&chosenByUser[1]=0&timestamp[1]=1506171600&method=track.scrobble&sk=071a119a9aac4942b1b05328a5591f55

View File

@ -0,0 +1,180 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace IF.Lastfm.Core.Tests.Resources {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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", "15.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
public class TrackApiResponses {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal TrackApiResponses() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public 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.TrackApiResponses", typeof(TrackApiResponses).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackGetShouts {
get {
object obj = ResourceManager.GetObject("TrackGetShouts", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackGetShoutsEmpty {
get {
object obj = ResourceManager.GetObject("TrackGetShoutsEmpty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackGetShoutsError {
get {
object obj = ResourceManager.GetObject("TrackGetShoutsError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackGetShoutsSingle {
get {
object obj = ResourceManager.GetObject("TrackGetShoutsSingle", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackScrobbleBadAuthError {
get {
object obj = ResourceManager.GetObject("TrackScrobbleBadAuthError", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized string similar to method=track.scrobble&amp;api_key=59dd1140db864fd4a68ca820709eaf98&amp;api_sig=0CBBA3F49026129060210E3863BF8283&amp;format=json&amp;artist[0]=65daysofstatic&amp;album[0]=The Fall of Math&amp;track[0]=Hole&amp;api_key=59dd1140db864fd4a68ca820709eaf98&amp;chosenByUser[0]=1&amp;timestamp[0]=1506168000&amp;artist[1]=やくしまるえつこ&amp;album[1]=X次元へようこそ&amp;track[1]=X次元へようこそ&amp;albumArtist[1]=やくしまるえつこ&amp;chosenByUser[1]=0&amp;timestamp[1]=1506171600&amp;artist[2]=Björk&amp;album[2]=Hyperballad&amp;track[2]=Post&amp;albumArtist[2]=Björk&amp;chosenByUser[2]=0&amp;timestamp[2]=1506175200&amp;artist[3]=Bro [rest of string was truncated]&quot;;.
/// </summary>
public static string TrackScrobbleMultipleRequestBody {
get {
return ResourceManager.GetString("TrackScrobbleMultipleRequestBody", resourceCulture);
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackScrobbleRejected {
get {
object obj = ResourceManager.GetObject("TrackScrobbleRejected", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized string similar to method=track.scrobble&amp;api_key=59dd1140db864fd4a68ca820709eaf98&amp;api_sig=D0249D5268AACF909FDB67CCF5104F4D&amp;format=json&amp;artist[0]=65daysofstatic&amp;album[0]=The Fall of Math&amp;track[0]=Hole&amp;api_key=59dd1140db864fd4a68ca820709eaf98&amp;chosenByUser[0]=1&amp;timestamp[0]=1506168000&amp;method=track.scrobble&amp;sk=071a119a9aac4942b1b05328a5591f55.
/// </summary>
public static string TrackScrobbleSingleRequestBody {
get {
return ResourceManager.GetString("TrackScrobbleSingleRequestBody", resourceCulture);
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackScrobbleSuccess {
get {
object obj = ResourceManager.GetObject("TrackScrobbleSuccess", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackScrobbleSuccess2 {
get {
object obj = ResourceManager.GetObject("TrackScrobbleSuccess2", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TrackScrobbleSuccessNoAlbumProperty {
get {
object obj = ResourceManager.GetObject("TrackScrobbleSuccessNoAlbumProperty", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized string similar to method=track.scrobble&amp;api_key=59dd1140db864fd4a68ca820709eaf98&amp;api_sig=59AC0D646B80B8FF6F01C5C5B1667ADE&amp;format=json&amp;artist[0]=65daysofstatic&amp;album[0]=The Fall of Math&amp;track[0]=Hole&amp;api_key=59dd1140db864fd4a68ca820709eaf98&amp;chosenByUser[0]=1&amp;timestamp[0]=1506168000&amp;artist[1]=やくしまるえつこ&amp;album[1]=X次元へようこそ&amp;track[1]=X次元へようこそ&amp;albumArtist[1]=やくしまるえつこ&amp;chosenByUser[1]=0&amp;timestamp[1]=1506171600&amp;method=track.scrobble&amp;sk=071a119a9aac4942b1b05328a5591f55.
/// </summary>
public static string TrackScrobbleTwoRequestBody {
get {
return ResourceManager.GetString("TrackScrobbleTwoRequestBody", resourceCulture);
}
}
}
}

View File

@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="TrackGetShouts" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>TrackApi\TrackGetShouts.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackGetShoutsEmpty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>TrackApi\TrackGetShoutsEmpty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackGetShoutsError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>TrackApi\TrackGetShoutsError.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackGetShoutsSingle" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>TrackApi\TrackGetShoutsSingle.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackScrobbleBadAuthError" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>trackapi\trackscrobblebadautherror.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackScrobbleMultipleRequestBody" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>trackapi\trackscrobblemultiplerequestbody.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="TrackScrobbleRejected" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>trackapi\trackscrobblerejected.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackScrobbleSingleRequestBody" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>trackapi\trackscrobblesinglerequestbody.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="TrackScrobbleSuccess" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>TrackApi\TrackScrobbleSuccess.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackScrobbleSuccess2" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>trackapi\trackscrobblesuccess2.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackScrobbleSuccessNoAlbumProperty" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>trackapi\trackscrobblesuccessnoalbumproperty.json;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TrackScrobbleTwoRequestBody" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>trackapi\trackscrobbletworequestbody.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
</root>

View File

@ -0,0 +1,5 @@
{
"error": 6,
"message": "Invalid parameters - Your request is missing the [user] parameter",
"links": []
}

View File

@ -0,0 +1,733 @@
{
"lovedtracks": {
"track": [
{
"artist": {
"#text": "Santana",
"mbid": "1bc6816a-d056-4113-9b0a-6c52e5c31a3c"
},
"name": "No One to Depend On",
"streamable": "0",
"mbid": "3f8ed8da-dcc6-43dc-8266-3663007261a6",
"album": {
"#text": "Santana (III)",
"mbid": ""
},
"url": "http://www.last.fm/music/Santana/_/No+One+to+Depend+On",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/99461493.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/99461493.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/99461493.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/99461493.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 16:21",
"uts": "1419006075"
}
},
{
"artist": {
"#text": "The Rolling Stones",
"mbid": "b071f9fa-14b0-4217-8e97-eb41da73f598"
},
"name": "Love in Vain",
"streamable": "0",
"mbid": "3dde65c8-22c3-4637-b67e-b234177c847b",
"album": {
"#text": "Let It Bleed",
"mbid": "8bc2f5e2-122a-42db-b86c-fddedc77463a"
},
"url": "http://www.last.fm/music/The+Rolling+Stones/_/Love+in+Vain",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/101739037.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/101739037.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/101739037.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/101739037.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 16:16",
"uts": "1419005816"
}
},
{
"artist": {
"#text": "The Who",
"mbid": "9fdaa16b-a6c4-4831-b87c-bc9ca8ce7eaa"
},
"name": "Pinball Wizard",
"streamable": "0",
"mbid": "79f3dc97-2297-47ee-8556-9a1bb4b48d53",
"album": {
"#text": "Tommy (Remastered)",
"mbid": ""
},
"url": "http://www.last.fm/music/The+Who/_/Pinball+Wizard",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/35234991.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/35234991.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/35234991.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/35234991.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 16:13",
"uts": "1419005635"
}
},
{
"artist": {
"#text": "Cream",
"mbid": "04cd0cfd-bfd1-4c36-bc38-95c35e2c045f"
},
"name": "I'm So Glad",
"streamable": "0",
"mbid": "3dc91be5-c7ab-4af3-9557-19eb8e054d5a",
"album": {
"#text": "Fresh Cream (Remastered)",
"mbid": ""
},
"url": "http://www.last.fm/music/Cream/_/I%27m+So+Glad",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/89387215.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/89387215.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/89387215.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/89387215.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 16:09",
"uts": "1419005395"
}
},
{
"artist": {
"#text": "The Yardbirds",
"mbid": "191de76f-a224-445d-b041-54df16d65bf7"
},
"name": "Smokestack Lightning",
"streamable": "0",
"mbid": "580b35c9-b701-43d7-9ec3-6bd6f01534c2",
"album": {
"#text": "Five Live Yardbirds",
"mbid": "3fda56ac-efe1-4a26-9c86-116f5cc4b721"
},
"url": "http://www.last.fm/music/The+Yardbirds/_/Smokestack+Lightning",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/91925037.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/91925037.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/91925037.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/91925037.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 16:04",
"uts": "1419005063"
}
},
{
"artist": {
"#text": "Canned Heat",
"mbid": "815a0279-558c-4522-ac3b-6a1e259e95b5"
},
"name": "One Kind Favor",
"streamable": "0",
"mbid": "5bde419b-9e93-46c6-baf5-ef58a0b3bb73",
"album": {
"#text": "Living The Blues",
"mbid": "ec82ab15-8c01-4aa0-810c-d184d20f229b"
},
"url": "http://www.last.fm/music/Canned+Heat/_/One+Kind+Favor",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/100370719.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/100370719.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/100370719.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/100370719.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:59",
"uts": "1419004779"
}
},
{
"artist": {
"#text": "Cream",
"mbid": "04cd0cfd-bfd1-4c36-bc38-95c35e2c045f"
},
"name": "Politician",
"streamable": "0",
"mbid": "f2c2760c-ea5c-4ca0-8a8b-4199a41ffba0",
"album": {
"#text": "Wheels of Fire (Remastered)",
"mbid": ""
},
"url": "http://www.last.fm/music/Cream/_/Politician",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/75021714.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/75021714.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/75021714.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/75021714.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:55",
"uts": "1419004522"
}
},
{
"artist": {
"#text": "The Doors",
"mbid": "9efff43b-3b29-4082-824e-bc82f646f93d"
},
"name": "Light My Fire",
"streamable": "0",
"mbid": "05b7cd66-a700-4aa1-baf3-e1e41388f3cf",
"album": {
"#text": "The Doors",
"mbid": "8f3cf206-35f6-3c77-925e-766bdfbf6333"
},
"url": "http://www.last.fm/music/The+Doors/_/Light+My+Fire",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/88289473.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/88289473.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/88289473.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/88289473.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:48",
"uts": "1419004096"
}
},
{
"artist": {
"#text": "Full Metal Hammer",
"mbid": ""
},
"name": "Since Ive Been Loving You",
"streamable": "0",
"mbid": "",
"album": {
"#text": "It's A Full Metal Hammer Thing",
"mbid": ""
},
"url": "http://www.last.fm/music/Full+Metal+Hammer/_/Since+Ive+Been+Loving+You",
"image": [
{
"#text": "",
"size": "small"
},
{
"#text": "",
"size": "medium"
},
{
"#text": "",
"size": "large"
},
{
"#text": "",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:41",
"uts": "1419003662"
}
},
{
"artist": {
"#text": "The Jimi Hendrix Experience",
"mbid": "33b3c323-77c2-417c-a5b4-af7e6a111cc9"
},
"name": "Burning Of The Midnight Lamp",
"streamable": "0",
"mbid": "1a1c8a21-351d-4c43-8ed4-3fd3f5058e1b",
"album": {
"#text": "Electric Ladyland",
"mbid": "9fa7f446-b15c-3ad9-a4cc-3348e9140319"
},
"url": "http://www.last.fm/music/The+Jimi+Hendrix+Experience/_/Burning+Of+The+Midnight+Lamp",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/96516997.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/96516997.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/96516997.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/96516997.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:37",
"uts": "1419003443"
}
},
{
"artist": {
"#text": "Otis Rush",
"mbid": "40ee7c92-f44a-4d14-9aee-f87244465ee4"
},
"name": "Double Trouble",
"streamable": "0",
"mbid": "f23c009e-19c4-4196-8fe2-236c28546bfc",
"album": {
"#text": "Live At Montreux 1986",
"mbid": ""
},
"url": "http://www.last.fm/music/Otis+Rush/_/Double+Trouble",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/91112769.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/91112769.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/91112769.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/91112769.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:32",
"uts": "1419003132"
}
},
{
"artist": {
"#text": "The Yardbirds",
"mbid": "191de76f-a224-445d-b041-54df16d65bf7"
},
"name": "I Don't Care No More",
"streamable": "0",
"mbid": "30e22d26-15f7-4547-a0f4-b08feed1a7fc",
"album": {
"#text": "Rock Classics: Parable Of Arable Land",
"mbid": ""
},
"url": "http://www.last.fm/music/The+Yardbirds/_/I+Don%27t+Care+No+More",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/54760139.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/54760139.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/54760139.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/174s/54760139.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:28",
"uts": "1419002911"
}
},
{
"artist": {
"#text": "The Doors",
"mbid": "9efff43b-3b29-4082-824e-bc82f646f93d"
},
"name": "Crawling King Snake",
"streamable": "0",
"mbid": "a08905e0-dc59-47fe-ae93-be5bb0d22a84",
"album": {
"#text": "L.A. Woman",
"mbid": "492025d7-a5fd-40f0-94f9-8841e9078bb3"
},
"url": "http://www.last.fm/music/The+Doors/_/Crawling+King+Snake",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/88488175.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/88488175.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/88488175.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/88488175.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:23",
"uts": "1419002612"
}
},
{
"artist": {
"#text": "Jimmy Page",
"mbid": "519774a4-3b18-4042-b8c0-927845a616c9"
},
"name": "Prison Blues",
"streamable": "0",
"mbid": "f78a2ce9-3dba-439c-9e05-0783ccfa40c3",
"album": {
"#text": "Outrider",
"mbid": "a53095c1-a6ea-4bc9-a14c-6ecafeef738e"
},
"url": "http://www.last.fm/music/Jimmy+Page/_/Prison+Blues",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/90138723.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/90138723.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/90138723.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/90138723.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:16",
"uts": "1419002181"
}
},
{
"artist": {
"#text": "Cream",
"mbid": "04cd0cfd-bfd1-4c36-bc38-95c35e2c045f"
},
"name": "Spoonful",
"streamable": "0",
"mbid": "f6f5d7f0-b368-45c0-8505-4b33ac696035",
"album": {
"#text": "Fresh Cream (Remastered)",
"mbid": ""
},
"url": "http://www.last.fm/music/Cream/_/Spoonful",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/89387215.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/89387215.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/89387215.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/89387215.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:09",
"uts": "1419001787"
}
},
{
"artist": {
"#text": "The Doors",
"mbid": "9efff43b-3b29-4082-824e-bc82f646f93d"
},
"name": "Back Door Man",
"streamable": "0",
"mbid": "1976f693-f35f-4534-b341-31d51f46b208",
"album": {
"#text": "The Doors",
"mbid": "8f3cf206-35f6-3c77-925e-766bdfbf6333"
},
"url": "http://www.last.fm/music/The+Doors/_/Back+Door+Man",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/88289473.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/88289473.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/88289473.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/88289473.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:06",
"uts": "1419001574"
}
},
{
"artist": {
"#text": "The Yardbirds",
"mbid": "191de76f-a224-445d-b041-54df16d65bf7"
},
"name": "I Ain't Got You",
"streamable": "0",
"mbid": "19ee6ab9-1716-41e1-8aa7-cada544f5695",
"album": {
"#text": "Five Live",
"mbid": ""
},
"url": "http://www.last.fm/music/The+Yardbirds/_/I+Ain%27t+Got+You",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/87032633.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/87032633.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/87032633.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/87032633.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:04",
"uts": "1419001453"
}
},
{
"artist": {
"#text": "The Who",
"mbid": "9fdaa16b-a6c4-4831-b87c-bc9ca8ce7eaa"
},
"name": "Substitute (Remixed Live At Leeds Version)",
"streamable": "0",
"mbid": "",
"album": {
"#text": "Live At Leeds (25th Anniversary Edition)",
"mbid": ""
},
"url": "http://www.last.fm/music/The+Who/_/Substitute+(Remixed+Live+At+Leeds+Version)",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/82286267.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/82286267.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/82286267.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/82286267.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 15:01",
"uts": "1419001281"
}
},
{
"artist": {
"#text": "Cream",
"mbid": "04cd0cfd-bfd1-4c36-bc38-95c35e2c045f"
},
"name": "Tales of Brave Ulysses",
"streamable": "0",
"mbid": "f5e62507-07f1-45eb-83c6-6742d5260d06",
"album": {
"#text": "Disraeli Gears (Remastered)",
"mbid": ""
},
"url": "http://www.last.fm/music/Cream/_/Tales+of+Brave+Ulysses",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/57500153.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/57500153.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/57500153.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/57500153.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 14:58",
"uts": "1419001115"
}
},
{
"artist": {
"#text": "Jimi Hendrix",
"mbid": "06fb1c8b-566e-4cb2-985b-b467c90781d4"
},
"name": "Johnny B. Goode (Live Berkeley Community Center, Berkeley, CA May 30, 1970)",
"streamable": "0",
"mbid": "",
"album": {
"#text": "In The West",
"mbid": ""
},
"url": "http://www.last.fm/music/Jimi+Hendrix/_/Johnny+B.+Goode+(Live+Berkeley+Community+Center,+Berkeley,+CA+May+30,+1970)",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/78579114.png",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/78579114.png",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/78579114.png",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/78579114.png",
"size": "extralarge"
}
],
"date": {
"#text": "19 Dec 2014, 14:53",
"uts": "1419000831"
}
}
],
"@attr": {
"user": "RJ",
"page": "0",
"perPage": "20",
"totalPages": "3827",
"total": "76526"
}
}
}

View File

@ -0,0 +1,47 @@
{
"lovedtracks": {
"track": {
"artist": {
"#text": "Rick James",
"mbid": "cba9cec2-be8d-41bd-91b4-a1cd7de39b0c"
},
"name": "Super Freak (Part 1) - 1981 Single Version",
"streamable": "0",
"mbid": "",
"album": {
"#text": "The Definitive Collection",
"mbid": "f22c19bf-1c88-4651-a0d3-8c50735f3c93"
},
"url": "http://www.last.fm/music/Rick+James/_/Super+Freak+(Part+1)+-+1981+Single+Version",
"image": [
{
"#text": "http://userserve-ak.last.fm/serve/34s/90462319.jpg",
"size": "small"
},
{
"#text": "http://userserve-ak.last.fm/serve/64s/90462319.jpg",
"size": "medium"
},
{
"#text": "http://userserve-ak.last.fm/serve/126/90462319.jpg",
"size": "large"
},
{
"#text": "http://userserve-ak.last.fm/serve/300x300/90462319.jpg",
"size": "extralarge"
}
],
"date": {
"#text": "20 Dec 2014, 10:16",
"uts": "1419070612"
}
},
"@attr": {
"user": "RJ",
"page": "0",
"perPage": "1",
"totalPages": "76536",
"total": "76536"
}
}
}

View File

@ -0,0 +1,10 @@
{
"recenttracks": {
"#text": "\n",
"user": "RT",
"page": "0",
"perPage": "20",
"totalPages": "0",
"total": "0"
}
}

Some files were not shown because too many files have changed in this diff Show More