diff --git a/src/NzbDrone.Core/Datastore/Converters/DictionaryStringObjectConverter.cs b/src/NzbDrone.Common/Serializer/System.Text.Json/DictionaryStringObjectConverter.cs similarity index 95% rename from src/NzbDrone.Core/Datastore/Converters/DictionaryStringObjectConverter.cs rename to src/NzbDrone.Common/Serializer/System.Text.Json/DictionaryStringObjectConverter.cs index 936da358d..506e5f31d 100644 --- a/src/NzbDrone.Core/Datastore/Converters/DictionaryStringObjectConverter.cs +++ b/src/NzbDrone.Common/Serializer/System.Text.Json/DictionaryStringObjectConverter.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; -namespace NzbDrone.Core.Datastore.Converters +namespace NzbDrone.Common.Serializer { - public class DictionaryStringObjectJsonConverter : JsonConverter> + public class DictionaryStringObjectConverter : JsonConverter> { public override Dictionary Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { diff --git a/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs b/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs index 48b98cf6d..c10740d3c 100644 --- a/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs +++ b/src/NzbDrone.Common/Serializer/System.Text.Json/STJson.cs @@ -30,6 +30,7 @@ namespace NzbDrone.Common.Serializer serializerSettings.Converters.Add(new STJHttpUriConverter()); serializerSettings.Converters.Add(new STJTimeSpanConverter()); serializerSettings.Converters.Add(new STJUtcConverter()); + serializerSettings.Converters.Add(new DictionaryStringObjectConverter()); return serializerSettings; } diff --git a/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs b/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs index 909c7e7e3..8acf352e8 100644 --- a/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs +++ b/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs @@ -25,7 +25,7 @@ namespace NzbDrone.Core.Datastore.Converters serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true)); serializerSettings.Converters.Add(new STJTimeSpanConverter()); serializerSettings.Converters.Add(new STJUtcConverter()); - serializerSettings.Converters.Add(new DictionaryStringObjectJsonConverter()); + serializerSettings.Converters.Add(new DictionaryStringObjectConverter()); SerializerSettings = serializerSettings; } diff --git a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs index 2d51907df..a729ae651 100644 --- a/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs +++ b/src/NzbDrone.Core/Indexers/Definitions/Cardigann/CardigannBase.cs @@ -238,7 +238,7 @@ namespace NzbDrone.Core.Indexers.Cardigann { _logger.Debug($"Setting options: {setting.Options.ToJson()}"); var sorted = setting.Options.OrderBy(x => x.Key).ToList(); - var selected = sorted[(int)(long)value]; + var selected = sorted[(int)value]; _logger.Debug($"Selected option: {selected.ToJson()}"); diff --git a/src/NzbDrone.Core/ThingiProvider/ProviderRepository.cs b/src/NzbDrone.Core/ThingiProvider/ProviderRepository.cs index c721ea790..e8a307c5d 100644 --- a/src/NzbDrone.Core/ThingiProvider/ProviderRepository.cs +++ b/src/NzbDrone.Core/ThingiProvider/ProviderRepository.cs @@ -32,7 +32,7 @@ namespace NzbDrone.Core.ThingiProvider serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true)); serializerSettings.Converters.Add(new STJTimeSpanConverter()); serializerSettings.Converters.Add(new STJUtcConverter()); - serializerSettings.Converters.Add(new DictionaryStringObjectJsonConverter()); + serializerSettings.Converters.Add(new DictionaryStringObjectConverter()); _serializerSettings = serializerSettings; } diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerEditorModule.cs b/src/Prowlarr.Api.V1/Indexers/IndexerEditorModule.cs index ad2d78579..323cdc71d 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerEditorModule.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerEditorModule.cs @@ -11,13 +11,15 @@ namespace Prowlarr.Api.V1.Indexers { private readonly IIndexerFactory _indexerService; private readonly IManageCommandQueue _commandQueueManager; - public static readonly IndexerResourceMapper ResourceMapper = new IndexerResourceMapper(); + private readonly IndexerResourceMapper _resourceMapper; - public IndexerEditorModule(IIndexerFactory indexerService, IManageCommandQueue commandQueueManager) + public IndexerEditorModule(IIndexerFactory indexerService, IManageCommandQueue commandQueueManager, IndexerResourceMapper resourceMapper) : base("/indexer/editor") { _indexerService = indexerService; _commandQueueManager = commandQueueManager; + _resourceMapper = resourceMapper; + Put("/", movie => SaveAll()); Delete("/", movie => DeleteIndexers()); } @@ -63,7 +65,7 @@ namespace Prowlarr.Api.V1.Indexers _indexerService.SetProviderCharacteristics(definition); } - return ResponseWithCode(ResourceMapper.ToResource(indexers), HttpStatusCode.Accepted); + return ResponseWithCode(_resourceMapper.ToResource(indexers), HttpStatusCode.Accepted); } private object DeleteIndexers() diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerModule.cs b/src/Prowlarr.Api.V1/Indexers/IndexerModule.cs index 1971db398..c5f64857d 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerModule.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerModule.cs @@ -16,15 +16,13 @@ namespace Prowlarr.Api.V1.Indexers { public class IndexerModule : ProviderModuleBase { - public static readonly IndexerResourceMapper ResourceMapper = new IndexerResourceMapper(); - private IIndexerFactory _indexerFactory { get; set; } private ISearchForNzb _nzbSearchService { get; set; } private IDownloadMappingService _downloadMappingService { get; set; } private IDownloadService _downloadService { get; set; } - public IndexerModule(IndexerFactory indexerFactory, ISearchForNzb nzbSearchService, IDownloadMappingService downloadMappingService, IDownloadService downloadService) - : base(indexerFactory, "indexer", ResourceMapper) + public IndexerModule(IndexerFactory indexerFactory, ISearchForNzb nzbSearchService, IDownloadMappingService downloadMappingService, IDownloadService downloadService, IndexerResourceMapper resourceMapper) + : base(indexerFactory, "indexer", resourceMapper) { _indexerFactory = indexerFactory; _nzbSearchService = nzbSearchService; diff --git a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs index dbbf3d2da..bb7361130 100644 --- a/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs +++ b/src/Prowlarr.Api.V1/Indexers/IndexerResource.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.Linq; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Annotations; using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers.Cardigann; +using NzbDrone.Core.IndexerVersions; using Prowlarr.Http.ClientSchema; namespace Prowlarr.Api.V1.Indexers @@ -24,6 +26,13 @@ namespace Prowlarr.Api.V1.Indexers public class IndexerResourceMapper : ProviderResourceMapper { + private readonly IIndexerDefinitionUpdateService _definitionService; + + public IndexerResourceMapper(IIndexerDefinitionUpdateService definitionService) + { + _definitionService = definitionService; + } + public override IndexerResource ToResource(IndexerDefinition definition) { if (definition == null) @@ -77,11 +86,15 @@ namespace Prowlarr.Api.V1.Indexers var standardFields = base.ToResource(definition).Fields.Select(x => x.Name).ToList(); var settings = (CardigannSettings)definition.Settings; + + var cardigannDefinition = _definitionService.GetDefinition(settings.DefinitionFile); + foreach (var field in resource.Fields) { if (!standardFields.Contains(field.Name)) { - settings.ExtraFieldData[field.Name] = field.Value; + var cardigannSetting = cardigannDefinition.Settings.FirstOrDefault(x => x.Name == field.Name); + settings.ExtraFieldData[field.Name] = MapValue(cardigannSetting, field.Value); } } } @@ -95,30 +108,53 @@ namespace Prowlarr.Api.V1.Indexers return definition; } - private Field MapField(SettingsField fieldAttribute, int order) + private object MapValue(SettingsField setting, object value) + { + if (setting.Type == "select") + { + return value.ToString().ParseInt32() ?? 0; + } + else if (setting.Type == "checkbox") + { + if (bool.TryParse(value.ToString(), out var result)) + { + return result; + } + else + { + return false; + } + } + else + { + return value.ToString(); + } + } + + private Field MapField(SettingsField setting, int order) { var field = new Field { - Name = fieldAttribute.Name, - Label = fieldAttribute.Label, + Name = setting.Name, + Label = setting.Label, Order = order, - Type = fieldAttribute.Type == "text" ? "textbox" : fieldAttribute.Type + Type = setting.Type == "text" ? "textbox" : setting.Type }; - if (fieldAttribute.Type == "select") + if (setting.Type == "select") { - var sorted = fieldAttribute.Options.OrderBy(x => x.Key).ToList(); + 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 = sorted.Select(x => x.Key).ToList().IndexOf(fieldAttribute.Default); + field.Value = sorted.Select(x => x.Key).ToList().IndexOf(setting.Default); } - else if (fieldAttribute.Type == "checkbox") + else if (setting.Type == "checkbox") { - if (bool.TryParse(fieldAttribute.Default, out var value)) + if (bool.TryParse(setting.Default, out var value)) { field.Value = value; } @@ -129,7 +165,7 @@ namespace Prowlarr.Api.V1.Indexers } else { - field.Value = fieldAttribute.Default; + field.Value = setting.Default; } return field;