diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs index 45f340b35..2705dfce6 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs @@ -4,6 +4,7 @@ using FizzWare.NBuilder; using FluentAssertions; using Moq; using NUnit.Framework; +using NzbDrone.Core.Configuration; using NzbDrone.Core.CustomFormats; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.Download.TrackedDownloads; @@ -365,7 +366,7 @@ namespace NzbDrone.Core.Test.DecisionEngineTests } [Test] - public void should_return_false_if_quality_and_language_in_queue_meets_cutoff() + public void should_return_false_if_quality_in_queue_meets_cutoff() { _series.QualityProfile.Value.Cutoff = _remoteEpisode.ParsedEpisodeInfo.Quality.Quality.Id; @@ -448,5 +449,32 @@ namespace NzbDrone.Core.Test.DecisionEngineTests Subject.IsSatisfiedBy(_remoteEpisode, null).Accepted.Should().BeTrue(); } + + [Test] + public void should_return_false_if_same_quality_non_proper_in_queue_and_download_propers_is_do_not_upgrade() + { + _remoteEpisode.ParsedEpisodeInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(2)); + _series.QualityProfile.Value.Cutoff = _remoteEpisode.ParsedEpisodeInfo.Quality.Quality.Id; + + Mocker.GetMock() + .Setup(s => s.DownloadPropersAndRepacks) + .Returns(ProperDownloadTypes.DoNotUpgrade); + + var remoteEpisode = Builder.CreateNew() + .With(r => r.Series = _series) + .With(r => r.Episodes = new List { _episode }) + .With(r => r.ParsedEpisodeInfo = new ParsedEpisodeInfo + { + Quality = new QualityModel(Quality.HDTV720p), + Languages = new List { Language.English } + }) + .With(r => r.Release = _releaseInfo) + .With(r => r.CustomFormats = new List()) + .Build(); + + GivenQueue(new List { remoteEpisode }); + + Subject.IsSatisfiedBy(_remoteEpisode, null).Accepted.Should().BeFalse(); + } } } diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs index d61500d19..472be2d9b 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs @@ -1,9 +1,12 @@ +using System; using System.Linq; using NLog; +using NzbDrone.Core.Configuration; using NzbDrone.Core.CustomFormats; using NzbDrone.Core.Download.TrackedDownloads; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Qualities; using NzbDrone.Core.Queue; namespace NzbDrone.Core.DecisionEngine.Specifications @@ -13,16 +16,19 @@ namespace NzbDrone.Core.DecisionEngine.Specifications private readonly IQueueService _queueService; private readonly UpgradableSpecification _upgradableSpecification; private readonly ICustomFormatCalculationService _formatService; + private readonly IConfigService _configService; private readonly Logger _logger; public QueueSpecification(IQueueService queueService, UpgradableSpecification upgradableSpecification, ICustomFormatCalculationService formatService, + IConfigService configService, Logger logger) { _queueService = queueService; _upgradableSpecification = upgradableSpecification; _formatService = formatService; + _configService = configService; _logger = logger; } @@ -84,6 +90,15 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades"); } + + if (_upgradableSpecification.IsRevisionUpgrade(remoteEpisode.ParsedEpisodeInfo.Quality, subject.ParsedEpisodeInfo.Quality)) + { + if (_configService.DownloadPropersAndRepacks == ProperDownloadTypes.DoNotUpgrade) + { + _logger.Debug("Auto downloading of propers is disabled"); + return Decision.Reject("Proper downloading is disabled"); + } + } } return Decision.Accept();