From e3be3ef91ed9aea23a08eff3ad9f791a43d089a1 Mon Sep 17 00:00:00 2001 From: Taloth Saldono Date: Sat, 25 Dec 2021 00:59:42 +0100 Subject: [PATCH] New: Gracefully handle broken release profiles when ppl swapped to older sonarr versions and back again --- .../Converters/EmbeddedDocumentConverter.cs | 2 +- .../Converters/StringListConverter.cs | 35 +++++++++++++++++++ src/NzbDrone.Core/Datastore/TableMapping.cs | 2 +- 3 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/NzbDrone.Core/Datastore/Converters/StringListConverter.cs diff --git a/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs b/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs index d2b9146f2..c776b3ea1 100644 --- a/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs +++ b/src/NzbDrone.Core/Datastore/Converters/EmbeddedDocumentConverter.cs @@ -9,7 +9,7 @@ namespace NzbDrone.Core.Datastore.Converters { public class EmbeddedDocumentConverter : IConverter { - private readonly JsonSerializerSettings SerializerSetting; + protected readonly JsonSerializerSettings SerializerSetting; public EmbeddedDocumentConverter(params JsonConverter[] converters) { diff --git a/src/NzbDrone.Core/Datastore/Converters/StringListConverter.cs b/src/NzbDrone.Core/Datastore/Converters/StringListConverter.cs new file mode 100644 index 000000000..e31d9e4ee --- /dev/null +++ b/src/NzbDrone.Core/Datastore/Converters/StringListConverter.cs @@ -0,0 +1,35 @@ +using Marr.Data.Converters; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Converters; +using System.Linq; +using System; + +namespace NzbDrone.Core.Datastore.Converters +{ + public class StringListConverter : EmbeddedDocumentConverter + { + public override object FromDB(ConverterContext context) + { + if (context.DbValue == DBNull.Value) + { + return DBNull.Value; + } + + var stringValue = (string)context.DbValue; + + if (string.IsNullOrWhiteSpace(stringValue)) + { + return null; + } + + // Handle when the database contains a comma separated string. Specifically for ReleaseProfiles when ppl downgraded Sonarr versions and added profiles. + if (!stringValue.StartsWith("[") || !stringValue.EndsWith("]")) + { + return stringValue.Split(',').ToList(); + } + + return JsonConvert.DeserializeObject(stringValue, context.ColumnMap.FieldType, SerializerSetting); + } + } +} diff --git a/src/NzbDrone.Core/Datastore/TableMapping.cs b/src/NzbDrone.Core/Datastore/TableMapping.cs index fcff36307..5a0de021c 100644 --- a/src/NzbDrone.Core/Datastore/TableMapping.cs +++ b/src/NzbDrone.Core/Datastore/TableMapping.cs @@ -171,7 +171,7 @@ namespace NzbDrone.Core.Datastore MapRepository.Instance.RegisterTypeConverter(typeof(List), new EmbeddedDocumentConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(List>), new EmbeddedDocumentConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Language), new LanguageIntConverter()); - MapRepository.Instance.RegisterTypeConverter(typeof(List), new EmbeddedDocumentConverter()); + MapRepository.Instance.RegisterTypeConverter(typeof(List), new StringListConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(List), new EmbeddedDocumentConverter(new LanguageIntConverter())); MapRepository.Instance.RegisterTypeConverter(typeof(ParsedEpisodeInfo), new EmbeddedDocumentConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(ReleaseInfo), new EmbeddedDocumentConverter());