예제 #1
0
        private async Task <List <ReleaseResource> > GetSearchReleases([FromQuery] SearchResource payload)
        {
            try
            {
                var request = new NewznabRequest
                {
                    q      = payload.Query,
                    t      = payload.Type,
                    source = "Prowlarr",
                    cat    = string.Join(",", payload.Categories),
                    server = Request.GetServerUrl(),
                    host   = Request.GetHostName(),
                    limit  = payload.Limit,
                    offset = payload.Offset
                };

                request.QueryToParams();

                var result = await _nzbSearhService.Search(request, payload.IndexerIds, true);

                var decisions = result.Releases;

                return(MapDecisions(decisions, Request.GetServerUrl()));
            }
            catch (SearchFailedException ex)
            {
                throw new NzbDroneClientException(HttpStatusCode.BadRequest, ex.Message);
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Search failed: " + ex.Message);
            }

            return(new List <ReleaseResource>());
        }
예제 #2
0
        private async Task <List <SearchResource> > GetSearchReleases(string query, string type, List <int> indexerIds, List <int> categories)
        {
            try
            {
                var request = new NewznabRequest
                {
                    q      = query,
                    t      = type,
                    source = "Prowlarr",
                    cat    = string.Join(",", categories),
                    server = Request.GetServerUrl(),
                    host   = Request.GetHostName()
                };

                request.QueryToParams();

                var result = await _nzbSearhService.Search(request, indexerIds, true);

                var decisions = result.Releases;

                return(MapDecisions(decisions, Request.GetServerUrl()));
            }
            catch (SearchFailedException ex)
            {
                throw new NzbDroneClientException(HttpStatusCode.BadRequest, ex.Message);
            }
            catch (Exception ex)
            {
                _logger.Error(ex, "Search failed: " + ex.Message);
            }

            return(new List <SearchResource>());
        }
예제 #3
0
        public async Task <IActionResult> GetNewznabResponse(int id, [FromQuery] NewznabRequest request)
        {
            var requestType = request.t;

            request.source = UserAgentParser.ParseSource(Request.Headers["User-Agent"]);
            request.server = Request.GetServerUrl();
            request.host   = Request.GetHostName();

            if (requestType.IsNullOrWhiteSpace())
            {
                return(Content(CreateErrorXML(200, "Missing parameter (t)"), "application/rss+xml"));
            }

            request.imdbid = request.imdbid?.TrimStart('t') ?? null;

            if (request.imdbid.IsNotNullOrWhiteSpace())
            {
                if (!int.TryParse(request.imdbid, out var imdb) || imdb == 0)
                {
                    return(Content(CreateErrorXML(201, "Incorrect parameter (imdbid)"), "application/rss+xml"));
                }
            }

            if (id == 0)
            {
                switch (requestType)
                {
                case "caps":
                    var caps = new IndexerCapabilities
                    {
                        TvSearchParams = new List <TvSearchParam>
                        {
                            TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
                        },
                        MovieSearchParams = new List <MovieSearchParam>
                        {
                            MovieSearchParam.Q
                        },
                        MusicSearchParams = new List <MusicSearchParam>
                        {
                            MusicSearchParam.Q
                        },
                        BookSearchParams = new List <BookSearchParam>
                        {
                            BookSearchParam.Q
                        }
                    };

                    foreach (var cat in NewznabStandardCategory.AllCats)
                    {
                        caps.Categories.AddCategoryMapping(1, cat);
                    }

                    return(Content(caps.ToXml(), "application/rss+xml"));

                case "search":
                case "tvsearch":
                case "music":
                case "book":
                case "movie":
                    var results = new NewznabResults();
                    results.Releases = new List <ReleaseInfo>
                    {
                        new ReleaseInfo
                        {
                            Title       = "Test Release",
                            Guid        = "https://prowlarr.com",
                            DownloadUrl = "https://prowlarr.com",
                            PublishDate = DateTime.Now
                        }
                    };

                    return(Content(results.ToXml(DownloadProtocol.Usenet), "application/rss+xml"));
                }
            }

            var indexerDef = _indexerFactory.Get(id);

            if (indexerDef == null)
            {
                throw new NotFoundException("Indexer Not Found");
            }

            var indexer = _indexerFactory.GetInstance(indexerDef);

            //TODO Optimize this so it's not called here and in NzbSearchService (for manual search)
            if (_indexerLimitService.AtQueryLimit(indexerDef))
            {
                return(Content(CreateErrorXML(500, $"Request limit reached ({((IIndexerSettings)indexer.Definition.Settings).BaseSettings.QueryLimit})"), "application/rss+xml"));
            }

            switch (requestType)
            {
            case "caps":
                var caps = indexer.GetCapabilities();
                return(Content(caps.ToXml(), "application/rss+xml"));

            case "search":
            case "tvsearch":
            case "music":
            case "book":
            case "movie":
                var results = await _nzbSearchService.Search(request, new List <int> {
                    indexerDef.Id
                }, false);

                foreach (var result in results.Releases)
                {
                    result.DownloadUrl = result.DownloadUrl.IsNotNullOrWhiteSpace() ? _downloadMappingService.ConvertToProxyLink(new Uri(result.DownloadUrl), request.server, indexerDef.Id, result.Title).AbsoluteUri : null;

                    if (result.DownloadProtocol == DownloadProtocol.Torrent)
                    {
                        ((TorrentInfo)result).MagnetUrl = ((TorrentInfo)result).MagnetUrl.IsNotNullOrWhiteSpace() ? _downloadMappingService.ConvertToProxyLink(new Uri(((TorrentInfo)result).MagnetUrl), request.server, indexerDef.Id, result.Title).AbsoluteUri : null;
                    }
                }

                return(Content(results.ToXml(indexer.Protocol), "application/rss+xml"));

            default:
                return(Content(CreateErrorXML(202, $"No such function ({requestType})"), "application/rss+xml"));
            }
        }