implemented search artists in MusicBrainz
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Net.Http;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace HarmonyWinUI.Models
|
||||
{
|
||||
class MusicBrainz
|
||||
{
|
||||
private String URLprefix = "https://musicbrainz.org/ws/2/";
|
||||
private static readonly HttpClient httpClient = createHttpClient();
|
||||
|
||||
public async Task<List<MusicBrainzArtist>> getArtists(String query)
|
||||
{
|
||||
ArgumentException.ThrowIfNullOrWhiteSpace(query);
|
||||
|
||||
string searchQuery = Uri.EscapeDataString($"artist:{query}");
|
||||
MusicBrainzArtistResponse? response = await getData<MusicBrainzArtistResponse>(
|
||||
$"artist?query={searchQuery}&fmt=json&limit=10"
|
||||
);
|
||||
|
||||
return response?.Artists ?? new List<MusicBrainzArtist>();
|
||||
}
|
||||
|
||||
private async Task<T?> getData<T>(String relativeURL)
|
||||
{
|
||||
Uri requestURL = new Uri(new Uri(URLprefix), relativeURL);
|
||||
|
||||
using HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestURL);
|
||||
using HttpResponseMessage response = await httpClient.SendAsync(
|
||||
request,
|
||||
HttpCompletionOption.ResponseHeadersRead
|
||||
);
|
||||
response.EnsureSuccessStatusCode();
|
||||
|
||||
await using Stream jsonStream = await response.Content.ReadAsStreamAsync();
|
||||
return await JsonSerializer.DeserializeAsync<T>(jsonStream);
|
||||
}
|
||||
|
||||
private static HttpClient createHttpClient()
|
||||
{
|
||||
HttpClient client = new HttpClient
|
||||
{
|
||||
Timeout = TimeSpan.FromSeconds(30)
|
||||
};
|
||||
client.DefaultRequestHeaders.UserAgent.ParseAdd(
|
||||
"HarmonyWinUI/1.0 (https://harmony.tpsoft.org/)"
|
||||
);
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
private sealed class MusicBrainzArtistResponse
|
||||
{
|
||||
[JsonPropertyName("artists")]
|
||||
public List<MusicBrainzArtist>? Artists { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
public class MusicBrainzArtist
|
||||
{
|
||||
public string? ID { get; set; }
|
||||
public string? Type { get; set; }
|
||||
[JsonPropertyName("type-id")]
|
||||
public string? TypeID { get; set; }
|
||||
public int? Score { get; set; }
|
||||
public string? Name { get; set; } = "";
|
||||
public string? Gender { get; set; }
|
||||
public string? Country { get; set; }
|
||||
public string? ImageURL { get; set; }
|
||||
|
||||
public MusicBrainzArtist() { }
|
||||
|
||||
public MusicBrainzArtist(
|
||||
string? id,
|
||||
string? type,
|
||||
string? typeID,
|
||||
int? score,
|
||||
string? name,
|
||||
string? gender,
|
||||
string? country)
|
||||
{
|
||||
this.ID = id;
|
||||
this.Type = type;
|
||||
this.TypeID = typeID;
|
||||
this.Score = score;
|
||||
this.Name = name;
|
||||
this.Gender = gender;
|
||||
this.Country = country;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user