diff --git a/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs index 4e3a41f30..2e01643f8 100644 --- a/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs +++ b/src/NzbDrone.Core.Test/MediaFiles/DiskScanServiceTests/ScanFixture.cs @@ -162,5 +162,25 @@ namespace NzbDrone.Core.Test.MediaFiles.DiskScanServiceTests Mocker.GetMock() .Verify(v => v.GetImportDecisions(It.Is>(l => l.Count == 1), _series), Times.Once()); } + + [Test] + public void should_not_scan_subfolder_of_season_folder_that_starts_with_a_period() + { + GivenParentFolderExists(); + + GivenFiles(new List + { + Path.Combine(_series.Path, "Season 1", ".@__thumb", "file1.mkv").AsOsAgnostic(), + Path.Combine(_series.Path, "Season 1", ".@__THUMB", "file2.mkv").AsOsAgnostic(), + Path.Combine(_series.Path, "Season 1", ".hidden", "file2.mkv").AsOsAgnostic(), + Path.Combine(_series.Path, "Season 1", ".AppleDouble", "s01e01.mkv").AsOsAgnostic(), + Path.Combine(_series.Path, "Season 1", "s01e01.mkv").AsOsAgnostic() + }); + + Subject.Scan(_series); + + Mocker.GetMock() + .Verify(v => v.GetImportDecisions(It.Is>(l => l.Count == 1), _series), Times.Once()); + } } } diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index e4c54c2a0..5f6e956a3 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; @@ -57,7 +58,8 @@ namespace NzbDrone.Core.MediaFiles _logger = logger; } - private static readonly Regex ExcludedSubFoldersRegex = new Regex(@"(extras|^\..+)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex ExcludedSubFoldersRegex = new Regex(@"(extras)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex ExcludedFoldersRegex = new Regex(@"(?:\\|\/)(\..+)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); public void Scan(Series series) { @@ -98,7 +100,8 @@ namespace NzbDrone.Core.MediaFiles } var videoFilesStopwatch = Stopwatch.StartNew(); - var mediaFileList = GetVideoFiles(series.Path).Where(file => !ExcludedSubFoldersRegex.IsMatch(series.Path.GetRelativePath(file))).ToList(); + var mediaFileList = FilterFiles(series, GetVideoFiles(series.Path)).ToList(); + videoFilesStopwatch.Stop(); _logger.Trace("Finished getting episode files for: {0} [{1}]", series, videoFilesStopwatch.Elapsed); @@ -126,6 +129,12 @@ namespace NzbDrone.Core.MediaFiles return mediaFileList.ToArray(); } + private IEnumerable FilterFiles(Series series, IEnumerable videoFiles) + { + return videoFiles.Where(file => !ExcludedSubFoldersRegex.IsMatch(series.Path.GetRelativePath(file))) + .Where(file => !ExcludedFoldersRegex.IsMatch(file)); + } + private void SetPermissions(String path) { if (!_configService.SetPermissionsLinux) @@ -145,7 +154,7 @@ namespace NzbDrone.Core.MediaFiles _logger.WarnException("Unable to apply permissions to: " + path, ex); _logger.DebugException(ex.Message, ex); } - } + } public void Handle(SeriesUpdatedEvent message) {