New: (Cardigann) Add multi-select type for settings

pull/1753/head
Bogdan 11 months ago
parent 8c653b5c09
commit 407f43ef9e

@ -8,6 +8,7 @@ using System.Text;
using System.Text.RegularExpressions;
using AngleSharp.Dom;
using Microsoft.AspNetCore.WebUtilities;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NLog;
using NzbDrone.Common.Extensions;
@ -296,6 +297,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
object defaultValue = setting.Type switch
{
"select" => setting.Options.OrderBy(x => x.Key).Select(x => x.Key).ToList().IndexOf(setting.Default).ToString().ParseInt64() ?? 0,
"multi-select" => setting.Defaults?.Select(d => setting.Options.OrderBy(x => x.Key).Select(x => x.Key).ToList().IndexOf(d).ToString().ParseInt64() ?? 0).ToArray() ?? Array.Empty<long>(),
_ => setting.Default
};
@ -303,7 +305,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
if (indexerLogging && setting.Type != "password" && setting.Name != "apikey" && setting.Name != "rsskey")
{
_logger.Trace($"{name} got value {value.ToJson()}");
_logger.Trace("{0} got value {1}", name, value.ToJson(Formatting.None));
}
switch (setting.Type)
@ -323,7 +325,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
case "select":
if (indexerLogging)
{
_logger.Trace($"Setting options: {setting.Options.ToJson()}");
_logger.Trace("Setting options: {0}", setting.Options.ToJson(Formatting.None));
}
var sorted = setting.Options.OrderBy(x => x.Key).ToList();
@ -331,11 +333,28 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
if (indexerLogging)
{
_logger.Debug($"Selected option: {selected.ToJson()}");
_logger.Debug("Selected option: {0}", selected.ToJson(Formatting.None));
}
variables[name] = selected.Key;
break;
case "multi-select":
if (indexerLogging)
{
_logger.Trace("Setting options: {0}", setting.Options.ToJson(Formatting.None));
}
var sortedMulti = setting.Options.OrderBy(x => x.Key).ToList();
var values = value is ICollection collectionMulti ? collectionMulti.Cast<long>() : Array.Empty<long>();
var selectedMulti = sortedMulti.Where((x, i) => values.Contains(i)).ToArray();
if (indexerLogging)
{
_logger.Debug("Selected option: {0}", selectedMulti.ToJson(Formatting.None));
}
variables[name] = selectedMulti.Select(x => x.Key).ToArray();
break;
case "info":
variables[name] = value;
break;
@ -347,7 +366,7 @@ namespace NzbDrone.Core.Indexers.Definitions.Cardigann
if (indexerLogging && setting.Type != "password" && setting.Name != "apikey" && setting.Name != "rsskey" && variables.ContainsKey(name))
{
_logger.Debug($"Setting {setting.Name} to {variables[name].ToJson()}");
_logger.Debug("Setting '{0}' to {1}", setting.Name, variables[name].ToJson(Formatting.None));
}
}

@ -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 @@ namespace Prowlarr.Api.V1.Indexers
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<long>()
},
"checkbox" => bool.TryParse(value.ToString(), out var result) && result,
_ => value?.ToString() ?? string.Empty
};
@ -167,7 +176,12 @@ namespace Prowlarr.Api.V1.Indexers
Name = setting.Name,
Label = setting.Label,
Order = order,
Type = setting.Type == "text" ? "textbox" : setting.Type
Type = setting.Type switch
{
"text" => "textbox",
"multi-select" => "select",
_ => setting.Type
}
};
if (setting.Type == "select")
@ -181,6 +195,17 @@ namespace Prowlarr.Api.V1.Indexers
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
}).ToList();
field.Value = setting.Defaults?.Select(d => sorted.Select(x => x.Key).ToList().IndexOf(d)).ToArray() ?? Array.Empty<int>();
}
else if (setting.Type == "checkbox")
{
field.Value = bool.TryParse(setting.Default, out var value) && value;

Loading…
Cancel
Save