diff --git a/CHANGELOG.md b/CHANGELOG.md index 4a990d61..fe2f2f66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +This release contains **BREAKING CHANGES**. See the [v4.0 Upgrade Guide][breaking4] for required +changes you need to make. + +[breaking4]: https://recyclarr.dev/wiki/upgrade-guide/v4.0 + +### Changed + +- **BREAKING**: Sonarr `quality_definition` configuration updated to address unexpected changes in + Sonarr v4 that caused it to stop working. See upgrade guide for details. +- Default for `preferred_ratio` changed from `1.0` to using the values from the guide. + +### Removed + +- **BREAKING**: Sonarr's `hybrid` quality definition removed. + ### Fixed - Do not warn about empty configuration YAML files when they aren't really empty. diff --git a/schemas/config-schema.json b/schemas/config-schema.json index 09915dd1..b8d889ce 100644 --- a/schemas/config-schema.json +++ b/schemas/config-schema.json @@ -104,6 +104,22 @@ } } }, + "quality_definition": { + "type": "object", + "additionalProperties": false, + "required": ["type"], + "properties": { + "type": { + "type": "string" + }, + "preferred_ratio": { + "type": "number", + "default": 1.0, + "minimum": 0.0, + "maximum": 1.0 + } + } + }, "radarr_instance": { "type": "object", "additionalProperties": false, @@ -123,20 +139,7 @@ "description": "The API key from Radarr." }, "quality_definition": { - "type": "object", - "additionalProperties": false, - "required": ["type"], - "properties": { - "type": { - "type": "string" - }, - "preferred_ratio": { - "type": "number", - "default": 1.0, - "minimum": 0.0, - "maximum": 1.0 - } - } + "$ref": "#/$defs/quality_definition" }, "delete_old_custom_formats": { "$ref": "#/$defs/delete_old_custom_formats" @@ -165,7 +168,7 @@ "description": "The API key from Sonarr." }, "quality_definition": { - "type": "string" + "$ref": "#/$defs/quality_definition" }, "delete_old_custom_formats": { "$ref": "#/$defs/delete_old_custom_formats" diff --git a/src/Recyclarr/Command/RadarrCommand.cs b/src/Recyclarr/Command/RadarrCommand.cs index 1302220c..0aa72475 100644 --- a/src/Recyclarr/Command/RadarrCommand.cs +++ b/src/Recyclarr/Command/RadarrCommand.cs @@ -7,9 +7,9 @@ using Serilog; using TrashLib.Config.Services; using TrashLib.Http; using TrashLib.Services.CustomFormat; +using TrashLib.Services.QualitySize; using TrashLib.Services.Radarr; using TrashLib.Services.Radarr.Config; -using TrashLib.Services.Radarr.QualityDefinition; namespace Recyclarr.Command; @@ -73,8 +73,8 @@ internal class RadarrCommand : ServiceCommand if (config.QualityDefinition != null) { - var updater = scope.Resolve(); - await updater.Process(Preview, config); + var updater = scope.Resolve(); + await updater.Process(Preview, config.QualityDefinition, guideService); } if (config.CustomFormats.Count > 0) diff --git a/src/Recyclarr/Command/SonarrCommand.cs b/src/Recyclarr/Command/SonarrCommand.cs index 17f65fcd..a0447254 100644 --- a/src/Recyclarr/Command/SonarrCommand.cs +++ b/src/Recyclarr/Command/SonarrCommand.cs @@ -7,9 +7,9 @@ using Serilog; using TrashLib.Config.Services; using TrashLib.Http; using TrashLib.Services.CustomFormat; +using TrashLib.Services.QualitySize; using TrashLib.Services.Sonarr; using TrashLib.Services.Sonarr.Config; -using TrashLib.Services.Sonarr.QualityDefinition; using TrashLib.Services.Sonarr.ReleaseProfile; using TrashLib.Services.Sonarr.ReleaseProfile.Guide; @@ -108,10 +108,10 @@ public class SonarrCommand : ServiceCommand await updater.Process(Preview, config); } - if (!string.IsNullOrEmpty(config.QualityDefinition)) + if (config.QualityDefinition != null) { - var updater = scope.Resolve(); - await updater.Process(Preview, config); + var updater = scope.Resolve(); + await updater.Process(Preview, config.QualityDefinition, guideService); } if (config.CustomFormats.Count > 0) diff --git a/src/Recyclarr/Config/ConfigurationLoader.cs b/src/Recyclarr/Config/ConfigurationLoader.cs index 2b5ce8c2..dfef2096 100644 --- a/src/Recyclarr/Config/ConfigurationLoader.cs +++ b/src/Recyclarr/Config/ConfigurationLoader.cs @@ -58,7 +58,8 @@ public class ConfigurationLoader : IConfigurationLoader switch (e.InnerException) { case InvalidCastException: - _log.Error("Incompatible value assigned/used at line {Line}", line); + _log.Error("Incompatible value assigned/used at line {Line}: {Msg}", line, + e.InnerException.Message); break; default: diff --git a/src/Recyclarr/config-template.yml b/src/Recyclarr/config-template.yml index f65b35ad..21990ef1 100644 --- a/src/Recyclarr/config-template.yml +++ b/src/Recyclarr/config-template.yml @@ -16,15 +16,18 @@ # Configuration specific to Sonarr sonarr: - # Set the URL/API Key to your actual instance - - base_url: http://localhost:8989 - api_key: f7e74ba6c80046e39e076a27af5a8444 + series: + # Set the URL/API Key to your actual instance + base_url: http://localhost:8989 + api_key: YOUR_KEY_HERE - # Quality definitions from the guide to sync to Sonarr. Choice: anime, series, hybrid - quality_definition: hybrid + # Quality definitions from the guide to sync to Sonarr. Choices: series, anime + quality_definition: + type: series - # Release profiles from the guide to sync to Sonarr. - # You can optionally add tags and make negative scores strictly ignored + # Release profiles from the guide to sync to Sonarr v3 (Sonarr v4 does not use this!) + # Use `recyclarr sonarr --list-release-profiles` for values you can put here. + # https://trash-guides.info/Sonarr/Sonarr-Release-Profile-RegEx/ release_profiles: # Series - trash_ids: @@ -38,9 +41,10 @@ sonarr: # Configuration specific to Radarr. radarr: - # Set the URL/API Key to your actual instance - - base_url: http://localhost:7878 - api_key: bf99da49d0b0488ea34e4464aa63a0e5 + movies: + # Set the URL/API Key to your actual instance + base_url: http://localhost:7878 + api_key: YOUR_KEY_HERE # Which quality definition in the guide to sync to Radarr. Only choice right now is 'movie' quality_definition: @@ -51,7 +55,9 @@ radarr: delete_old_custom_formats: false custom_formats: - # A list of custom formats to sync to Radarr. Must match the "trash_id" in the guide JSON. + # A list of custom formats to sync to Radarr. + # Use `recyclarr radarr --list-custom-formats` for values you can put here. + # https://trash-guides.info/Radarr/Radarr-collection-of-custom-formats/ - trash_ids: - ed38b889b31be83fda192888e2286d83 # BR-DISK - 90cedc1fea7ea5d11298bebd3d1d3223 # EVO (no WEBDL) diff --git a/src/TrashLib.Tests/GlobalTestSetup.cs b/src/TrashLib.Tests/GlobalTestSetup.cs index 1bf5a195..56e86031 100644 --- a/src/TrashLib.Tests/GlobalTestSetup.cs +++ b/src/TrashLib.Tests/GlobalTestSetup.cs @@ -2,6 +2,8 @@ using System.Diagnostics.CodeAnalysis; using FluentAssertions; using NUnit.Framework; +namespace TrashLib.Tests; + [SetUpFixture] [SuppressMessage("ReSharper", "CheckNamespace")] public class GlobalTestSetup diff --git a/src/TrashLib.Tests/Radarr/QualityDefinition/RadarrQualityDataTest.cs b/src/TrashLib.Tests/QualityDefinition/QualitySizeDataTest.cs similarity index 58% rename from src/TrashLib.Tests/Radarr/QualityDefinition/RadarrQualityDataTest.cs rename to src/TrashLib.Tests/QualityDefinition/QualitySizeDataTest.cs index 0989ed29..e6f4b698 100644 --- a/src/TrashLib.Tests/Radarr/QualityDefinition/RadarrQualityDataTest.cs +++ b/src/TrashLib.Tests/QualityDefinition/QualitySizeDataTest.cs @@ -1,12 +1,12 @@ using FluentAssertions; using NUnit.Framework; -using TrashLib.Services.Radarr.QualityDefinition; +using TrashLib.Services.QualitySize; -namespace TrashLib.Tests.Radarr.QualityDefinition; +namespace TrashLib.Tests.QualityDefinition; [TestFixture] [Parallelizable(ParallelScope.All)] -public class RadarrQualityDataTest +public class QualitySizeDataTest { private static readonly object[] PreferredTestValues = { @@ -14,17 +14,17 @@ public class RadarrQualityDataTest new object?[] {100m, 101m, true}, new object?[] {100m, 98m, true}, new object?[] {100m, null, true}, - new object?[] {RadarrQualityItem.PreferredUnlimitedThreshold, null, false}, - new object?[] {RadarrQualityItem.PreferredUnlimitedThreshold - 1, null, true}, + new object?[] {QualitySizeItem.PreferredUnlimitedThreshold, null, false}, + new object?[] {QualitySizeItem.PreferredUnlimitedThreshold - 1, null, true}, new object?[] - {RadarrQualityItem.PreferredUnlimitedThreshold, RadarrQualityItem.PreferredUnlimitedThreshold, true} + {QualitySizeItem.PreferredUnlimitedThreshold, QualitySizeItem.PreferredUnlimitedThreshold, true} }; [TestCaseSource(nameof(PreferredTestValues))] public void PreferredDifferent_WithVariousValues_ReturnsExpectedResult(decimal guideValue, decimal? radarrValue, bool isDifferent) { - var data = new RadarrQualityItem("", 0, 0, guideValue); + var data = new QualitySizeItem("", 0, 0, guideValue); data.IsPreferredDifferent(radarrValue) .Should().Be(isDifferent); } @@ -35,19 +35,19 @@ public class RadarrQualityDataTest { 400m, 1.0m, - RadarrQualityItem.PreferredUnlimitedThreshold + QualitySizeItem.PreferredUnlimitedThreshold }, new[] { - RadarrQualityItem.PreferredUnlimitedThreshold, + QualitySizeItem.PreferredUnlimitedThreshold, 1.0m, - RadarrQualityItem.PreferredUnlimitedThreshold + QualitySizeItem.PreferredUnlimitedThreshold }, new[] { - RadarrQualityItem.PreferredUnlimitedThreshold - 1m, + QualitySizeItem.PreferredUnlimitedThreshold - 1m, 1.0m, - RadarrQualityItem.PreferredUnlimitedThreshold - 1m + QualitySizeItem.PreferredUnlimitedThreshold - 1m }, new[] { @@ -67,54 +67,54 @@ public class RadarrQualityDataTest public void InterpolatedPreferred_VariousValues_ExpectedResults(decimal max, decimal ratio, decimal expectedResult) { - var data = new RadarrQualityItem("", 0, max, 0); + var data = new QualitySizeItem("", 0, max, 0); data.InterpolatedPreferred(ratio).Should().Be(expectedResult); } [Test] public void AnnotatedPreferred_OutsideThreshold_EqualsSameValueWithUnlimited() { - const decimal testVal = RadarrQualityItem.PreferredUnlimitedThreshold; - var data = new RadarrQualityItem("", 0, 0, testVal); + const decimal testVal = QualitySizeItem.PreferredUnlimitedThreshold; + var data = new QualitySizeItem("", 0, 0, testVal); data.AnnotatedPreferred.Should().Be($"{testVal} (Unlimited)"); } [Test] public void AnnotatedPreferred_WithinThreshold_EqualsSameStringValue() { - const decimal testVal = RadarrQualityItem.PreferredUnlimitedThreshold - 1; - var data = new RadarrQualityItem("", 0, 0, testVal); + const decimal testVal = QualitySizeItem.PreferredUnlimitedThreshold - 1; + var data = new QualitySizeItem("", 0, 0, testVal); data.AnnotatedPreferred.Should().Be($"{testVal}"); } [Test] public void Preferred_AboveThreshold_EqualsSameValue() { - const decimal testVal = RadarrQualityItem.PreferredUnlimitedThreshold + 1; - var data = new RadarrQualityItem("", 0, 0, testVal); + const decimal testVal = QualitySizeItem.PreferredUnlimitedThreshold + 1; + var data = new QualitySizeItem("", 0, 0, testVal); data.Preferred.Should().Be(testVal); } [Test] public void PreferredForApi_AboveThreshold_EqualsNull() { - const decimal testVal = RadarrQualityItem.PreferredUnlimitedThreshold + 1; - var data = new RadarrQualityItem("", 0, 0, testVal); + const decimal testVal = QualitySizeItem.PreferredUnlimitedThreshold + 1; + var data = new QualitySizeItem("", 0, 0, testVal); data.PreferredForApi.Should().Be(null); } [Test] public void PreferredForApi_HighestWithinThreshold_EqualsSameValue() { - const decimal testVal = RadarrQualityItem.PreferredUnlimitedThreshold - 0.1m; - var data = new RadarrQualityItem("", 0, 0, testVal); + const decimal testVal = QualitySizeItem.PreferredUnlimitedThreshold - 0.1m; + var data = new QualitySizeItem("", 0, 0, testVal); data.PreferredForApi.Should().Be(testVal).And.Be(data.Preferred); } [Test] public void PreferredForApi_LowestWithinThreshold_EqualsSameValue() { - var data = new RadarrQualityItem("", 0, 0, 0); + var data = new QualitySizeItem("", 0, 0, 0); data.PreferredForApi.Should().Be(0); } } diff --git a/src/TrashLib.Tests/Sonarr/QualityDefinition/SonarrQualityDataTest.cs b/src/TrashLib.Tests/Sonarr/QualityDefinition/SonarrQualityDataTest.cs index c108ebb3..2359630c 100644 --- a/src/TrashLib.Tests/Sonarr/QualityDefinition/SonarrQualityDataTest.cs +++ b/src/TrashLib.Tests/Sonarr/QualityDefinition/SonarrQualityDataTest.cs @@ -1,12 +1,12 @@ using FluentAssertions; using NUnit.Framework; -using TrashLib.Services.Common.QualityDefinition; +using TrashLib.Services.QualitySize.Guide; namespace TrashLib.Tests.Sonarr.QualityDefinition; [TestFixture] [Parallelizable(ParallelScope.All)] -public class SonarrQualityDataTest +public class QualitySizeDataTest { private static readonly object[] MaxTestValues = { diff --git a/src/TrashLib/Config/Services/ServiceConfiguration.cs b/src/TrashLib/Config/Services/ServiceConfiguration.cs index 49e0f664..885ebabd 100644 --- a/src/TrashLib/Config/Services/ServiceConfiguration.cs +++ b/src/TrashLib/Config/Services/ServiceConfiguration.cs @@ -16,6 +16,8 @@ public abstract class ServiceConfiguration : IServiceConfiguration new List(); public bool DeleteOldCustomFormats { get; init; } + + public QualityDefinitionConfig? QualityDefinition { get; init; } } [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] @@ -34,3 +36,10 @@ public class QualityProfileScoreConfig public int? Score { get; init; } public bool ResetUnmatchedScores { get; init; } } + +[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] +public class QualityDefinitionConfig +{ + public string Type { get; init; } = ""; + public decimal? PreferredRatio { get; set; } +} diff --git a/src/TrashLib/Services/Common/IGuideService.cs b/src/TrashLib/Services/Common/IGuideService.cs index 736ec9a8..19105a15 100644 --- a/src/TrashLib/Services/Common/IGuideService.cs +++ b/src/TrashLib/Services/Common/IGuideService.cs @@ -1,8 +1,10 @@ using TrashLib.Services.CustomFormat.Models; +using TrashLib.Services.QualitySize; namespace TrashLib.Services.Common; public interface IGuideService { ICollection GetCustomFormatData(); + ICollection GetQualities(); } diff --git a/src/TrashLib/Services/QualitySize/Api/IQualityDefinitionService.cs b/src/TrashLib/Services/QualitySize/Api/IQualityDefinitionService.cs new file mode 100644 index 00000000..21c909be --- /dev/null +++ b/src/TrashLib/Services/QualitySize/Api/IQualityDefinitionService.cs @@ -0,0 +1,7 @@ +namespace TrashLib.Services.QualitySize.Api; + +public interface IQualityDefinitionService +{ + Task> GetQualityDefinition(); + Task> UpdateQualityDefinition(IList newQuality); +} diff --git a/src/TrashLib/Services/Radarr/QualityDefinition/Api/QualityDefinitionService.cs b/src/TrashLib/Services/QualitySize/Api/QualityDefinitionService.cs similarity index 50% rename from src/TrashLib/Services/Radarr/QualityDefinition/Api/QualityDefinitionService.cs rename to src/TrashLib/Services/QualitySize/Api/QualityDefinitionService.cs index 6a89dd0b..722613d8 100644 --- a/src/TrashLib/Services/Radarr/QualityDefinition/Api/QualityDefinitionService.cs +++ b/src/TrashLib/Services/QualitySize/Api/QualityDefinitionService.cs @@ -1,8 +1,7 @@ using Flurl.Http; using TrashLib.Config.Services; -using TrashLib.Services.Radarr.QualityDefinition.Api.Objects; -namespace TrashLib.Services.Radarr.QualityDefinition.Api; +namespace TrashLib.Services.QualitySize.Api; internal class QualityDefinitionService : IQualityDefinitionService { @@ -13,17 +12,17 @@ internal class QualityDefinitionService : IQualityDefinitionService _service = service; } - public async Task> GetQualityDefinition() + public async Task> GetQualityDefinition() { return await _service.Request("qualitydefinition") - .GetJsonAsync>(); + .GetJsonAsync>(); } - public async Task> UpdateQualityDefinition( - IList newQuality) + public async Task> UpdateQualityDefinition( + IList newQuality) { return await _service.Request("qualityDefinition", "update") .PutJsonAsync(newQuality) - .ReceiveJson>(); + .ReceiveJson>(); } } diff --git a/src/TrashLib/Services/Radarr/QualityDefinition/Api/Objects/RadarrQualityDefinitionItem.cs b/src/TrashLib/Services/QualitySize/Api/ServiceQualityDefinitionItem.cs similarity index 75% rename from src/TrashLib/Services/Radarr/QualityDefinition/Api/Objects/RadarrQualityDefinitionItem.cs rename to src/TrashLib/Services/QualitySize/Api/ServiceQualityDefinitionItem.cs index a3614f14..50c3f395 100644 --- a/src/TrashLib/Services/Radarr/QualityDefinition/Api/Objects/RadarrQualityDefinitionItem.cs +++ b/src/TrashLib/Services/QualitySize/Api/ServiceQualityDefinitionItem.cs @@ -1,9 +1,9 @@ using JetBrains.Annotations; -namespace TrashLib.Services.Radarr.QualityDefinition.Api.Objects; +namespace TrashLib.Services.QualitySize.Api; [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] -public class RadarrQualityItem +public class ServiceQualityItem { public int Id { get; set; } public string Modifier { get; set; } = ""; @@ -13,10 +13,10 @@ public class RadarrQualityItem } [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] -public class RadarrQualityDefinitionItem +public class ServiceQualityDefinitionItem { public int Id { get; set; } - public RadarrQualityItem? Quality { get; set; } + public ServiceQualityItem? Quality { get; set; } public string Title { get; set; } = ""; public int Weight { get; set; } public decimal MinSize { get; set; } diff --git a/src/TrashLib/Services/Common/QualityDefinition/QualityItem.cs b/src/TrashLib/Services/QualitySize/Guide/QualityItem.cs similarity index 95% rename from src/TrashLib/Services/Common/QualityDefinition/QualityItem.cs rename to src/TrashLib/Services/QualitySize/Guide/QualityItem.cs index 55ac1136..1f341b2f 100644 --- a/src/TrashLib/Services/Common/QualityDefinition/QualityItem.cs +++ b/src/TrashLib/Services/QualitySize/Guide/QualityItem.cs @@ -1,7 +1,7 @@ using System.Globalization; using System.Text; -namespace TrashLib.Services.Common.QualityDefinition; +namespace TrashLib.Services.QualitySize.Guide; public class QualityItem { diff --git a/src/TrashLib/Services/Common/QualityDefinition/QualityGuideParser.cs b/src/TrashLib/Services/QualitySize/Guide/QualitySizeGuideParser.cs similarity index 87% rename from src/TrashLib/Services/Common/QualityDefinition/QualityGuideParser.cs rename to src/TrashLib/Services/QualitySize/Guide/QualitySizeGuideParser.cs index 503d6e08..5ca26f50 100644 --- a/src/TrashLib/Services/Common/QualityDefinition/QualityGuideParser.cs +++ b/src/TrashLib/Services/QualitySize/Guide/QualitySizeGuideParser.cs @@ -5,13 +5,13 @@ using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using Serilog; -namespace TrashLib.Services.Common.QualityDefinition; +namespace TrashLib.Services.QualitySize.Guide; -internal class QualityGuideParser where T : class +internal class QualitySizeGuideParser where T : class { private readonly ILogger _log; - public QualityGuideParser(ILogger log) + public QualitySizeGuideParser(ILogger log) { _log = log; } diff --git a/src/TrashLib/Services/QualitySize/IQualitySizeUpdater.cs b/src/TrashLib/Services/QualitySize/IQualitySizeUpdater.cs new file mode 100644 index 00000000..db44ee7c --- /dev/null +++ b/src/TrashLib/Services/QualitySize/IQualitySizeUpdater.cs @@ -0,0 +1,9 @@ +using TrashLib.Config.Services; +using TrashLib.Services.Common; + +namespace TrashLib.Services.QualitySize; + +public interface IQualitySizeUpdater +{ + Task Process(bool isPreview, QualityDefinitionConfig config, IGuideService guideService); +} diff --git a/src/TrashLib/Services/QualitySize/QualitySizeData.cs b/src/TrashLib/Services/QualitySize/QualitySizeData.cs new file mode 100644 index 00000000..41eff958 --- /dev/null +++ b/src/TrashLib/Services/QualitySize/QualitySizeData.cs @@ -0,0 +1,8 @@ +namespace TrashLib.Services.QualitySize; + +public record QualitySizeData( + // ReSharper disable once NotAccessedPositionalProperty.Global + string TrashId, + string Type, + IReadOnlyCollection Qualities +); diff --git a/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityItem.cs b/src/TrashLib/Services/QualitySize/QualitySizeItem.cs similarity index 77% rename from src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityItem.cs rename to src/TrashLib/Services/QualitySize/QualitySizeItem.cs index 9882fffd..0f3d1298 100644 --- a/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityItem.cs +++ b/src/TrashLib/Services/QualitySize/QualitySizeItem.cs @@ -1,10 +1,10 @@ -using TrashLib.Services.Common.QualityDefinition; +using TrashLib.Services.QualitySize.Guide; -namespace TrashLib.Services.Radarr.QualityDefinition; +namespace TrashLib.Services.QualitySize; -public class RadarrQualityItem : QualityItem +public class QualitySizeItem : QualityItem { - public RadarrQualityItem(string quality, decimal min, decimal max, decimal preferred) + public QualitySizeItem(string quality, decimal min, decimal max, decimal preferred) : base(quality, min, max) { Preferred = preferred; diff --git a/src/TrashLib/Services/QualitySize/QualitySizeUpdater.cs b/src/TrashLib/Services/QualitySize/QualitySizeUpdater.cs new file mode 100644 index 00000000..95a865ce --- /dev/null +++ b/src/TrashLib/Services/QualitySize/QualitySizeUpdater.cs @@ -0,0 +1,127 @@ +using CliFx.Infrastructure; +using Common.Extensions; +using Serilog; +using TrashLib.Config.Services; +using TrashLib.Services.Common; +using TrashLib.Services.QualitySize.Api; + +namespace TrashLib.Services.QualitySize; + +internal class QualitySizeUpdater : IQualitySizeUpdater +{ + private readonly ILogger _log; + private readonly IQualityDefinitionService _api; + private readonly IConsole _console; + + public QualitySizeUpdater( + ILogger logger, + IQualityDefinitionService api, + IConsole console) + { + _log = logger; + _api = api; + _console = console; + } + + public async Task Process(bool isPreview, QualityDefinitionConfig config, IGuideService guideService) + { + _log.Information("Processing Quality Definition: {QualityDefinition}", config.Type); + var qualityDefinitions = guideService.GetQualities(); + var qualityTypeInConfig = config.Type; + + var selectedQuality = qualityDefinitions + .FirstOrDefault(x => x.Type.EqualsIgnoreCase(qualityTypeInConfig)); + + if (selectedQuality == null) + { + _log.Error("The specified quality definition type does not exist: {Type}", qualityTypeInConfig); + return; + } + + if (config.PreferredRatio is not null) + { + _log.Information("Using an explicit preferred ratio which will override values from the guide"); + + // Fix an out of range ratio and warn the user + if (config.PreferredRatio is < 0 or > 1) + { + var clampedRatio = Math.Clamp(config.PreferredRatio.Value, 0, 1); + _log.Warning("Your `preferred_ratio` of {CurrentRatio} is out of range. " + + "It must be a decimal between 0.0 and 1.0. It has been clamped to {ClampedRatio}", + config.PreferredRatio, clampedRatio); + + config.PreferredRatio = clampedRatio; + } + + // Apply a calculated preferred size + foreach (var quality in selectedQuality.Qualities) + { + quality.Preferred = quality.InterpolatedPreferred(config.PreferredRatio.Value); + } + } + + if (isPreview) + { + PrintQualityPreview(selectedQuality.Qualities); + return; + } + + await ProcessQualityDefinition(selectedQuality.Qualities); + } + + private void PrintQualityPreview(IReadOnlyCollection quality) + { + _console.Output.WriteLine(""); + const string format = "{0,-20} {1,-10} {2,-15} {3,-15}"; + _console.Output.WriteLine(format, "Quality", "Min", "Max", "Preferred"); + _console.Output.WriteLine(format, "-------", "---", "---", "---------"); + + foreach (var q in quality) + { + _console.Output.WriteLine(format, q.Quality, q.AnnotatedMin, q.AnnotatedMax, q.AnnotatedPreferred); + } + + _console.Output.WriteLine(""); + } + + private static bool QualityIsDifferent(ServiceQualityDefinitionItem a, QualitySizeItem b) + { + return b.IsMinDifferent(a.MinSize) || b.IsMaxDifferent(a.MaxSize) || + a.PreferredSize is not null && b.IsPreferredDifferent(a.PreferredSize); + } + + private async Task ProcessQualityDefinition(IReadOnlyCollection guideQuality) + { + var serverQuality = await _api.GetQualityDefinition(); + + var newQuality = new List(); + foreach (var qualityData in guideQuality) + { + var serverEntry = serverQuality.FirstOrDefault(q => q.Quality?.Name == qualityData.Quality); + if (serverEntry == null) + { + _log.Warning("Server lacks quality definition for {Quality}; it will be skipped", qualityData.Quality); + continue; + } + + if (!QualityIsDifferent(serverEntry, qualityData)) + { + continue; + } + + // Not using the original list again, so it's OK to modify the definition ref type objects in-place. + serverEntry.MinSize = qualityData.MinForApi; + serverEntry.MaxSize = qualityData.MaxForApi; + serverEntry.PreferredSize = qualityData.PreferredForApi; + newQuality.Add(serverEntry); + + _log.Debug("Setting Quality " + + "[Name: {Name}] [Source: {Source}] [Min: {Min}] [Max: {Max}] [Preferred: {Preferred}]", + serverEntry.Quality?.Name, serverEntry.Quality?.Source, serverEntry.MinSize, serverEntry.MaxSize, + serverEntry.PreferredSize); + } + + await _api.UpdateQualityDefinition(newQuality); + _log.Information("Number of updated qualities: {Count}", newQuality.Count); + } +} diff --git a/src/TrashLib/Services/Radarr/Config/RadarrConfiguration.cs b/src/TrashLib/Services/Radarr/Config/RadarrConfiguration.cs index 8e996dd8..f680900e 100644 --- a/src/TrashLib/Services/Radarr/Config/RadarrConfiguration.cs +++ b/src/TrashLib/Services/Radarr/Config/RadarrConfiguration.cs @@ -6,12 +6,4 @@ namespace TrashLib.Services.Radarr.Config; [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] public class RadarrConfiguration : ServiceConfiguration { - public QualityDefinitionConfig? QualityDefinition { get; init; } -} - -[UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] -public class QualityDefinitionConfig -{ - public string Type { get; init; } = ""; - public decimal PreferredRatio { get; set; } = 1.0m; } diff --git a/src/TrashLib/Services/Radarr/IRadarrGuideService.cs b/src/TrashLib/Services/Radarr/IRadarrGuideService.cs index 625a621f..ce1cfd67 100644 --- a/src/TrashLib/Services/Radarr/IRadarrGuideService.cs +++ b/src/TrashLib/Services/Radarr/IRadarrGuideService.cs @@ -1,9 +1,7 @@ using TrashLib.Services.Common; -using TrashLib.Services.Radarr.QualityDefinition; namespace TrashLib.Services.Radarr; public interface IRadarrGuideService : IGuideService { - ICollection GetQualities(); } diff --git a/src/TrashLib/Services/Radarr/LocalRepoRadarrGuideService.cs b/src/TrashLib/Services/Radarr/LocalRepoRadarrGuideService.cs index b26c293a..4e19a998 100644 --- a/src/TrashLib/Services/Radarr/LocalRepoRadarrGuideService.cs +++ b/src/TrashLib/Services/Radarr/LocalRepoRadarrGuideService.cs @@ -1,9 +1,9 @@ using Serilog; using TrashLib.Repo; -using TrashLib.Services.Common.QualityDefinition; using TrashLib.Services.CustomFormat.Guide; using TrashLib.Services.CustomFormat.Models; -using TrashLib.Services.Radarr.QualityDefinition; +using TrashLib.Services.QualitySize; +using TrashLib.Services.QualitySize.Guide; namespace TrashLib.Services.Radarr; @@ -11,16 +11,16 @@ public class LocalRepoRadarrGuideService : IRadarrGuideService { private readonly IRepoPathsFactory _pathsFactory; private readonly ICustomFormatLoader _cfLoader; - private readonly QualityGuideParser _parser; + private readonly QualitySizeGuideParser _parser; public LocalRepoRadarrGuideService(IRepoPathsFactory pathsFactory, ILogger log, ICustomFormatLoader cfLoader) { _pathsFactory = pathsFactory; _cfLoader = cfLoader; - _parser = new QualityGuideParser(log); + _parser = new QualitySizeGuideParser(log); } - public ICollection GetQualities() + public ICollection GetQualities() => _parser.GetQualities(_pathsFactory.Create().RadarrQualityPaths); public ICollection GetCustomFormatData() diff --git a/src/TrashLib/Services/Radarr/QualityDefinition/Api/IQualityDefinitionService.cs b/src/TrashLib/Services/Radarr/QualityDefinition/Api/IQualityDefinitionService.cs deleted file mode 100644 index 2049f30f..00000000 --- a/src/TrashLib/Services/Radarr/QualityDefinition/Api/IQualityDefinitionService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using TrashLib.Services.Radarr.QualityDefinition.Api.Objects; - -namespace TrashLib.Services.Radarr.QualityDefinition.Api; - -public interface IQualityDefinitionService -{ - Task> GetQualityDefinition(); - Task> UpdateQualityDefinition(IList newQuality); -} diff --git a/src/TrashLib/Services/Radarr/QualityDefinition/IRadarrQualityDefinitionUpdater.cs b/src/TrashLib/Services/Radarr/QualityDefinition/IRadarrQualityDefinitionUpdater.cs deleted file mode 100644 index 8d4d1508..00000000 --- a/src/TrashLib/Services/Radarr/QualityDefinition/IRadarrQualityDefinitionUpdater.cs +++ /dev/null @@ -1,8 +0,0 @@ -using TrashLib.Services.Radarr.Config; - -namespace TrashLib.Services.Radarr.QualityDefinition; - -public interface IRadarrQualityDefinitionUpdater -{ - Task Process(bool isPreview, RadarrConfiguration config); -} diff --git a/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityData.cs b/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityData.cs deleted file mode 100644 index cdc8ab90..00000000 --- a/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityData.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace TrashLib.Services.Radarr.QualityDefinition; - -public record RadarrQualityData( - // ReSharper disable once NotAccessedPositionalProperty.Global - string TrashId, - string Type, - IReadOnlyCollection Qualities -); diff --git a/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityDefinitionUpdater.cs b/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityDefinitionUpdater.cs deleted file mode 100644 index 8f8adfc3..00000000 --- a/src/TrashLib/Services/Radarr/QualityDefinition/RadarrQualityDefinitionUpdater.cs +++ /dev/null @@ -1,130 +0,0 @@ -using CliFx.Infrastructure; -using Common.Extensions; -using Serilog; -using TrashLib.Services.Radarr.Config; -using TrashLib.Services.Radarr.QualityDefinition.Api; -using TrashLib.Services.Radarr.QualityDefinition.Api.Objects; - -namespace TrashLib.Services.Radarr.QualityDefinition; - -internal class RadarrQualityDefinitionUpdater : IRadarrQualityDefinitionUpdater -{ - private readonly ILogger _log; - private readonly IQualityDefinitionService _api; - private readonly IConsole _console; - private readonly IRadarrGuideService _guide; - - public RadarrQualityDefinitionUpdater( - ILogger logger, - IRadarrGuideService guide, - IQualityDefinitionService api, - IConsole console) - { - _log = logger; - _guide = guide; - _api = api; - _console = console; - } - - public async Task Process(bool isPreview, RadarrConfiguration config) - { - _log.Information("Processing Quality Definition: {QualityDefinition}", config.QualityDefinition!.Type); - var qualityDefinitions = _guide.GetQualities(); - var qualityTypeInConfig = config.QualityDefinition!.Type; - - var selectedQuality = qualityDefinitions - .FirstOrDefault(x => x.Type.EqualsIgnoreCase(qualityTypeInConfig)); - - if (selectedQuality == null) - { - _log.Error("The specified quality definition type does not exist: {Type}", qualityTypeInConfig); - return; - } - - // Fix an out of range ratio and warn the user - if (config.QualityDefinition.PreferredRatio is < 0 or > 1) - { - var clampedRatio = Math.Clamp(config.QualityDefinition.PreferredRatio, 0, 1); - _log.Warning("Your `preferred_ratio` of {CurrentRatio} is out of range. " + - "It must be a decimal between 0.0 and 1.0. It has been clamped to {ClampedRatio}", - config.QualityDefinition.PreferredRatio, clampedRatio); - - config.QualityDefinition.PreferredRatio = clampedRatio; - } - - // Apply a calculated preferred size - foreach (var quality in selectedQuality.Qualities) - { - quality.Preferred = quality.InterpolatedPreferred(config.QualityDefinition.PreferredRatio); - } - - if (isPreview) - { - PrintQualityPreview(selectedQuality.Qualities); - return; - } - - await ProcessQualityDefinition(selectedQuality.Qualities); - } - - private void PrintQualityPreview(IEnumerable quality) - { - _console.Output.WriteLine(""); - const string format = "{0,-20} {1,-10} {2,-15} {3,-15}"; - _console.Output.WriteLine(format, "Quality", "Min", "Max", "Preferred"); - _console.Output.WriteLine(format, "-------", "---", "---", "---------"); - - foreach (var q in quality) - { - _console.Output.WriteLine(format, q.Quality, q.AnnotatedMin, q.AnnotatedMax, q.AnnotatedPreferred); - } - - _console.Output.WriteLine(""); - } - - private async Task ProcessQualityDefinition(IEnumerable guideQuality) - { - var serverQuality = await _api.GetQualityDefinition(); - await UpdateQualityDefinition(serverQuality, guideQuality); - } - - private async Task UpdateQualityDefinition(IReadOnlyCollection serverQuality, - IEnumerable guideQuality) - { - static bool QualityIsDifferent(RadarrQualityDefinitionItem a, RadarrQualityItem b) - { - return b.IsMinDifferent(a.MinSize) || - b.IsMaxDifferent(a.MaxSize) || - b.IsPreferredDifferent(a.PreferredSize); - } - - var newQuality = new List(); - foreach (var qualityData in guideQuality) - { - var entry = serverQuality.FirstOrDefault(q => q.Quality?.Name == qualityData.Quality); - if (entry == null) - { - _log.Warning("Server lacks quality definition for {Quality}; it will be skipped", qualityData.Quality); - continue; - } - - if (!QualityIsDifferent(entry, qualityData)) - { - continue; - } - - // Not using the original list again, so it's OK to modify the definition ref type objects in-place. - entry.MinSize = qualityData.MinForApi; - entry.MaxSize = qualityData.MaxForApi; - entry.PreferredSize = qualityData.PreferredForApi; - newQuality.Add(entry); - - _log.Debug("Setting Quality " + - "[Name: {Name}] [Source: {Source}] [Min: {Min}] [Max: {Max}] [Preferred: {Preferred}]", - entry.Quality?.Name, entry.Quality?.Source, entry.MinSize, entry.MaxSize, entry.PreferredSize); - } - - await _api.UpdateQualityDefinition(newQuality); - _log.Information("Number of updated qualities: {Count}", newQuality.Count); - } -} diff --git a/src/TrashLib/Services/Radarr/RadarrAutofacModule.cs b/src/TrashLib/Services/Radarr/RadarrAutofacModule.cs index af6dcce9..2e59db20 100644 --- a/src/TrashLib/Services/Radarr/RadarrAutofacModule.cs +++ b/src/TrashLib/Services/Radarr/RadarrAutofacModule.cs @@ -1,7 +1,7 @@ using Autofac; +using TrashLib.Services.QualitySize; +using TrashLib.Services.QualitySize.Api; using TrashLib.Services.Radarr.Config; -using TrashLib.Services.Radarr.QualityDefinition; -using TrashLib.Services.Radarr.QualityDefinition.Api; namespace TrashLib.Services.Radarr; @@ -12,7 +12,7 @@ public class RadarrAutofacModule : Module builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); - builder.RegisterType().As(); + builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType(); diff --git a/src/TrashLib/Services/Sonarr/Config/SonarrConfiguration.cs b/src/TrashLib/Services/Sonarr/Config/SonarrConfiguration.cs index 067a2257..3b61ac95 100644 --- a/src/TrashLib/Services/Sonarr/Config/SonarrConfiguration.cs +++ b/src/TrashLib/Services/Sonarr/Config/SonarrConfiguration.cs @@ -7,8 +7,6 @@ public class SonarrConfiguration : ServiceConfiguration { public IList ReleaseProfiles { get; [UsedImplicitly] init; } = Array.Empty(); - - public string QualityDefinition { get; [UsedImplicitly] init; } = ""; } public class ReleaseProfileConfig diff --git a/src/TrashLib/Services/Sonarr/QualityDefinition/ISonarrQualityDefinitionUpdater.cs b/src/TrashLib/Services/Sonarr/QualityDefinition/ISonarrQualityDefinitionUpdater.cs deleted file mode 100644 index 7be18a50..00000000 --- a/src/TrashLib/Services/Sonarr/QualityDefinition/ISonarrQualityDefinitionUpdater.cs +++ /dev/null @@ -1,8 +0,0 @@ -using TrashLib.Services.Sonarr.Config; - -namespace TrashLib.Services.Sonarr.QualityDefinition; - -public interface ISonarrQualityDefinitionUpdater -{ - Task Process(bool isPreview, SonarrConfiguration config); -} diff --git a/src/TrashLib/Services/Sonarr/QualityDefinition/SonarrQualityData.cs b/src/TrashLib/Services/Sonarr/QualityDefinition/SonarrQualityData.cs deleted file mode 100644 index 064d8766..00000000 --- a/src/TrashLib/Services/Sonarr/QualityDefinition/SonarrQualityData.cs +++ /dev/null @@ -1,10 +0,0 @@ -using TrashLib.Services.Common.QualityDefinition; - -namespace TrashLib.Services.Sonarr.QualityDefinition; - -public record SonarrQualityData( - // ReSharper disable once NotAccessedPositionalProperty.Global - string TrashId, - string Type, - IReadOnlyCollection Qualities -); diff --git a/src/TrashLib/Services/Sonarr/QualityDefinition/SonarrQualityDefinitionUpdater.cs b/src/TrashLib/Services/Sonarr/QualityDefinition/SonarrQualityDefinitionUpdater.cs deleted file mode 100644 index e858364e..00000000 --- a/src/TrashLib/Services/Sonarr/QualityDefinition/SonarrQualityDefinitionUpdater.cs +++ /dev/null @@ -1,181 +0,0 @@ -using System.Text.RegularExpressions; -using CliFx.Infrastructure; -using Common.Extensions; -using Serilog; -using TrashLib.Services.Common.QualityDefinition; -using TrashLib.Services.Sonarr.Api; -using TrashLib.Services.Sonarr.Api.Objects; -using TrashLib.Services.Sonarr.Config; -using TrashLib.Services.Sonarr.ReleaseProfile.Guide; - -namespace TrashLib.Services.Sonarr.QualityDefinition; - -internal class SonarrQualityDefinitionUpdater : ISonarrQualityDefinitionUpdater -{ - private readonly ILogger _log; - private readonly ISonarrApi _api; - private readonly IConsole _console; - private readonly ISonarrGuideService _guide; - private readonly Regex _regexHybrid = new(@"720|1080", RegexOptions.Compiled); - - public SonarrQualityDefinitionUpdater( - ILogger logger, - ISonarrGuideService guide, - ISonarrApi api, - IConsole console) - { - _log = logger; - _guide = guide; - _api = api; - _console = console; - } - - private SonarrQualityData? GetQualityOrError(ICollection qualityDefinitions, string type) - { - var quality = qualityDefinitions.FirstOrDefault(x => x.Type.EqualsIgnoreCase(type)); - if (quality is null) - { - _log.Error( - "The following quality definition is required for hybrid, but was not found in the guide: {Type}", - type); - } - - return quality; - } - - public async Task Process(bool isPreview, SonarrConfiguration config) - { - _log.Information("Processing Quality Definition: {QualityDefinition}", config.QualityDefinition); - var qualityDefinitions = _guide.GetQualities(); - var qualityTypeInConfig = config.QualityDefinition; - - SonarrQualityData? selectedQuality; - - if (config.QualityDefinition.EqualsIgnoreCase("hybrid")) - { - var animeQuality = GetQualityOrError(qualityDefinitions, "anime"); - var seriesQuality = GetQualityOrError(qualityDefinitions, "series"); - if (animeQuality is null || seriesQuality is null) - { - return; - } - - selectedQuality = BuildHybridQuality(animeQuality.Qualities, seriesQuality.Qualities); - } - else - { - selectedQuality = qualityDefinitions - .FirstOrDefault(x => x.Type.EqualsIgnoreCase(qualityTypeInConfig)); - - if (selectedQuality == null) - { - _log.Error("The specified quality definition type does not exist: {Type}", qualityTypeInConfig); - return; - } - } - - if (isPreview) - { - PrintQualityPreview(selectedQuality.Qualities); - return; - } - - await ProcessQualityDefinition(selectedQuality.Qualities); - } - - private SonarrQualityData BuildHybridQuality( - IReadOnlyCollection anime, - IReadOnlyCollection series) - { - _log.Information( - "Notice: Hybrid only functions on 720/1080 qualities and uses non-anime values for the rest (e.g. 2160)"); - - var hybrid = new List(); - foreach (var left in series) - { - // Any qualities that anime doesn't care about get immediately added from Series quality - var match = _regexHybrid.Match(left.Quality); - if (!match.Success) - { - _log.Debug("Using 'Series' Quality For: {QualityName}", left.Quality); - hybrid.Add(left); - continue; - } - - // If there's a quality in Series that Anime doesn't know about, we add the Series quality - var right = anime.FirstOrDefault(row => row.Quality == left.Quality); - if (right == null) - { - _log.Error("Could not find matching anime quality for series quality named {QualityName}", - left.Quality); - hybrid.Add(left); - continue; - } - - hybrid.Add(new QualityItem(left.Quality, - Math.Min(left.Min, right.Min), - Math.Max(left.Max, right.Max))); - } - - return new SonarrQualityData("", "hybrid", hybrid); - } - - private void PrintQualityPreview(IEnumerable quality) - { - _console.Output.WriteLine(""); - const string format = "{0,-20} {1,-10} {2,-15}"; - _console.Output.WriteLine(format, "Quality", "Min", "Max"); - _console.Output.WriteLine(format, "-------", "---", "---"); - - foreach (var q in quality) - { - _console.Output.WriteLine(format, q.Quality, q.AnnotatedMin, q.AnnotatedMax); - } - - _console.Output.WriteLine(""); - } - - private async Task ProcessQualityDefinition(IEnumerable guideQuality) - { - var serverQuality = await _api.GetQualityDefinition(); - await UpdateQualityDefinition(serverQuality, guideQuality); - } - - private async Task UpdateQualityDefinition(IReadOnlyCollection serverQuality, - IEnumerable guideQuality) - { - static bool QualityIsDifferent(SonarrQualityDefinitionItem a, QualityItem b) - { - return b.IsMinDifferent(a.MinSize) || - b.IsMaxDifferent(a.MaxSize); - } - - var newQuality = new List(); - foreach (var qualityData in guideQuality) - { - var entry = serverQuality.FirstOrDefault(q => q.Quality?.Name == qualityData.Quality); - if (entry == null) - { - _log.Warning("Server lacks quality definition for {Quality}; it will be skipped", qualityData.Quality); - continue; - } - - if (!QualityIsDifferent(entry, qualityData)) - { - continue; - } - - // Not using the original list again, so it's OK to modify the definition ref type objects in-place. - entry.MinSize = qualityData.MinForApi; - entry.MaxSize = qualityData.MaxForApi; - newQuality.Add(entry); - - _log.Debug("Setting Quality " + - "[Name: {Name}] [Source: {Source}] [Min: {Min}] [Max: {Max}]", - entry.Quality?.Name, entry.Quality?.Source, entry.MinSize, entry.MaxSize); - } - - await _api.UpdateQualityDefinition(newQuality); - _log.Information("Number of updated qualities: {Count}", newQuality.Count); - } -} diff --git a/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/ISonarrGuideService.cs b/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/ISonarrGuideService.cs index fd3ed526..3cde8f2b 100644 --- a/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/ISonarrGuideService.cs +++ b/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/ISonarrGuideService.cs @@ -1,5 +1,4 @@ using TrashLib.Services.Common; -using TrashLib.Services.Sonarr.QualityDefinition; namespace TrashLib.Services.Sonarr.ReleaseProfile.Guide; @@ -7,5 +6,4 @@ public interface ISonarrGuideService : IGuideService { IReadOnlyCollection GetReleaseProfileData(); ReleaseProfileData? GetUnfilteredProfileById(string trashId); - ICollection GetQualities(); } diff --git a/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/LocalRepoSonarrGuideService.cs b/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/LocalRepoSonarrGuideService.cs index 7c1ab38f..bc60f5f1 100644 --- a/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/LocalRepoSonarrGuideService.cs +++ b/src/TrashLib/Services/Sonarr/ReleaseProfile/Guide/LocalRepoSonarrGuideService.cs @@ -5,10 +5,10 @@ using MoreLinq; using Newtonsoft.Json; using Serilog; using TrashLib.Repo; -using TrashLib.Services.Common.QualityDefinition; using TrashLib.Services.CustomFormat.Guide; using TrashLib.Services.CustomFormat.Models; -using TrashLib.Services.Sonarr.QualityDefinition; +using TrashLib.Services.QualitySize; +using TrashLib.Services.QualitySize.Guide; using TrashLib.Services.Sonarr.ReleaseProfile.Filters; namespace TrashLib.Services.Sonarr.ReleaseProfile.Guide; @@ -19,7 +19,7 @@ public class LocalRepoSonarrGuideService : ISonarrGuideService private readonly ILogger _log; private readonly ICustomFormatLoader _cfLoader; private readonly Lazy> _data; - private readonly QualityGuideParser _parser; + private readonly QualitySizeGuideParser _parser; public LocalRepoSonarrGuideService( IRepoPathsFactory pathsFactory, @@ -30,10 +30,10 @@ public class LocalRepoSonarrGuideService : ISonarrGuideService _log = log; _cfLoader = cfLoader; _data = new Lazy>(GetReleaseProfileDataImpl); - _parser = new QualityGuideParser(log); + _parser = new QualitySizeGuideParser(log); } - public ICollection GetQualities() + public ICollection GetQualities() => _parser.GetQualities(_pathsFactory.Create().SonarrQualityPaths); public ICollection GetCustomFormatData() diff --git a/src/TrashLib/Services/Sonarr/SonarrAutofacModule.cs b/src/TrashLib/Services/Sonarr/SonarrAutofacModule.cs index bab771a0..ad8b661f 100644 --- a/src/TrashLib/Services/Sonarr/SonarrAutofacModule.cs +++ b/src/TrashLib/Services/Sonarr/SonarrAutofacModule.cs @@ -2,7 +2,6 @@ using Autofac; using Autofac.Extras.Ordering; using TrashLib.Services.Sonarr.Api; using TrashLib.Services.Sonarr.Config; -using TrashLib.Services.Sonarr.QualityDefinition; using TrashLib.Services.Sonarr.ReleaseProfile; using TrashLib.Services.Sonarr.ReleaseProfile.Filters; using TrashLib.Services.Sonarr.ReleaseProfile.Guide; @@ -33,8 +32,5 @@ public class SonarrAutofacModule : Module typeof(StrictNegativeScoresFilter)) .As() .OrderByRegistration(); - - // Quality Definition Support - builder.RegisterType().As(); } }