Exemplo n.º 1
0
        public Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
        {
            var torrentInfo = subject.Release as TorrentInfo;

            IIndexerSettings indexerSettings = null;

            try {
                indexerSettings = _indexerFactory.Get(subject.Release.IndexerId)?.Settings as IIndexerSettings;
            }
            catch (Exception e)
            {
                _logger.Debug("Indexer with id {0} does not exist, skipping minimum seeder checks.", subject.Release.IndexerId);
            }


            if (torrentInfo == null || indexerSettings == null)
            {
                return(Decision.Accept());
            }

            if (indexerSettings is ITorrentIndexerSettings torrentIndexerSettings)
            {
                var minimumSeeders = torrentIndexerSettings.MinimumSeeders;

                if (torrentInfo.Seeders.HasValue && torrentInfo.Seeders.Value < minimumSeeders)
                {
                    _logger.Debug("Not enough seeders: {0}. Minimum seeders: {1}", torrentInfo.Seeders, minimumSeeders);
                    return(Decision.Reject("Not enough seeders: {0}. Minimum seeders: {1}", torrentInfo.Seeders, minimumSeeders));
                }
            }

            return(Decision.Accept());
        }
Exemplo n.º 2
0
        public virtual Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
        {
            if (subject.Release == null || subject.Movie?.Tags == null || subject.Release.IndexerId == 0)
            {
                return(Decision.Accept());
            }

            IndexerDefinition indexer;

            try
            {
                indexer = _indexerFactory.Get(subject.Release.IndexerId);
            }
            catch (ModelNotFoundException)
            {
                _logger.Debug("Indexer with id {0} does not exist, skipping indexer tags check", subject.Release.IndexerId);
                return(Decision.Accept());
            }

            // If indexer has tags, check that at least one of them is present on the series
            var indexerTags = indexer.Tags;

            if (indexerTags.Any() && indexerTags.Intersect(subject.Movie.Tags).Empty())
            {
                _logger.Debug("Indexer {0} has tags. None of these are present on movie {1}. Rejecting", subject.Release.Indexer, subject.Movie);

                return(Decision.Reject("Movie tags do not match any of the indexer tags"));
            }

            return(Decision.Accept());
        }
Exemplo n.º 3
0
 private void ResolveIndexer(ReleaseInfo release)
 {
     if (release.IndexerId == 0 && release.Indexer.IsNotNullOrWhiteSpace())
     {
         var indexer = _indexerFactory.All().FirstOrDefault(v => v.Name == release.Indexer);
         if (indexer != null)
         {
             release.IndexerId = indexer.Id;
             _logger.Debug("Push Release {0} associated with indexer {1} - {2}.", release.Title, release.IndexerId, release.Indexer);
         }
         else
         {
             _logger.Debug("Push Release {0} not associated with unknown indexer {1}.", release.Title, release.Indexer);
         }
     }
     else if (release.IndexerId != 0 && release.Indexer.IsNullOrWhiteSpace())
     {
         try
         {
             var indexer = _indexerFactory.Get(release.IndexerId);
             release.Indexer = indexer.Name;
             _logger.Debug("Push Release {0} associated with indexer {1} - {2}.", release.Title, release.IndexerId, release.Indexer);
         }
         catch (ModelNotFoundException)
         {
             _logger.Debug("Push Release {0} not associated with unknown indexer {0}.", release.Title, release.IndexerId);
             release.IndexerId = 0;
         }
     }
     else
     {
         _logger.Debug("Push Release {0} not associated with an indexer.", release.Title);
     }
 }
Exemplo n.º 4
0
        public ActionResult <SearchResource> GrabRelease(SearchResource release)
        {
            ValidateResource(release);

            var releaseInfo = _remoteReleaseCache.Find(GetCacheKey(release));

            var indexerDef = _indexerFactory.Get(release.IndexerId);
            var source     = UserAgentParser.ParseSource(Request.Headers["User-Agent"]);
            var host       = Request.GetHostName();

            try
            {
                _downloadService.SendReportToClient(releaseInfo, source, host, indexerDef.Redirect);
            }
            catch (ReleaseDownloadException ex)
            {
                _logger.Error(ex, "Getting release from indexer failed");
                throw new NzbDroneClientException(HttpStatusCode.Conflict, "Getting release from indexer failed");
            }

            return(Ok(release));
        }
