diff --git a/NzbDrone.Core.Test/ProviderTests/DownloadProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/DownloadProviderTest.cs index 1549f9447..61e257470 100644 --- a/NzbDrone.Core.Test/ProviderTests/DownloadProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/DownloadProviderTest.cs @@ -5,6 +5,7 @@ using Moq; using NUnit.Framework; using NzbDrone.Core.Model; using NzbDrone.Core.Providers; +using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; using NzbDrone.Core.Repository.Quality; using NzbDrone.Core.Test.Framework; @@ -62,6 +63,60 @@ namespace NzbDrone.Core.Test.ProviderTests Mocker.GetMock() .Setup(c => c.OnGrab(It.IsAny())); + Mocker.GetMock() + .Setup(c => c.DownloadClient) + .Returns(DownloadClientType.Sabnzbd); + + Mocker.Resolve().DownloadReport(parseResult); + + Mocker.VerifyAllMocks(); + } + + [Test] + public void Download_report_should_download_nzb_add_to_history_mark_as_grabbed() + { + WithStrictMocker(); + var parseResult = Builder.CreateNew() + .With(c => c.Quality = new Quality(QualityTypes.DVD, false)) + .Build(); + + var episodes = Builder.CreateListOfSize(2) + .TheFirst(1).With(s => s.EpisodeId = 12) + .TheNext(1).With(s => s.EpisodeId = 99) + .All().With(s => s.SeriesId = 5) + .Build(); + + + const string sabTitle = "My fake sab title"; + Mocker.GetMock() + .Setup(s => s.DownloadNzb(It.IsAny(), sabTitle)) + .Returns(true); + + Mocker.GetMock() + .Setup(s => s.GetSabTitle(parseResult)) + .Returns(sabTitle); + + Mocker.GetMock() + .Setup(s => s.Add(It.Is(h => h.EpisodeId == 12 && h.SeriesId == 5))); + Mocker.GetMock() + .Setup(s => s.Add(It.Is(h => h.EpisodeId == 99 && h.SeriesId == 5))); + + Mocker.GetMock() + .Setup(c => c.GetEpisodesByParseResult(It.IsAny(), false)).Returns(episodes); + + Mocker.GetMock() + .Setup(c => c.MarkEpisodeAsFetched(12)); + + Mocker.GetMock() + .Setup(c => c.MarkEpisodeAsFetched(99)); + + Mocker.GetMock() + .Setup(c => c.OnGrab(It.IsAny())); + + Mocker.GetMock() + .Setup(c => c.DownloadClient) + .Returns(DownloadClientType.Blackhole); + Mocker.Resolve().DownloadReport(parseResult); Mocker.VerifyAllMocks(); diff --git a/NzbDrone.Core/NzbDrone.Core.csproj b/NzbDrone.Core/NzbDrone.Core.csproj index 2e22a4faf..796fbbb2c 100644 --- a/NzbDrone.Core/NzbDrone.Core.csproj +++ b/NzbDrone.Core/NzbDrone.Core.csproj @@ -259,6 +259,7 @@ + diff --git a/NzbDrone.Core/Providers/BlackholeProvider.cs b/NzbDrone.Core/Providers/BlackholeProvider.cs new file mode 100644 index 000000000..11bca5755 --- /dev/null +++ b/NzbDrone.Core/Providers/BlackholeProvider.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using NLog; +using Ninject; +using NzbDrone.Common; +using NzbDrone.Core.Model; +using NzbDrone.Core.Providers.Core; + +namespace NzbDrone.Core.Providers +{ + public class BlackholeProvider + { + private readonly ConfigProvider _configProvider; + private readonly HttpProvider _httpProvider; + private readonly DiskProvider _diskProvider; + + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + [Inject] + public BlackholeProvider(ConfigProvider configProvider, HttpProvider httpProvider, + DiskProvider diskProvider) + { + _configProvider = configProvider; + _httpProvider = httpProvider; + _diskProvider = diskProvider; + } + + public BlackholeProvider() + { + } + + public virtual bool DownloadNzb(EpisodeParseResult parseResult, string title) + { + try + { + var filename = Path.Combine(_configProvider.BlackholeDirectory, title, ".nzb"); + + if(_diskProvider.FileExists(filename)) + { + //Return true so a lesser quality is not returned. + Logger.Info("NZB already exists on disk: {0)", filename); + return true; + } + + Logger.Trace("Downloading NZB from: {0} to: {1}", parseResult.NzbUrl, filename); + _httpProvider.DownloadFile(parseResult.NzbUrl, filename); + + Logger.Trace("NZB Download succeeded, saved to: {0}", filename); + return true; + } + catch(Exception ex) + { + Logger.WarnException("Failed to download NZB: " + parseResult.NzbUrl, ex); + return false; + } + } + } +} diff --git a/NzbDrone.Core/Providers/Core/ConfigProvider.cs b/NzbDrone.Core/Providers/Core/ConfigProvider.cs index ea684f1e8..e54991446 100644 --- a/NzbDrone.Core/Providers/Core/ConfigProvider.cs +++ b/NzbDrone.Core/Providers/Core/ConfigProvider.cs @@ -416,6 +416,12 @@ namespace NzbDrone.Core.Providers.Core set { SetValue("DownloadClient", (int)value); } } + public virtual string BlackholeDirectory + { + get { return GetValue("BlackholeDirectory", String.Empty); } + set { SetValue("BlackholeDirectory", value); } + } + public string UGuid { get { return GetValue("UGuid", Guid.NewGuid().ToString(), persist: true); } diff --git a/NzbDrone.Core/Providers/DownloadProvider.cs b/NzbDrone.Core/Providers/DownloadProvider.cs index 3a1b580e6..07966ae3f 100644 --- a/NzbDrone.Core/Providers/DownloadProvider.cs +++ b/NzbDrone.Core/Providers/DownloadProvider.cs @@ -2,6 +2,7 @@ using Ninject; using NLog; using NzbDrone.Core.Model; +using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Repository; namespace NzbDrone.Core.Providers @@ -12,17 +13,22 @@ namespace NzbDrone.Core.Providers private readonly HistoryProvider _historyProvider; private readonly EpisodeProvider _episodeProvider; private readonly ExternalNotificationProvider _externalNotificationProvider; + private readonly ConfigProvider _configProvider; + private readonly BlackholeProvider _blackholeProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); [Inject] public DownloadProvider(SabProvider sabProvider, HistoryProvider historyProvider, - EpisodeProvider episodeProvider, ExternalNotificationProvider externalNotificationProvider) + EpisodeProvider episodeProvider, ExternalNotificationProvider externalNotificationProvider, + ConfigProvider configProvider, BlackholeProvider blackholeProvider) { _sabProvider = sabProvider; _historyProvider = historyProvider; _episodeProvider = episodeProvider; _externalNotificationProvider = externalNotificationProvider; + _configProvider = configProvider; + _blackholeProvider = blackholeProvider; } public DownloadProvider() @@ -31,14 +37,22 @@ namespace NzbDrone.Core.Providers public virtual bool DownloadReport(EpisodeParseResult parseResult) { - if (_sabProvider.IsInQueue(parseResult)) - { - Logger.Warn("Episode {0} is already in sab's queue. skipping.", parseResult); - return false; - } - var sabTitle = _sabProvider.GetSabTitle(parseResult); - var addSuccess = _sabProvider.AddByUrl(parseResult.NzbUrl, sabTitle); + bool addSuccess = false; + + if (_configProvider.DownloadClient == DownloadClientType.Blackhole) + addSuccess = _blackholeProvider.DownloadNzb(parseResult, sabTitle); + + if (_configProvider.DownloadClient == DownloadClientType.Sabnzbd) + { + if(_sabProvider.IsInQueue(parseResult)) + { + Logger.Warn("Episode {0} is already in sab's queue. skipping.", parseResult); + return false; + } + + addSuccess = _sabProvider.AddByUrl(parseResult.NzbUrl, sabTitle); + } if (addSuccess) { diff --git a/NzbDrone.Web/Controllers/SettingsController.cs b/NzbDrone.Web/Controllers/SettingsController.cs index 3d439d40d..d0b1885eb 100644 --- a/NzbDrone.Web/Controllers/SettingsController.cs +++ b/NzbDrone.Web/Controllers/SettingsController.cs @@ -113,6 +113,7 @@ namespace NzbDrone.Web.Controllers DownloadClientDropDirectory = _configProvider.SabDropDirectory, SabTvCategorySelectList = tvCategorySelectList, DownloadClient = (int)_configProvider.DownloadClient, + BlackholeDirectory = _configProvider.BlackholeDirectory, DownloadClientSelectList = new SelectList(downloadClientTypes, "Key", "Value") }; @@ -393,6 +394,7 @@ namespace NzbDrone.Web.Controllers _configProvider.SabUsername = data.SabUsername; _configProvider.SabTvPriority = data.SabTvPriority; _configProvider.SabDropDirectory = data.DownloadClientDropDirectory; + _configProvider.BlackholeDirectory = data.BlackholeDirectory; _configProvider.DownloadClient = (DownloadClientType)data.DownloadClient; return GetSuccessResult();