Try to fix deserializing cardigann definitions

This commit is contained in:
ta264
2021-02-23 21:18:48 +00:00
committed by Qstick
parent 596ba2dcbc
commit d747777183
8 changed files with 60 additions and 23 deletions

View File

@@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
namespace NzbDrone.Core.Datastore.Converters namespace NzbDrone.Common.Serializer
{ {
public class DictionaryStringObjectJsonConverter : JsonConverter<Dictionary<string, object>> public class DictionaryStringObjectConverter : JsonConverter<Dictionary<string, object>>
{ {
public override Dictionary<string, object> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override Dictionary<string, object> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{ {

View File

@@ -30,6 +30,7 @@ namespace NzbDrone.Common.Serializer
serializerSettings.Converters.Add(new STJHttpUriConverter()); serializerSettings.Converters.Add(new STJHttpUriConverter());
serializerSettings.Converters.Add(new STJTimeSpanConverter()); serializerSettings.Converters.Add(new STJTimeSpanConverter());
serializerSettings.Converters.Add(new STJUtcConverter()); serializerSettings.Converters.Add(new STJUtcConverter());
serializerSettings.Converters.Add(new DictionaryStringObjectConverter());
return serializerSettings; return serializerSettings;
} }

View File

@@ -25,7 +25,7 @@ namespace NzbDrone.Core.Datastore.Converters
serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true)); serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true));
serializerSettings.Converters.Add(new STJTimeSpanConverter()); serializerSettings.Converters.Add(new STJTimeSpanConverter());
serializerSettings.Converters.Add(new STJUtcConverter()); serializerSettings.Converters.Add(new STJUtcConverter());
serializerSettings.Converters.Add(new DictionaryStringObjectJsonConverter()); serializerSettings.Converters.Add(new DictionaryStringObjectConverter());
SerializerSettings = serializerSettings; SerializerSettings = serializerSettings;
} }

View File

@@ -238,7 +238,7 @@ namespace NzbDrone.Core.Indexers.Cardigann
{ {
_logger.Debug($"Setting options: {setting.Options.ToJson()}"); _logger.Debug($"Setting options: {setting.Options.ToJson()}");
var sorted = setting.Options.OrderBy(x => x.Key).ToList(); 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()}"); _logger.Debug($"Selected option: {selected.ToJson()}");

View File

@@ -32,7 +32,7 @@ namespace NzbDrone.Core.ThingiProvider
serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true)); serializerSettings.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, true));
serializerSettings.Converters.Add(new STJTimeSpanConverter()); serializerSettings.Converters.Add(new STJTimeSpanConverter());
serializerSettings.Converters.Add(new STJUtcConverter()); serializerSettings.Converters.Add(new STJUtcConverter());
serializerSettings.Converters.Add(new DictionaryStringObjectJsonConverter()); serializerSettings.Converters.Add(new DictionaryStringObjectConverter());
_serializerSettings = serializerSettings; _serializerSettings = serializerSettings;
} }

View File

@@ -11,13 +11,15 @@ namespace Prowlarr.Api.V1.Indexers
{ {
private readonly IIndexerFactory _indexerService; private readonly IIndexerFactory _indexerService;
private readonly IManageCommandQueue _commandQueueManager; 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") : base("/indexer/editor")
{ {
_indexerService = indexerService; _indexerService = indexerService;
_commandQueueManager = commandQueueManager; _commandQueueManager = commandQueueManager;
_resourceMapper = resourceMapper;
Put("/", movie => SaveAll()); Put("/", movie => SaveAll());
Delete("/", movie => DeleteIndexers()); Delete("/", movie => DeleteIndexers());
} }
@@ -63,7 +65,7 @@ namespace Prowlarr.Api.V1.Indexers
_indexerService.SetProviderCharacteristics(definition); _indexerService.SetProviderCharacteristics(definition);
} }
return ResponseWithCode(ResourceMapper.ToResource(indexers), HttpStatusCode.Accepted); return ResponseWithCode(_resourceMapper.ToResource(indexers), HttpStatusCode.Accepted);
} }
private object DeleteIndexers() private object DeleteIndexers()

