diff --git a/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs b/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs index 449c251e6..e8c3fa104 100644 --- a/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs +++ b/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs @@ -27,6 +27,11 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests @"C:\Test\movie" }; + GivenFiles(); + } + + private void GivenFiles() + { Mocker.GetMock() .Setup(s => s.GetFiles(It.IsAny(), SearchOption.AllDirectories)) .Returns(_files); @@ -69,8 +74,20 @@ namespace NzbDrone.Core.Test.ProviderTests.DiskScanProviderTests public void should_return_video_files_only() { var path = @"C:\Test\"; - var test = Subject.GetVideoFiles(path); + Subject.GetVideoFiles(path).Should().HaveCount(4); } + + [Test] + public void should_exclude_osx_metadata_files() + { + var path = @"C:\Test\"; + + _files = new [] { "._24 The Status Quo Combustion.mp4", "24 The Status Quo Combustion.mp4" }; + + GivenFiles(); + + Subject.GetVideoFiles(path).Should().HaveCount(1); + } } } diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index 23daed588..b30c4b70e 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -60,6 +60,7 @@ namespace NzbDrone.Core.MediaFiles private static readonly Regex ExcludedSubFoldersRegex = new Regex(@"(extras|@eadir)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex ExcludedFoldersRegex = new Regex(@"(?:\\|\/)(\..+)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex ExcludedFilesRegex = new Regex(@"^\._", RegexOptions.Compiled | RegexOptions.IgnoreCase); public void Scan(Series series) { @@ -124,7 +125,9 @@ namespace NzbDrone.Core.MediaFiles var searchOption = allDirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly; var filesOnDisk = _diskProvider.GetFiles(path, searchOption); - var mediaFileList = filesOnDisk.Where(c => MediaFileExtensions.Extensions.Contains(Path.GetExtension(c).ToLower())).ToList(); + var mediaFileList = filesOnDisk.Where(file => MediaFileExtensions.Extensions.Contains(Path.GetExtension(file).ToLower())) + .Where(file => !ExcludedFilesRegex.IsMatch(Path.GetFileName(file))) + .ToList(); _logger.Debug("{0} video files were found in {1}", mediaFileList.Count, path); return mediaFileList.ToArray(); @@ -133,7 +136,8 @@ namespace NzbDrone.Core.MediaFiles private IEnumerable FilterFiles(Series series, IEnumerable videoFiles) { return videoFiles.Where(file => !ExcludedSubFoldersRegex.IsMatch(series.Path.GetRelativePath(file))) - .Where(file => !ExcludedFoldersRegex.IsMatch(file)); + .Where(file => !ExcludedFoldersRegex.IsMatch(file)) + .Where(file => !ExcludedFilesRegex.IsMatch(Path.GetFileName(file))); } private void SetPermissions(String path)