using System; using System.Collections.Generic; using System.Net; using Nancy.ModelBinding; using NLog; using NzbDrone.Common.Extensions; using NzbDrone.Core.Exceptions; using NzbDrone.Core.IndexerSearch; using NzbDrone.Core.IndexerSearch.Definitions; using NzbDrone.Core.Parser.Model; using Prowlarr.Http; using Prowlarr.Http.Extensions; namespace Prowlarr.Api.V1.Search { public class SearchModule : ProwlarrRestModule { private readonly ISearchForNzb _nzbSearhService; private readonly Logger _logger; public SearchModule(ISearchForNzb nzbSearhService, Logger logger) { _nzbSearhService = nzbSearhService; _logger = logger; GetResourceAll = GetAll; } private List GetAll() { var request = this.Bind(); if (request.Query.IsNotNullOrWhiteSpace()) { var indexerIds = request.IndexerIds ?? new List(); var categories = request.Categories ?? new List(); if (indexerIds.Count > 0) { return GetSearchReleases(request.Query, indexerIds, categories); } else { return GetSearchReleases(request.Query, null, categories); } } return new List(); } private List GetSearchReleases(string query, List indexerIds, List categories) { try { var request = new NewznabRequest { q = query, source = "Prowlarr", t = "search", cat = string.Join(",", categories), server = Request.GetServerUrl() }; var decisions = _nzbSearhService.Search(request, indexerIds, true).Releases; return MapDecisions(decisions); } catch (SearchFailedException ex) { throw new NzbDroneClientException(HttpStatusCode.BadRequest, ex.Message); } catch (Exception ex) { _logger.Error(ex, "Search failed: " + ex.Message); } return new List(); } protected virtual List MapDecisions(IEnumerable releases) { var result = new List(); foreach (var downloadDecision in releases) { var release = downloadDecision.ToResource(); result.Add(release); } return result; } } }