diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index a935d6dfb..f5a464d3b 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -219,6 +219,7 @@ + diff --git a/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs b/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs index 3d393058f..a2a67aa93 100644 --- a/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs +++ b/NzbDrone.Core/Providers/Jobs/PostDownloadScanJob.cs @@ -10,23 +10,12 @@ namespace NzbDrone.Core.Providers.Jobs { public class PostDownloadScanJob : IJob { - private readonly ConfigProvider _configProvider; - private readonly DiskProvider _diskProvider; - private readonly DiskScanProvider _diskScanProvider; - private readonly SeriesProvider _seriesProvider; - private readonly EpisodeProvider _episodeProvider; - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private readonly PostDownloadProvider _postDownloadProvider; [Inject] - public PostDownloadScanJob(ConfigProvider configProvider, DiskProvider diskProvider, - DiskScanProvider diskScanProvider, SeriesProvider seriesProvider, - EpisodeProvider episodeProvider) + public PostDownloadScanJob(PostDownloadProvider postDownloadProvider) { - _configProvider = configProvider; - _diskProvider = diskProvider; - _diskScanProvider = diskScanProvider; - _seriesProvider = seriesProvider; - _episodeProvider = episodeProvider; + _postDownloadProvider = postDownloadProvider; } public PostDownloadScanJob() @@ -45,76 +34,7 @@ namespace NzbDrone.Core.Providers.Jobs public virtual void Start(ProgressNotification notification, int targetId, int secondaryTargetId) { - var dropFolder = _configProvider.SabDropDirectory; - - if (String.IsNullOrWhiteSpace(dropFolder)) - { - Logger.Debug("No drop folder is defined. Skipping."); - return; - } - - if (!_diskProvider.FolderExists(dropFolder)) - { - Logger.Warn("Unable to Scan for New Downloads - folder Doesn't exist: [{0}]", dropFolder); - return; - } - - foreach (var subfolder in _diskProvider.GetDirectories(dropFolder)) - { - try - { - var subfolderInfo = new DirectoryInfo(subfolder); - - if (subfolderInfo.Name.StartsWith("_UNPACK_", StringComparison.CurrentCultureIgnoreCase)) - { - _episodeProvider.SetPostDownloadStatus(subfolderInfo.Name.Substring(8), PostDownloadStatusType.Unpacking); - Logger.Debug("Folder [{0}] is still being unpacked. skipping.", subfolder); - continue; - } - - if (subfolderInfo.Name.StartsWith("_FAILED_", StringComparison.CurrentCultureIgnoreCase)) - { - _episodeProvider.SetPostDownloadStatus(subfolderInfo.Name.Substring(8), PostDownloadStatusType.Failed); - Logger.Debug("Folder [{0}] is marked as failed. skipping.", subfolder); - continue; - } - - if (subfolderInfo.Name.StartsWith("_NzbDrone_", StringComparison.CurrentCultureIgnoreCase)) - { - Logger.Debug("Folder [{0}] is marked as already processedby NzbDrone. skipping.", subfolder); - continue; - } - - //Parse the Folder name - var seriesName = Parser.ParseSeriesName(subfolderInfo.Name); - var series = _seriesProvider.FindSeries(seriesName); - - if (series == null) - { - Logger.Warn("Unable to Import new download [{0}], series doesn't exist in database.", subfolder); - - //Rename the Directory so it's not processed again. - _diskProvider.MoveDirectory(subfolderInfo.FullName, Path.Combine(subfolderInfo.Parent.FullName, "_NzbDrone_" + subfolderInfo.Name)); - continue; - } - - var importedFiles = _diskScanProvider.Scan(series, subfolder); - importedFiles.ForEach(file => _diskScanProvider.MoveEpisodeFile(file, true)); - - //Delete the folder only if folder is small enough - if (_diskProvider.GetDirectorySize(subfolder) < 10.Megabytes()) - _diskProvider.DeleteFolder(subfolder, true); - - //Otherwise rename the folder to say it was already processed once by NzbDrone so it will not be continually processed - else - _diskProvider.MoveDirectory(subfolderInfo.FullName,Path.Combine(subfolderInfo.Parent.FullName, "_NzbDrone_" + subfolderInfo.Name)); - } - - catch (Exception e) - { - Logger.ErrorException("An error has occurred while importing " + subfolder, e); - } - } + _postDownloadProvider.Start(notification); } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/PostDownloadProvider.cs b/NzbDrone.Core/Providers/PostDownloadProvider.cs new file mode 100644 index 000000000..06d9053b4 --- /dev/null +++ b/NzbDrone.Core/Providers/PostDownloadProvider.cs @@ -0,0 +1,116 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using NLog; +using Ninject; +using NzbDrone.Core.Model; +using NzbDrone.Core.Model.Notification; +using NzbDrone.Core.Providers.Core; + +namespace NzbDrone.Core.Providers +{ + public class PostDownloadProvider + { + //Used to perform Post Download Processing (Started by PostDownloadScanJob) + + private readonly ConfigProvider _configProvider; + private readonly DiskProvider _diskProvider; + private readonly DiskScanProvider _diskScanProvider; + private readonly SeriesProvider _seriesProvider; + private readonly EpisodeProvider _episodeProvider; + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + [Inject] + public PostDownloadProvider(ConfigProvider configProvider, DiskProvider diskProvider, + DiskScanProvider diskScanProvider, SeriesProvider seriesProvider, + EpisodeProvider episodeProvider) + { + _configProvider = configProvider; + _diskProvider = diskProvider; + _diskScanProvider = diskScanProvider; + _seriesProvider = seriesProvider; + _episodeProvider = episodeProvider; + } + + PostDownloadProvider() + { + + } + + public virtual void Start(ProgressNotification notification) + { + var dropFolder = _configProvider.SabDropDirectory; + + if (String.IsNullOrWhiteSpace(dropFolder)) + { + Logger.Debug("No drop folder is defined. Skipping."); + return; + } + + if (!_diskProvider.FolderExists(dropFolder)) + { + Logger.Warn("Unable to Scan for New Downloads - folder Doesn't exist: [{0}]", dropFolder); + return; + } + + foreach (var subfolder in _diskProvider.GetDirectories(dropFolder)) + { + try + { + var subfolderInfo = new DirectoryInfo(subfolder); + + if (subfolderInfo.Name.StartsWith("_UNPACK_", StringComparison.CurrentCultureIgnoreCase)) + { + _episodeProvider.SetPostDownloadStatus(subfolderInfo.Name.Substring(8), PostDownloadStatusType.Unpacking); + Logger.Debug("Folder [{0}] is still being unpacked. skipping.", subfolder); + continue; + } + + if (subfolderInfo.Name.StartsWith("_FAILED_", StringComparison.CurrentCultureIgnoreCase)) + { + _episodeProvider.SetPostDownloadStatus(subfolderInfo.Name.Substring(8), PostDownloadStatusType.Failed); + Logger.Debug("Folder [{0}] is marked as failed. skipping.", subfolder); + continue; + } + + if (subfolderInfo.Name.StartsWith("_NzbDrone_", StringComparison.CurrentCultureIgnoreCase)) + { + Logger.Debug("Folder [{0}] is marked as already processedby NzbDrone. skipping.", subfolder); + continue; + } + + //Parse the Folder name + var seriesName = Parser.ParseSeriesName(subfolderInfo.Name); + var series = _seriesProvider.FindSeries(seriesName); + + if (series == null) + { + Logger.Warn("Unable to Import new download [{0}], series doesn't exist in database.", subfolder); + + //Rename the Directory so it's not processed again. + _diskProvider.MoveDirectory(subfolderInfo.FullName, Path.Combine(subfolderInfo.Parent.FullName, "_NzbDrone_" + subfolderInfo.Name)); + continue; + } + + var importedFiles = _diskScanProvider.Scan(series, subfolder); + importedFiles.ForEach(file => _diskScanProvider.MoveEpisodeFile(file, true)); + + //Delete the folder only if folder is small enough + if (_diskProvider.GetDirectorySize(subfolder) < 10.Megabytes()) + _diskProvider.DeleteFolder(subfolder, true); + + //Otherwise rename the folder to say it was already processed once by NzbDrone so it will not be continually processed + else + _diskProvider.MoveDirectory(subfolderInfo.FullName, Path.Combine(subfolderInfo.Parent.FullName, "_NzbDrone_" + subfolderInfo.Name)); + } + + catch (Exception e) + { + Logger.ErrorException("An error has occurred while importing " + subfolder, e); + } + } + } + } +}