diff --git a/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs b/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs index fcb4cfdfa..d1f598fd7 100644 --- a/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs +++ b/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs @@ -10,209 +10,404 @@ namespace ErsatzTV.Core.Tests.Metadata [TestFixture] public class TestMediaScannerTests { - private readonly TestMediaScanner _scanner = new(); - - [Test] - public void NewMovieFile_WithoutNfo_WithoutPoster() + [TestFixture] + public class NewMovieTests { - // new movie file without nfo and without poster should have statistics and fallback metadata - var movieFileName = "/movies/test (2021)/test (2021).mkv"; - string[] fileNames = { movieFileName }; - - Seq result = _scanner.DetermineActions( - MediaType.Movie, - Seq.Empty, - fileNames.ToSeq()); - - result.Count.Should().Be(1); - (Either source, List itemScanningPlans) = result.Head(); - source.IsLeft.Should().BeTrue(); - source.LeftToSeq().Should().BeEquivalentTo(movieFileName); - itemScanningPlans.Should().BeEquivalentTo( - new ItemScanningPlan(movieFileName, ScanningAction.Statistics), - new ItemScanningPlan(movieFileName, ScanningAction.FallbackMetadata), - new ItemScanningPlan(movieFileName, ScanningAction.Collections)); - } + private readonly TestMediaScanner _scanner = new(); - [Test] - public void NewMovieFile_WithNfo_WithoutPoster( - [Values("test (2021).nfo", "movie.nfo")] - string nfoFile) - { - // new movie file without nfo and without poster should have statistics and fallback metadata - var movieFileName = "/movies/test (2021)/test (2021).mkv"; - var nfoFileName = $"/movies/test (2021)/{nfoFile}"; - string[] fileNames = { movieFileName, nfoFileName }; - - Seq result = _scanner.DetermineActions( - MediaType.Movie, - Seq.Empty, - fileNames.ToSeq()); - - result.Count.Should().Be(1); - (Either source, List itemScanningPlans) = result.Head(); - source.IsLeft.Should().BeTrue(); - source.LeftToSeq().Should().BeEquivalentTo(movieFileName); - itemScanningPlans.Should().BeEquivalentTo( - new ItemScanningPlan(movieFileName, ScanningAction.Statistics), - new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(movieFileName, ScanningAction.Collections)); - } + [Test] + public void WithoutNfo_WithoutPoster() + { + var movieFileName = "/movies/test (2021)/test (2021).mkv"; + string[] fileNames = { movieFileName }; - [Test] - public void NewMovieFile_WithoutNfo_WithPoster( - [Values("", "test (2021)-")] - string basePosterName, - [Values("jpg", "jpeg", "png", "gif", "tbn")] - string posterExtension) - { - // new movie file without nfo and without poster should have statistics and fallback metadata - var movieFileName = "/movies/test (2021)/test (2021).mkv"; - var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; - - string[] fileNames = { movieFileName, posterFileName }; - - Seq result = _scanner.DetermineActions( - MediaType.Movie, - Seq.Empty, - fileNames.ToSeq()); - - result.Count.Should().Be(1); - (Either source, List itemScanningPlans) = result.Head(); - source.IsLeft.Should().BeTrue(); - source.LeftToSeq().Should().BeEquivalentTo(movieFileName); - itemScanningPlans.Should().BeEquivalentTo( - new ItemScanningPlan(movieFileName, ScanningAction.Statistics), - new ItemScanningPlan(movieFileName, ScanningAction.FallbackMetadata), - new ItemScanningPlan(posterFileName, ScanningAction.Poster), - new ItemScanningPlan(movieFileName, ScanningAction.Collections)); - } + Seq result = _scanner.DetermineActions( + MediaType.Movie, + Seq.Empty, + fileNames.ToSeq()); - [Test] - public void NewMovieFile_WithNfo_WithPoster( - [Values("test (2021).nfo", "movie.nfo")] - string nfoFile, - [Values("", "test (2021)-")] - string basePosterName, - [Values("jpg", "jpeg", "png", "gif", "tbn")] - string posterExtension) - { - // new movie file without nfo and without poster should have statistics and fallback metadata - var movieFileName = "/movies/test (2021)/test (2021).mkv"; - var nfoFileName = $"/movies/test (2021)/{nfoFile}"; - var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; - - string[] fileNames = { movieFileName, nfoFileName, posterFileName }; - - Seq result = _scanner.DetermineActions( - MediaType.Movie, - Seq.Empty, - fileNames.ToSeq()); - - result.Count.Should().Be(1); - (Either source, List itemScanningPlans) = result.Head(); - source.IsLeft.Should().BeTrue(); - source.LeftToSeq().Should().BeEquivalentTo(movieFileName); - itemScanningPlans.Should().BeEquivalentTo( - new ItemScanningPlan(movieFileName, ScanningAction.Statistics), - new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(posterFileName, ScanningAction.Poster), - new ItemScanningPlan(movieFileName, ScanningAction.Collections)); + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(movieFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(movieFileName, ScanningAction.Statistics), + new ItemScanningPlan(movieFileName, ScanningAction.FallbackMetadata), + new ItemScanningPlan(movieFileName, ScanningAction.Collections)); + } + + [Test] + public void WithNfo_WithoutPoster( + [Values("test (2021).nfo", "movie.nfo")] + string nfoFile) + { + var movieFileName = "/movies/test (2021)/test (2021).mkv"; + var nfoFileName = $"/movies/test (2021)/{nfoFile}"; + string[] fileNames = { movieFileName, nfoFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.Movie, + Seq.Empty, + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(movieFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(movieFileName, ScanningAction.Statistics), + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(movieFileName, ScanningAction.Collections)); + } + + [Test] + public void WithoutNfo_WithPoster( + [Values("", "test (2021)-")] + string basePosterName, + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) + { + var movieFileName = "/movies/test (2021)/test (2021).mkv"; + var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; + + string[] fileNames = { movieFileName, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.Movie, + Seq.Empty, + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(movieFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(movieFileName, ScanningAction.Statistics), + new ItemScanningPlan(movieFileName, ScanningAction.FallbackMetadata), + new ItemScanningPlan(posterFileName, ScanningAction.Poster), + new ItemScanningPlan(movieFileName, ScanningAction.Collections)); + } + + [Test] + public void WithNfo_WithPoster( + [Values("test (2021).nfo", "movie.nfo")] + string nfoFile, + [Values("", "test (2021)-")] + string basePosterName, + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) + { + var movieFileName = "/movies/test (2021)/test (2021).mkv"; + var nfoFileName = $"/movies/test (2021)/{nfoFile}"; + var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; + + string[] fileNames = { movieFileName, nfoFileName, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.Movie, + Seq.Empty, + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(movieFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(movieFileName, ScanningAction.Statistics), + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(posterFileName, ScanningAction.Poster), + new ItemScanningPlan(movieFileName, ScanningAction.Collections)); + } } - // TODO: mtime should affect this - [Test] - public void ExistingMovieFile_WithNewNfo_WithoutPoster( - [Values("test (2021).nfo", "movie.nfo")] - string nfoFile) + [TestFixture] + public class ExistingMovieTests { - // new movie file without nfo and without poster should have statistics and fallback metadata - var movieMediaItem = new MediaItem + private readonly TestMediaScanner _scanner = new(); + + // TODO: mtime should affect this + [Test] + public void WithNewNfo_WithoutPoster( + [Values("test (2021).nfo", "movie.nfo")] + string nfoFile) { - Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, - Path = "/movies/test (2021)/test (2021).mkv" - }; - - var nfoFileName = $"/movies/test (2021)/{nfoFile}"; - string[] fileNames = { movieMediaItem.Path, nfoFileName }; - - Seq result = _scanner.DetermineActions( - MediaType.Movie, - Seq.create(movieMediaItem), - fileNames.ToSeq()); - - result.Count.Should().Be(1); - (Either source, List itemScanningPlans) = result.Head(); - source.IsRight.Should().BeTrue(); - source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); - itemScanningPlans.Should().BeEquivalentTo( - new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(movieMediaItem.Path, ScanningAction.Collections)); + var movieMediaItem = new MediaItem + { + Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, + Path = "/movies/test (2021)/test (2021).mkv" + }; + + var nfoFileName = $"/movies/test (2021)/{nfoFile}"; + string[] fileNames = { movieMediaItem.Path, nfoFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.Movie, + Seq.create(movieMediaItem), + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsRight.Should().BeTrue(); + source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(movieMediaItem.Path, ScanningAction.Collections)); + } + + [Test] + public void WithoutNfo_WithNewPoster( + [Values("", "test (2021)-")] + string basePosterName, + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) + { + var movieMediaItem = new MediaItem + { + Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, + Path = "/movies/test (2021)/test (2021).mkv" + }; + + var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; + string[] fileNames = { movieMediaItem.Path, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.Movie, + Seq.create(movieMediaItem), + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsRight.Should().BeTrue(); + source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); + itemScanningPlans.Should() + .BeEquivalentTo(new ItemScanningPlan(posterFileName, ScanningAction.Poster)); + } + + [Test] + public void WithNewNfo_WithNewPoster( + [Values("test (2021).nfo", "movie.nfo")] + string nfoFile, + [Values("", "test (2021)-")] + string basePosterName, + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) + { + var movieMediaItem = new MediaItem + { + Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, + Path = "/movies/test (2021)/test (2021).mkv" + }; + + var nfoFileName = $"/movies/test (2021)/{nfoFile}"; + var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; + string[] fileNames = { movieMediaItem.Path, nfoFileName, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.Movie, + Seq.create(movieMediaItem), + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsRight.Should().BeTrue(); + source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(posterFileName, ScanningAction.Poster), + new ItemScanningPlan(movieMediaItem.Path, ScanningAction.Collections)); + } } - [Test] - public void ExistingMovieFile_WithoutNfo_WithNewPoster( - [Values("", "test (2021)-")] - string basePosterName, - [Values("jpg", "jpeg", "png", "gif", "tbn")] - string posterExtension) + [TestFixture] + public class NewEpisodeTests { - // new movie file without nfo and without poster should have statistics and fallback metadata - var movieMediaItem = new MediaItem + private readonly TestMediaScanner _scanner = new(); + + [Test] + public void WithoutNfo_WithoutPoster() { - Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, - Path = "/movies/test (2021)/test (2021).mkv" - }; - - var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; - string[] fileNames = { movieMediaItem.Path, posterFileName }; - - Seq result = _scanner.DetermineActions( - MediaType.Movie, - Seq.create(movieMediaItem), - fileNames.ToSeq()); - - result.Count.Should().Be(1); - (Either source, List itemScanningPlans) = result.Head(); - source.IsRight.Should().BeTrue(); - source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); - itemScanningPlans.Should() - .BeEquivalentTo(new ItemScanningPlan(posterFileName, ScanningAction.Poster)); - } + var episodeFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.mkv"; + string[] fileNames = { episodeFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.TvShow, + Seq.Empty, + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(episodeFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(episodeFileName, ScanningAction.Statistics), + new ItemScanningPlan(episodeFileName, ScanningAction.FallbackMetadata), + new ItemScanningPlan(episodeFileName, ScanningAction.Collections)); + } + + [Test] + public void WithNfo_WithoutPoster() + { + var episodeFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.mkv"; + var nfoFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.nfo"; + string[] fileNames = { episodeFileName, nfoFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.TvShow, + Seq.Empty, + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(episodeFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(episodeFileName, ScanningAction.Statistics), + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(episodeFileName, ScanningAction.Collections)); + } + + [Test] + public void WithoutNfo_WithPoster( + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) + { + var episodeFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.mkv"; + var posterFileName = $"/tv/test (2021)/poster.{posterExtension}"; + + string[] fileNames = { episodeFileName, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.TvShow, + Seq.Empty, + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(episodeFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(episodeFileName, ScanningAction.Statistics), + new ItemScanningPlan(episodeFileName, ScanningAction.FallbackMetadata), + new ItemScanningPlan(posterFileName, ScanningAction.Poster), + new ItemScanningPlan(episodeFileName, ScanningAction.Collections)); + } + + [Test] + public void WithNfo_WithPoster( + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) + { + var episodeFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.mkv"; + var nfoFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.nfo"; + var posterFileName = $"/tv/test (2021)/poster.{posterExtension}"; - [Test] - public void ExistingMovieFile_WithNewNfo_WithNewPoster( - [Values("test (2021).nfo", "movie.nfo")] - string nfoFile, - [Values("", "test (2021)-")] - string basePosterName, - [Values("jpg", "jpeg", "png", "gif", "tbn")] - string posterExtension) + string[] fileNames = { episodeFileName, nfoFileName, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.TvShow, + Seq.Empty, + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsLeft.Should().BeTrue(); + source.LeftToSeq().Should().BeEquivalentTo(episodeFileName); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(episodeFileName, ScanningAction.Statistics), + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(posterFileName, ScanningAction.Poster), + new ItemScanningPlan(episodeFileName, ScanningAction.Collections)); + } + } + + [TestFixture] + public class ExistingEpisodeTests { - // new movie file without nfo and without poster should have statistics and fallback metadata - var movieMediaItem = new MediaItem + private readonly TestMediaScanner _scanner = new(); + + // TODO: mtime should affect this + [Test] + public void WithNewNfo_WithoutPoster() + { + var episodeMediaItem = new MediaItem + { + Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, + Path = "/tv/test (2021)/season 01/test (2021) - s01e03.mkv" + }; + + var nfoFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.nfo"; + string[] fileNames = { episodeMediaItem.Path, nfoFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.TvShow, + Seq.create(episodeMediaItem), + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsRight.Should().BeTrue(); + source.RightToSeq().Should().BeEquivalentTo(episodeMediaItem); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(episodeMediaItem.Path, ScanningAction.Collections)); + } + + [Test] + public void WithoutNfo_WithNewPoster( + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) { - Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, - Path = "/movies/test (2021)/test (2021).mkv" - }; - - var nfoFileName = $"/movies/test (2021)/{nfoFile}"; - var posterFileName = $"/movies/test (2021)/{basePosterName}poster.{posterExtension}"; - string[] fileNames = { movieMediaItem.Path, nfoFileName, posterFileName }; - - Seq result = _scanner.DetermineActions( - MediaType.Movie, - Seq.create(movieMediaItem), - fileNames.ToSeq()); - - result.Count.Should().Be(1); - (Either source, List itemScanningPlans) = result.Head(); - source.IsRight.Should().BeTrue(); - source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); - itemScanningPlans.Should().BeEquivalentTo( - new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(posterFileName, ScanningAction.Poster), - new ItemScanningPlan(movieMediaItem.Path, ScanningAction.Collections)); + var episodeMediaItem = new MediaItem + { + Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, + Path = "/tv/test (2021)/season 01/test (2021) - s01e03.mkv" + }; + + var posterFileName = $"/tv/test (2021)/poster.{posterExtension}"; + string[] fileNames = { episodeMediaItem.Path, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.TvShow, + Seq.create(episodeMediaItem), + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsRight.Should().BeTrue(); + source.RightToSeq().Should().BeEquivalentTo(episodeMediaItem); + itemScanningPlans.Should() + .BeEquivalentTo(new ItemScanningPlan(posterFileName, ScanningAction.Poster)); + } + + [Test] + public void WithNewNfo_WithNewPoster( + [Values("jpg", "jpeg", "png", "gif", "tbn")] + string posterExtension) + { + var episodeMediaItem = new MediaItem + { + Metadata = new MediaMetadata { Source = MetadataSource.Fallback }, + Path = "/tv/test (2021)/season 01/test (2021) - s01e03.mkv" + }; + + var nfoFileName = "/tv/test (2021)/season 01/test (2021) - s01e03.nfo"; + var posterFileName = $"/tv/test (2021)/poster.{posterExtension}"; + string[] fileNames = { episodeMediaItem.Path, nfoFileName, posterFileName }; + + Seq result = _scanner.DetermineActions( + MediaType.TvShow, + Seq.create(episodeMediaItem), + fileNames.ToSeq()); + + result.Count.Should().Be(1); + (Either source, List itemScanningPlans) = result.Head(); + source.IsRight.Should().BeTrue(); + source.RightToSeq().Should().BeEquivalentTo(episodeMediaItem); + itemScanningPlans.Should().BeEquivalentTo( + new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), + new ItemScanningPlan(posterFileName, ScanningAction.Poster), + new ItemScanningPlan(episodeMediaItem.Path, ScanningAction.Collections)); + } } } } diff --git a/ErsatzTV.Core/Metadata/TestMediaScanner.cs b/ErsatzTV.Core/Metadata/TestMediaScanner.cs index dfa10f36d..3499435d0 100644 --- a/ErsatzTV.Core/Metadata/TestMediaScanner.cs +++ b/ErsatzTV.Core/Metadata/TestMediaScanner.cs @@ -81,6 +81,11 @@ namespace ErsatzTV.Core.Metadata return Seq(movieAsNfo, movieNfo) .Filter(s => files.Contains(s)) .HeadOrNone(); + case MediaType.TvShow: + string episodeAsNfo = Path.ChangeExtension(file, "nfo"); + return Optional(episodeAsNfo) + .Filter(s => files.Contains(s)) + .HeadOrNone(); } return None; @@ -93,10 +98,16 @@ namespace ErsatzTV.Core.Metadata switch (mediaType) { case MediaType.Movie: - IEnumerable possiblePosters = ImageFileExtensions.Collect( + IEnumerable possibleMoviePosters = ImageFileExtensions.Collect( ext => new[] { $"poster.{ext}", Path.GetFileNameWithoutExtension(file) + $"-poster.{ext}" }) .Map(f => Path.Combine(folder, f)); - return possiblePosters.Filter(s => files.Contains(s)).HeadOrNone(); + return possibleMoviePosters.Filter(p => files.Contains(p)).HeadOrNone(); + case MediaType.TvShow: + string parentFolder = Directory.GetParent(folder)?.FullName ?? string.Empty; + IEnumerable possibleTvPosters = ImageFileExtensions + .Collect(ext => new[] { $"poster.{ext}" }) + .Map(f => Path.Combine(parentFolder, f)); + return possibleTvPosters.Filter(p => files.Contains(p)).HeadOrNone(); } return None;