Esempio n. 1
0
        private List <ReleaseResource> GetBookReleases(int bookId)
        {
            try
            {
                var decisions            = _nzbSearchService.BookSearch(bookId, true, true, true);
                var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions);

                return(MapDecisions(prioritizedDecisions));
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Book search failed");
                throw new NzbDroneClientException(HttpStatusCode.InternalServerError, ex.Message);
            }
        }
Esempio n. 2
0
        private List <ReleaseResource> GetEpisodeReleases(int episodeId)
        {
            try
            {
                var decisions            = _nzbSearchService.EpisodeSearch(episodeId);
                var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions);

                return(MapDecisions(prioritizedDecisions));
            }
            catch (Exception ex)
            {
                _logger.ErrorException("Episode search failed: " + ex.Message, ex);
            }

            return(new List <ReleaseResource>());
        }
Esempio n. 3
0
        private List <ReleaseResource> GetBookReleases(int bookId)
        {
            try
            {
                var decisions            = _nzbSearchService.BookSearch(bookId, true, true, true);
                var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions);

                return(MapDecisions(prioritizedDecisions));
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Book search failed");
            }

            return(new List <ReleaseResource>());
        }
Esempio n. 4
0
        private List <ReleaseResource> GetEpisodeReleases(int episodeId)
        {
            try
            {
                var decisions            = _releaseSearchService.EpisodeSearch(episodeId, true, true);
                var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions);

                return(MapDecisions(prioritizedDecisions));
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Episode search failed");
            }

            return(new List <ReleaseResource>());
        }