View File

@@ -16,15 +16,13 @@ namespace Prowlarr.Api.V1.Indexers
{ {
public class IndexerModule : ProviderModuleBase<IndexerResource, IIndexer, IndexerDefinition> public class IndexerModule : ProviderModuleBase<IndexerResource, IIndexer, IndexerDefinition>
{ {
public static readonly IndexerResourceMapper ResourceMapper = new IndexerResourceMapper();
private IIndexerFactory _indexerFactory { get; set; } private IIndexerFactory _indexerFactory { get; set; }
private ISearchForNzb _nzbSearchService { get; set; } private ISearchForNzb _nzbSearchService { get; set; }
private IDownloadMappingService _downloadMappingService { get; set; } private IDownloadMappingService _downloadMappingService { get; set; }
private IDownloadService _downloadService { get; set; } private IDownloadService _downloadService { get; set; }
public IndexerModule(IndexerFactory indexerFactory, ISearchForNzb nzbSearchService, IDownloadMappingService downloadMappingService, IDownloadService downloadService) public IndexerModule(IndexerFactory indexerFactory, ISearchForNzb nzbSearchService, IDownloadMappingService downloadMappingService, IDownloadService downloadService, IndexerResourceMapper resourceMapper)
: base(indexerFactory, "indexer", ResourceMapper) : base(indexerFactory, "indexer", resourceMapper)
{ {
_indexerFactory = indexerFactory; _indexerFactory = indexerFactory;
_nzbSearchService = nzbSearchService; _nzbSearchService = nzbSearchService;

View File

@@ -1,9 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using NzbDrone.Common.Extensions;
using NzbDrone.Core.Annotations; using NzbDrone.Core.Annotations;
using NzbDrone.Core.Indexers; using NzbDrone.Core.Indexers;
using NzbDrone.Core.Indexers.Cardigann; using NzbDrone.Core.Indexers.Cardigann;
using NzbDrone.Core.IndexerVersions;
using Prowlarr.Http.ClientSchema; using Prowlarr.Http.ClientSchema;
namespace Prowlarr.Api.V1.Indexers namespace Prowlarr.Api.V1.Indexers
@@ -24,6 +26,13 @@ namespace Prowlarr.Api.V1.Indexers
public class IndexerResourceMapper : ProviderResourceMapper<IndexerResource, IndexerDefinition> public class IndexerResourceMapper : ProviderResourceMapper<IndexerResource, IndexerDefinition>
{ {
private readonly IIndexerDefinitionUpdateService _definitionService;
public IndexerResourceMapper(IIndexerDefinitionUpdateService definitionService)
{
_definitionService = definitionService;
}
public override IndexerResource ToResource(IndexerDefinition definition) public override IndexerResource ToResource(IndexerDefinition definition)
{ {
if (definition == null) if (definition == null)
@@ -77,11 +86,15 @@ namespace Prowlarr.Api.V1.Indexers
var standardFields = base.ToResource(definition).Fields.Select(x => x.Name).ToList(); var standardFields = base.ToResource(definition).Fields.Select(x => x.Name).ToList();
var settings = (CardigannSettings)definition.Settings; var settings = (CardigannSettings)definition.Settings;
var cardigannDefinition = _definitionService.GetDefinition(settings.DefinitionFile);
foreach (var field in resource.Fields) foreach (var field in resource.Fields)
{ {
if (!standardFields.Contains(field.Name)) 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; 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 var field = new Field
{ {
Name = fieldAttribute.Name, Name = setting.Name,
Label = fieldAttribute.Label, Label = setting.Label,
Order = order, 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 field.SelectOptions = sorted.Select((x, i) => new SelectOption
{ {
Value = i, Value = i,
Name = x.Value Name = x.Value
}).ToList(); }).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; field.Value = value;
} }
@@ -129,7 +165,7 @@ namespace Prowlarr.Api.V1.Indexers
} }
else else
{ {
field.Value = fieldAttribute.Default; field.Value = setting.Default;
} }
return field; return field;