diff options
| author | Shadowghost <Shadowghost@users.noreply.github.com> | 2024-05-17 13:51:42 -0400 |
|---|---|---|
| committer | Joshua M. Boniface <joshua@boniface.me> | 2024-05-17 13:51:42 -0400 |
| commit | b063dfd2e3925b85bbc9461c272a10d7c8931767 (patch) | |
| tree | 43ed6848eb91cfe656023c8909d4a726c7151776 | |
| parent | 29a293f9e78e61d464e18b6d74ba32152eaa01ce (diff) | |
Backport pull request #11648 from jellyfin/release-10.9.z
Fix series status parsing
Original-merge: c6c48a2b474012f6e4464b743a937c522f15e04d
Merged-by: nielsvanvelzen <nielsvanvelzen@users.noreply.github.com>
Backported-by: Joshua M. Boniface <joshua@boniface.me>
| -rw-r--r-- | Emby.Naming/TV/TvParserHelpers.cs | 44 | ||||
| -rw-r--r-- | MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs | 11 | ||||
| -rw-r--r-- | MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs | 4 | ||||
| -rw-r--r-- | tests/Jellyfin.Naming.Tests/TV/TvParserHelpersTest.cs | 31 |
4 files changed, 80 insertions, 10 deletions
diff --git a/Emby.Naming/TV/TvParserHelpers.cs b/Emby.Naming/TV/TvParserHelpers.cs new file mode 100644 index 000000000..2eca389da --- /dev/null +++ b/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; + } +} diff --git a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs b/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs index 8dc2d6938..d8476bd47 100644 --- a/MediaBrowser.Providers/Plugins/Tmdb/TV/TmdbSeriesProvider.cs +++ b/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; diff --git a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs index 94df871e9..3b551acec 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/SeriesNfoParser.cs +++ b/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; } diff --git a/tests/Jellyfin.Naming.Tests/TV/TvParserHelpersTest.cs b/tests/Jellyfin.Naming.Tests/TV/TvParserHelpersTest.cs new file mode 100644 index 000000000..2d4b5b730 --- /dev/null +++ b/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); + } +} |
