From 33be566fa1755ac2a314196bc08f3b26e05a7167 Mon Sep 17 00:00:00 2001 From: wo80 Date: Sun, 24 Mar 2024 10:38:23 +0100 Subject: [PATCH] Add ToString() method to fluent API requests. --- src/Hqub.MusicBrainz.Client/Example6.cs | 22 +++++++-- .../Services/BrowseRequest.cs | 47 +++++++++++++++---- .../Services/LookupRequest.cs | 10 +++- .../Services/SearchRequest.cs | 10 +++- 4 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/Hqub.MusicBrainz.Client/Example6.cs b/src/Hqub.MusicBrainz.Client/Example6.cs index 46e2bda..69681d4 100644 --- a/src/Hqub.MusicBrainz.Client/Example6.cs +++ b/src/Hqub.MusicBrainz.Client/Example6.cs @@ -60,20 +60,34 @@ public static async Task Search(MusicBrainzClient client, string genre, int limi for (; i < pages && i < MAX_PAGES; i++) { - // Try to avoid rate limit ... - await Task.Delay(1000); + // Advance browse offset. + request.Offset(i * limit); - // Advance browse offset and fetch results. + // Check if the request is in cache. + bool cached = await client.Cache.Contains(request.ToString()); + + if (!cached) + { + // Try to avoid MusicBrainz rate limit ... + await Task.Delay(1000); + } + + // Fetch results. groups = await request.Offset(i * limit).GetAsync(); DisplayReleases(groups, i + 1, pages); } + Console.WriteLine(); + if (i == MAX_PAGES) { - Console.WriteLine(); Console.WriteLine("Stopping at page {0} ...", i); } + else + { + Console.WriteLine("Done ..."); + } } private static void DisplayArtists(ArtistList artists) diff --git a/src/Hqub.MusicBrainz/Services/BrowseRequest.cs b/src/Hqub.MusicBrainz/Services/BrowseRequest.cs index 67d685d..2d26480 100644 --- a/src/Hqub.MusicBrainz/Services/BrowseRequest.cs +++ b/src/Hqub.MusicBrainz/Services/BrowseRequest.cs @@ -1,15 +1,14 @@ namespace Hqub.MusicBrainz.Services { using Hqub.MusicBrainz.Entities.Collections; - using System; using System.Threading; using System.Threading.Tasks; /// - /// Prepare a browse request to the MusicBrainz webservice. + /// Prepare a browse request to the MusicBrainz web service. /// /// Any supported MusicBrainz entity. - public class BrowseRequest + public abstract class BrowseRequest { private readonly MusicBrainzClient client; @@ -83,7 +82,7 @@ public BrowseRequest Offset(int offset) } /// - /// Set the type of release or release-group to browse. + /// Set the type of the release or release-group to browse. /// /// The release type (for example 'album'). /// @@ -97,7 +96,7 @@ public BrowseRequest Type(string type) } /// - /// Set the status of release to browse. + /// Set the status of the release to browse. /// /// The release status (for example 'official'). /// @@ -123,10 +122,12 @@ public async Task GetAsync(CancellationToken ct = default) /// /// Initiate the actual request. /// - protected virtual Task BrowseAsync(MusicBrainzClient client, CancellationToken ct) - { - throw new NotImplementedException(); - } + protected abstract Task BrowseAsync(MusicBrainzClient client, CancellationToken ct); + + /// + /// Returns the request path. + /// + public abstract override string ToString(); } #region Helper classes @@ -138,6 +139,7 @@ public ArtistBrowseRequest(MusicBrainzClient client, UrlBuilder builder, string { } + /// protected override async Task BrowseAsync(MusicBrainzClient client, CancellationToken ct) { string url = builder.CreateBrowseUrl(EntityName, relatedEntity, id, limit, offset, include); @@ -146,6 +148,12 @@ protected override async Task BrowseAsync(MusicBrainzClient client, return new ArtistList() { Items = list.Items, Count = list.Count, Offset = list.Offset }; } + + /// + public override string ToString() + { + return builder.CreateBrowseUrl(EntityName, relatedEntity, id, limit, offset, include); + } } class RecordingBrowseRequest : BrowseRequest @@ -155,6 +163,7 @@ public RecordingBrowseRequest(MusicBrainzClient client, UrlBuilder builder, stri { } + /// protected override async Task BrowseAsync(MusicBrainzClient client, CancellationToken ct) { string url = builder.CreateBrowseUrl(EntityName, relatedEntity, id, limit, offset, include); @@ -163,6 +172,12 @@ protected override async Task BrowseAsync(MusicBrainzClient clien return new RecordingList() { Items = list.Items, Count = list.Count, Offset = list.Offset }; } + + /// + public override string ToString() + { + return builder.CreateBrowseUrl(EntityName, relatedEntity, id, limit, offset, include); + } } class ReleaseGroupBrowseRequest : BrowseRequest @@ -172,6 +187,7 @@ public ReleaseGroupBrowseRequest(MusicBrainzClient client, UrlBuilder builder, s { } + /// protected override async Task BrowseAsync(MusicBrainzClient client, CancellationToken ct) { string url = builder.CreateBrowseUrl(EntityName, relatedEntity, id, type, null, limit, offset, include); @@ -180,6 +196,12 @@ protected override async Task BrowseAsync(MusicBrainzClient cl return new ReleaseGroupList() { Items = list.Items, Count = list.Count, Offset = list.Offset }; } + + /// + public override string ToString() + { + return builder.CreateBrowseUrl(EntityName, relatedEntity, id, type, null, limit, offset, include); + } } class ReleaseBrowseRequest : BrowseRequest @@ -189,6 +211,7 @@ public ReleaseBrowseRequest(MusicBrainzClient client, UrlBuilder builder, string { } + /// protected override async Task BrowseAsync(MusicBrainzClient client, CancellationToken ct) { string url = builder.CreateBrowseUrl(EntityName, relatedEntity, id, type, status, limit, offset, include); @@ -197,6 +220,12 @@ protected override async Task BrowseAsync(MusicBrainzClient client, return new ReleaseList() { Items = list.Items, Count = list.Count, Offset = list.Offset }; } + + /// + public override string ToString() + { + return builder.CreateBrowseUrl(EntityName, relatedEntity, id, type, status, limit, offset, include); + } } #endregion diff --git a/src/Hqub.MusicBrainz/Services/LookupRequest.cs b/src/Hqub.MusicBrainz/Services/LookupRequest.cs index 000f19c..498203a 100644 --- a/src/Hqub.MusicBrainz/Services/LookupRequest.cs +++ b/src/Hqub.MusicBrainz/Services/LookupRequest.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; /// - /// Prepare a lookup request to the MusicBrainz webservice. + /// Prepare a lookup request to the MusicBrainz web service. /// /// Any supported MusicBrainz entity. public class LookupRequest @@ -54,5 +54,13 @@ public async Task GetAsync(CancellationToken ct = default) return await client.GetAsync(url, ct); } + + /// + /// Returns the request path. + /// + public override string ToString() + { + return builder.CreateLookupUrl(EntityName, id, include); + } } } diff --git a/src/Hqub.MusicBrainz/Services/SearchRequest.cs b/src/Hqub.MusicBrainz/Services/SearchRequest.cs index de9729d..cfbb3b6 100644 --- a/src/Hqub.MusicBrainz/Services/SearchRequest.cs +++ b/src/Hqub.MusicBrainz/Services/SearchRequest.cs @@ -5,7 +5,7 @@ using System.Threading.Tasks; /// - /// Prepare a search request to the MusicBrainz webservice. + /// Prepare a search request to the MusicBrainz web service. /// /// Any supported MusicBrainz entity. public class SearchRequest @@ -77,5 +77,13 @@ public async Task GetAsync(CancellationToken ct = default) return await client.GetAsync(url, ct); } + + /// + /// Returns the request path. + /// + public override string ToString() + { + return builder.CreateSearchUrl(EntityName, query, limit, offset); + } } }