Przeglądaj źródła

Fix series status parsing (#11648)

* Fix series status parsing

* Apply review suggestions and add test

* Apply review suggestion

* Apply review suggestions
Tim Eisele 1 rok temu
rodzic
commit
c6c48a2b47

+ 44 - 0
Emby.Naming/TV/TvParserHelpers.cs

@@ -0,0 +1,44 @@
+using System;
+using System.Linq;
+using MediaBrowser.Model.Entities;
+
+namespace Emby.Naming.TV;
+
+/// <summary>
+/// Helper class for TV metadata parsing.
+/// </summary>
+public static class TvParserHelpers
+{
+    private static readonly string[] _continuingState = ["Pilot", "Returning Series", "Returning"];
+    private static readonly string[] _endedState = ["Cancelled"];
+
+    /// <summary>
+    /// Tries to parse a string into <see cref="SeriesStatus"/>.
+    /// </summary>
+    /// <param name="status">The status string.</param>
+    /// <param name="enumValue">The <see cref="SeriesStatus"/>.</param>
+    /// <returns>Returns true if parsing was successful.</returns>
+    public static bool TryParseSeriesStatus(string status, out SeriesStatus? enumValue)
+    {
+        if (Enum.TryParse(status, true, out SeriesStatus seriesStatus))
+        {
+            enumValue = seriesStatus;
+            return true;
+        }
+
+        if (_continuingState.Contains(status, StringComparer.OrdinalIgnoreCase))
+        {
+            enumValue = SeriesStatus.Continuing;
+            return true;
+        }
+
+        if (_endedState.Contains(status, StringComparer.OrdinalIgnoreCase))
+        {
+            enumValue = SeriesStatus.Ended;
+            return true;
+        }
+
+        enumValue = null;
+        return false;
+    }
+}

+ 3 - 8
MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs

@@ -278,17 +278,12 @@ namespace MediaBrowser.Providers.Plugins.Tmdb.TV
 
             series.RunTimeTicks = seriesResult.EpisodeRunTime.Select(i => TimeSpan.FromMinutes(i).Ticks).FirstOrDefault();
 
-            if (string.Equals(seriesResult.Status, "Ended", StringComparison.OrdinalIgnoreCase)
-                || string.Equals(seriesResult.Status, "Canceled", StringComparison.OrdinalIgnoreCase))
+            if (Emby.Naming.TV.TvParserHelpers.TryParseSeriesStatus(seriesResult.Status, out var seriesStatus))
             {
-                series.Status = SeriesStatus.Ended;
-                series.EndDate = seriesResult.LastAirDate;
-            }
-            else
-            {
-                series.Status = SeriesStatus.Continuing;
+                series.Status = seriesStatus;
             }
 
+            series.EndDate = seriesResult.LastAirDate;
             series.PremiereDate = seriesResult.FirstAirDate;
 
             var ids = seriesResult.ExternalIds;

+ 2 - 2
MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs

@@ -1,6 +1,6 @@
-using System;
 using System.Globalization;
 using System.Xml;
+using Emby.Naming.TV;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Controller.Entities.TV;
 using MediaBrowser.Controller.Extensions;
@@ -87,7 +87,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers
 
                         if (!string.IsNullOrWhiteSpace(status))
                         {
-                            if (Enum.TryParse(status, true, out SeriesStatus seriesStatus))
+                            if (TvParserHelpers.TryParseSeriesStatus(status, out var seriesStatus))
                             {
                                 item.Status = seriesStatus;
                             }

+ 31 - 0
tests/Jellyfin.Naming.Tests/TV/TvParserHelpersTest.cs

@@ -0,0 +1,31 @@
+using Emby.Naming.TV;
+using MediaBrowser.Model.Entities;
+using Xunit;
+
+namespace Jellyfin.Naming.Tests.TV;
+
+public class TvParserHelpersTest
+{
+    [Theory]
+    [InlineData("Ended", SeriesStatus.Ended)]
+    [InlineData("Cancelled", SeriesStatus.Ended)]
+    [InlineData("Continuing", SeriesStatus.Continuing)]
+    [InlineData("Returning", SeriesStatus.Continuing)]
+    [InlineData("Returning Series", SeriesStatus.Continuing)]
+    [InlineData("Unreleased", SeriesStatus.Unreleased)]
+    public void SeriesStatusParserTest_Valid(string statusString, SeriesStatus? status)
+    {
+        var successful = TvParserHelpers.TryParseSeriesStatus(statusString, out var parsered);
+        Assert.True(successful);
+        Assert.Equal(status, parsered);
+    }
+
+    [Theory]
+    [InlineData("XXX")]
+    public void SeriesStatusParserTest_InValid(string statusString)
+    {
+        var successful = TvParserHelpers.TryParseSeriesStatus(statusString, out var parsered);
+        Assert.False(successful);
+        Assert.Null(parsered);
+    }
+}