diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs index 8f17e1179..beeabca27 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/QueueSpecificationFixture.cs @@ -4,9 +4,11 @@ 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; +using NzbDrone.Core.Languages; using NzbDrone.Core.Movies; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.Profiles; @@ -204,5 +206,31 @@ public void should_return_true_if_everything_is_the_same_for_failed_pending() Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeTrue(); } + + [Test] + public void should_return_false_if_same_quality_non_proper_in_queue_and_download_propers_is_do_not_upgrade() + { + _remoteMovie.ParsedMovieInfo.Quality = new QualityModel(Quality.HDTV720p, new Revision(2)); + _movie.Profile.Cutoff = _remoteMovie.ParsedMovieInfo.Quality.Quality.Id; + + Mocker.GetMock() + .Setup(s => s.DownloadPropersAndRepacks) + .Returns(ProperDownloadTypes.DoNotUpgrade); + + var remoteMovie = Builder.CreateNew() + .With(r => r.Movie = _movie) + .With(r => r.ParsedMovieInfo = new ParsedMovieInfo + { + 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 { remoteMovie }); + + Subject.IsSatisfiedBy(_remoteMovie, null).Accepted.Should().BeFalse(); + } } } diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs index 446d4cf5d..d748dc3f3 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/QueueSpecification.cs @@ -1,10 +1,12 @@ using System.Linq; using NLog; using NzbDrone.Common.Extensions; +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 @@ -14,16 +16,19 @@ public class QueueSpecification : IDecisionEngineSpecification 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; } @@ -85,6 +90,15 @@ public Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCrit { return Decision.Reject("Another release is queued and the Quality profile does not allow upgrades"); } + + if (_upgradableSpecification.IsRevisionUpgrade(remoteMovie.ParsedMovieInfo.Quality, subject.ParsedMovieInfo.Quality)) + { + if (_configService.DownloadPropersAndRepacks == ProperDownloadTypes.DoNotUpgrade) + { + _logger.Debug("Auto downloading of propers is disabled"); + return Decision.Reject("Proper downloading is disabled"); + } + } } return Decision.Accept();