using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.CustomFormats; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; namespace NzbDrone.Core.DecisionEngine.Specifications { public class UpgradeAllowedSpecification : IDecisionEngineSpecification { private readonly UpgradableSpecification _upgradableSpecification; private readonly ICustomFormatCalculationService _formatService; private readonly Logger _logger; public UpgradeAllowedSpecification(UpgradableSpecification upgradableSpecification, ICustomFormatCalculationService formatService, Logger logger) { _upgradableSpecification = upgradableSpecification; _formatService = formatService; _logger = logger; } public SpecificationPriority Priority => SpecificationPriority.Default; public RejectionType Type => RejectionType.Permanent; public virtual Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria) { var qualityProfile = subject.Movie.Profile; if (subject.Movie.MovieFileId != 0) { var file = subject.Movie.MovieFile; if (file == null) { _logger.Debug("File is no longer available, skipping this file."); return Decision.Accept(); } file.Movie = subject.Movie; var customFormats = _formatService.ParseCustomFormat(file); _logger.Debug("Comparing file quality with report. Existing file is {0} [{1}]", file.Quality, customFormats.ConcatToString()); if (!_upgradableSpecification.IsUpgradeAllowed(qualityProfile, file.Quality, customFormats, subject.ParsedMovieInfo.Quality, subject.CustomFormats)) { _logger.Debug("Upgrading is not allowed by the quality profile"); return Decision.Reject("Existing file and the Quality profile does not allow upgrades"); } } return Decision.Accept(); } } }