From 4f22d135d62cf8285cb8e6103fd5e18ada7ae9ec Mon Sep 17 00:00:00 2001 From: Qstick Date: Wed, 1 Jul 2020 21:48:13 -0400 Subject: [PATCH] Fixed: Skip various Extras directories during scan Fixes: #4487 --- .../Blackhole/ScanWatchFolderFixture.cs | 2 +- .../Blackhole/TorrentBlackholeFixture.cs | 2 +- .../Blackhole/UsenetBlackholeFixture.cs | 2 +- .../DiskScanServiceTests/ScanFixture.cs | 44 +++++++++++++++++++ .../DownloadedMoviesImportServiceFixture.cs | 2 +- .../Extras/ExistingExtraFileService.cs | 2 +- .../MediaFiles/DiskScanService.cs | 22 +++++----- 7 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs index bb085409d..978d898cc 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/ScanWatchFolderFixture.cs @@ -36,7 +36,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole .Setup(c => c.GetFileSize(It.IsAny())) .Returns(1000000); - Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>())) + Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>(), It.IsAny())) .Returns>((b, s) => s.ToList()); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs index ac7aee2af..293f3ffd3 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/TorrentBlackholeFixture.cs @@ -51,7 +51,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole .Setup(c => c.GetHashFromTorrentFile(It.IsAny())) .Returns("myhash"); - Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>())) + Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>(), It.IsAny())) .Returns>((b, s) => s.ToList()); } diff --git a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs index 28ecca4e1..763dc09b8 100644 --- a/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs +++ b/src/NzbDrone.Core.Test/Download/DownloadClientTests/Blackhole/UsenetBlackholeFixture.cs @@ -42,7 +42,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests.Blackhole .Setup(c => c.OpenWriteStream(It.IsAny())) .Returns(() => new FileStream(GetTempFilePath(), FileMode.Create)); - Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>())) + Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>(), It.IsAny())) .Returns>((b, s) => s.ToList()); } diff --git a/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs index f35f7f01d..c2813e344 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs @@ -155,6 +155,50 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests .Verify(v => v.GetImportDecisions(It.Is>(l => l.Count == 1), _movie), Times.Once()); } + [Test] + public void should_not_scan_various_extras_subfolders() + { + GivenMovieFolder(); + + GivenFiles(new List + { + Path.Combine(_movie.Path, "Behind the Scenes", "file1.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Deleted Scenes", "file2.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Featurettes", "file3.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Interviews", "file4.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Samples", "file5.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Scenes", "file6.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Shorts", "file7.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Trailers", "file8.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "The Count of Monte Cristo (2002) (1080p BluRay x265 10bit Tigole).mkv").AsOsAgnostic(), + }); + + Subject.Scan(_movie); + + Mocker.GetMock() + .Verify(v => v.GetImportDecisions(It.Is>(l => l.Count == 1), _movie), Times.Once()); + } + + [Test] + public void should_not_scan_featurettes_subfolders() + { + GivenMovieFolder(); + + GivenFiles(new List + { + Path.Combine(_movie.Path, "Featurettes", "An Epic Reborn.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Featurettes", "Deleted & Alternate Scenes.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Featurettes", "En Garde - Multi-Angle Dailies.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "Featurettes", "Layer-By-Layer - Sound Design - Multiple Audio.mkv").AsOsAgnostic(), + Path.Combine(_movie.Path, "The Count of Monte Cristo (2002) (1080p BluRay x265 10bit Tigole).mkv").AsOsAgnostic(), + }); + + Subject.Scan(_movie); + + Mocker.GetMock() + .Verify(v => v.GetImportDecisions(It.Is>(l => l.Count == 1), _movie), Times.Once()); + } + [Test] public void should_not_create_if_movie_folder_does_not_exist_and_create_folder_disabled() { diff --git a/src/NzbDrone.Core.Test/MediaFiles/DownloadedMoviesImportServiceFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/DownloadedMoviesImportServiceFixture.cs index 31c3afe38..8ec3ec07c 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/DownloadedMoviesImportServiceFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/DownloadedMoviesImportServiceFixture.cs @@ -36,7 +36,7 @@ namespace NzbDrone.Core.Test.MediaFiles Mocker.GetMock().Setup(c => c.GetVideoFiles(It.IsAny(), It.IsAny())) .Returns(_videoFiles); - Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>())) + Mocker.GetMock().Setup(c => c.FilterFiles(It.IsAny(), It.IsAny>(), It.IsAny())) .Returns>((b, s) => s.ToList()); Mocker.GetMock().Setup(c => c.GetDirectories(It.IsAny())) diff --git a/src/NzbDrone.Core/Extras/ExistingExtraFileService.cs b/src/NzbDrone.Core/Extras/ExistingExtraFileService.cs index 3f6d4a003..cf8979dbf 100644 --- a/src/NzbDrone.Core/Extras/ExistingExtraFileService.cs +++ b/src/NzbDrone.Core/Extras/ExistingExtraFileService.cs @@ -41,7 +41,7 @@ namespace NzbDrone.Core.Extras _logger.Debug("Looking for existing extra files in {0}", movie.Path); var filesOnDisk = _diskScanService.GetNonVideoFiles(movie.Path); - var possibleExtraFiles = _diskScanService.FilterFiles(movie.Path, filesOnDisk); + var possibleExtraFiles = _diskScanService.FilterFiles(movie.Path, filesOnDisk, false); var filteredFiles = possibleExtraFiles; var importedFiles = new List(); diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index e9f416e79..43e5015da 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -24,7 +24,7 @@ namespace NzbDrone.Core.MediaFiles void Scan(Movie movie); string[] GetVideoFiles(string path, bool allDirectories = true); string[] GetNonVideoFiles(string path, bool allDirectories = true); - List FilterFiles(string basePath, IEnumerable files); + List FilterFiles(string basePath, IEnumerable files, bool filterExtras = true); } public class DiskScanService : @@ -39,8 +39,6 @@ namespace NzbDrone.Core.MediaFiles private readonly IMediaFileTableCleanupService _mediaFileTableCleanupService; private readonly IRootFolderService _rootFolderService; private readonly IEventAggregator _eventAggregator; - private readonly IMediaFileService _movieFileRepository; - private readonly IRenameMovieFileService _renameMovieFiles; private readonly Logger _logger; public DiskScanService(IDiskProvider diskProvider, @@ -51,8 +49,6 @@ namespace NzbDrone.Core.MediaFiles IMediaFileTableCleanupService mediaFileTableCleanupService, IRootFolderService rootFolderService, IEventAggregator eventAggregator, - IMediaFileService movieFileRepository, - IRenameMovieFileService renameMovieFiles, Logger logger) { _diskProvider = diskProvider; @@ -63,12 +59,11 @@ namespace NzbDrone.Core.MediaFiles _mediaFileTableCleanupService = mediaFileTableCleanupService; _rootFolderService = rootFolderService; _eventAggregator = eventAggregator; - _movieFileRepository = movieFileRepository; - _renameMovieFiles = renameMovieFiles; _logger = logger; } - private static readonly Regex ExcludedSubFoldersRegex = new Regex(@"(?:\\|\/|^)(?:extras|@eadir|\.@__thumb|extrafanart|plex versions|\.[^\\/]+)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex ExcludedExtrasSubFolderRegex = new Regex(@"(?:\\|\/|^)(?:extras|extrafanart|behind the scenes|deleted scenes|featurettes|interviews|scenes|samples|shorts|trailers)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex ExcludedSubFoldersRegex = new Regex(@"(?:\\|\/|^)(?:@eadir|\.@__thumb|plex versions|\.[^\\/]+)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex ExcludedFilesRegex = new Regex(@"^\._|^Thumbs\.db$", RegexOptions.Compiled | RegexOptions.IgnoreCase); public void Scan(Movie movie) @@ -176,11 +171,18 @@ namespace NzbDrone.Core.MediaFiles return mediaFileList.ToArray(); } - public List FilterFiles(string basePath, IEnumerable files) + public List FilterFiles(string basePath, IEnumerable files, bool filterExtras = true) { - return files.Where(file => !ExcludedSubFoldersRegex.IsMatch(basePath.GetRelativePath(file))) + var filteredFiles = files.Where(file => !ExcludedSubFoldersRegex.IsMatch(basePath.GetRelativePath(file))) .Where(file => !ExcludedFilesRegex.IsMatch(Path.GetFileName(file))) .ToList(); + + if (filterExtras) + { + filteredFiles = filteredFiles.Where(file => !ExcludedExtrasSubFolderRegex.IsMatch(basePath.GetRelativePath(file))).ToList(); + } + + return filteredFiles; } private void SetPermissions(string path)