diff --git a/Emby.Naming/TV/TvParserHelpers.cs b/Emby.Naming/TV/TvParserHelpers.cs new file mode 100644 index 0000000000..2eca389da5 --- /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; + +/// +/// Helper class for TV metadata parsing. +/// +public static class TvParserHelpers +{ + private static readonly string[] _continuingState = ["Pilot", "Returning Series", "Returning"]; + private static readonly string[] _endedState = ["Cancelled"]; + + /// + /// Tries to parse a string into . + /// + /// The status string. + /// The . + /// Returns true if parsing was successful. + 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 8dc2d69385..d8476bd47d 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 dbcfe7997a..b72281c12e 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 0000000000..2d4b5b730e --- /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); + } +}