Ejemplo n.º 1
0
        public virtual Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
        {
            if (searchCriteria != null)
            {
                _logger.Debug("Skipping history check during search");
                return(Decision.Accept());
            }

            var cdhEnabled = _configService.EnableCompletedDownloadHandling;

            _logger.Debug("Performing history status check on report");
            _logger.Debug("Checking current status of movie [{0}] in history", subject.Movie.Id);
            var mostRecent = _historyService.MostRecentForMovie(subject.Movie.Id);

            if (mostRecent != null && mostRecent.EventType == MovieHistoryEventType.Grabbed)
            {
                var customFormats = _formatService.ParseCustomFormat(mostRecent);

                var cutoffUnmet = _upgradableSpecification.CutoffNotMet(subject.Movie.Profile,
                                                                        mostRecent.Quality,
                                                                        customFormats,
                                                                        subject.ParsedMovieInfo.Quality);

                var upgradeable = _upgradableSpecification.IsUpgradable(subject.Movie.Profile,
                                                                        mostRecent.Quality,
                                                                        customFormats,
                                                                        subject.ParsedMovieInfo.Quality,
                                                                        subject.CustomFormats);

                var recent = mostRecent.Date.After(DateTime.UtcNow.AddHours(-12));
                if (!recent && cdhEnabled)
                {
                    return(Decision.Accept());
                }

                if (!cutoffUnmet)
                {
                    if (recent)
                    {
                        return(Decision.Reject("Recent grab event in history already meets cutoff: {0}", mostRecent.Quality));
                    }

                    return(Decision.Reject("CDH is disabled and grab event in history already meets cutoff: {0}", mostRecent.Quality));
                }

                if (!upgradeable)
                {
                    if (recent)
                    {
                        return(Decision.Reject("Recent grab event in history is of equal or higher quality: {0}", mostRecent.Quality));
                    }

                    return(Decision.Reject("CDH is disabled and grab event in history is of equal or higher quality: {0}", mostRecent.Quality));
                }
            }

            return(Decision.Accept());
        }
Ejemplo n.º 2
0
        public virtual Decision IsSatisfiedBy(RemoteEpisode subject, SearchCriteriaBase searchCriteria)
        {
            if (searchCriteria != null)
            {
                _logger.Debug("Skipping history check during search");
                return(Decision.Accept());
            }

            var cdhEnabled = _configService.EnableCompletedDownloadHandling;

            _logger.Debug("Performing history status check on report");
            foreach (var episode in subject.Episodes)
            {
                _logger.Debug("Checking current status of episode [{0}] in history", episode.Id);
                var mostRecent = _historyService.MostRecentForEpisode(episode.Id);

                if (mostRecent != null && mostRecent.EventType == EpisodeHistoryEventType.Grabbed)
                {
                    var recent = mostRecent.Date.After(DateTime.UtcNow.AddHours(-12));

                    if (!recent && cdhEnabled)
                    {
                        continue;
                    }

                    // The series will be the same as the one in history since it's the same episode.
                    // Instead of fetching the series from the DB reuse the known series.
                    var preferredWordScore = _preferredWordServiceCalculator.Calculate(subject.Series, mostRecent.SourceTitle, subject.Release?.IndexerId ?? 0);

                    var cutoffUnmet = _upgradableSpecification.CutoffNotMet(
                        subject.Series.QualityProfile,
                        subject.Series.LanguageProfile,
                        mostRecent.Quality,
                        mostRecent.Language,
                        preferredWordScore,
                        subject.ParsedEpisodeInfo.Quality,
                        subject.PreferredWordScore);

                    var upgradeable = _upgradableSpecification.IsUpgradable(
                        subject.Series.QualityProfile,
                        subject.Series.LanguageProfile,
                        mostRecent.Quality,
                        mostRecent.Language,
                        preferredWordScore,
                        subject.ParsedEpisodeInfo.Quality,
                        subject.ParsedEpisodeInfo.Language,
                        subject.PreferredWordScore);

                    if (!cutoffUnmet)
                    {
                        if (recent)
                        {
                            return(Decision.Reject("Recent grab event in history already meets cutoff: {0}", mostRecent.Quality));
                        }

                        return(Decision.Reject("CDH is disabled and grab event in history already meets cutoff: {0}", mostRecent.Quality));
                    }

                    if (!upgradeable)
                    {
                        if (recent)
                        {
                            return(Decision.Reject("Recent grab event in history is of equal or higher quality: {0}", mostRecent.Quality));
                        }

                        return(Decision.Reject("CDH is disabled and grab event in history is of equal or higher quality: {0}", mostRecent.Quality));
                    }
                }
            }

            return(Decision.Accept());
        }