aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Controller/Entities/BaseItem.cs41
-rw-r--r--tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs22
-rw-r--r--tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs15
-rw-r--r--tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo6
4 files changed, 80 insertions, 4 deletions
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index 022f8f0fbf..a1e955f33f 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -102,6 +102,14 @@ namespace MediaBrowser.Controller.Entities
private string _originalLanguage;
+ private float? _lufs;
+
+ private float? _normalizationGain;
+
+ private float? _criticRating;
+
+ private float? _communityRating;
+
public const char SlugChar = '-';
protected BaseItem()
@@ -154,14 +162,22 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The LUFS Value.</value>
[JsonIgnore]
- public float? LUFS { get; set; }
+ public float? LUFS
+ {
+ get => _lufs;
+ set => _lufs = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the gain required for audio normalization.
/// </summary>
/// <value>The gain required for audio normalization.</value>
[JsonIgnore]
- public float? NormalizationGain { get; set; }
+ public float? NormalizationGain
+ {
+ get => _normalizationGain;
+ set => _normalizationGain = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the channel identifier.
@@ -610,7 +626,11 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The critic rating.</value>
[JsonIgnore]
- public float? CriticRating { get; set; }
+ public float? CriticRating
+ {
+ get => _criticRating;
+ set => _criticRating = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the custom rating.
@@ -662,7 +682,11 @@ namespace MediaBrowser.Controller.Entities
/// </summary>
/// <value>The community rating.</value>
[JsonIgnore]
- public float? CommunityRating { get; set; }
+ public float? CommunityRating
+ {
+ get => _communityRating;
+ set => _communityRating = FiniteOrNull(value);
+ }
/// <summary>
/// Gets or sets the run time ticks.
@@ -1376,6 +1400,15 @@ namespace MediaBrowser.Controller.Entities
}
/// <summary>
+ /// Treats a rating or gain that is not a finite number as no value, since NaN and infinity
+ /// cannot be stored by every database or written as JSON.
+ /// </summary>
+ /// <param name="value">The value to check.</param>
+ /// <returns><paramref name="value"/> when it is finite or has no value, otherwise <see langword="null"/>.</returns>
+ private static float? FiniteOrNull(float? value)
+ => value.HasValue && !float.IsFinite(value.Value) ? null : value;
+
+ /// <summary>
/// Derives the prefix shared by the supplied media source items' file names, used to strip the
/// common part and surface a short version label per source. Returns null when there are fewer
/// than two file-based sources, since there is nothing to differentiate.
diff --git a/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs b/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs
index c67717e2fa..cb95c9d204 100644
--- a/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs
+++ b/tests/Jellyfin.Controller.Tests/Entities/BaseItemTests.cs
@@ -91,6 +91,28 @@ public class BaseItemTests
Assert.Equal(video.Id.ToString("N", CultureInfo.InvariantCulture), video.PresentationUniqueKey);
}
+ [Theory]
+ [InlineData(float.NaN, null)]
+ [InlineData(float.PositiveInfinity, null)]
+ [InlineData(float.NegativeInfinity, null)]
+ [InlineData(-3.5f, -3.5f)]
+ [InlineData(null, null)]
+ public void RatingsAndGains_KeepOnlyFiniteValues(float? value, float? expected)
+ {
+ var item = new Video
+ {
+ CommunityRating = value,
+ CriticRating = value,
+ LUFS = value,
+ NormalizationGain = value
+ };
+
+ Assert.Equal(expected, item.CommunityRating);
+ Assert.Equal(expected, item.CriticRating);
+ Assert.Equal(expected, item.LUFS);
+ Assert.Equal(expected, item.NormalizationGain);
+ }
+
[Fact]
public void GetItemByNameFolderName_ShortName_IsKeptAsIs()
{
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
index 4142831c31..d884493cea 100644
--- a/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Parsers/MovieNfoParserTests.cs
@@ -337,5 +337,20 @@ namespace Jellyfin.XbmcMetadata.Tests.Parsers
Assert.Equal(7.5f, item.CommunityRating);
}
+
+ [Fact]
+ public void Parse_Ratings_NotFinite_Ignored()
+ {
+ var result = new MetadataResult<Video>()
+ {
+ Item = new Movie()
+ };
+
+ _parser.Fetch(result, "Test Data/Ratings_NotFinite.nfo", CancellationToken.None);
+ var item = (Movie)result.Item;
+
+ Assert.Null(item.CommunityRating);
+ Assert.Null(item.CriticRating);
+ }
}
}
diff --git a/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo
new file mode 100644
index 0000000000..3012efb18d
--- /dev/null
+++ b/tests/Jellyfin.XbmcMetadata.Tests/Test Data/Ratings_NotFinite.nfo
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<movie>
+ <title>Test Movie</title>
+ <rating>NaN</rating>
+ <criticrating>Infinity</criticrating>
+</movie>