diff --git a/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs b/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs index e9edf3f38..850f07c84 100644 --- a/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs +++ b/src/NzbDrone.Core.Test/ProviderTests/DiskScanProviderTests/GetVideoFilesFixture.cs @@ -90,6 +90,7 @@ public void should_return_video_files_only() [TestCase(".secret")] [TestCase(".hidden")] [TestCase(".unwanted")] + [TestCase("theme-music")] public void should_filter_certain_sub_folders(string subFolder) { var path = @"C:\Test\"; diff --git a/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupExtraFilesInExcludedFolders.cs b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupExtraFilesInExcludedFolders.cs new file mode 100644 index 000000000..5e0bb7745 --- /dev/null +++ b/src/NzbDrone.Core/Housekeeping/Housekeepers/CleanupExtraFilesInExcludedFolders.cs @@ -0,0 +1,46 @@ +using System.IO; +using System.Linq; +using NzbDrone.Core.Extras.Files; +using NzbDrone.Core.Extras.Others; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.Housekeeping.Housekeepers +{ + public class CleanupExtraFilesInExcludedFolders : IHousekeepingTask + { + private readonly IExtraFileRepository _extraFileRepository; + private readonly ISeriesService _seriesService; + private readonly IDiskScanService _diskScanService; + + public CleanupExtraFilesInExcludedFolders(IExtraFileRepository extraFileRepository, ISeriesService seriesService, IDiskScanService diskScanService) + { + _extraFileRepository = extraFileRepository; + _seriesService = seriesService; + _diskScanService = diskScanService; + } + + public void Clean() + { + var allSeries = _seriesService.GetAllSeries(); + + foreach (var series in allSeries) + { + var extraFiles = _extraFileRepository.GetFilesBySeries(series.Id); + var filteredExtraFiles = _diskScanService.FilterPaths(series.Path, extraFiles.Select(e => Path.Combine(series.Path, e.RelativePath))); + + if (filteredExtraFiles.Count == extraFiles.Count) + { + continue; + } + + var excludedExtraFiles = extraFiles.Where(e => !filteredExtraFiles.Contains(Path.Combine(e.RelativePath))).ToList(); + + if (excludedExtraFiles.Any()) + { + _extraFileRepository.DeleteMany(excludedExtraFiles.Select(e => e.Id)); + } + } + } + } +} diff --git a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs index 82237aad9..396a5b955 100644 --- a/src/NzbDrone.Core/MediaFiles/DiskScanService.cs +++ b/src/NzbDrone.Core/MediaFiles/DiskScanService.cs @@ -69,7 +69,7 @@ public DiskScanService(IDiskProvider diskProvider, _logger = logger; } - private static readonly Regex ExcludedExtrasSubFolderRegex = new Regex(@"(?:\\|\/|^)(?:extras|extrafanart|behind the scenes|deleted scenes|featurettes|interviews|other|scenes|samples|shorts|trailers)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex ExcludedExtrasSubFolderRegex = new Regex(@"(?:\\|\/|^)(?:extras|extrafanart|behind the scenes|deleted scenes|featurettes|interviews|other|scenes|samples|shorts|trailers|theme[-_. ]music|backdrops)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex ExcludedSubFoldersRegex = new Regex(@"(?:\\|\/|^)(?:@eadir|\.@__thumb|plex versions|\.[^\\/]+)(?:\\|\/)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex ExcludedExtraFilesRegex = new Regex(@"(-(trailer|other|behindthescenes|deleted|featurette|interview|scene|short)\.[^.]+$)", RegexOptions.Compiled | RegexOptions.IgnoreCase); private static readonly Regex ExcludedFilesRegex = new Regex(@"^\.(_|unmanic|DS_Store$)|^Thumbs\.db$", RegexOptions.Compiled | RegexOptions.IgnoreCase);