Esempio n. 5
0
        private List <ReleaseResource> GetEpisodeReleases(int episodeId)
        {
            try
            {
                var decisions            = _nzbSearchService.EpisodeSearch(episodeId, true, true);
                var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(decisions);

                return(MapDecisions(prioritizedDecisions));
            }
            catch (SearchFailedException ex)
            {
                throw new NzbDroneClientException(HttpStatusCode.BadRequest, ex.Message);
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Episode search failed: " + ex.Message);
                throw new NzbDroneClientException(HttpStatusCode.InternalServerError, ex.Message);
            }
        }
        public ProcessedDecisions ProcessDecisions(List <DownloadDecision> decisions)
        {
            var qualifiedReports     = GetQualifiedReports(decisions);
            var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(qualifiedReports);
            var grabbed = new List <DownloadDecision>();
            var pending = new List <DownloadDecision>();

            foreach (var report in prioritizedDecisions)
            {
                var remoteEpisode = report.RemoteEpisode;

                var episodeIds = remoteEpisode.Episodes.Select(e => e.Id).ToList();

                //Skip if already grabbed
                if (grabbed.SelectMany(r => r.RemoteEpisode.Episodes)
                    .Select(e => e.Id)
                    .ToList()
                    .Intersect(episodeIds)
                    .Any())
                {
                    continue;
                }

                if (report.TemporarilyRejected)
                {
                    _pendingReleaseService.Add(report);
                    pending.Add(report);
                    continue;
                }

                if (pending.SelectMany(r => r.RemoteEpisode.Episodes)
                    .Select(e => e.Id)
                    .ToList()
                    .Intersect(episodeIds)
                    .Any())
                {
                    continue;
                }

                try
                {
                    _downloadService.DownloadReport(remoteEpisode);
                    grabbed.Add(report);
                }
                catch (Exception e)
                {
                    //TODO: support for store & forward
                    //We'll need to differentiate between a download client error and an indexer error
                    _logger.Warn(e, "Couldn't add report to download queue. " + remoteEpisode);
                }
            }

            return(new ProcessedDecisions(grabbed, pending, decisions.Where(d => d.Rejected).ToList()));
        }
        public ProcessedDecisions ProcessDecisions(List <DownloadDecision> decisions)
        {
            var qualifiedReports     = GetQualifiedReports(decisions);
            var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(qualifiedReports);
            var grabbed  = new List <DownloadDecision>();
            var pending  = new List <DownloadDecision>();
            var failed   = new List <DownloadDecision>();
            var rejected = decisions.Where(d => d.Rejected).ToList();

            var usenetFailed  = false;
            var torrentFailed = false;

            foreach (var report in prioritizedDecisions)
            {
                var remoteEpisode    = report.RemoteEpisode;
                var downloadProtocol = report.RemoteEpisode.Release.DownloadProtocol;

                // Skip if already grabbed
                if (IsEpisodeProcessed(grabbed, report))
                {
                    continue;
                }

                if (report.TemporarilyRejected)
                {
                    _pendingReleaseService.Add(report, PendingReleaseReason.Delay);
                    pending.Add(report);
                    continue;
                }

                if (downloadProtocol == DownloadProtocol.Usenet && usenetFailed ||
                    downloadProtocol == DownloadProtocol.Torrent && torrentFailed)
                {
                    failed.Add(report);
                    continue;
                }

                try
                {
                    _downloadService.DownloadReport(remoteEpisode);
                    grabbed.Add(report);
                }
                catch (ReleaseUnavailableException)
                {
                    _logger.Warn("Failed to download release from indexer, no longer available. " + remoteEpisode);
                    rejected.Add(report);
                }
                catch (Exception ex)
                {
                    if (ex is DownloadClientUnavailableException || ex is DownloadClientAuthenticationException)
                    {
                        _logger.Debug(ex, "Failed to send release to download client, storing until later. " + remoteEpisode);
                        failed.Add(report);

                        if (downloadProtocol == DownloadProtocol.Usenet)
                        {
                            usenetFailed = true;
                        }
                        else if (downloadProtocol == DownloadProtocol.Torrent)
                        {
                            torrentFailed = true;
                        }
                    }
                    else
                    {
                        _logger.Warn(ex, "Couldn't add report to download queue. " + remoteEpisode);
                    }
                }
            }

            pending.AddRange(ProcessFailedGrabs(grabbed, failed));

            return(new ProcessedDecisions(grabbed, pending, rejected));
        }
        public ProcessedDecisions ProcessDecisions(List <DownloadDecision> decisions)
        {
            var qualifiedReports     = GetQualifiedReports(decisions);
            var prioritizedDecisions = _prioritizeDownloadDecision.PrioritizeDecisions(qualifiedReports);
            var grabbed = new List <DownloadDecision>();
            var pending = new List <DownloadDecision>();

            //var failed = new List<DownloadDecision>();
            var rejected = decisions.Where(d => d.Rejected).ToList();

            var pendingAddQueue = new List <Tuple <DownloadDecision, PendingReleaseReason> >();

            var usenetFailed  = false;
            var torrentFailed = false;

            foreach (var report in prioritizedDecisions)
            {
                var remoteBook       = report.RemoteBook;
                var downloadProtocol = report.RemoteBook.Release.DownloadProtocol;

                //Skip if already grabbed
                if (IsAlbumProcessed(grabbed, report))
                {
                    continue;
                }

                if (report.TemporarilyRejected)
                {
                    PreparePending(pendingAddQueue, grabbed, pending, report, PendingReleaseReason.Delay);
                    continue;
                }

                if ((downloadProtocol == DownloadProtocol.Usenet && usenetFailed) ||
                    (downloadProtocol == DownloadProtocol.Torrent && torrentFailed))
                {
                    PreparePending(pendingAddQueue, grabbed, pending, report, PendingReleaseReason.DownloadClientUnavailable);
                    continue;
                }

                try
                {
                    _logger.Trace("Grabbing from Indexer {0} at priority {1}.", remoteBook.Release.Indexer, remoteBook.Release.IndexerPriority);
                    _downloadService.DownloadReport(remoteBook);
                    grabbed.Add(report);
                }
                catch (ReleaseUnavailableException)
                {
                    _logger.Warn("Failed to download release from indexer, no longer available. " + remoteBook);
                    rejected.Add(report);
                }
                catch (Exception ex)
                {
                    if (ex is DownloadClientUnavailableException || ex is DownloadClientAuthenticationException)
                    {
                        _logger.Debug(ex, "Failed to send release to download client, storing until later. " + remoteBook);
                        PreparePending(pendingAddQueue, grabbed, pending, report, PendingReleaseReason.DownloadClientUnavailable);

                        if (downloadProtocol == DownloadProtocol.Usenet)
                        {
                            usenetFailed = true;
                        }
                        else if (downloadProtocol == DownloadProtocol.Torrent)
                        {
                            torrentFailed = true;
                        }
                    }
                    else
                    {
                        _logger.Warn(ex, "Couldn't add report to download queue. " + remoteBook);
                    }
                }
            }

            if (pendingAddQueue.Any())
            {
                _pendingReleaseService.AddMany(pendingAddQueue);
            }

            return(new ProcessedDecisions(grabbed, pending, rejected));
        }