From f9ed2e6fa91e9ef8335073580a188f357f04f83c Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Mon, 15 Feb 2021 06:10:51 -0600 Subject: [PATCH] add existing items to new scanner --- .../Metadata/TestMediaScannerTests.cs | 99 ++++++++++++++++++- ErsatzTV.Core/Metadata/TestMediaScanner.cs | 26 ++++- 2 files changed, 118 insertions(+), 7 deletions(-) diff --git a/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs b/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs index 9fa8aec08..f4feff00d 100644 --- a/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs +++ b/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs @@ -32,7 +32,7 @@ namespace ErsatzTV.Core.Tests.Metadata new ItemScanningPlan(movieFileName, ScanningAction.Statistics), new ItemScanningPlan(movieFileName, ScanningAction.FallbackMetadata)); } - + [Test] public void NewMovieFile_WithNfo_WithoutPoster( [Values("test (2021).nfo", "movie.nfo")] @@ -56,7 +56,7 @@ namespace ErsatzTV.Core.Tests.Metadata new ItemScanningPlan(movieFileName, ScanningAction.Statistics), new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata)); } - + [Test] public void NewMovieFile_WithoutNfo_WithPoster( [Values("", "test (2021)-")] @@ -84,7 +84,7 @@ namespace ErsatzTV.Core.Tests.Metadata new ItemScanningPlan(movieFileName, ScanningAction.FallbackMetadata), new ItemScanningPlan(posterFileName, ScanningAction.Poster)); } - + [Test] public void NewMovieFile_WithNfo_WithPoster( [Values("test (2021).nfo", "movie.nfo")] @@ -115,5 +115,98 @@ namespace ErsatzTV.Core.Tests.Metadata new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), new ItemScanningPlan(posterFileName, ScanningAction.Poster)); } + + // TODO: mtime should affect this + [Test] + public void ExistingMovieFile_WithNewNfo_WithoutPoster( + [Values("test (2021).nfo", "movie.nfo")] + string nfoFile) + { + // new movie file without nfo and without poster should have statistics and fallback metadata + 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)); + } + + [Test] + public void ExistingMovieFile_WithoutNfo_WithNewPoster( + [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 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 ExistingMovieFile_WithNewNfo_WithNewPoster( + [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 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)); + } } } diff --git a/ErsatzTV.Core/Metadata/TestMediaScanner.cs b/ErsatzTV.Core/Metadata/TestMediaScanner.cs index 074b20a14..c2cae886b 100644 --- a/ErsatzTV.Core/Metadata/TestMediaScanner.cs +++ b/ErsatzTV.Core/Metadata/TestMediaScanner.cs @@ -24,12 +24,12 @@ namespace ErsatzTV.Core.Metadata Seq files) { var results = new IntermediateResults(); - var videoFiles = files.Filter(f => VideoFileExtensions.Contains(Path.GetExtension(f))); + Seq videoFiles = files.Filter(f => VideoFileExtensions.Contains(Path.GetExtension(f))); (Seq newFiles, Seq existingMediaItems) = videoFiles.Map( s => mediaItems.Find(i => i.Path == s).ToEither(s)) .Partition(); - + // new files foreach (string file in newFiles) { @@ -44,8 +44,26 @@ namespace ErsatzTV.Core.Metadata maybePoster.IfSome( posterFile => results.Add(file, new ItemScanningPlan(posterFile, ScanningAction.Poster))); } - + // existing media items + foreach (MediaItem mediaItem in existingMediaItems) + { + if (mediaItem.Metadata == null || mediaItem.Metadata.Source == MetadataSource.Fallback) + { + Option maybeNfoFile = LocateNfoFile(mediaType, files, mediaItem.Path); + maybeNfoFile.IfSome( + nfoFile => results.Add( + mediaItem, + new ItemScanningPlan(nfoFile, ScanningAction.SidecarMetadata))); + } + + if (string.IsNullOrWhiteSpace(mediaItem.Poster)) + { + Option maybePoster = LocatePoster(mediaType, files, mediaItem.Path); + maybePoster.IfSome( + posterFile => results.Add(mediaItem, new ItemScanningPlan(posterFile, ScanningAction.Poster))); + } + } return results.Summarize(); } @@ -68,7 +86,7 @@ namespace ErsatzTV.Core.Metadata private static Option LocatePoster(MediaType mediaType, Seq files, string file) { string folder = Path.GetDirectoryName(file) ?? string.Empty; - + switch (mediaType) { case MediaType.Movie: