From 5b41c710f6add4a74a0cf65d61b80ff0a58f3369 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Tue, 9 Jul 2024 18:35:58 +0300 Subject: [PATCH] New: Match only custom formats with score --- .../Profiles/Quality/QualityProfileFormatItem.js | 4 ++-- .../Profiles/Quality/QualityProfileFormatItems.js | 11 ++++++++++- .../CustomFormats/CustomFormatCalculationService.cs | 11 ++++++++++- src/NzbDrone.Core/Profiles/ProfileFormatItem.cs | 2 +- .../Profiles/Qualities/QualityProfile.cs | 2 +- .../Profiles/Quality/QualityProfileResource.cs | 5 ++++- 6 files changed, 28 insertions(+), 7 deletions(-) diff --git a/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItem.js b/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItem.js index 5ef4add2d..3ca04bebf 100644 --- a/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItem.js +++ b/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItem.js @@ -56,13 +56,13 @@ class QualityProfileFormatItem extends Component { QualityProfileFormatItem.propTypes = { formatId: PropTypes.number.isRequired, name: PropTypes.string.isRequired, - score: PropTypes.number.isRequired, + score: PropTypes.number, onScoreChange: PropTypes.func }; QualityProfileFormatItem.defaultProps = { // To handle the case score is deleted during edit - score: 0 + score: null }; export default QualityProfileFormatItem; diff --git a/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItems.js b/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItems.js index 7b90dec6c..cfb226727 100644 --- a/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItems.js +++ b/frontend/src/Settings/Profiles/Quality/QualityProfileFormatItems.js @@ -18,9 +18,18 @@ function calcOrder(profileFormatItems) { return [...profileFormatItems].sort((a, b) => { if (b.score !== a.score) { + if (a.score === null) { + return 1; + } + + if (b.score === null) { + return -1; + } + return b.score - a.score; } - return a.name > b.name ? 1 : -1; + + return a.name.localeCompare(b.name); }).map((x) => items[x.format]); } diff --git a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs index 1f0cb296b..8806f9377 100644 --- a/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs +++ b/src/NzbDrone.Core/CustomFormats/CustomFormatCalculationService.cs @@ -148,7 +148,16 @@ namespace NzbDrone.Core.CustomFormats { var matches = new List(); - foreach (var customFormat in allCustomFormats) + var profileFormatItems = input.Series?.QualityProfile?.Value?.FormatItems + .Where(f => f.Score.HasValue) + .Select(f => f.Format) + .ToList(); + + var customFormats = profileFormatItems == null + ? allCustomFormats + : allCustomFormats.Intersect(profileFormatItems).ToList(); + + foreach (var customFormat in customFormats) { var specificationMatches = customFormat.Specifications .GroupBy(t => t.GetType()) diff --git a/src/NzbDrone.Core/Profiles/ProfileFormatItem.cs b/src/NzbDrone.Core/Profiles/ProfileFormatItem.cs index 7f498d172..f484d7fa1 100644 --- a/src/NzbDrone.Core/Profiles/ProfileFormatItem.cs +++ b/src/NzbDrone.Core/Profiles/ProfileFormatItem.cs @@ -6,6 +6,6 @@ namespace NzbDrone.Core.Profiles public class ProfileFormatItem : IEmbeddedDocument { public CustomFormat Format { get; set; } - public int Score { get; set; } + public int? Score { get; set; } } } diff --git a/src/NzbDrone.Core/Profiles/Qualities/QualityProfile.cs b/src/NzbDrone.Core/Profiles/Qualities/QualityProfile.cs index f8a214042..b4f10427a 100644 --- a/src/NzbDrone.Core/Profiles/Qualities/QualityProfile.cs +++ b/src/NzbDrone.Core/Profiles/Qualities/QualityProfile.cs @@ -89,7 +89,7 @@ namespace NzbDrone.Core.Profiles.Qualities public int CalculateCustomFormatScore(List formats) { - return FormatItems.Where(x => formats.Contains(x.Format)).Sum(x => x.Score); + return FormatItems.Where(x => x.Score.HasValue && formats.Contains(x.Format)).Sum(x => x.Score.Value); } } } diff --git a/src/Sonarr.Api.V3/Profiles/Quality/QualityProfileResource.cs b/src/Sonarr.Api.V3/Profiles/Quality/QualityProfileResource.cs index 8f7fef948..ffdc3a332 100644 --- a/src/Sonarr.Api.V3/Profiles/Quality/QualityProfileResource.cs +++ b/src/Sonarr.Api.V3/Profiles/Quality/QualityProfileResource.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Text.Json.Serialization; using NzbDrone.Core.CustomFormats; using NzbDrone.Core.Profiles; using NzbDrone.Core.Profiles.Qualities; @@ -35,7 +36,9 @@ namespace Sonarr.Api.V3.Profiles.Quality { public int Format { get; set; } public string Name { get; set; } - public int Score { get; set; } + + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public int? Score { get; set; } } public static class ProfileResourceMapper