Exemplo n.º 5
0
        private SeedCriteriaSettings FetchSeedCriteria(int indexerId)
        {
            try
            {
                var indexer = _indexerFactory.Get(indexerId);
                var torrentIndexerSettings = indexer.Settings as ITorrentIndexerSettings;

                return(torrentIndexerSettings?.SeedCriteria);
            }
            catch (ModelNotFoundException)
            {
                return(null);
            }
        }
        public Decision IsSatisfiedBy(RemoteEpisode remoteEpisode, SearchCriteriaBase searchCriteria)
        {
            var torrentInfo = remoteEpisode.Release as TorrentInfo;

            if (torrentInfo == null || torrentInfo.IndexerId == 0)
            {
                return(Decision.Accept());
            }

            IndexerDefinition indexer;

            try
            {
                indexer = _indexerFactory.Get(torrentInfo.IndexerId);
            }
            catch (ModelNotFoundException)
            {
                _logger.Debug("Indexer with id {0} does not exist, skipping seeders check", torrentInfo.IndexerId);
                return(Decision.Accept());
            }

            var torrentIndexerSettings = indexer.Settings as ITorrentIndexerSettings;

            if (torrentIndexerSettings != null)
            {
                var minimumSeeders = torrentIndexerSettings.MinimumSeeders;

                if (torrentInfo.Seeders.HasValue && torrentInfo.Seeders.Value < minimumSeeders)
                {
                    _logger.Debug("Not enough seeders: {0}. Minimum seeders: {1}", torrentInfo.Seeders, minimumSeeders);
                    return(Decision.Reject("Not enough seeders: {0}. Minimum seeders: {1}", torrentInfo.Seeders, minimumSeeders));
                }
            }

            return(Decision.Accept());
        }
Exemplo n.º 7
0
        public Decision IsSatisfiedBy(RemoteBook subject, SearchCriteriaBase searchCriteria)
        {
            var releaseInfo = subject.Release;

            if (releaseInfo == null || releaseInfo.IndexerId == 0)
            {
                return(Decision.Accept());
            }

            IndexerDefinition indexer;

            try
            {
                indexer = _indexerFactory.Get(subject.Release.IndexerId);
            }
            catch (ModelNotFoundException)
            {
                _logger.Debug("Indexer with id {0} does not exist, skipping early release check", subject.Release.IndexerId);
                return(Decision.Accept());
            }

            var indexerSettings = indexer.Settings as IIndexerSettings;

            if (subject.Books.Count != 1 || indexerSettings?.EarlyReleaseLimit == null)
            {
                return(Decision.Accept());
            }

            var releaseDate = subject.Books.First().ReleaseDate;

            if (releaseDate == null)
            {
                return(Decision.Accept());
            }

            var isEarly = releaseDate.Value > subject.Release.PublishDate.AddDays(indexerSettings.EarlyReleaseLimit.Value);

            if (isEarly)
            {
                var message = $"Release published date, {subject.Release.PublishDate.ToShortDateString()}, is outside of {indexerSettings.EarlyReleaseLimit.Value} day early grab limit allowed by user";

                _logger.Debug(message);
                return(Decision.Reject(message));
            }

            return(Decision.Accept());
        }
        public Decision IsSatisfiedBy(RemoteMovie subject, SearchCriteriaBase searchCriteria)
        {
            var torrentInfo = subject.Release;

            IIndexerSettings indexerSettings = null;

            try
            {
                indexerSettings = _indexerFactory.Get(subject.Release.IndexerId)?.Settings as IIndexerSettings;
            }
            catch (Exception)
            {
                _logger.Debug("Indexer with id {0} does not exist, skipping required indexer flags specs.", subject.Release.IndexerId);
            }

            if (torrentInfo == null || indexerSettings == null)
            {
                return(Decision.Accept());
            }

            if (indexerSettings is ITorrentIndexerSettings torrentIndexerSettings)
            {
                var requiredFlags = torrentIndexerSettings.RequiredFlags;
                var requiredFlag  = (IndexerFlags)0;

                if (requiredFlags == null || !requiredFlags.Any())
                {
                    return(Decision.Accept());
                }

                foreach (var flag in requiredFlags)
                {
                    if (torrentInfo.IndexerFlags.HasFlag((IndexerFlags)flag))
                    {
                        return(Decision.Accept());
                    }

                    requiredFlag |= (IndexerFlags)flag;
                }

                _logger.Debug("None of the required indexer flags {0} where found. Found flags: {1}", requiredFlag, torrentInfo.IndexerFlags);
                return(Decision.Reject("None of the required indexer flags {0} where found. Found flags: {1}", requiredFlag, torrentInfo.IndexerFlags));
            }

            return(Decision.Accept());
        }
