diff --git a/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs b/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs index f57c8101a..d817af976 100644 --- a/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs +++ b/ErsatzTV.Core.Tests/Metadata/TestMediaScannerTests.cs @@ -83,7 +83,7 @@ namespace ErsatzTV.Core.Tests.Metadata itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(movieFileName, ScanningAction.Statistics), new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(movieFileName, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } [Test] @@ -146,7 +146,7 @@ namespace ErsatzTV.Core.Tests.Metadata new ItemScanningPlan(movieFileName, ScanningAction.Statistics), new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), new ItemScanningPlan(posterFileName, ScanningAction.Poster), - new ItemScanningPlan(movieFileName, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } } @@ -227,7 +227,7 @@ namespace ErsatzTV.Core.Tests.Metadata source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(movieMediaItem.Path, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } [Test] @@ -283,7 +283,7 @@ namespace ErsatzTV.Core.Tests.Metadata source.RightToSeq().Should().BeEquivalentTo(movieMediaItem); itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(movieMediaItem.Path, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } [Test] @@ -413,7 +413,7 @@ namespace ErsatzTV.Core.Tests.Metadata itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), new ItemScanningPlan(posterFileName, ScanningAction.Poster), - new ItemScanningPlan(movieMediaItem.Path, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } } @@ -464,7 +464,7 @@ namespace ErsatzTV.Core.Tests.Metadata itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(episodeFileName, ScanningAction.Statistics), new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(episodeFileName, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } [Test] @@ -521,7 +521,7 @@ namespace ErsatzTV.Core.Tests.Metadata new ItemScanningPlan(episodeFileName, ScanningAction.Statistics), new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), new ItemScanningPlan(posterFileName, ScanningAction.Poster), - new ItemScanningPlan(episodeFileName, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } } @@ -600,7 +600,7 @@ namespace ErsatzTV.Core.Tests.Metadata source.RightToSeq().Should().BeEquivalentTo(episodeMediaItem); itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(episodeMediaItem.Path, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } [Test] @@ -652,7 +652,7 @@ namespace ErsatzTV.Core.Tests.Metadata source.RightToSeq().Should().BeEquivalentTo(episodeMediaItem); itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), - new ItemScanningPlan(episodeMediaItem.Path, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } [Test] @@ -772,7 +772,7 @@ namespace ErsatzTV.Core.Tests.Metadata itemScanningPlans.Should().BeEquivalentTo( new ItemScanningPlan(nfoFileName, ScanningAction.SidecarMetadata), new ItemScanningPlan(posterFileName, ScanningAction.Poster), - new ItemScanningPlan(episodeMediaItem.Path, ScanningAction.Collections)); + new ItemScanningPlan(nfoFileName, ScanningAction.Collections)); } } @@ -786,7 +786,9 @@ namespace ErsatzTV.Core.Tests.Metadata "/movies/test (2021)/Scenes/test (2021)", "/movies/test (2021)/Shorts/test (2021)", "/movies/test (2021)/Trailers/test (2021)", - "/movies/test (2021)/Other/test (2021)")] + "/movies/test (2021)/Other/test (2021)", + "/movies/test (2021)/Extras/test (2021)", + "/movies/test (2021)/Specials/test (2021)")] string baseFileName, [ValueSource(typeof(TestMediaScannerTests), nameof(VideoFileExtensions))] string extension) @@ -827,10 +829,6 @@ namespace ErsatzTV.Core.Tests.Metadata } [Test] - // [TestCase( - // "/tv/test (2022)/season 03/test (2022) - s03e01.mkv", - // "/tv/test (2022)/season 03/test (2022) - s03e02.mkv", - // MediaType.TvShow)] public void Movies_Should_Remove_Missing_MediaItems( [ValueSource(typeof(TestMediaScannerTests), nameof(VideoFileExtensions))] string extension) diff --git a/ErsatzTV.Core/Metadata/LocalFileSystem.cs b/ErsatzTV.Core/Metadata/LocalFileSystem.cs index dd9adaacd..bb353a3fc 100644 --- a/ErsatzTV.Core/Metadata/LocalFileSystem.cs +++ b/ErsatzTV.Core/Metadata/LocalFileSystem.cs @@ -11,7 +11,7 @@ namespace ErsatzTV.Core.Metadata public class LocalFileSystem : ILocalFileSystem { public DateTime GetLastWriteTime(string path) => - File.GetLastWriteTimeUtc(path); + Try(File.GetLastWriteTimeUtc(path)).IfFail(() => DateTime.MinValue); public bool IsMediaSourceAccessible(LocalMediaSource localMediaSource) => Directory.Exists(localMediaSource.Folder); diff --git a/ErsatzTV.Core/Metadata/TestMediaScanner.cs b/ErsatzTV.Core/Metadata/TestMediaScanner.cs index f5b7fba4d..7b5adc844 100644 --- a/ErsatzTV.Core/Metadata/TestMediaScanner.cs +++ b/ErsatzTV.Core/Metadata/TestMediaScanner.cs @@ -33,12 +33,19 @@ namespace ErsatzTV.Core.Metadata foreach (string file in newFiles) { results.Add(file, new ItemScanningPlan(file, ScanningAction.Statistics)); - results.Add(file, new ItemScanningPlan(file, ScanningAction.Collections)); Option maybeNfoFile = LocateNfoFile(mediaType, files, file); maybeNfoFile.BiIter( - nfoFile => results.Add(file, new ItemScanningPlan(nfoFile, ScanningAction.SidecarMetadata)), - () => results.Add(file, new ItemScanningPlan(file, ScanningAction.FallbackMetadata))); + nfoFile => + { + results.Add(file, new ItemScanningPlan(nfoFile, ScanningAction.SidecarMetadata)); + results.Add(file, new ItemScanningPlan(nfoFile, ScanningAction.Collections)); + }, + () => + { + results.Add(file, new ItemScanningPlan(file, ScanningAction.FallbackMetadata)); + results.Add(file, new ItemScanningPlan(file, ScanningAction.Collections)); + }); Option maybePoster = LocatePoster(mediaType, files, file); maybePoster.IfSome( @@ -52,7 +59,7 @@ namespace ErsatzTV.Core.Metadata { results.Add(mediaItem, new ItemScanningPlan(mediaItem.Path, ScanningAction.Statistics)); } - + Option maybeNfoFile = LocateNfoFile(mediaType, files, mediaItem.Path); maybeNfoFile.IfSome( nfoFile => @@ -62,7 +69,7 @@ namespace ErsatzTV.Core.Metadata _localFileSystem.GetLastWriteTime(nfoFile)) { results.Add(mediaItem, new ItemScanningPlan(nfoFile, ScanningAction.SidecarMetadata)); - results.Add(mediaItem, new ItemScanningPlan(mediaItem.Path, ScanningAction.Collections)); + results.Add(mediaItem, new ItemScanningPlan(nfoFile, ScanningAction.Collections)); } }); @@ -78,13 +85,13 @@ namespace ErsatzTV.Core.Metadata } }); } - + // missing media items foreach (MediaItem mediaItem in mediaItems.Where(i => !files.Contains(i.Path))) { results.Add(mediaItem, new ItemScanningPlan(mediaItem.Path, ScanningAction.Remove)); } - + return results.Summarize(); } @@ -158,12 +165,13 @@ namespace ErsatzTV.Core.Metadata ".m4p", ".m4v", ".avi", ".wmv", ".mov", ".mkv", ".ts"); private static readonly Seq ExtraDirectories = Seq( - "behind the scenes","deleted scenes","featurettes", - "interviews","scenes","shorts","trailers","other"); + "behind the scenes", "deleted scenes", "featurettes", + "interviews", "scenes", "shorts", "trailers", "other", + "extras", "specials"); private static readonly Seq ExtraFiles = Seq( - "behindthescenes","deleted","featurette", - "interview","scene","short","trailer","other"); + "behindthescenes", "deleted", "featurette", + "interview", "scene", "short", "trailer", "other"); // @formatter:on } }