From c19643e321ae2d3fc11f5dcf279e3c9ad81a2dbd Mon Sep 17 00:00:00 2001 From: aglowinthefield <146008217+aglowinthefield@users.noreply.github.com> Date: Wed, 10 Dec 2025 16:17:03 -0500 Subject: [PATCH] More cleanup and DI --- .../Discogs/DiscogsListsFixture.cs | 7 +- .../Discogs/DiscogsWantlistFixture.cs | 5 +- .../ImportLists/Discogs/DiscogsListsParser.cs | 68 ++++++++----------- .../ImportLists/Discogs/DiscogsWantlist.cs | 4 +- .../Discogs/DiscogsWantlistParser.cs | 33 +++++---- 5 files changed, 55 insertions(+), 62 deletions(-) diff --git a/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsListsFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsListsFixture.cs index 98769a012..f1fc83181 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsListsFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsListsFixture.cs @@ -2,6 +2,7 @@ using System.Net; using FluentAssertions; using Moq; +using NLog; using NUnit.Framework; using NzbDrone.Common.Http; using NzbDrone.Core.ImportLists; @@ -18,15 +19,15 @@ public class DiscogsListsFixture private DiscogsListsParser _parser; private Mock _httpClient; private DiscogsListsSettings _settings; + private Logger _logger; [SetUp] public void SetUp() { _httpClient = new Mock(); - _parser = new DiscogsListsParser(); _settings = new DiscogsListsSettings { Token = "token", ListId = "123", BaseUrl = "https://api.discogs.com" }; - - _parser.SetContext(_httpClient.Object, _settings); + _logger = LogManager.GetCurrentClassLogger(); + _parser = new DiscogsListsParser(_settings, _httpClient.Object, _logger); } [Test] diff --git a/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsWantlistFixture.cs b/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsWantlistFixture.cs index 0874c6e93..0e54e6e71 100644 --- a/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsWantlistFixture.cs +++ b/src/NzbDrone.Core.Test/ImportListTests/Discogs/DiscogsWantlistFixture.cs @@ -23,10 +23,8 @@ public class DiscogsWantlistFixture public void SetUp() { _httpClient = new Mock(); - _parser = new DiscogsWantlistParser(); _settings = new DiscogsWantlistSettings { Token = "token", Username = "user", BaseUrl = "https://api.discogs.com" }; - - _parser.SetContext(_httpClient.Object, _settings); + _parser = new DiscogsWantlistParser(_settings, _httpClient.Object); } [Test] @@ -133,5 +131,4 @@ private ImportListResponse BuildWantlistResponse(string content, HttpStatusCode return new ImportListResponse(importListRequest, httpResponse); } - } diff --git a/src/NzbDrone.Core/ImportLists/Discogs/DiscogsListsParser.cs b/src/NzbDrone.Core/ImportLists/Discogs/DiscogsListsParser.cs index 0e6a960f1..79f10526b 100644 --- a/src/NzbDrone.Core/ImportLists/Discogs/DiscogsListsParser.cs +++ b/src/NzbDrone.Core/ImportLists/Discogs/DiscogsListsParser.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Common.Http; @@ -11,68 +10,61 @@ namespace NzbDrone.Core.ImportLists.Discogs; public class DiscogsListsParser : IParseImportListResponse { - private IHttpClient _httpClient; - private DiscogsListsSettings _settings; - private Logger _logger; + private readonly DiscogsListsSettings _settings; + private readonly IHttpClient _httpClient; + private readonly Logger _logger; - public DiscogsListsParser() + public DiscogsListsParser(DiscogsListsSettings settings, IHttpClient httpClient, Logger logger) { - } - - public void SetContext(IHttpClient httpClient, DiscogsListsSettings settings, Logger logger = null) - { - _httpClient = httpClient; _settings = settings; - _logger = logger ?? LogManager.GetCurrentClassLogger(); + _httpClient = httpClient; + _logger = logger; } public IList ParseResponse(ImportListResponse importListResponse) { - DiscogsParserHelper.EnsureValidResponse(importListResponse, - "Discogs API responded with HTML content. List may be too large or API may be unavailable."); + var items = new List(); + + if (!PreProcess(importListResponse)) + { + return items; + } var jsonResponse = Json.Deserialize(importListResponse.Content); if (jsonResponse?.Items == null) { - return new List(); + return items; } - var items = new List(); - - foreach (var resourceUrl in jsonResponse.Items.Where(IsReleaseItem).Select(item => item.ResourceUrl)) + foreach (var item in jsonResponse.Items) { - var releaseInfo = TryFetchRelease(resourceUrl); - - if (releaseInfo != null) + if (item.Type == "release" && item.ResourceUrl.IsNotNullOrWhiteSpace()) { - items.Add(releaseInfo); + try + { + var releaseInfo = FetchReleaseDetails(item.ResourceUrl); + items.AddIfNotNull(releaseInfo); + } + catch (Exception ex) + { + _logger.Error(ex, "Discogs release details API call resulted in an unexpected exception"); + } } } return items; } - private static bool IsReleaseItem(DiscogsListItem item) + private bool PreProcess(ImportListResponse importListResponse) { - return item?.Type == "release" && item.ResourceUrl.IsNotNullOrWhiteSpace(); + DiscogsParserHelper.EnsureValidResponse(importListResponse, + "Discogs API responded with HTML content. List may be too large or API may be unavailable."); + return true; } - private ImportListItemInfo TryFetchRelease(string resourceUrl) + private ImportListItemInfo FetchReleaseDetails(string resourceUrl) { - if (_httpClient == null || _settings == null) - { - return null; - } - - try - { - return DiscogsParserHelper.FetchReleaseDetails(_httpClient, _settings.Token, resourceUrl); - } - catch (Exception ex) - { - _logger?.Error(ex, "Failed to fetch release details from Discogs API for resource URL: {0}. Skipping this item.", resourceUrl); - return null; - } + return DiscogsParserHelper.FetchReleaseDetails(_httpClient, _settings.Token, resourceUrl); } } diff --git a/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlist.cs b/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlist.cs index 6a1d138c9..e9358b82d 100644 --- a/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlist.cs +++ b/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlist.cs @@ -30,9 +30,7 @@ public override IImportListRequestGenerator GetRequestGenerator() public override IParseImportListResponse GetParser() { - var parser = new DiscogsWantlistParser(); - parser.SetContext(_httpClient, Settings); - return parser; + return new DiscogsWantlistParser(Settings, _httpClient); } } } diff --git a/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlistParser.cs b/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlistParser.cs index 415e64c2b..8074ea91f 100644 --- a/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlistParser.cs +++ b/src/NzbDrone.Core/ImportLists/Discogs/DiscogsWantlistParser.cs @@ -9,33 +9,31 @@ namespace NzbDrone.Core.ImportLists.Discogs; public class DiscogsWantlistParser : IParseImportListResponse { - private IHttpClient _httpClient; - private DiscogsWantlistSettings _settings; + private readonly DiscogsWantlistSettings _settings; + private readonly IHttpClient _httpClient; - public DiscogsWantlistParser() + public DiscogsWantlistParser(DiscogsWantlistSettings settings, IHttpClient httpClient) { - } - - public void SetContext(IHttpClient httpClient, DiscogsWantlistSettings settings) - { - _httpClient = httpClient; _settings = settings; + _httpClient = httpClient; } public IList ParseResponse(ImportListResponse importListResponse) { - DiscogsParserHelper.EnsureValidResponse(importListResponse, - "Discogs API responded with HTML content. Wantlist may be too large or API may be unavailable."); + var items = new List(); + + if (!PreProcess(importListResponse)) + { + return items; + } var jsonResponse = Json.Deserialize(importListResponse.Content); if (jsonResponse?.Wants == null) { - return new List(); + return items; } - var items = new List(); - foreach (var want in jsonResponse.Wants) { var basicInfo = want?.BasicInformation; @@ -52,7 +50,7 @@ public IList ParseResponse(ImportListResponse importListResp continue; } - items.Add(new ImportListItemInfo + items.AddIfNotNull(new ImportListItemInfo { Artist = basicInfo.Artists.First().Name, Album = basicInfo.Title @@ -61,4 +59,11 @@ public IList ParseResponse(ImportListResponse importListResp return items; } + + private bool PreProcess(ImportListResponse importListResponse) + { + DiscogsParserHelper.EnsureValidResponse(importListResponse, + "Discogs API responded with HTML content. Wantlist may be too large or API may be unavailable."); + return true; + } }