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> getArtists(String query) { ArgumentException.ThrowIfNullOrWhiteSpace(query); string searchQuery = Uri.EscapeDataString($"artist:{query}"); MusicBrainzArtistResponse? response = await getData( $"artist?query={searchQuery}&fmt=json&limit=10" ); return response?.Artists ?? new List(); } private async Task getData(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(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? 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; } } }