Exemplo n.º 9
0
        public ParsedMovieInfo AugmentMovieInfo(ParsedMovieInfo movieInfo, object helper)
        {
            if (helper is ReleaseInfo releaseInfo)
            {
                IIndexerSettings indexerSettings = null;
                try
                {
                    indexerSettings = _indexerFactory.Get(releaseInfo.IndexerId)?.Settings as IIndexerSettings;
                }
                catch (Exception)
                {
                    //_logger.Debug("Indexer with id {0} does not exist, skipping minimum seeder checks.", subject.Release.IndexerId);
                }                // First, let's augment the language!

                var languageTitle = movieInfo.SimpleReleaseTitle;
                if (movieInfo.MovieTitle.IsNotNullOrWhiteSpace())
                {
                    if (languageTitle.ToLower().Contains("multi") && indexerSettings?.MultiLanguages?.Any() == true)
                    {
                        foreach (var i in indexerSettings.MultiLanguages)
                        {
                            var language = (Language)i;
                            if (!movieInfo.Languages.Contains(language))
                            {
                                movieInfo.Languages.Add(language);
                            }
                        }
                    }
                }

                //Next, let's add other useful info to the extra info dict
                if (!movieInfo.ExtraInfo.ContainsKey("Size"))
                {
                    movieInfo.ExtraInfo["Size"] = releaseInfo.Size;
                }

                movieInfo.ExtraInfo["IndexerFlags"] = releaseInfo.IndexerFlags;
            }

            return(movieInfo);
        }
Exemplo n.º 10
0
        public TorrentSeedConfiguration GetSeedConfiguration(RemoteMovie remoteMovie)
        {
            if (remoteMovie.Release.DownloadProtocol != DownloadProtocol.Torrent)
            {
                return(null);
            }

            if (remoteMovie.Release.IndexerId == 0)
            {
                return(null);
            }

            try
            {
                var indexer = _indexerFactory.Get(remoteMovie.Release.IndexerId);
                var torrentIndexerSettings = indexer.Settings as ITorrentIndexerSettings;

                if (torrentIndexerSettings != null && torrentIndexerSettings.SeedCriteria != null)
                {
                    var seedConfig = new TorrentSeedConfiguration
                    {
                        Ratio = torrentIndexerSettings.SeedCriteria.SeedRatio
                    };

                    var seedTime = torrentIndexerSettings.SeedCriteria.SeedTime;
                    if (seedTime.HasValue)
                    {
                        seedConfig.SeedTime = TimeSpan.FromMinutes(seedTime.Value);
                    }

                    return(seedConfig);
                }
            }
            catch (ModelNotFoundException)
            {
                return(null);
            }

            return(null);
        }
Exemplo n.º 11
0
        public async Task SendReportToClient(ReleaseInfo release, string source, string host, bool redirect)
        {
            var downloadTitle  = release.Title;
            var downloadClient = _downloadClientProvider.GetDownloadClient(release.DownloadProtocol);

            if (downloadClient == null)
            {
                throw new DownloadClientUnavailableException($"{release.DownloadProtocol} Download client isn't configured yet");
            }

            // Get the seed configuration for this release.
            // remoteMovie.SeedConfiguration = _seedConfigProvider.GetSeedConfiguration(remoteMovie);

            // Limit grabs to 2 per second.
            if (release.DownloadUrl.IsNotNullOrWhiteSpace() && !release.DownloadUrl.StartsWith("magnet:"))
            {
                var url = new HttpUri(release.DownloadUrl);
                _rateLimitService.WaitAndPulse(url.Host, TimeSpan.FromSeconds(2));
            }

            var indexer = _indexerFactory.GetInstance(_indexerFactory.Get(release.IndexerId));

            string downloadClientId;

            try
            {
                downloadClientId = await downloadClient.Download(release, redirect, indexer);

                _downloadClientStatusService.RecordSuccess(downloadClient.Definition.Id);
                _indexerStatusService.RecordSuccess(release.IndexerId);
            }
            catch (ReleaseUnavailableException)
            {
                _logger.Trace("Release {0} no longer available on indexer.", release);
                _eventAggregator.PublishEvent(new IndexerDownloadEvent(release.IndexerId, false, source, host, release.Title, release.DownloadUrl, redirect));
                throw;
            }
            catch (DownloadClientRejectedReleaseException)
            {
                _logger.Trace("Release {0} rejected by download client, possible duplicate.", release);
                _eventAggregator.PublishEvent(new IndexerDownloadEvent(release.IndexerId, false, source, host, release.Title, release.DownloadUrl, redirect));
                throw;
            }
            catch (ReleaseDownloadException ex)
            {
                var http429 = ex.InnerException as TooManyRequestsException;
                if (http429 != null)
                {
                    _indexerStatusService.RecordFailure(release.IndexerId, http429.RetryAfter);
                }
                else
                {
                    _indexerStatusService.RecordFailure(release.IndexerId);
                }

                _eventAggregator.PublishEvent(new IndexerDownloadEvent(release.IndexerId, false, source, host, release.Title, release.DownloadUrl, redirect));

                throw;
            }

            _logger.ProgressInfo("Report sent to {0}. {1}", downloadClient.Definition.Name, downloadTitle);

            _eventAggregator.PublishEvent(new IndexerDownloadEvent(release.IndexerId, true, source, host, release.Title, release.DownloadUrl, redirect));
        }