diff --git a/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs b/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs index fe10a6a18..280362803 100644 --- a/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs +++ b/NzbDrone.Core.Test/Download/DownloadClientTests/PneumaticProviderFixture.cs @@ -26,7 +26,7 @@ namespace NzbDrone.Core.Test.Download.DownloadClientTests nzbPath = pneumaticFolder + title + ".nzb"; Mocker.GetMock().SetupGet(c => c.PneumaticDirectory).Returns(pneumaticFolder); - Mocker.GetMock().SetupGet(c => c.DownloadClientTvDirectory).Returns(sabDrop); + Mocker.GetMock().SetupGet(c => c.DownloadedEpisodesFolder).Returns(sabDrop); } private void WithExistingFile() diff --git a/NzbDrone.Core/Configuration/ConfigService.cs b/NzbDrone.Core/Configuration/ConfigService.cs index 80d66df74..5e1a5249a 100644 --- a/NzbDrone.Core/Configuration/ConfigService.cs +++ b/NzbDrone.Core/Configuration/ConfigService.cs @@ -99,11 +99,11 @@ namespace NzbDrone.Core.Configuration set { SetValue("SabRecentTvPriority", value); } } - public String DownloadClientTvDirectory + public String DownloadedEpisodesFolder { - get { return GetValue("DownloadClientTvDirectory"); } + get { return GetValue("DownloadedEpisodesFolder"); } - set { SetValue("DownloadClientTvDirectory", value); } + set { SetValue("DownloadedEpisodesFolder", value); } } public bool UseSeasonFolder diff --git a/NzbDrone.Core/Configuration/IConfigService.cs b/NzbDrone.Core/Configuration/IConfigService.cs index 754901ce8..df0265b86 100644 --- a/NzbDrone.Core/Configuration/IConfigService.cs +++ b/NzbDrone.Core/Configuration/IConfigService.cs @@ -19,7 +19,7 @@ namespace NzbDrone.Core.Configuration String SabTvCategory { get; set; } SabPriorityType SabBacklogTvPriority { get; set; } SabPriorityType SabRecentTvPriority { get; set; } - String DownloadClientTvDirectory { get; set; } + String DownloadedEpisodesFolder { get; set; } bool UseSeasonFolder { get; set; } string SortingSeasonFolderFormat { get; set; } int DefaultQualityProfile { get; set; } diff --git a/NzbDrone.Core/Download/Clients/PneumaticClient.cs b/NzbDrone.Core/Download/Clients/PneumaticClient.cs index 86b9a980a..8d1be6c7e 100644 --- a/NzbDrone.Core/Download/Clients/PneumaticClient.cs +++ b/NzbDrone.Core/Download/Clients/PneumaticClient.cs @@ -60,7 +60,7 @@ namespace NzbDrone.Core.Download.Clients logger.Trace("NZB Download succeeded, saved to: {0}", filename); var contents = String.Format("plugin://plugin.program.pneumatic/?mode=strm&type=add_file&nzb={0}&nzbname={1}", filename, title); - _diskProvider.WriteAllText(Path.Combine(_configService.DownloadClientTvDirectory, title + ".strm"), contents); + _diskProvider.WriteAllText(Path.Combine(_configService.DownloadedEpisodesFolder, title + ".strm"), contents); return true; } diff --git a/NzbDrone.Core/Jobs/Scheduler.cs b/NzbDrone.Core/Jobs/Scheduler.cs index f245e6aab..7399eac3c 100644 --- a/NzbDrone.Core/Jobs/Scheduler.cs +++ b/NzbDrone.Core/Jobs/Scheduler.cs @@ -67,6 +67,4 @@ namespace NzbDrone.Core.Jobs Timer.Stop(); } } - - } \ No newline at end of file diff --git a/NzbDrone.Core/Jobs/TaskManager.cs b/NzbDrone.Core/Jobs/TaskManager.cs index 71719c4c9..428dce76d 100644 --- a/NzbDrone.Core/Jobs/TaskManager.cs +++ b/NzbDrone.Core/Jobs/TaskManager.cs @@ -38,12 +38,12 @@ namespace NzbDrone.Core.Jobs { new ScheduledTask{ Interval = 25, TypeName = typeof(RssSyncCommand).FullName}, new ScheduledTask{ Interval = 12*60, TypeName = typeof(UpdateXemMappings).FullName}, - new ScheduledTask{ Interval = 6*60, TypeName = typeof(DiskScanCommand).FullName} + new ScheduledTask{ Interval = 6*60, TypeName = typeof(DiskScanCommand).FullName}, + new ScheduledTask{ Interval = 1, TypeName = typeof(DownloadedEpisodesScanCommand).FullName} }; var currentTasks = _scheduledTaskRepository.All(); - _logger.Debug("Initializing jobs. Available: {0} Existing:{1}", defaultTasks.Count(), currentTasks.Count()); diff --git a/NzbDrone.Core/MediaFiles/Commands/DiskScanCommand.cs b/NzbDrone.Core/MediaFiles/Commands/DiskScanCommand.cs index db7dd7a04..6d5b144fd 100644 --- a/NzbDrone.Core/MediaFiles/Commands/DiskScanCommand.cs +++ b/NzbDrone.Core/MediaFiles/Commands/DiskScanCommand.cs @@ -13,5 +13,9 @@ namespace NzbDrone.Core.MediaFiles.Commands SeriesId = seriesId; } } + + public DiskScanCommand() + { + } } } \ No newline at end of file diff --git a/NzbDrone.Core/MediaFiles/Commands/DownloadedEpisodesScanCommand.cs b/NzbDrone.Core/MediaFiles/Commands/DownloadedEpisodesScanCommand.cs new file mode 100644 index 000000000..0f03f2083 --- /dev/null +++ b/NzbDrone.Core/MediaFiles/Commands/DownloadedEpisodesScanCommand.cs @@ -0,0 +1,11 @@ +using NzbDrone.Common.Messaging; + +namespace NzbDrone.Core.MediaFiles.Commands +{ + public class DownloadedEpisodesScanCommand : ICommand + { + public DownloadedEpisodesScanCommand() + { + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core/Providers/DropfolderImportService.cs b/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs similarity index 78% rename from NzbDrone.Core/Providers/DropfolderImportService.cs rename to NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs index 05eb998f1..2f2123735 100644 --- a/NzbDrone.Core/Providers/DropfolderImportService.cs +++ b/NzbDrone.Core/MediaFiles/DownloadedEpisodesImportService.cs @@ -2,31 +2,30 @@ using System.IO; using NLog; using NzbDrone.Common; -using NzbDrone.Core.MediaFiles; +using NzbDrone.Common.Messaging; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.MediaFiles.Commands; using NzbDrone.Core.Parser; using NzbDrone.Core.Tv; -namespace NzbDrone.Core.Providers +namespace NzbDrone.Core.MediaFiles { - public interface IDropFolderImportService - { - void ProcessDropFolder(string dropFolder); - } - - public class DropFolderImportService : IDropFolderImportService + public class DownloadedEpisodesImportService : IExecute { private readonly IDiskProvider _diskProvider; private readonly IDiskScanService _diskScanService; private readonly ISeriesService _seriesService; private readonly IMoveEpisodeFiles _episodeFileMover; private readonly IParsingService _parsingService; + private readonly IConfigService _configService; private readonly Logger _logger; - public DropFolderImportService(IDiskProvider diskProvider, + public DownloadedEpisodesImportService(IDiskProvider diskProvider, IDiskScanService diskScanService, ISeriesService seriesService, IMoveEpisodeFiles episodeFileMover, IParsingService parsingService, + IConfigService configService, Logger logger) { _diskProvider = diskProvider; @@ -34,42 +33,10 @@ namespace NzbDrone.Core.Providers _seriesService = seriesService; _episodeFileMover = episodeFileMover; _parsingService = parsingService; + _configService = configService; _logger = logger; } - public virtual void ProcessDropFolder(string dropFolder) - { - foreach (var subfolder in _diskProvider.GetDirectories(dropFolder)) - { - try - { - if (!_seriesService.SeriesPathExists(subfolder)) - { - ProcessSubFolder(new DirectoryInfo(subfolder)); - } - } - catch (Exception e) - { - _logger.ErrorException("An error has occurred while importing folder: " + subfolder, e); - } - } - - foreach (var videoFile in _diskScanService.GetVideoFiles(dropFolder, false)) - { - try - { - var series = _parsingService.GetSeries(videoFile); - ProcessVideoFile(videoFile, series); - } - catch (Exception ex) - { - _logger.ErrorException("An error has occurred while importing video file" + videoFile, ex); - } - } - - //TODO: cleanup empty folders - } - public void ProcessSubFolder(DirectoryInfo subfolderInfo) { if (_diskProvider.GetLastFolderWrite(subfolderInfo.FullName).AddMinutes(2) > DateTime.UtcNow) @@ -94,7 +61,6 @@ namespace NzbDrone.Core.Providers } } - public void ProcessVideoFile(string videoFile, Series series) { if (_diskProvider.GetLastFileWrite(videoFile).AddMinutes(2) > DateTime.UtcNow) @@ -117,5 +83,46 @@ namespace NzbDrone.Core.Providers } } + public void Execute(DownloadedEpisodesScanCommand message) + { + //TODO: We should also process the download client's category folder + var downloadedEpisodesFolder = _configService.DownloadedEpisodesFolder; + + if (String.IsNullOrEmpty(downloadedEpisodesFolder)) + { + _logger.Warn("Downloaded Episodes Folder is not configured"); + return; + } + + foreach (var subfolder in _diskProvider.GetDirectories(downloadedEpisodesFolder)) + { + try + { + if (!_seriesService.SeriesPathExists(subfolder)) + { + ProcessSubFolder(new DirectoryInfo(subfolder)); + } + } + catch (Exception e) + { + _logger.ErrorException("An error has occurred while importing folder: " + subfolder, e); + } + } + + foreach (var videoFile in _diskScanService.GetVideoFiles(downloadedEpisodesFolder, false)) + { + try + { + var series = _parsingService.GetSeries(videoFile); + ProcessVideoFile(videoFile, series); + } + catch (Exception ex) + { + _logger.ErrorException("An error has occurred while importing video file" + videoFile, ex); + } + } + + //TODO: cleanup empty folders + } } } \ No newline at end of file diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 6332d24e9..7bb98795f 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -249,6 +249,7 @@ + @@ -459,7 +460,7 @@ Code - + Code diff --git a/UI/Settings/DownloadClient/DownloadClientTemplate.html b/UI/Settings/DownloadClient/DownloadClientTemplate.html index a0105509d..5ce3d12a4 100644 --- a/UI/Settings/DownloadClient/DownloadClientTemplate.html +++ b/UI/Settings/DownloadClient/DownloadClientTemplate.html @@ -17,12 +17,12 @@
- +
- + - +