public virtual bool IsSatisfiedBy(EpisodeParseResult subject)
        {
            var series = _seriesProvider.FindSeries(subject.CleanTitle);

            if (series == null)
            {
                logger.Trace("{0} is not mapped to any series in DB. skipping", subject.CleanTitle);
                return(false);
            }

            subject.Series = series;

            if (!series.Monitored)
            {
                logger.Debug("{0} is present in the DB but not tracked. skipping.", subject.CleanTitle);
                return(false);
            }

            var episodes = _episodeProvider.GetEpisodesByParseResult(subject);

            subject.Episodes = episodes;

            //return monitored if any of the episodes are monitored
            if (episodes.Any(episode => !episode.Ignored))
            {
                return(true);
            }

            logger.Debug("All episodes are ignored. skipping.");
            return(false);
        }
예제 #2
0
        public virtual SearchHistory ProcessReports(Series series, dynamic options, List <EpisodeParseResult> episodeParseResults,
                                                    SearchHistory searchResult, ProgressNotification notification)
        {
            var items = new List <SearchHistoryItem>();

            searchResult.Successes = new List <Int32>();

            foreach (var episodeParseResult in episodeParseResults
                     .OrderByDescending(c => c.Quality)
                     .ThenBy(c => c.EpisodeNumbers.MinOrDefault())
                     .ThenBy(c => c.Age))
            {
                try
                {
                    var item = new SearchHistoryItem
                    {
                        ReportTitle = episodeParseResult.OriginalString,
                        NzbUrl      = episodeParseResult.NzbUrl,
                        Indexer     = episodeParseResult.Indexer,
                        Quality     = episodeParseResult.Quality.Quality,
                        Proper      = episodeParseResult.Quality.Proper,
                        Size        = episodeParseResult.Size,
                        Age         = episodeParseResult.Age,
                        Language    = episodeParseResult.Language
                    };

                    items.Add(item);

                    logger.Trace("Analysing report " + episodeParseResult);
                    episodeParseResult.Series = _seriesProvider.FindSeries(episodeParseResult.CleanTitle);

                    if (episodeParseResult.Series == null || episodeParseResult.Series.SeriesId != series.SeriesId)
                    {
                        item.SearchError = ReportRejectionType.WrongSeries;
                        continue;
                    }

                    episodeParseResult.Episodes = _episodeProvider.GetEpisodesByParseResult(episodeParseResult);

                    if (searchResult.Successes.Intersect(episodeParseResult.Episodes.Select(e => e.EpisodeId)).Any())
                    {
                        item.SearchError = ReportRejectionType.Skipped;
                        continue;
                    }

                    CheckReport(series, options, episodeParseResult, item);
                    if (item.SearchError != ReportRejectionType.None)
                    {
                        continue;
                    }

                    item.SearchError = _allowedDownloadSpecification.IsSatisfiedBy(episodeParseResult);

                    if (item.SearchError == ReportRejectionType.None)
                    {
                        if (DownloadReport(notification, episodeParseResult, item))
                        {
                            searchResult.Successes.AddRange(episodeParseResult.Episodes.Select(e => e.EpisodeId));
                        }
                    }
                }
                catch (Exception e)
                {
                    logger.ErrorException("An error has occurred while processing parse result items from " + episodeParseResult, e);
                }
            }

            searchResult.SearchHistoryItems = items;
            return(searchResult);
        }