diff --git a/src/Jackett.Common/Indexers/BaseIndexer.cs b/src/Jackett.Common/Indexers/BaseIndexer.cs index 02f8219e1..8500af18c 100644 --- a/src/Jackett.Common/Indexers/BaseIndexer.cs +++ b/src/Jackett.Common/Indexers/BaseIndexer.cs @@ -263,20 +263,44 @@ namespace Jackett.Common.Indexers protected virtual IEnumerable FilterResults(TorznabQuery query, IEnumerable results) { - if (query.Categories.Length == 0) - return results; + var filteredResults = results; - // expand parent categories from the query - var expandedQueryCats = TorznabCaps.Categories.ExpandTorznabQueryCategories(query); + // filter results with wrong categories + if (query.Categories.Length > 0) + { + // expand parent categories from the query + var expandedQueryCats = TorznabCaps.Categories.ExpandTorznabQueryCategories(query); - var filteredResults = results.Where(result => - result.Category?.Any() != true || - expandedQueryCats.Intersect(result.Category).Any() + filteredResults = filteredResults.Where(result => + result.Category?.Any() != true || + expandedQueryCats.Intersect(result.Category).Any() ); + } + + // eliminate excess results + if (query.Limit > 0) + filteredResults = filteredResults.Take(query.Limit); return filteredResults; } + protected virtual IEnumerable FixResults(TorznabQuery query, IEnumerable results) + { + var fixedResults = results.Select(r => + { + // add origin + r.Origin = this; + + // fix publish date + // some trackers do not keep their clocks up to date and can be ~20 minutes out! + if (r.PublishDate > DateTime.Now) + r.PublishDate = DateTime.Now; + + return r; + }); + return fixedResults; + } + public virtual bool CanHandleQuery(TorznabQuery query) { if (query == null) @@ -328,26 +352,14 @@ namespace Jackett.Common.Indexers public virtual async Task ResultsForQuery(TorznabQuery query) { + if (!CanHandleQuery(query)) + return new IndexerResult(this, new ReleaseInfo[0]); + try { - if (!CanHandleQuery(query)) - return new IndexerResult(this, new ReleaseInfo[0]); var results = await PerformQuery(query); results = FilterResults(query, results); - if (query.Limit > 0) - { - results = results.Take(query.Limit); - } - results = results.Select(r => - { - r.Origin = this; - - // Some trackers do not keep their clocks up to date and can be ~20 minutes out! - if (r.PublishDate > DateTime.Now) - r.PublishDate = DateTime.Now; - return r; - }); - + results = FixResults(query, results); return new IndexerResult(this, results); } catch (Exception ex) diff --git a/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs b/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs index 30261a449..b219020c6 100644 --- a/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs +++ b/src/Jackett.Common/Indexers/Meta/BaseMetaIndexer.cs @@ -48,19 +48,14 @@ namespace Jackett.Common.Indexers.Meta public override async Task ResultsForQuery(TorznabQuery query) { + if (!CanHandleQuery(query)) + return new IndexerResult(this, new ReleaseInfo[0]); + try { - if (!CanHandleQuery(query)) - return new IndexerResult(this, new ReleaseInfo[0]); var results = await PerformQuery(query); - var correctedResults = results.Select(r => - { - if (r.PublishDate > DateTime.Now) - r.PublishDate = DateTime.Now; - return r; - }); - - return new IndexerResult(this, correctedResults); + // the results are already filtered and fixed by each indexer + return new IndexerResult(this, results); } catch (Exception ex) { diff --git a/src/Jackett.Common/Models/ReleaseInfo.cs b/src/Jackett.Common/Models/ReleaseInfo.cs index 58d8b56dd..0e064a936 100644 --- a/src/Jackett.Common/Models/ReleaseInfo.cs +++ b/src/Jackett.Common/Models/ReleaseInfo.cs @@ -35,7 +35,7 @@ namespace Jackett.Common.Models public long? MinimumSeedTime { get; set; } public double? DownloadVolumeFactor { get; set; } public double? UploadVolumeFactor { get; set; } - [JsonIgnore] // don't export the Origin to the manul search API, otherwise each result line contains a full recursive indexer JSON structure + [JsonIgnore] // don't export the Origin to the manual search API, otherwise each result line contains a full recursive indexer JSON structure public IIndexer Origin; diff --git a/src/Jackett.Test/Common/Indexers/BaseWebIndexerTests.cs b/src/Jackett.Test/Common/Indexers/BaseWebIndexerTests.cs index 716f58ed8..ea30a44cf 100644 --- a/src/Jackett.Test/Common/Indexers/BaseWebIndexerTests.cs +++ b/src/Jackett.Test/Common/Indexers/BaseWebIndexerTests.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using Jackett.Common.Models; @@ -42,7 +43,7 @@ namespace Jackett.Test.Common.Indexers } [Test] - public void TestFilterResults() + public void TestFilterResultsCategories() { var indexer = new TestWebIndexer(); indexer.AddTestCategories(); @@ -100,6 +101,49 @@ namespace Jackett.Test.Common.Indexers Assert.AreEqual(null, filteredResults[1].Category); } + [Test] + public void TestFilterResultsLimit() + { + var indexer = new TestWebIndexer(); + var results = new List + { + new ReleaseInfo(), + new ReleaseInfo() + }; + + var query = new TorznabQuery(); + var filteredResults = indexer._FilterResults(query, results).ToList(); + Assert.AreEqual(2, filteredResults.Count); + + query = new TorznabQuery + { + Limit = 1 + }; + filteredResults = indexer._FilterResults(query, results).ToList(); + Assert.AreEqual(1, filteredResults.Count); + } + + [Test] + public void TestFixResults() + { + var indexer = new TestWebIndexer(); + var query = new TorznabQuery(); + var results = new List + { + new ReleaseInfo + { + PublishDate = new DateTime(3000, 1, 1) // future date + } + }; + + // fix origin and publish date + Assert.AreEqual(null, results.First().Origin); + Assert.AreEqual(3000, results.First().PublishDate.Year); + var fixedResults = indexer._FixResults(query, results).ToList(); + Assert.AreEqual(indexer.Id, fixedResults.First().Origin.Id); + Assert.AreEqual(DateTime.Now.Year, fixedResults.First().PublishDate.Year); + } + [Test] public void TestAddCategoryMapping() { diff --git a/src/Jackett.Test/TestHelpers/TestWebIndexer.cs b/src/Jackett.Test/TestHelpers/TestWebIndexer.cs index 299e17be1..c8f488595 100644 --- a/src/Jackett.Test/TestHelpers/TestWebIndexer.cs +++ b/src/Jackett.Test/TestHelpers/TestWebIndexer.cs @@ -48,6 +48,9 @@ namespace Jackett.Test.TestHelpers public IEnumerable _FilterResults(TorznabQuery query, IEnumerable results) => FilterResults(query, results); + public IEnumerable _FixResults(TorznabQuery query, IEnumerable results) => + FixResults(query, results); + public void _AddCategoryMapping(string trackerCategory, TorznabCategory newznabCategory, string trackerCategoryDesc = null) => AddCategoryMapping(trackerCategory, newznabCategory, trackerCategoryDesc);