Fixed: Using FlareSolverr in the same time with another HTTP/SOCKS proxy

pull/2024/head
Bogdan 4 months ago
parent a5ecc2dc9f
commit a1a5dd574e

@ -1,8 +1,10 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using NLog; using NLog;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Http; using NzbDrone.Common.Http;
using NzbDrone.Common.Http.Dispatchers; using NzbDrone.Common.Http.Dispatchers;
using NzbDrone.Common.TPL; using NzbDrone.Common.TPL;
@ -34,56 +36,63 @@ namespace NzbDrone.Core.Indexers
public async Task<HttpResponse> ExecuteProxiedAsync(HttpRequest request, ProviderDefinition definition) public async Task<HttpResponse> ExecuteProxiedAsync(HttpRequest request, ProviderDefinition definition)
{ {
var selectedProxy = GetProxy(definition); var selectedProxies = GetProxies(definition);
request = PreRequest(request, selectedProxy); request = PreRequest(request, selectedProxies);
return PostResponse(await ExecuteAsync(request), selectedProxy); return PostResponse(await ExecuteAsync(request), selectedProxies);
} }
public HttpResponse ExecuteProxied(HttpRequest request, ProviderDefinition definition) public HttpResponse ExecuteProxied(HttpRequest request, ProviderDefinition definition)
{ {
var selectedProxy = GetProxy(definition); var selectedProxies = GetProxies(definition);
request = PreRequest(request, selectedProxy); request = PreRequest(request, selectedProxies);
return PostResponse(Execute(request), selectedProxy); return PostResponse(Execute(request), selectedProxies);
} }
private IIndexerProxy GetProxy(ProviderDefinition definition) private IList<IIndexerProxy> GetProxies(ProviderDefinition definition)
{ {
// Skip DB call if no tags on the indexers // Skip DB call if no tags on the indexers
if (definition is { Id: > 0 } && definition.Tags.Count == 0) if (definition is { Id: > 0 } && definition.Tags.Count == 0)
{ {
return null; return Array.Empty<IIndexerProxy>();
} }
var proxies = _indexerProxyFactory.GetAvailableProviders(); var proxies = _indexerProxyFactory.GetAvailableProviders();
var selectedProxy = proxies.FirstOrDefault(proxy => definition.Tags.Intersect(proxy.Definition.Tags).Any());
if (selectedProxy == null && definition is not { Id: not 0 }) var selectedProxies = proxies
.Where(proxy => definition.Tags.Intersect(proxy.Definition.Tags).Any())
.GroupBy(p => p is FlareSolverr)
.Select(g => g.First())
.OrderBy(p => p is FlareSolverr)
.ToList();
if (!selectedProxies.Any() && definition is not { Id: not 0 })
{ {
selectedProxy = proxies.FirstOrDefault(p => p is FlareSolverr); selectedProxies = new List<IIndexerProxy>();
selectedProxies.AddIfNotNull(proxies.Find(p => p is FlareSolverr));
} }
return selectedProxy; return selectedProxies;
} }
private HttpRequest PreRequest(HttpRequest request, IIndexerProxy selectedProxy) private HttpRequest PreRequest(HttpRequest request, IList<IIndexerProxy> selectedProxies)
{ {
if (selectedProxy != null) if (selectedProxies != null && selectedProxies.Any())
{ {
request = selectedProxy.PreRequest(request); request = selectedProxies.Aggregate(request, (current, selectedProxy) => selectedProxy.PreRequest(current));
} }
return request; return request;
} }
private HttpResponse PostResponse(HttpResponse response, IIndexerProxy selectedProxy) private HttpResponse PostResponse(HttpResponse response, IList<IIndexerProxy> selectedProxies)
{ {
if (selectedProxy != null) if (selectedProxies != null && selectedProxies.Any())
{ {
response = selectedProxy.PostResponse(response); response = selectedProxies.Aggregate(response, (current, selectedProxy) => selectedProxy.PostResponse(current));
} }
return response; return response;

Loading…
Cancel
Save