From 66a1880a580b25db7add41ed3947166b10415f37 Mon Sep 17 00:00:00 2001 From: crobibero Date: Sun, 6 Dec 2020 20:26:21 -0700 Subject: [PATCH] Add number to bool json converter --- .../TunerHosts/HdHomerun/HdHomerunHost.cs | 4 +++ .../Converters/JsonBoolNumberConverter.cs | 33 +++++++++++++++++++ .../Json/JsonBoolNumberTests.cs | 23 +++++++++++++ .../Models/BoolTypeModel.cs | 17 ++++++++++ 4 files changed, 77 insertions(+) create mode 100644 MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs create mode 100644 tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs create mode 100644 tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs index b6444b172a..0f296d9894 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/HdHomerun/HdHomerunHost.cs @@ -8,10 +8,12 @@ using System.Linq; using System.Net; using System.Net.Http; using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; using MediaBrowser.Common.Configuration; using MediaBrowser.Common.Extensions; +using MediaBrowser.Common.Json.Converters; using MediaBrowser.Common.Net; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; @@ -340,8 +342,10 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun public string URL { get; set; } + [JsonConverter(typeof(JsonBoolNumberConverter))] public bool Favorite { get; set; } + [JsonConverter(typeof(JsonBoolNumberConverter))] public bool DRM { get; set; } public int HD { get; set; } diff --git a/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs b/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs new file mode 100644 index 0000000000..f73ca344ca --- /dev/null +++ b/MediaBrowser.Common/Json/Converters/JsonBoolNumberConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MediaBrowser.Common.Json.Converters +{ + /// + /// Converts a number to a boolean. + /// This is needed for HDHomerun. + /// + /// + /// Adding this to the JsonConverter list causes recursion. + /// + public class JsonBoolNumberConverter : JsonConverter + { + /// + public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Number) + { + return Convert.ToBoolean(reader.GetInt32()); + } + + return JsonSerializer.Deserialize(ref reader, options); + } + + /// + public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options) + { + JsonSerializer.Serialize(writer, value, options); + } + } +} \ No newline at end of file diff --git a/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs b/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs new file mode 100644 index 0000000000..1cae5b8491 --- /dev/null +++ b/tests/Jellyfin.Common.Tests/Json/JsonBoolNumberTests.cs @@ -0,0 +1,23 @@ +using System.Text.Json; +using Jellyfin.Common.Tests.Models; +using Xunit; + +namespace Jellyfin.Common.Tests.Json +{ + public static class JsonBoolNumberTests + { + [Theory] + [InlineData("1", true)] + [InlineData("0", false)] + [InlineData("2", true)] + [InlineData("true", true)] + [InlineData("false", false)] + public static void Deserialize_Number_Valid_Success(string input, bool? output) + { + var inputJson = $"{{ \"Value\": {input} }}"; + var options = new JsonSerializerOptions(); + var value = JsonSerializer.Deserialize(inputJson, options); + Assert.Equal(value?.Value, output); + } + } +} \ No newline at end of file diff --git a/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs b/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs new file mode 100644 index 0000000000..feb952efc5 --- /dev/null +++ b/tests/Jellyfin.Common.Tests/Models/BoolTypeModel.cs @@ -0,0 +1,17 @@ +using System.Text.Json.Serialization; +using MediaBrowser.Common.Json.Converters; + +namespace Jellyfin.Common.Tests.Models +{ + /// + /// The bool type model. + /// + public class BoolTypeModel + { + /// + /// Gets or sets a value indicating whether the value is true or false. + /// + [JsonConverter(typeof(JsonBoolNumberConverter))] + public bool Value { get; set; } + } +} \ No newline at end of file