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>()); }
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>()); }
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")); } }