From 3f4b1b60bee8e55634c8675f0a52e4a2ade2a004 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Thu, 11 Feb 2021 05:08:44 -0600 Subject: [PATCH] improve fallback metadata parsing, add tests --- .../FFmpegPlaybackSettingsServiceTests.cs | 1 + .../Metadata/FallbackMetadataProviderTests.cs | 38 +++++++++++++++++++ .../Scheduling/ChronologicalContentTests.cs | 1 + .../Scheduling/PlayoutBuilderTests.cs | 1 + .../Scheduling/RandomizedContentTests.cs | 1 + .../Scheduling/ShuffledContentTests.cs | 1 + .../Metadata/FallbackMetadataProvider.cs | 30 +++++++++++++++ .../Metadata/LocalMetadataProvider.cs | 24 +----------- 8 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs create mode 100644 ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs diff --git a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsServiceTests.cs b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsServiceTests.cs index 85ae5fd1e..6497ebb1e 100644 --- a/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsServiceTests.cs +++ b/ErsatzTV.Core.Tests/FFmpeg/FFmpegPlaybackSettingsServiceTests.cs @@ -6,6 +6,7 @@ using NUnit.Framework; namespace ErsatzTV.Core.Tests.FFmpeg { + [TestFixture] public class FFmpegPlaybackSettingsCalculatorTests { public class CalculateSettings diff --git a/ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs b/ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs new file mode 100644 index 000000000..944f236e3 --- /dev/null +++ b/ErsatzTV.Core.Tests/Metadata/FallbackMetadataProviderTests.cs @@ -0,0 +1,38 @@ +using ErsatzTV.Core.Domain; +using ErsatzTV.Core.Metadata; +using FluentAssertions; +using NUnit.Framework; + +namespace ErsatzTV.Core.Tests.Metadata +{ + [TestFixture] + public class FallbackMetadataProviderTests + { + [Test] + [TestCase("Awesome Show - s01e02.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - S01E02.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - s1e2.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - S1E2.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - s01e02 - Episode Title.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - S01E02 - Episode Title.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - s1e2 - Episode Title.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - S1E2 - Episode Title.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show (2021) - s01e02 - Episode Title.mkv", "Awesome Show (2021)", 1, 2)] + [TestCase("Awesome Show (2021) - S01E02 - Episode Title.mkv", "Awesome Show (2021)", 1, 2)] + [TestCase("Awesome Show (2021) - s1e2 - Episode Title.mkv", "Awesome Show (2021)", 1, 2)] + [TestCase("Awesome Show (2021) - S1E2 - Episode Title.mkv", "Awesome Show (2021)", 1, 2)] + [TestCase("Awesome Show - s01e02 - Episode Title-720p.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - S01E02 - Episode Title-720p.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - s1e2 - Episode Title-720p.mkv", "Awesome Show", 1, 2)] + [TestCase("Awesome Show - S1E2 - Episode Title-720p.mkv", "Awesome Show", 1, 2)] + public void GetFallbackMetadata_ShouldHandleVariousFormats(string path, string title, int season, int episode) + { + var metadata = FallbackMetadataProvider.GetFallbackMetadata(path); + + metadata.MediaType.Should().Be(MediaType.TvShow); + metadata.Title.Should().Be(title); + metadata.SeasonNumber.Should().Be(season); + metadata.EpisodeNumber.Should().Be(episode); + } + } +} diff --git a/ErsatzTV.Core.Tests/Scheduling/ChronologicalContentTests.cs b/ErsatzTV.Core.Tests/Scheduling/ChronologicalContentTests.cs index 6473f6264..9a9e35b74 100644 --- a/ErsatzTV.Core.Tests/Scheduling/ChronologicalContentTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/ChronologicalContentTests.cs @@ -9,6 +9,7 @@ using static LanguageExt.Prelude; namespace ErsatzTV.Core.Tests.Scheduling { + [TestFixture] public class ChronologicalContentTests { [Test] diff --git a/ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs b/ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs index bcce1b592..d67f4d558 100644 --- a/ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs @@ -14,6 +14,7 @@ using static LanguageExt.Prelude; namespace ErsatzTV.Core.Tests.Scheduling { + [TestFixture] public class PlayoutBuilderTests { private readonly ILogger _logger; diff --git a/ErsatzTV.Core.Tests/Scheduling/RandomizedContentTests.cs b/ErsatzTV.Core.Tests/Scheduling/RandomizedContentTests.cs index d02509176..8992c6ede 100644 --- a/ErsatzTV.Core.Tests/Scheduling/RandomizedContentTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/RandomizedContentTests.cs @@ -9,6 +9,7 @@ using static LanguageExt.Prelude; namespace ErsatzTV.Core.Tests.Scheduling { + [TestFixture] public class RandomizedContentTests { private const int KnownSeed = 22295; diff --git a/ErsatzTV.Core.Tests/Scheduling/ShuffledContentTests.cs b/ErsatzTV.Core.Tests/Scheduling/ShuffledContentTests.cs index 65c28120d..f767f3f12 100644 --- a/ErsatzTV.Core.Tests/Scheduling/ShuffledContentTests.cs +++ b/ErsatzTV.Core.Tests/Scheduling/ShuffledContentTests.cs @@ -9,6 +9,7 @@ using static LanguageExt.Prelude; namespace ErsatzTV.Core.Tests.Scheduling { + [TestFixture] public class ShuffledContentTests { // this seed will produce (shuffle) 1-10 in order diff --git a/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs new file mode 100644 index 000000000..f6550dadb --- /dev/null +++ b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs @@ -0,0 +1,30 @@ +using System.IO; +using System.Text.RegularExpressions; +using ErsatzTV.Core.Domain; + +namespace ErsatzTV.Core.Metadata +{ + public static class FallbackMetadataProvider + { + public static MediaMetadata GetFallbackMetadata(string path) + { + string fileName = Path.GetFileName(path); + var metadata = new MediaMetadata { Title = fileName ?? path }; + + if (fileName != null) + { + const string PATTERN = @"^(.*?)[\s-]+[sS](\d+)[eE](\d+).*\.\w+$"; + Match match = Regex.Match(fileName, PATTERN); + if (match.Success) + { + metadata.MediaType = MediaType.TvShow; + metadata.Title = match.Groups[1].Value; + metadata.SeasonNumber = int.Parse(match.Groups[2].Value); + metadata.EpisodeNumber = int.Parse(match.Groups[3].Value); + } + } + + return metadata; + } + } +} diff --git a/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs b/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs index 334a6bfeb..62fca8884 100644 --- a/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs +++ b/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs @@ -21,7 +21,8 @@ namespace ErsatzTV.Core.Metadata public async Task RefreshMetadata(MediaItem mediaItem) { Option maybeMetadata = await LoadMetadata(mediaItem); - MediaMetadata metadata = maybeMetadata.IfNone(() => GetFallbackMetadata(mediaItem)); + MediaMetadata metadata = + maybeMetadata.IfNone(() => FallbackMetadataProvider.GetFallbackMetadata(mediaItem.Path)); await ApplyMetadataUpdate(mediaItem, metadata); } @@ -99,27 +100,6 @@ namespace ErsatzTV.Core.Metadata None); } - private MediaMetadata GetFallbackMetadata(MediaItem mediaItem) - { - string fileName = Path.GetFileName(mediaItem.Path); - var metadata = new MediaMetadata { Title = fileName ?? mediaItem.Path }; - - if (fileName != null) - { - const string PATTERN = @"^(.*?)[\s-]+[sS](\d+)[eE](\d+)\.\w+$"; - Match match = Regex.Match(fileName, PATTERN); - if (match.Success) - { - metadata.MediaType = MediaType.TvShow; - metadata.Title = match.Groups[1].Value; - metadata.SeasonNumber = int.Parse(match.Groups[2].Value); - metadata.EpisodeNumber = int.Parse(match.Groups[3].Value); - } - } - - return metadata; - } - private static DateTime? GetAired(string aired) { if (string.IsNullOrWhiteSpace(aired))