Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions src/Hqub.MusicBrainz.Client/FetchTestData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
namespace Hqub.MusicBrainz.Client
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;

static class FetchTestData
{
private static readonly Dictionary<string, string> Data = new Dictionary<string, string>()
{
{ "artist-get", "artist/72c536dc-7137-4477-a521-567eeb840fa8?inc=release-groups+tags+genres+works+ratings+artist-rels+url-rels+aliases" },
{ "artist-search", "artist?query=artist:(bob dylan)&limit=10" },
{ "artist-browse", "artist?area=c9ac1239-e832-41bc-9930-e252a1fd1105&limit=10" },

{ "label-get", "label/82935ddb-a9d6-45a7-85e3-0b0add51fa1c?inc=releases+artist-credits+genres+url-rels" },
{ "label-search", "label?query=%22City%20Slang%22" },
{ "label-browse", "label?area=85752fda-13c4-31a3-bee5-0e5cb1f51dad&limit=10" },

{ "recording-get", "recording/9408b8ce-9b95-4fb0-ac70-595d054a15c6?inc=artists+releases+tags+genres+ratings+url-rels" },
{ "recording-search", "recording?query=artist:calexico AND recording:(alone again or) AND NOT secondarytype:live&limit=10" },
{ "recording-browse", "recording?release=12195c41-6136-4dfd-acf1-9923dadc73e2&inc=ratings" },

{ "releasegroup-get", "release-group/fc325dd3-73ed-36aa-9c77-6b65a958e3cf?inc=artists+releases+ratings+genres+url-rels" },
{ "releasegroup-search", "release-group?query=artist:(bob dylan)" },
{ "releasegroup-browse", "release-group?artist=45a663b5-b1cb-4a91-bff6-2bef7bbfdd76&limit=10&inc=ratings" },

{ "release-get", "release/12195c41-6136-4dfd-acf1-9923dadc73e2?inc=artists+labels+recordings+release-groups+genres+url-rels" },
{ "release-search", "release?query=artist:(giant sand) release:tucson&limit=10" },
{ "release-browse", "release?label=82935ddb-a9d6-45a7-85e3-0b0add51fa1c&limit=10" },

{ "area-get", "area/c9ac1239-e832-41bc-9930-e252a1fd1105?inc=area-rels" },
{ "work-get", "work/0e23ed77-ad7e-34e7-b57c-c3407b2ae5df?inc=url-rels+artist-rels" },
};

public static async Task Download(bool overwrite = false)
{
var client = new HttpClient() { BaseAddress = new Uri("https://musicbrainz.org/ws/2/") };

client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0");

foreach (var item in Data)
{
await Get(client, item.Key, item.Value, overwrite);

}

Console.Write("Done. Press any key to quit.");
}

private static async Task Get(HttpClient client, string target, string url, bool overwrite)
{
url += "&fmt=json";

target = target + ".json";

Console.Write("Saving {0} ... ", target);

try
{
if (File.Exists(target) && !overwrite)
{
Console.WriteLine("ALREADY EXISTS");
return;
}

var stream = await client.GetStreamAsync(url);

using var file = File.Open(target, FileMode.Create);

stream.CopyTo(file);

Console.WriteLine("OK");

// Avoid rate limit.
await Task.Delay(500);
}
catch
{
Console.WriteLine("FAILED");
}
}
}
}
46 changes: 46 additions & 0 deletions src/Hqub.MusicBrainz.Tests/ArtistBrowseTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
namespace Hqub.MusicBrainz.Tests
{
using Hqub.MusicBrainz.Entities.Collections;
using NUnit.Framework;
using System.Threading.Tasks;

// Resource: artist-browse.json
// URL: https://musicbrainz.org/ws/2/artist?area=c9ac1239-e832-41bc-9930-e252a1fd1105&limit=10&fmt=json

public class ArtistBrowseTests
{
private ArtistList data;

[OneTimeSetUp]
public async Task Init()
{
var client = new MusicBrainzClient()
{
Cache = EmbeddedResourceCache.Instance
};

data = await client.Artists.BrowseAsync("area", "c9ac1239-e832-41bc-9930-e252a1fd1105", 10);
}

[Test]
public void TestArtistListQueryCount()
{
Assert.That(data.Offset, Is.EqualTo(0));
Assert.That(data.Count, Is.GreaterThanOrEqualTo(1));
}

[Test]
public void TestArtistListCount()
{
Assert.That(data.Items.Count, Is.EqualTo(10));
}

[Test]
public void TestArtistListElements()
{
var artist = data.Items[0];

Assert.That(artist.Id, Is.EqualTo("00ad9fb8-674f-4770-a77e-fbb5c9bdbfea"));
}
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,28 @@

namespace Hqub.MusicBrainz.Tests
namespace Hqub.MusicBrainz.Tests
{
using Hqub.MusicBrainz.Entities;
using NUnit.Framework;
using System.Linq;
using System.Threading.Tasks;

// Resource: artist-get.json
// Artist.Get("12195c41-6136-4dfd-acf1-9923dadc73e2", "release-groups", "tags", "works", "ratings", "artist-rels", "url-rels");
//
// https://musicbrainz.org/ws/2/artist/72c536dc-7137-4477-a521-567eeb840fa8/?inc=release-groups+tags+works+ratings+artist-rels+url-rels&fmt=json
// URL: https://musicbrainz.org/ws/2/artist/72c536dc-7137-4477-a521-567eeb840fa8/?inc=release-groups+tags+genres+works+ratings+artist-rels+url-rels+aliases&fmt=json

public class ArtistTests
public class ArtistGetTests
{
Artist artist;

public ArtistTests()
[OneTimeSetUp]
public async Task Init()
{
this.artist = TestHelper.GetJson<Artist>("artist-get.json");
var client = new MusicBrainzClient()
{
Cache = EmbeddedResourceCache.Instance
};

string[] inc = ["release-groups", "tags", "genres", "works", "ratings", "artist-rels", "url-rels", "aliases"];

artist = await client.Artists.GetAsync("72c536dc-7137-4477-a521-567eeb840fa8", inc);
}

[Test]
Expand Down Expand Up @@ -121,12 +127,12 @@ public void TestArtistGenres()
var genres = artist.Genres;

Assert.That(genres, Is.Not.Null);
Assert.That(genres.Count, Is.EqualTo(10));
Assert.That(genres.Count, Is.GreaterThan(10));

var genre = genres[0];

Assert.That(genre, Is.Not.Null);
Assert.That(genre.Count, Is.EqualTo(2));
Assert.That(genre.Count, Is.GreaterThan(2));
Assert.That(genre.Name, Is.EqualTo("blues"));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@

namespace Hqub.MusicBrainz.Tests
namespace Hqub.MusicBrainz.Tests
{
using Hqub.MusicBrainz.Entities.Collections;
using NUnit.Framework;
using System.Threading.Tasks;

// Resource: artist-search.json
// Artist.Search("artist:(bob dylan)", 10);
//
// https://musicbrainz.org/ws/2/artist?query=artist:(bob%20dylan)&limit=10&fmt=json
// URL: https://musicbrainz.org/ws/2/artist?query=artist:(bob%20dylan)&limit=10&fmt=json

public class ArtistListTests
public class ArtistSearchTests
{
private readonly ArtistList data;
private ArtistList data;

public ArtistListTests()
[OneTimeSetUp]
public async Task Init()
{
data = TestHelper.GetJson<ArtistList>("artist-search.json");
var client = new MusicBrainzClient()
{
Cache = EmbeddedResourceCache.Instance
};

data = await client.Artists.SearchAsync("artist:(bob dylan)", 10);
}

[Test]
Expand Down
1 change: 1 addition & 0 deletions src/Hqub.MusicBrainz.Tests/Data/area-get.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"Berlin","life-span":{"end":null,"begin":null,"ended":false},"sort-name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105","type-id":"6fd8f29a-3d0a-32fc-980d-ea697b69da78","iso-3166-2-codes":["DE-BE"],"relations":[{"attribute-ids":{},"area":{"disambiguation":"","type-id":"84039871-5e47-38ca-a66a-45e512c8290f","name":"Tempelhof-Schöneberg","id":"050f0a72-3609-4ec4-8726-3d4fb63527f7","type":"District","sort-name":"Tempelhof-Schöneberg"},"source-credit":"","target-type":"area","attribute-values":{},"begin":null,"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7","attributes":[],"end":null,"target-credit":"","direction":"forward","type":"part of","ended":false},{"end":null,"ended":false,"type":"part of","direction":"forward","target-credit":"","target-type":"area","begin":null,"attribute-values":{},"source-credit":"","area":{"disambiguation":"","type-id":"84039871-5e47-38ca-a66a-45e512c8290f","name":"Charlottenburg-Wilmersdorf","id":"b6ab62da-b507-4e4d-867e-9ed1dd58db9e","type":"District","sort-name":"Charlottenburg-Wilmersdorf"},"attribute-ids":{},"attributes":[],"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7"},{"end":null,"target-credit":"","direction":"forward","type":"part of","ended":false,"area":{"id":"7eb0cc3e-7116-4f2c-8413-38c00664b08e","type":"District","sort-name":"Pankow","disambiguation":"","type-id":"84039871-5e47-38ca-a66a-45e512c8290f","name":"Pankow"},"attribute-ids":{},"begin":null,"target-type":"area","attribute-values":{},"source-credit":"","attributes":[],"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7"},{"end":null,"type":"part of","direction":"forward","target-credit":"","ended":false,"attribute-ids":{},"area":{"type":"District","sort-name":"Mitte","id":"0833ba52-2827-4dba-8336-2640c06d682b","type-id":"84039871-5e47-38ca-a66a-45e512c8290f","name":"Mitte","disambiguation":""},"source-credit":"","begin":null,"target-type":"area","attribute-values":{},"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7","attributes":[]},{"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7","attributes":[],"attribute-ids":{},"area":{"id":"1df4868a-b298-4759-bbeb-5235c9ba5346","type":"District","sort-name":"Friedrichshain-Kreuzberg","disambiguation":"","type-id":"84039871-5e47-38ca-a66a-45e512c8290f","name":"Friedrichshain-Kreuzberg"},"source-credit":"","begin":null,"target-type":"area","attribute-values":{},"type":"part of","direction":"forward","target-credit":"","ended":false,"end":null},{"direction":"forward","target-credit":"","type":"part of","ended":false,"end":null,"attributes":[],"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7","area":{"sort-name":"Steglitz-Zehlendorf","type":"District","id":"b5aecb4e-db09-46f7-ba67-7dd060bb3d15","type-id":"84039871-5e47-38ca-a66a-45e512c8290f","name":"Steglitz-Zehlendorf","disambiguation":""},"attribute-ids":{},"target-type":"area","begin":null,"attribute-values":{},"source-credit":""},{"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7","attributes":[],"attribute-ids":{},"area":{"type-id":"84039871-5e47-38ca-a66a-45e512c8290f","name":"Spandau","disambiguation":"borough","type":"District","sort-name":"Spandau","id":"38f6d301-1864-4190-a9cc-9a7ace38aef6"},"source-credit":"","target-type":"area","attribute-values":{},"begin":null,"type":"part of","target-credit":"","direction":"forward","ended":false,"end":null},{"source-credit":"","attribute-values":{},"target-type":"area","begin":null,"attribute-ids":{},"area":{"id":"85752fda-13c4-31a3-bee5-0e5cb1f51dad","sort-name":"Germany","iso-3166-1-codes":["DE"],"name":"Germany","type":"Country","disambiguation":"","type-id":"06dd0ae4-8c74-30bb-b43d-95dcedf961de"},"type-id":"de7cc874-8b1b-3a05-8272-f3834c968fb7","attributes":[],"end":null,"ended":false,"type":"part of","direction":"backward","target-credit":""}],"disambiguation":"","type":"City"}
1 change: 1 addition & 0 deletions src/Hqub.MusicBrainz.Tests/Data/artist-browse.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artists":[{"area":{"disambiguation":"","type-id":null,"type":null,"iso-3166-1-codes":["DE"],"name":"Germany","id":"85752fda-13c4-31a3-bee5-0e5cb1f51dad","sort-name":"Germany"},"sort-name":"$OHO BANI","life-span":{"end":null,"ended":false,"begin":"1999"},"ipis":[],"name":"$OHO BANI","gender":"Male","gender-id":"36d3d30a-839d-3eda-8cb3-29be4384e4a9","type-id":"b6e035f4-3ce9-331c-97df-83397230b0df","id":"00ad9fb8-674f-4770-a77e-fbb5c9bdbfea","end-area":null,"isnis":["0000000503024662"],"begin-area":{"name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105","sort-name":"Berlin","disambiguation":"","type-id":null,"iso-3166-2-codes":["DE-BE"],"type":null},"type":"Person","disambiguation":"","country":"DE"},{"ipis":[],"life-span":{"end":null,"begin":null,"ended":false},"name":"-Selektor","area":{"type":null,"disambiguation":"","type-id":null,"id":"85752fda-13c4-31a3-bee5-0e5cb1f51dad","sort-name":"Germany","iso-3166-1-codes":["DE"],"name":"Germany"},"sort-name":"-Selektor","type-id":null,"gender-id":null,"gender":null,"begin-area":{"type":null,"iso-3166-2-codes":["DE-BE"],"type-id":null,"disambiguation":"","sort-name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105","name":"Berlin"},"end-area":null,"id":"0575c40d-dbcf-4058-bc45-9db9f7d200bd","isnis":[],"disambiguation":"","country":"DE","type":null},{"gender-id":"36d3d30a-839d-3eda-8cb3-29be4384e4a9","type-id":"b6e035f4-3ce9-331c-97df-83397230b0df","gender":"Male","life-span":{"end":null,"begin":null,"ended":false},"ipis":[],"name":"3 Phase","area":{"type-id":null,"disambiguation":"","type":null,"name":"Germany","iso-3166-1-codes":["DE"],"sort-name":"Germany","id":"85752fda-13c4-31a3-bee5-0e5cb1f51dad"},"sort-name":"3 Phase","disambiguation":"","country":"DE","type":"Person","begin-area":{"id":"c9ac1239-e832-41bc-9930-e252a1fd1105","sort-name":"Berlin","name":"Berlin","type":null,"disambiguation":"","iso-3166-2-codes":["DE-BE"],"type-id":null},"id":"44c4373b-396a-424a-a262-8aaace5a743a","end-area":null,"isnis":["0000000372954842"]},{"gender":null,"type-id":"e431f5f6-b5d2-343d-8b36-72607fffb74b","gender-id":null,"area":{"iso-3166-1-codes":["DE"],"name":"Germany","id":"85752fda-13c4-31a3-bee5-0e5cb1f51dad","sort-name":"Germany","disambiguation":"","type-id":null,"type":null},"sort-name":"2raumwohnung","ipis":[],"life-span":{"end":null,"begin":"2000","ended":false},"name":"2raumwohnung","type":"Group","disambiguation":"","country":"DE","end-area":null,"id":"5579a23d-c411-4930-987d-ff89d77c1c12","isnis":["000000011523609X"],"begin-area":{"type":null,"iso-3166-2-codes":["DE-BE"],"type-id":null,"disambiguation":"","sort-name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105","name":"Berlin"}},{"disambiguation":"German house duo Kevin Cremer and Sean Yves Seifert","country":"DE","type":"Group","begin-area":null,"id":"6eaba231-587e-47ef-a18d-65a525a88616","end-area":null,"isnis":[],"gender-id":null,"type-id":"e431f5f6-b5d2-343d-8b36-72607fffb74b","gender":null,"life-span":{"end":null,"begin":null,"ended":false},"ipis":[],"name":"1Oaks","area":{"name":"Berlin","sort-name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105","iso-3166-2-codes":["DE-BE"],"type-id":null,"disambiguation":"","type":null},"sort-name":"1Oaks"},{"begin-area":null,"isnis":[],"id":"7710fba3-17e1-47f6-830e-756177e7ff85","end-area":null,"country":"DE","disambiguation":"aka “deviser”","type":"Person","name":"1)3\\/1532","life-span":{"end":null,"begin":null,"ended":false},"ipis":[],"sort-name":"1)3\\/1532","area":{"id":"c9ac1239-e832-41bc-9930-e252a1fd1105","sort-name":"Berlin","name":"Berlin","type":null,"disambiguation":"","type-id":null,"iso-3166-2-codes":["DE-BE"]},"gender-id":"36d3d30a-839d-3eda-8cb3-29be4384e4a9","type-id":"b6e035f4-3ce9-331c-97df-83397230b0df","gender":"Male"},{"begin-area":{"type-id":null,"iso-3166-2-codes":["DE-BE"],"disambiguation":"","type":null,"name":"Berlin","sort-name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105"},"isnis":[],"end-area":null,"id":"85409085-82cd-461a-b3b8-e5f64ff299a5","country":"DE","disambiguation":"","type":"Group","name":"...and Then I Feel Nothing","ipis":[],"life-span":{"begin":"2017","ended":false,"end":null},"sort-name":"...and Then I Feel Nothing","area":{"id":"c9ac1239-e832-41bc-9930-e252a1fd1105","sort-name":"Berlin","name":"Berlin","type":null,"disambiguation":"","iso-3166-2-codes":["DE-BE"],"type-id":null},"type-id":"e431f5f6-b5d2-343d-8b36-72607fffb74b","gender-id":null,"gender":null},{"end-area":null,"id":"937f0b20-fe0b-4b4c-aa30-06152e6094a4","isnis":[],"begin-area":{"type":null,"disambiguation":"","type-id":null,"iso-3166-2-codes":["DE-BE"],"id":"c9ac1239-e832-41bc-9930-e252a1fd1105","sort-name":"Berlin","name":"Berlin"},"type":"Group","disambiguation":"","country":"DE","area":{"type":null,"disambiguation":"","type-id":null,"id":"85752fda-13c4-31a3-bee5-0e5cb1f51dad","sort-name":"Germany","iso-3166-1-codes":["DE"],"name":"Germany"},"sort-name":"1. FC Union Berlin","ipis":[],"life-span":{"end":null,"begin":null,"ended":false},"name":"1. FC Union Berlin","gender":null,"type-id":"e431f5f6-b5d2-343d-8b36-72607fffb74b","gender-id":null},{"type-id":"b6e035f4-3ce9-331c-97df-83397230b0df","gender-id":"36d3d30a-839d-3eda-8cb3-29be4384e4a9","gender":"Male","name":"&ME","ipis":[],"life-span":{"end":null,"begin":null,"ended":false},"sort-name":"&ME","area":{"name":"Berlin","sort-name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105","iso-3166-2-codes":["DE-BE"],"type-id":null,"disambiguation":"","type":null},"country":"DE","disambiguation":"","type":"Person","begin-area":null,"isnis":[],"end-area":null,"id":"ab886374-8565-4407-ac50-f76baadd4c7f"},{"begin-area":null,"isnis":[],"end-area":null,"id":"d9c7bb14-b8cf-40df-ba00-d839d5ad0f06","country":"DE","disambiguation":"mastering engineer Helmut Erler","type":"Person","name":"≠","ipis":[],"life-span":{"end":null,"ended":false,"begin":null},"sort-name":"≠","area":{"name":"Berlin","id":"c9ac1239-e832-41bc-9930-e252a1fd1105","sort-name":"Berlin","disambiguation":"","iso-3166-2-codes":["DE-BE"],"type-id":null,"type":null},"type-id":"b6e035f4-3ce9-331c-97df-83397230b0df","gender-id":"36d3d30a-839d-3eda-8cb3-29be4384e4a9","gender":"Male"}],"artist-offset":0,"artist-count":7959}
2 changes: 1 addition & 1 deletion src/Hqub.MusicBrainz.Tests/Data/artist-get.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/Hqub.MusicBrainz.Tests/Data/artist-search.json

Large diffs are not rendered by default.

Loading
Loading