mirror of
https://github.com/Prowlarr/Prowlarr
synced 2026-04-21 12:20:59 +02:00
More accurate indexer query times in History
This commit is contained in:
parent
041596df4c
commit
ff926d71f7
17 changed files with 122 additions and 63 deletions
|
|
@ -34,7 +34,7 @@ public void should_parse_recent_feed_from_FileList()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(4);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ public void should_parse_recent_feed_from_HDBits(string fileName)
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.POST)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), responseJson));
|
||||
|
||||
var torrents = Subject.Fetch(_movieSearchCriteria);
|
||||
var torrents = Subject.Fetch(_movieSearchCriteria).Releases;
|
||||
|
||||
torrents.Should().HaveCount(2);
|
||||
torrents.First().Should().BeOfType<HDBitsInfo>();
|
||||
|
|
@ -75,7 +75,7 @@ public void should_warn_on_wrong_passkey()
|
|||
.Setup(v => v.Execute(It.IsAny<HttpRequest>()))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), Encoding.UTF8.GetBytes(responseJson)));
|
||||
|
||||
var torrents = Subject.Fetch(_movieSearchCriteria);
|
||||
var torrents = Subject.Fetch(_movieSearchCriteria).Releases;
|
||||
|
||||
torrents.Should().BeEmpty();
|
||||
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ public void should_parse_recent_feed_from_IPTorrents()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(5);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ public void should_parse_recent_feed_from_newznab_nzb_su()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 }, Limit = 100, Offset = 0 });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 }, Limit = 100, Offset = 0 }).Releases;
|
||||
|
||||
releases.Should().HaveCount(100);
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ public void should_parse_recent_feed_from_Nyaa()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria());
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria()).Releases;
|
||||
|
||||
releases.Should().HaveCount(4);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ public void should_parse_feed_from_PTP(string fileName)
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader { ContentType = HttpAccept.Json.Value }, responseJson));
|
||||
|
||||
var torrents = Subject.Fetch(new MovieSearchCriteria());
|
||||
var torrents = Subject.Fetch(new MovieSearchCriteria()).Releases;
|
||||
|
||||
torrents.Should().HaveCount(293);
|
||||
torrents.First().Should().BeOfType<PassThePopcornInfo>();
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ public void should_parse_recent_feed_from_Rarbg()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(4);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -66,7 +66,7 @@ public void should_parse_error_20_as_empty_results()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), "{ error_code: 20, error: \"some message\" }"));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(0);
|
||||
}
|
||||
|
|
@ -78,7 +78,7 @@ public void should_warn_on_unknown_error()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), "{ error_code: 25, error: \"some message\" }"));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(0);
|
||||
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ public void should_parse_recent_feed_from_ImmortalSeed()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/ImmortalSeed.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(50);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -71,7 +71,7 @@ public void should_parse_recent_feed_from_Ezrss()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/Ezrss.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(3);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -99,7 +99,7 @@ public void should_parse_recent_feed_from_ShowRSS_info()
|
|||
|
||||
GivenRecentFeedResponse("TorrentRss/ShowRSS.info.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(5);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -127,7 +127,7 @@ public void should_parse_recent_feed_from_Doki()
|
|||
|
||||
GivenRecentFeedResponse("TorrentRss/Doki.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(5);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -153,7 +153,7 @@ public void should_parse_recent_feed_from_ExtraTorrents()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/ExtraTorrents.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(5);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -179,7 +179,7 @@ public void should_parse_recent_feed_from_LimeTorrents()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/LimeTorrents.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(5);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -205,7 +205,7 @@ public void should_parse_recent_feed_from_AnimeTosho_without_size()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/AnimeTosho_NoSize.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(2);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -231,7 +231,7 @@ public void should_parse_multi_enclosure_from_AnimeTosho()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/AnimeTosho_NoSize.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(2);
|
||||
releases.Last().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -248,7 +248,7 @@ public void should_parse_recent_feed_from_AlphaRatio()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/AlphaRatio.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(2);
|
||||
releases.Last().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -266,7 +266,7 @@ public void should_parse_recent_feed_from_EveolutionWorld_without_size()
|
|||
Subject.Definition.Settings.As<TorrentRssIndexerSettings>().AllowZeroSize = true;
|
||||
GivenRecentFeedResponse("TorrentRss/EvolutionWorld.xml");
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } });
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases;
|
||||
|
||||
releases.Should().HaveCount(2);
|
||||
releases.First().Should().BeOfType<TorrentInfo>();
|
||||
|
|
@ -292,7 +292,7 @@ public void should_record_indexer_failure_if_unsupported_feed()
|
|||
{
|
||||
GivenRecentFeedResponse("TorrentRss/invalid/TorrentDay_NoPubDate.xml");
|
||||
|
||||
Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Should().BeEmpty();
|
||||
Subject.Fetch(new MovieSearchCriteria { Categories = new int[] { 2000 } }).Releases.Should().BeEmpty();
|
||||
|
||||
Mocker.GetMock<IIndexerStatusService>()
|
||||
.Verify(v => v.RecordFailure(It.IsAny<int>(), TimeSpan.Zero), Times.Once());
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ public void should_parse_recent_feed_from_torznab_hdaccess_net()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria());
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria()).Releases;
|
||||
|
||||
releases.Should().HaveCount(5);
|
||||
|
||||
|
|
@ -74,7 +74,7 @@ public void should_parse_recent_feed_from_torznab_tpb()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria());
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria()).Releases;
|
||||
|
||||
releases.Should().HaveCount(5);
|
||||
|
||||
|
|
@ -104,7 +104,7 @@ public void should_parse_recent_feed_from_torznab_animetosho()
|
|||
.Setup(o => o.Execute(It.Is<HttpRequest>(v => v.Method == HttpMethod.GET)))
|
||||
.Returns<HttpRequest>(r => new HttpResponse(r, new HttpHeader(), recentFeed));
|
||||
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria());
|
||||
var releases = Subject.Fetch(new MovieSearchCriteria()).Releases;
|
||||
|
||||
releases.Should().HaveCount(2);
|
||||
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ public void Handle(IndexerQueryEvent message)
|
|||
|
||||
history.Data.Add("ElapsedTime", message.Time.ToString());
|
||||
history.Data.Add("Query", message.Query.SearchTerm ?? string.Empty);
|
||||
history.Data.Add("Categories", string.Join(',', message.Query.Categories) ?? string.Empty);
|
||||
history.Data.Add("Successful", message.Successful.ToString());
|
||||
history.Data.Add("QueryResults", message.Results.HasValue ? message.Results.ToString() : null);
|
||||
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ private TSpec Get<TSpec>(NewznabRequest query, List<int> indexerIds, bool intera
|
|||
return spec;
|
||||
}
|
||||
|
||||
private List<ReleaseInfo> Dispatch(Func<IIndexer, IEnumerable<ReleaseInfo>> searchAction, SearchCriteriaBase criteriaBase)
|
||||
private List<ReleaseInfo> Dispatch(Func<IIndexer, IndexerPageableQueryResult> searchAction, SearchCriteriaBase criteriaBase)
|
||||
{
|
||||
var indexers = criteriaBase.InteractiveSearch ?
|
||||
_indexerFactory.InteractiveSearchEnabled() :
|
||||
|
|
@ -151,25 +151,25 @@ private List<ReleaseInfo> Dispatch(Func<IIndexer, IEnumerable<ReleaseInfo>> sear
|
|||
|
||||
taskList.Add(taskFactory.StartNew(() =>
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
try
|
||||
{
|
||||
var indexerReports = searchAction(indexerLocal);
|
||||
|
||||
lock (reports)
|
||||
{
|
||||
reports.AddRange(indexerReports);
|
||||
reports.AddRange(indexerReports.Releases);
|
||||
}
|
||||
|
||||
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, sw.ElapsedMilliseconds, true, indexerReports.Count()));
|
||||
foreach (var query in indexerReports.Queries)
|
||||
{
|
||||
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, query.ElapsedTime, true, indexerReports.Releases.Count()));
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, sw.ElapsedMilliseconds, false));
|
||||
_eventAggregator.PublishEvent(new IndexerQueryEvent(indexer.Definition.Id, criteriaBase, 0, false));
|
||||
_logger.Error(e, "Error while searching for {0}", criteriaBase);
|
||||
}
|
||||
|
||||
sw.Stop();
|
||||
}).LogExceptions());
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using FluentValidation.Results;
|
||||
|
|
@ -40,7 +41,7 @@ public HttpIndexerBase(IHttpClient httpClient, IIndexerStatusService indexerStat
|
|||
_httpClient = httpClient;
|
||||
}
|
||||
|
||||
public override IList<ReleaseInfo> Fetch(MovieSearchCriteria searchCriteria)
|
||||
public override IndexerPageableQueryResult Fetch(MovieSearchCriteria searchCriteria)
|
||||
{
|
||||
//if (!SupportsSearch)
|
||||
//{
|
||||
|
|
@ -49,41 +50,41 @@ public override IList<ReleaseInfo> Fetch(MovieSearchCriteria searchCriteria)
|
|||
return FetchReleases(g => g.GetSearchRequests(searchCriteria));
|
||||
}
|
||||
|
||||
public override IList<ReleaseInfo> Fetch(MusicSearchCriteria searchCriteria)
|
||||
public override IndexerPageableQueryResult Fetch(MusicSearchCriteria searchCriteria)
|
||||
{
|
||||
if (!SupportsSearch)
|
||||
{
|
||||
return new List<ReleaseInfo>();
|
||||
return new IndexerPageableQueryResult();
|
||||
}
|
||||
|
||||
return FetchReleases(g => g.GetSearchRequests(searchCriteria));
|
||||
}
|
||||
|
||||
public override IList<ReleaseInfo> Fetch(TvSearchCriteria searchCriteria)
|
||||
public override IndexerPageableQueryResult Fetch(TvSearchCriteria searchCriteria)
|
||||
{
|
||||
if (!SupportsSearch)
|
||||
{
|
||||
return new List<ReleaseInfo>();
|
||||
return new IndexerPageableQueryResult();
|
||||
}
|
||||
|
||||
return FetchReleases(g => g.GetSearchRequests(searchCriteria));
|
||||
}
|
||||
|
||||
public override IList<ReleaseInfo> Fetch(BookSearchCriteria searchCriteria)
|
||||
public override IndexerPageableQueryResult Fetch(BookSearchCriteria searchCriteria)
|
||||
{
|
||||
if (!SupportsSearch)
|
||||
{
|
||||
return new List<ReleaseInfo>();
|
||||
return new IndexerPageableQueryResult();
|
||||
}
|
||||
|
||||
return FetchReleases(g => g.GetSearchRequests(searchCriteria));
|
||||
}
|
||||
|
||||
public override IList<ReleaseInfo> Fetch(BasicSearchCriteria searchCriteria)
|
||||
public override IndexerPageableQueryResult Fetch(BasicSearchCriteria searchCriteria)
|
||||
{
|
||||
if (!SupportsSearch)
|
||||
{
|
||||
return new List<ReleaseInfo>();
|
||||
return new IndexerPageableQueryResult();
|
||||
}
|
||||
|
||||
return FetchReleases(g => g.GetSearchRequests(searchCriteria));
|
||||
|
|
@ -116,9 +117,10 @@ protected IndexerPageableRequestChain GetRequestChain(SearchCriteriaBase searchC
|
|||
return requests;
|
||||
}
|
||||
|
||||
protected virtual IList<ReleaseInfo> FetchReleases(Func<IIndexerRequestGenerator, IndexerPageableRequestChain> pageableRequestChainSelector, bool isRecent = false)
|
||||
protected virtual IndexerPageableQueryResult FetchReleases(Func<IIndexerRequestGenerator, IndexerPageableRequestChain> pageableRequestChainSelector, bool isRecent = false)
|
||||
{
|
||||
var releases = new List<ReleaseInfo>();
|
||||
var result = new IndexerPageableQueryResult();
|
||||
var url = string.Empty;
|
||||
|
||||
try
|
||||
|
|
@ -153,9 +155,11 @@ protected virtual IList<ReleaseInfo> FetchReleases(Func<IIndexerRequestGenerator
|
|||
|
||||
var page = FetchPage(request, parser);
|
||||
|
||||
pagedReleases.AddRange(page);
|
||||
result.Queries.Add(page);
|
||||
|
||||
if (isRecent && page.Any())
|
||||
pagedReleases.AddRange(page.Releases);
|
||||
|
||||
if (isRecent && page.Releases.Any())
|
||||
{
|
||||
if (lastReleaseInfo == null)
|
||||
{
|
||||
|
|
@ -163,8 +167,8 @@ protected virtual IList<ReleaseInfo> FetchReleases(Func<IIndexerRequestGenerator
|
|||
break;
|
||||
}
|
||||
|
||||
var oldestReleaseDate = page.Select(v => v.PublishDate).Min();
|
||||
if (oldestReleaseDate < lastReleaseInfo.PublishDate || page.Any(v => v.DownloadUrl == lastReleaseInfo.DownloadUrl))
|
||||
var oldestReleaseDate = page.Releases.Select(v => v.PublishDate).Min();
|
||||
if (oldestReleaseDate < lastReleaseInfo.PublishDate || page.Releases.Any(v => v.DownloadUrl == lastReleaseInfo.DownloadUrl))
|
||||
{
|
||||
fullyUpdated = true;
|
||||
break;
|
||||
|
|
@ -182,7 +186,7 @@ protected virtual IList<ReleaseInfo> FetchReleases(Func<IIndexerRequestGenerator
|
|||
break;
|
||||
}
|
||||
|
||||
if (!IsFullPage(page))
|
||||
if (!IsFullPage(page.Releases))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
|
@ -289,7 +293,9 @@ protected virtual IList<ReleaseInfo> FetchReleases(Func<IIndexerRequestGenerator
|
|||
_logger.Error(ex, "An error occurred while processing indexer feed. {0}", url);
|
||||
}
|
||||
|
||||
return CleanupReleases(releases);
|
||||
result.Releases = CleanupReleases(releases);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override IndexerCapabilities GetCapabilities()
|
||||
|
|
@ -312,13 +318,18 @@ protected virtual bool IsFullPage(IList<ReleaseInfo> page)
|
|||
return PageSize != 0 && page.Count >= PageSize;
|
||||
}
|
||||
|
||||
protected virtual IList<ReleaseInfo> FetchPage(IndexerRequest request, IParseIndexerResponse parser)
|
||||
protected virtual IndexerQueryResult FetchPage(IndexerRequest request, IParseIndexerResponse parser)
|
||||
{
|
||||
var response = FetchIndexerResponse(request);
|
||||
|
||||
try
|
||||
{
|
||||
return parser.ParseResponse(response).ToList();
|
||||
return new IndexerQueryResult
|
||||
{
|
||||
Releases = parser.ParseResponse(response).ToList(),
|
||||
ElapsedTime = response.ElapsedTime,
|
||||
StatusCode = (int)response.HttpResponse.StatusCode
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
@ -339,7 +350,13 @@ protected virtual IndexerResponse FetchIndexerResponse(IndexerRequest request)
|
|||
|
||||
request.HttpRequest.AllowAutoRedirect = true;
|
||||
|
||||
return new IndexerResponse(request, _httpClient.Execute(request.HttpRequest));
|
||||
var stopWatch = Stopwatch.StartNew();
|
||||
|
||||
var response = _httpClient.Execute(request.HttpRequest);
|
||||
|
||||
stopWatch.Stop();
|
||||
|
||||
return new IndexerResponse(request, response, stopWatch.ElapsedMilliseconds);
|
||||
}
|
||||
|
||||
protected override void Test(List<ValidationFailure> failures)
|
||||
|
|
@ -366,7 +383,7 @@ protected virtual ValidationFailure TestConnection()
|
|||
|
||||
var releases = FetchPage(firstRequest, parser);
|
||||
|
||||
if (releases.Empty())
|
||||
if (releases.Releases.Empty())
|
||||
{
|
||||
return new ValidationFailure(string.Empty, "Query successful, but no results were returned from your indexer. This may be an issue with the indexer or your indexer category settings.");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,11 +14,11 @@ public interface IIndexer : IProvider
|
|||
DownloadProtocol Protocol { get; }
|
||||
IndexerPrivacy Privacy { get; }
|
||||
|
||||
IList<ReleaseInfo> Fetch(MovieSearchCriteria searchCriteria);
|
||||
IList<ReleaseInfo> Fetch(MusicSearchCriteria searchCriteria);
|
||||
IList<ReleaseInfo> Fetch(TvSearchCriteria searchCriteria);
|
||||
IList<ReleaseInfo> Fetch(BookSearchCriteria searchCriteria);
|
||||
IList<ReleaseInfo> Fetch(BasicSearchCriteria searchCriteria);
|
||||
IndexerPageableQueryResult Fetch(MovieSearchCriteria searchCriteria);
|
||||
IndexerPageableQueryResult Fetch(MusicSearchCriteria searchCriteria);
|
||||
IndexerPageableQueryResult Fetch(TvSearchCriteria searchCriteria);
|
||||
IndexerPageableQueryResult Fetch(BookSearchCriteria searchCriteria);
|
||||
IndexerPageableQueryResult Fetch(BasicSearchCriteria searchCriteria);
|
||||
|
||||
IndexerCapabilities GetCapabilities();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,11 +65,11 @@ public virtual object RequestAction(string action, IDictionary<string, string> q
|
|||
|
||||
protected TSettings Settings => (TSettings)Definition.Settings;
|
||||
|
||||
public abstract IList<ReleaseInfo> Fetch(MovieSearchCriteria searchCriteria);
|
||||
public abstract IList<ReleaseInfo> Fetch(MusicSearchCriteria searchCriteria);
|
||||
public abstract IList<ReleaseInfo> Fetch(TvSearchCriteria searchCriteria);
|
||||
public abstract IList<ReleaseInfo> Fetch(BookSearchCriteria searchCriteria);
|
||||
public abstract IList<ReleaseInfo> Fetch(BasicSearchCriteria searchCriteria);
|
||||
public abstract IndexerPageableQueryResult Fetch(MovieSearchCriteria searchCriteria);
|
||||
public abstract IndexerPageableQueryResult Fetch(MusicSearchCriteria searchCriteria);
|
||||
public abstract IndexerPageableQueryResult Fetch(TvSearchCriteria searchCriteria);
|
||||
public abstract IndexerPageableQueryResult Fetch(BookSearchCriteria searchCriteria);
|
||||
public abstract IndexerPageableQueryResult Fetch(BasicSearchCriteria searchCriteria);
|
||||
|
||||
public abstract IndexerCapabilities GetCapabilities();
|
||||
|
||||
|
|
|
|||
21
src/NzbDrone.Core/Indexers/IndexerPageableQueryResult.cs
Normal file
21
src/NzbDrone.Core/Indexers/IndexerPageableQueryResult.cs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
public class IndexerPageableQueryResult
|
||||
{
|
||||
public IndexerPageableQueryResult()
|
||||
{
|
||||
Releases = new List<ReleaseInfo>();
|
||||
Queries = new List<IndexerQueryResult>();
|
||||
}
|
||||
|
||||
public IList<ReleaseInfo> Releases { get; set; }
|
||||
public IList<IndexerQueryResult> Queries { get; set; }
|
||||
}
|
||||
}
|
||||
18
src/NzbDrone.Core/Indexers/IndexerQueryResult.cs
Normal file
18
src/NzbDrone.Core/Indexers/IndexerQueryResult.cs
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
|
||||
namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
public class IndexerQueryResult
|
||||
{
|
||||
public IndexerQueryResult()
|
||||
{
|
||||
Releases = new List<ReleaseInfo>();
|
||||
}
|
||||
|
||||
public IList<ReleaseInfo> Releases { get; set; }
|
||||
public long ElapsedTime { get; set; }
|
||||
public int StatusCode { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Http;
|
||||
|
||||
namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
|
|
@ -7,10 +7,11 @@ public class IndexerResponse
|
|||
private readonly IndexerRequest _indexerRequest;
|
||||
private readonly HttpResponse _httpResponse;
|
||||
|
||||
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse)
|
||||
public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse, long elapsedTime = 0)
|
||||
{
|
||||
_indexerRequest = indexerRequest;
|
||||
_httpResponse = httpResponse;
|
||||
ElapsedTime = elapsedTime;
|
||||
}
|
||||
|
||||
public IndexerRequest Request => _indexerRequest;
|
||||
|
|
@ -20,5 +21,6 @@ public IndexerResponse(IndexerRequest indexerRequest, HttpResponse httpResponse)
|
|||
public HttpResponse HttpResponse => _httpResponse;
|
||||
|
||||
public string Content => _httpResponse.Content;
|
||||
public long ElapsedTime { get; private set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue