From ce338e24f3a1ca97232c59cf378f144069986c6a Mon Sep 17 00:00:00 2001 From: Robert Dailey Date: Sat, 22 Jul 2023 11:31:50 -0500 Subject: [PATCH] feat: Quality profile sync Initial implementation with sync support for the following fields: - Name - Upgrade Allowed - Min Format Score - Cutoff - Cutoff Format Score - Items Quality profiles are always created if they are defined under `quality_profiles` at the top-level. Within a quality profile configuration, Recyclarr will not modify quality profile fields if those corresponding properties in the config are omitted. --- CHANGELOG.md | 1 + schemas/config-schema.json | 49 +- .../runConfigurations/sync___preview.xml | 2 +- src/Recyclarr.Cli/CompositionRoot.cs | 2 + .../Api/IQualityProfileService.cs | 4 +- .../QualityProfile/Api/QualityProfileDto.cs | 116 +++- .../Api/QualityProfileService.cs | 31 +- .../QualityProfileApiFetchPhase.cs | 8 +- .../QualityProfileApiPersistencePhase.cs | 84 +-- .../QualityProfileConfigPhase.cs | 28 +- .../QualityProfileNoticePhase.cs | 57 ++ .../QualityProfilePreviewPhase.cs | 150 ++++- .../QualityProfileStatCalculator.cs | 92 +++ .../QualityProfileTransactionPhase.cs | 107 ++-- .../QualityProfile/QualityItemOrganizer.cs | 128 ++++ .../QualityProfileAutofacModule.cs | 2 + .../QualityProfileExtensions.cs | 122 ++++ .../QualityProfileSyncPipeline.cs | 3 + .../QualityProfile/UpdatedFormatScore.cs | 29 +- .../QualityProfile/UpdatedQualityProfile.cs | 49 ++ .../UpdatedQualityProfileValidator.cs | 26 + .../ReleaseProfileDataValidationFilterer.cs | 2 +- .../Extensions/CollectionExtensions.cs | 5 + .../FluentValidationExtensions.cs | 50 +- .../FluentValidation/IManualValidator.cs | 9 + .../Sonarr/SonarrCapabilityEnforcer.cs | 18 + .../Parsing/ConfigValidationExecutor.cs | 26 +- .../Config/Parsing/ConfigYamlDataObjects.cs | 18 + .../ConfigYamlDataObjectsValidation.cs | 67 +- ...rProfile.cs => ConfigYamlMapperProfile.cs} | 12 +- .../Config/Services/ServiceConfiguration.cs | 23 +- src/tests/Recyclarr.Cli.TestLibrary/NewQp.cs | 64 +- .../Api/QualityProfileDtoTest.cs | 82 +++ .../QualityProfileConfigPhaseTest.cs | 29 +- .../QualityProfileTransactionPhaseTest.cs | 94 ++- .../QualityItemOrganizerTest.cs | 117 ++++ .../QualityProfileExtensionsTest.cs | 578 ++++++++++++++++++ .../UpdatedQualityProfileTest.cs | 119 ++++ .../UpdatedQualityProfileValidatorTest.cs | 52 ++ .../Sonarr/SonarrCapabilityEnforcerTest.cs | 32 +- .../ConfigYamlDataObjectsValidationTest.cs | 169 +++++ .../Parsing/ConfigYamlMapperProfileTest.cs | 44 ++ 42 files changed, 2489 insertions(+), 211 deletions(-) create mode 100644 src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileNoticePhase.cs create mode 100644 src/Recyclarr.Cli/Pipelines/QualityProfile/PipelinePhases/QualityProfileStatCalculator.cs create mode 100644 src/Recyclarr.Cli/Pipelines/QualityProfile/QualityItemOrganizer.cs create mode 100644 src/Recyclarr.Cli/Pipelines/QualityProfile/QualityProfileExtensions.cs create mode 100644 src/Recyclarr.Cli/Pipelines/QualityProfile/UpdatedQualityProfile.cs create mode 100644 src/Recyclarr.Cli/Pipelines/QualityProfile/UpdatedQualityProfileValidator.cs create mode 100644 src/Recyclarr.Common/FluentValidation/IManualValidator.cs rename src/Recyclarr.TrashLib/Config/Parsing/{ConfigurationMapperProfile.cs => ConfigYamlMapperProfile.cs} (64%) create mode 100644 src/tests/Recyclarr.Cli.Tests/Pipelines/QualityProfile/Api/QualityProfileDtoTest.cs create mode 100644 src/tests/Recyclarr.Cli.Tests/Pipelines/QualityProfile/QualityItemOrganizerTest.cs create mode 100644 src/tests/Recyclarr.Cli.Tests/Pipelines/QualityProfile/QualityProfileExtensionsTest.cs create mode 100644 src/tests/Recyclarr.Cli.Tests/Pipelines/QualityProfile/UpdatedQualityProfileTest.cs create mode 100644 src/tests/Recyclarr.Cli.Tests/Pipelines/QualityProfile/UpdatedQualityProfileValidatorTest.cs create mode 100644 src/tests/Recyclarr.TrashLib.Tests/Config/Parsing/ConfigYamlDataObjectsValidationTest.cs create mode 100644 src/tests/Recyclarr.TrashLib.Tests/Config/Parsing/ConfigYamlMapperProfileTest.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 8baf3709..9565e549 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `base_url` and `api_key` are now optional. These can be implicitly set via secrets that follow a naming convention. See the Secrets reference page on the wiki for details. +- Quality Profiles can now be created & synced to Radarr, Sonarr v3, and Sonarr v4. ### Changed diff --git a/schemas/config-schema.json b/schemas/config-schema.json index b38e9871..f6be283c 100644 --- a/schemas/config-schema.json +++ b/schemas/config-schema.json @@ -100,6 +100,7 @@ }, "quality_profiles": { "type": "array", + "description": "An array of quality profiles that exist in the remote service along with any configuration properties that Recyclarr should use to modify that quality profile.", "minItems": 1, "items": { "type": "object", @@ -107,12 +108,58 @@ "required": ["name"], "properties": { "name": { - "type": "string" + "type": "string", + "description": "The name of the quality profile to which settings should apply" }, "reset_unmatched_scores": { "type": "boolean", "description": "If set to true, enables setting scores to 0 in quality profiles where either a CF was not mentioned in the trash_ids array or it was in that list but did not get a score (e.g. no score in guide).", "default": false + }, + "upgrades_allowed": { + "type": "object", + "additionalProperties": false, + "required": ["until_quality"], + "properties": { + "until_quality": { + "type": "string" + }, + "until_score": { + "type": "number" + } + } + }, + "min_format_score": { + "type": "number" + }, + "quality_sort": { + "enum": ["bottom", "top"], + "default": "top" + }, + "qualities": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": ["name"], + "properties": { + "name": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "default": true + }, + "qualities": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + } + } } } } diff --git a/src/.idea/.idea.Recyclarr/.idea/runConfigurations/sync___preview.xml b/src/.idea/.idea.Recyclarr/.idea/runConfigurations/sync___preview.xml index ee8b1a4e..5c7f4707 100644 --- a/src/.idea/.idea.Recyclarr/.idea/runConfigurations/sync___preview.xml +++ b/src/.idea/.idea.Recyclarr/.idea/runConfigurations/sync___preview.xml @@ -1,7 +1,7 @@