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; 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(); if (indexerIds.Count > 0) { return GetSearchReleases(request.Query, indexerIds); } else { return GetSearchReleases(request.Query, null); } } return new List(); } private List GetSearchReleases(string query, List indexerIds) { try { var decisions = _nzbSearhService.Search(new NewznabRequest { q = query, t = "search" }, 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; } } }