diff --git a/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs b/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs index a1f794936..e8594da27 100644 --- a/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs +++ b/src/NzbDrone.Core.Test/DecisionEngineTests/RepackSpecificationFixture.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using FizzWare.NBuilder; @@ -5,6 +6,7 @@ using FluentAssertions; using Moq; using NUnit.Framework; using NzbDrone.Core.Books; +using NzbDrone.Core.Configuration; using NzbDrone.Core.DecisionEngine.Specifications; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Parser.Model; @@ -244,5 +246,88 @@ namespace NzbDrone.Core.Test.DecisionEngineTests .Should() .BeFalse(); } + + [Test] + public void should_return_true_when_repacks_are_not_preferred() + { + Mocker.GetMock() + .Setup(s => s.DownloadPropersAndRepacks) + .Returns(ProperDownloadTypes.DoNotPrefer); + + _trackFiles.Select(c => + { + c.ReleaseGroup = ""; + return c; + }).ToList(); + + _trackFiles.Select(c => + { + c.Quality = new QualityModel(Quality.FLAC); + return c; + }).ToList(); + + var remoteAlbum = Builder.CreateNew() + .With(e => e.ParsedBookInfo = _parsedBookInfo) + .With(e => e.Books = _books) + .Build(); + + Subject.IsSatisfiedBy(remoteAlbum, null).Accepted.Should().BeTrue(); + } + + [Test] + public void should_return_true_when_repack_but_auto_download_repacks_is_true() + { + Mocker.GetMock() + .Setup(s => s.DownloadPropersAndRepacks) + .Returns(ProperDownloadTypes.PreferAndUpgrade); + + _parsedBookInfo.Quality.Revision.IsRepack = true; + + _trackFiles.Select(c => + { + c.ReleaseGroup = "Lidarr"; + return c; + }).ToList(); + _trackFiles.Select(c => + { + c.Quality = new QualityModel(Quality.FLAC); + return c; + }).ToList(); + + var remoteAlbum = Builder.CreateNew() + .With(e => e.ParsedBookInfo = _parsedBookInfo) + .With(e => e.Books = _books) + .Build(); + + Subject.IsSatisfiedBy(remoteAlbum, null).Accepted.Should().BeTrue(); + } + + [Test] + public void should_return_false_when_repack_but_auto_download_repacks_is_false() + { + Mocker.GetMock() + .Setup(s => s.DownloadPropersAndRepacks) + .Returns(ProperDownloadTypes.DoNotUpgrade); + + _parsedBookInfo.Quality.Revision.IsRepack = true; + + _trackFiles.Select(c => + { + c.ReleaseGroup = "Lidarr"; + return c; + }).ToList(); + _trackFiles.Select(c => + { + c.Quality = new QualityModel(Quality.FLAC); + return c; + }).ToList(); + + var remoteAlbum = Builder.CreateNew() + .With(e => e.ParsedBookInfo = _parsedBookInfo) + .With(e => e.Books = _books) + .Build(); + + Subject.IsSatisfiedBy(remoteAlbum, null).Accepted.Should().BeFalse(); + } } } diff --git a/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs b/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs index 8cce208d8..1cf9ffa4d 100644 --- a/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs +++ b/src/NzbDrone.Core/DecisionEngine/Specifications/RepackSpecification.cs @@ -1,9 +1,11 @@ using System; using NLog; using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Qualities; namespace NzbDrone.Core.DecisionEngine.Specifications { @@ -11,12 +13,14 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { private readonly IMediaFileService _mediaFileService; private readonly UpgradableSpecification _upgradableSpecification; + private readonly IConfigService _configService; private readonly Logger _logger; - public RepackSpecification(IMediaFileService mediaFileService, UpgradableSpecification upgradableSpecification, Logger logger) + public RepackSpecification(IMediaFileService mediaFileService, UpgradableSpecification upgradableSpecification, IConfigService configService, Logger logger) { _mediaFileService = mediaFileService; _upgradableSpecification = upgradableSpecification; + _configService = configService; _logger = logger; } @@ -30,6 +34,14 @@ namespace NzbDrone.Core.DecisionEngine.Specifications return Decision.Accept(); } + var downloadPropersAndRepacks = _configService.DownloadPropersAndRepacks; + + if (downloadPropersAndRepacks == ProperDownloadTypes.DoNotPrefer) + { + _logger.Debug("Repacks are not preferred, skipping check"); + return Decision.Accept(); + } + foreach (var book in subject.Books) { var releaseGroup = subject.ParsedBookInfo.ReleaseGroup; @@ -39,6 +51,12 @@ namespace NzbDrone.Core.DecisionEngine.Specifications { if (_upgradableSpecification.IsRevisionUpgrade(file.Quality, subject.ParsedBookInfo.Quality)) { + if (downloadPropersAndRepacks == ProperDownloadTypes.DoNotUpgrade) + { + _logger.Debug("Auto downloading of repacks is disabled"); + return Decision.Reject("Repack downloading is disabled"); + } + var fileReleaseGroup = file.ReleaseGroup; if (fileReleaseGroup.IsNullOrWhiteSpace())