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