mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-09-17 17:14:18 +02:00
Try to fix deserializing cardigann definitions
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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()}");
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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()
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user