From 3487f79b5ed4f7e092cc239f1f8a3598f6e530c5 Mon Sep 17 00:00:00 2001 From: Josh Patra Date: Fri, 30 Jan 2026 13:16:26 -0500 Subject: [PATCH] refactor: pass decoded SquidWTF URL from Program.cs to services - Decode base64 URL once at startup in Program.cs - Pass decoded URL as constructor parameter to all SquidWTF services - Services receive plain URL, no decoding logic in service classes - Cleaner separation: encoding/decoding only in Program.cs - All service code remains unchanged, just receives decoded URL --- allstarr/Program.cs | 39 +++++++++++++++++-- .../SquidWTF/SquidWTFDownloadService.cs | 13 ++----- .../SquidWTF/SquidWTFMetadataService.cs | 14 ++----- .../SquidWTF/SquidWTFStartupValidator.cs | 13 ++----- 4 files changed, 46 insertions(+), 33 deletions(-) diff --git a/allstarr/Program.cs b/allstarr/Program.cs index 0fd98ad..f3086bc 100644 --- a/allstarr/Program.cs +++ b/allstarr/Program.cs @@ -12,9 +12,19 @@ using allstarr.Services.Lyrics; using allstarr.Middleware; using allstarr.Filters; using Microsoft.Extensions.Http; +using System.Text; var builder = WebApplication.CreateBuilder(args); +// Decode SquidWTF API base URL once at startup +var squidWtfApiBase = DecodeSquidWtfUrl(); +static string DecodeSquidWtfUrl() +{ + var encoded = "aHR0cHM6Ly90cml0b24uc3F1aWQud3Rm"; + var bytes = Convert.FromBase64String(encoded); + return Encoding.UTF8.GetString(bytes); +} + // Determine backend type FIRST var backendType = builder.Configuration.GetValue("Backend:Type"); @@ -163,9 +173,26 @@ else if (musicService == MusicService.Deezer) } else if (musicService == MusicService.SquidWTF) { - // SquidWTF services - builder.Services.AddSingleton(); - builder.Services.AddSingleton(); + // SquidWTF services - pass decoded URL + builder.Services.AddSingleton(sp => + new SquidWTFMetadataService( + sp.GetRequiredService(), + sp.GetRequiredService>(), + sp.GetRequiredService>(), + sp.GetRequiredService>(), + sp.GetRequiredService(), + squidWtfApiBase)); + builder.Services.AddSingleton(sp => + new SquidWTFDownloadService( + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetRequiredService(), + sp.GetRequiredService>(), + sp.GetRequiredService>(), + sp, + sp.GetRequiredService>(), + squidWtfApiBase)); } // Startup validation - register validators based on backend @@ -180,7 +207,11 @@ else builder.Services.AddSingleton(); builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +builder.Services.AddSingleton(sp => + new SquidWTFStartupValidator( + sp.GetRequiredService>(), + sp.GetRequiredService().CreateClient(), + squidWtfApiBase)); // Register orchestrator as hosted service builder.Services.AddHostedService(); diff --git a/allstarr/Services/SquidWTF/SquidWTFDownloadService.cs b/allstarr/Services/SquidWTF/SquidWTFDownloadService.cs index 31be540..85904c1 100644 --- a/allstarr/Services/SquidWTF/SquidWTFDownloadService.cs +++ b/allstarr/Services/SquidWTF/SquidWTFDownloadService.cs @@ -26,14 +26,7 @@ public class SquidWTFDownloadService : BaseDownloadService private DateTime _lastRequestTime = DateTime.MinValue; private readonly int _minRequestIntervalMs = 200; - private static readonly string SquidWTFApiBase = DecodeBaseUrl(); - - private static string DecodeBaseUrl() - { - var encoded = "aHR0cHM6Ly90cml0b24uc3F1aWQud3Rm"; - var bytes = Convert.FromBase64String(encoded); - return Encoding.UTF8.GetString(bytes); - } + private readonly string SquidWTFApiBase; protected override string ProviderName => "squidwtf"; @@ -45,11 +38,13 @@ public class SquidWTFDownloadService : BaseDownloadService IOptions subsonicSettings, IOptions SquidWTFSettings, IServiceProvider serviceProvider, - ILogger logger) + ILogger logger, + string apiBase) : base(configuration, localLibraryService, metadataService, subsonicSettings.Value, serviceProvider, logger) { _httpClient = httpClientFactory.CreateClient(); _squidwtfSettings = SquidWTFSettings.Value; + SquidWTFApiBase = apiBase; } #region BaseDownloadService Implementation diff --git a/allstarr/Services/SquidWTF/SquidWTFMetadataService.cs b/allstarr/Services/SquidWTF/SquidWTFMetadataService.cs index 2705004..a593353 100644 --- a/allstarr/Services/SquidWTF/SquidWTFMetadataService.cs +++ b/allstarr/Services/SquidWTF/SquidWTFMetadataService.cs @@ -21,27 +21,21 @@ public class SquidWTFMetadataService : IMusicMetadataService private readonly SubsonicSettings _settings; private readonly ILogger _logger; private readonly RedisCacheService _cache; - - private static readonly string BaseUrl = DecodeBaseUrl(); - - private static string DecodeBaseUrl() - { - var encoded = "aHR0cHM6Ly90cml0b24uc3F1aWQud3Rm"; - var bytes = Convert.FromBase64String(encoded); - return Encoding.UTF8.GetString(bytes); - } + private readonly string BaseUrl; public SquidWTFMetadataService( IHttpClientFactory httpClientFactory, IOptions settings, IOptions squidwtfSettings, ILogger logger, - RedisCacheService cache) + RedisCacheService cache, + string baseUrl) { _httpClient = httpClientFactory.CreateClient(); _settings = settings.Value; _logger = logger; _cache = cache; + BaseUrl = baseUrl; // Set up default headers _httpClient.DefaultRequestHeaders.Add("User-Agent", diff --git a/allstarr/Services/SquidWTF/SquidWTFStartupValidator.cs b/allstarr/Services/SquidWTF/SquidWTFStartupValidator.cs index e6e4e07..39b042b 100644 --- a/allstarr/Services/SquidWTF/SquidWTFStartupValidator.cs +++ b/allstarr/Services/SquidWTF/SquidWTFStartupValidator.cs @@ -12,22 +12,15 @@ namespace allstarr.Services.SquidWTF; public class SquidWTFStartupValidator : BaseStartupValidator { private readonly SquidWTFSettings _settings; - - private static readonly string _apiBase = DecodeBaseUrl(); - - private static string DecodeBaseUrl() - { - var encoded = "aHR0cHM6Ly90cml0b24uc3F1aWQud3Rm"; - var bytes = Convert.FromBase64String(encoded); - return Encoding.UTF8.GetString(bytes); - } + private readonly string _apiBase; public override string ServiceName => "SquidWTF"; - public SquidWTFStartupValidator(IOptions settings, HttpClient httpClient) + public SquidWTFStartupValidator(IOptions settings, HttpClient httpClient, string apiBase) : base(httpClient) { _settings = settings.Value; + _apiBase = apiBase; } public override async Task ValidateAsync(CancellationToken cancellationToken)