diff --git a/src/NzbDrone.Api/Indexers/ReleasePushModule.cs b/src/NzbDrone.Api/Indexers/ReleasePushModule.cs index c25e45726..7cb93739c 100644 --- a/src/NzbDrone.Api/Indexers/ReleasePushModule.cs +++ b/src/NzbDrone.Api/Indexers/ReleasePushModule.cs @@ -1,13 +1,16 @@ -using Nancy; -using Nancy.ModelBinding; +using System.Collections.Generic; +using System.Linq; using FluentValidation; +using Nancy; +using Nancy.ModelBinding; +using NLog; +using NzbDrone.Api.Extensions; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Datastore; using NzbDrone.Core.DecisionEngine; using NzbDrone.Core.Download; -using System.Collections.Generic; -using System.Linq; +using NzbDrone.Core.Indexers; using NzbDrone.Core.Parser.Model; -using NzbDrone.Api.Extensions; -using NLog; namespace NzbDrone.Api.Indexers { @@ -15,14 +18,17 @@ namespace NzbDrone.Api.Indexers { private readonly IMakeDownloadDecision _downloadDecisionMaker; private readonly IProcessDownloadDecisions _downloadDecisionProcessor; + private readonly IIndexerFactory _indexerFactory; private readonly Logger _logger; public ReleasePushModule(IMakeDownloadDecision downloadDecisionMaker, IProcessDownloadDecisions downloadDecisionProcessor, + IIndexerFactory indexerFactory, Logger logger) { _downloadDecisionMaker = downloadDecisionMaker; _downloadDecisionProcessor = downloadDecisionProcessor; + _indexerFactory = indexerFactory; _logger = logger; Post["/push"] = x => ProcessRelease(this.Bind()); @@ -41,10 +47,47 @@ namespace NzbDrone.Api.Indexers info.Guid = "PUSH-" + info.DownloadUrl; + ResolveIndexer(info); + var decisions = _downloadDecisionMaker.GetRssDecision(new List { info }); _downloadDecisionProcessor.ProcessDecisions(decisions); return MapDecisions(decisions).First().AsResponse(); } + + private void ResolveIndexer(ReleaseInfo release) + { + if (release.IndexerId == 0 && release.Indexer.IsNotNullOrWhiteSpace()) + { + var indexer = _indexerFactory.All().FirstOrDefault(v => v.Name == release.Indexer); + if (indexer != null) + { + release.IndexerId = indexer.Id; + _logger.Debug("Push Release {0} associated with indexer {1} - {2}.", release.Title, release.IndexerId, release.Indexer); + } + else + { + _logger.Debug("Push Release {0} not associated with unknown indexer {1}.", release.Title, release.Indexer); + } + } + else if (release.IndexerId != 0 && release.Indexer.IsNullOrWhiteSpace()) + { + try + { + var indexer = _indexerFactory.Get(release.IndexerId); + release.Indexer = indexer.Name; + _logger.Debug("Push Release {0} associated with indexer {1} - {2}.", release.Title, release.IndexerId, release.Indexer); + } + catch (ModelNotFoundException) + { + _logger.Debug("Push Release {0} not associated with unknown indexer {0}.", release.Title, release.IndexerId); + release.IndexerId = 0; + } + } + else + { + _logger.Debug("Push Release {0} not associated with an indexer.", release.Title); + } + } } } diff --git a/src/NzbDrone.Core.Test/IndexerTests/SeedConfigProviderFixture.cs b/src/NzbDrone.Core.Test/IndexerTests/SeedConfigProviderFixture.cs new file mode 100644 index 000000000..9a29e5193 --- /dev/null +++ b/src/NzbDrone.Core.Test/IndexerTests/SeedConfigProviderFixture.cs @@ -0,0 +1,65 @@ +using System; +using FluentAssertions; +using Moq; +using NUnit.Framework; +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Indexers; +using NzbDrone.Core.Indexers.Torznab; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Test.Framework; + +namespace NzbDrone.Core.Test.IndexerTests +{ + [TestFixture] + public class SeedConfigProviderFixture : CoreTest + { + [Test] + public void should_not_return_config_for_non_existent_indexer() + { + Mocker.GetMock() + .Setup(v => v.Get(It.IsAny())) + .Throws(new ModelNotFoundException(typeof(IndexerDefinition), 0)); + + var result = Subject.GetSeedConfiguration(new RemoteEpisode + { + Release = new ReleaseInfo() + { + DownloadProtocol = DownloadProtocol.Torrent, + IndexerId = 0 + } + }); + + result.Should().BeNull(); + } + + [Test] + public void should_return_season_time_for_season_packs() + { + var settings = new TorznabSettings(); + settings.SeedCriteria.SeasonPackSeedTime = 10; + + Mocker.GetMock() + .Setup(v => v.Get(It.IsAny())) + .Returns(new IndexerDefinition + { + Settings = settings + }); + + var result = Subject.GetSeedConfiguration(new RemoteEpisode + { + Release = new ReleaseInfo() + { + DownloadProtocol = DownloadProtocol.Torrent, + IndexerId = 1 + }, + ParsedEpisodeInfo = new ParsedEpisodeInfo + { + FullSeason = true + } + }); + + result.Should().NotBeNull(); + result.SeedTime.Should().Be(TimeSpan.FromMinutes(10)); + } + } +} diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 9eabf49b2..ab85a93a4 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -279,6 +279,7 @@ + diff --git a/src/NzbDrone.Core/Configuration/SeedConfigProvider.cs b/src/NzbDrone.Core/Configuration/SeedConfigProvider.cs deleted file mode 100644 index a22be023f..000000000 --- a/src/NzbDrone.Core/Configuration/SeedConfigProvider.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using NzbDrone.Core.Download.Clients; -using NzbDrone.Core.Indexers; -using NzbDrone.Core.Parser.Model; - -namespace NzbDrone.Core.Configuration -{ - public interface ISeedConfigProvider - { - TorrentSeedConfiguration GetSeedConfiguration(RemoteEpisode release); - } - - public class SeedConfigProvider: ISeedConfigProvider - { - private readonly IIndexerFactory _indexerFactory; - - public SeedConfigProvider(IIndexerFactory indexerFactory) - { - _indexerFactory = indexerFactory; - } - - public TorrentSeedConfiguration GetSeedConfiguration(RemoteEpisode remoteEpisode) - { - if (remoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent) return null; - - var indexer = _indexerFactory.Get(remoteEpisode.Release.IndexerId); - var torrentIndexerSettings = indexer?.Settings as ITorrentIndexerSettings; - - if (torrentIndexerSettings != null) - { - var seedConfig = new TorrentSeedConfiguration - { - Ratio = torrentIndexerSettings.SeedCriteria.SeedRatio - }; - - var seedTime = remoteEpisode.ParsedEpisodeInfo.FullSeason ? torrentIndexerSettings.SeedCriteria.SeasonPackSeedTime : torrentIndexerSettings.SeedCriteria.SeedTime; - if (seedTime.HasValue) - { - seedConfig.SeedTime = TimeSpan.FromMinutes(seedTime.Value); - } - - return seedConfig; - } - - return null; - } - } -} diff --git a/src/NzbDrone.Core/Indexers/SeedConfigProvider.cs b/src/NzbDrone.Core/Indexers/SeedConfigProvider.cs new file mode 100644 index 000000000..ff07ec2b3 --- /dev/null +++ b/src/NzbDrone.Core/Indexers/SeedConfigProvider.cs @@ -0,0 +1,59 @@ +using System; +using System.Linq; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Download.Clients; +using NzbDrone.Core.Indexers; +using NzbDrone.Core.Parser.Model; + +namespace NzbDrone.Core.Indexers +{ + public interface ISeedConfigProvider + { + TorrentSeedConfiguration GetSeedConfiguration(RemoteEpisode release); + } + + public class SeedConfigProvider : ISeedConfigProvider + { + private readonly IIndexerFactory _indexerFactory; + + public SeedConfigProvider(IIndexerFactory indexerFactory) + { + _indexerFactory = indexerFactory; + } + + public TorrentSeedConfiguration GetSeedConfiguration(RemoteEpisode remoteEpisode) + { + if (remoteEpisode.Release.DownloadProtocol != DownloadProtocol.Torrent) return null; + if (remoteEpisode.Release.IndexerId == 0) return null; + + try + { + var indexer = _indexerFactory.Get(remoteEpisode.Release.IndexerId); + var torrentIndexerSettings = indexer.Settings as ITorrentIndexerSettings; + + if (torrentIndexerSettings != null && torrentIndexerSettings.SeedCriteria != null) + { + var seedConfig = new TorrentSeedConfiguration + { + Ratio = torrentIndexerSettings.SeedCriteria.SeedRatio + }; + + var seedTime = remoteEpisode.ParsedEpisodeInfo.FullSeason ? torrentIndexerSettings.SeedCriteria.SeasonPackSeedTime : torrentIndexerSettings.SeedCriteria.SeedTime; + if (seedTime.HasValue) + { + seedConfig.SeedTime = TimeSpan.FromMinutes(seedTime.Value); + } + + return seedConfig; + } + } + catch (ModelNotFoundException) + { + return null; + } + + return null; + } + } +} diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj index 24f650b51..49383c194 100644 --- a/src/NzbDrone.Core/NzbDrone.Core.csproj +++ b/src/NzbDrone.Core/NzbDrone.Core.csproj @@ -143,7 +143,7 @@ - +