From 466f358efb99a36eb510c8c53857e3410eb1a981 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 18 Jun 2023 15:48:28 +0300 Subject: [PATCH] New: (Cardigann) Add multi-select type for settings --- .../Definitions/Cardigann/CardigannBase.cs | 17 ++++++++++ .../Indexers/IndexerResource.cs | 31 +++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs index d61f413d707..46ffe68b4fe 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs @@ -336,6 +336,23 @@ protected string HandleJsonSelector(SelectorBlock selector, JToken parentObj, Di variables[name] = selected.Key; break; + case "multi-select": + if (indexerLogging) + { + _logger.Trace($"Setting options: {setting.Options.ToJson()}"); + } + + var sortedMulti = setting.Options.OrderBy(x => x.Key).ToList(); + var values = (long[])value; + var selectedMulti = sortedMulti.Where((x, i) => values.Contains(i)).ToArray(); + + if (indexerLogging) + { + _logger.Debug($"Selected option: {selectedMulti.ToJson()}"); + } + + variables[name] = selectedMulti.Select(x => x.Key).ToArray(); + break; case "info": variables[name] = value; break; diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs index 832d7f21919..e39a562b717 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text.Json; using NzbDrone.Common.Extensions; using NzbDrone.Core.Annotations; using NzbDrone.Core.Indexers; @@ -155,6 +156,14 @@ private object MapValue(SettingsField setting, object value) return setting.Type switch { "select" => value.ToString().ParseInt64() ?? 0, + "multi-select" => value switch + { + JsonElement { ValueKind: JsonValueKind.Array } values + => values.EnumerateArray().Select(e => e.ToString().ParseInt64() ?? 0).ToArray(), + JsonElement { ValueKind: JsonValueKind.Number or JsonValueKind.String } singleValue + => new[] { singleValue.ToString().ParseInt64() ?? 0 }, + _ => Array.Empty() + }, "checkbox" => bool.TryParse(value.ToString(), out var result) && result, _ => value?.ToString() ?? string.Empty }; @@ -167,7 +176,12 @@ private Field MapField(SettingsField setting, int order) Name = setting.Name, Label = setting.Label, Order = order, - Type = setting.Type == "text" ? "textbox" : setting.Type + Type = setting.Type switch + { + "text" => "textbox", + "multi-select" => "tagSelect", + _ => setting.Type + } }; if (setting.Type == "select") @@ -176,11 +190,24 @@ private Field MapField(SettingsField setting, int order) field.SelectOptions = sorted.Select((x, i) => new SelectOption { Value = i, - Name = x.Value + Name = x.Value, + Order = i }).ToList(); field.Value = sorted.Select(x => x.Key).ToList().IndexOf(setting.Default); } + else if (setting.Type == "multi-select") + { + var sorted = setting.Options.OrderBy(x => x.Key).ToList(); + field.SelectOptions = sorted.Select((x, i) => new SelectOption + { + Value = i, + Name = x.Value, + Order = i + }).ToList(); + + field.Value = setting.Defaults.Select(d => sorted.Select(x => x.Key).ToList().IndexOf(d)).ToArray(); + } else if (setting.Type == "checkbox") { field.Value = bool.TryParse(setting.Default, out var value) && value;