From 1a49430b45adf00584a7f07d43929e6bd632f45c Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sun, 28 May 2023 19:51:46 +0300 Subject: [PATCH] rutracker: use supported 200 categories per search request --- .../Extensions/ListExtensions.cs | 12 ++++ src/Jackett.Common/Indexers/RuTracker.cs | 72 +++++++++++-------- 2 files changed, 56 insertions(+), 28 deletions(-) create mode 100644 src/Jackett.Common/Extensions/ListExtensions.cs diff --git a/src/Jackett.Common/Extensions/ListExtensions.cs b/src/Jackett.Common/Extensions/ListExtensions.cs new file mode 100644 index 000000000..a2439b434 --- /dev/null +++ b/src/Jackett.Common/Extensions/ListExtensions.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Linq; + +namespace Jackett.Common.Extensions +{ + public static class ListExtensions + { + public static List> ChunkBy(this List source, int chunkSize) => source + .Select((x, i) => new { Index = i, Value = x }).GroupBy(x => x.Index / chunkSize) + .Select(x => x.Select(v => v.Value).ToList()).ToList(); + } +} diff --git a/src/Jackett.Common/Indexers/RuTracker.cs b/src/Jackett.Common/Indexers/RuTracker.cs index 702b93e34..0bc9c834b 100644 --- a/src/Jackett.Common/Indexers/RuTracker.cs +++ b/src/Jackett.Common/Indexers/RuTracker.cs @@ -8,6 +8,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using AngleSharp.Dom; using AngleSharp.Html.Parser; +using Jackett.Common.Extensions; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig; using Jackett.Common.Models.IndexerConfig.Bespoke; @@ -1453,36 +1454,41 @@ namespace Jackett.Common.Indexers protected override async Task> PerformQuery(TorznabQuery query) { - var searchUrl = CreateSearchUrlForQuery(query); - - var results = await RequestWithCookiesAsync(searchUrl); - if (!results.ContentString.Contains("id=\"logged-in-username\"")) - { - // re login - await ApplyConfiguration(null); - results = await RequestWithCookiesAsync(searchUrl); - } + var searchUrls = CreateSearchUrlsForQuery(query); var releases = new List(); - try + foreach (var searchUrl in searchUrls) { - var rows = GetReleaseRows(results); - foreach (var row in rows) + Console.WriteLine(searchUrl); + + var results = await RequestWithCookiesAsync(searchUrl); + if (!results.ContentString.Contains("id=\"logged-in-username\"")) { - var release = ParseReleaseRow(row); - if (release != null) + // re login + await ApplyConfiguration(null); + results = await RequestWithCookiesAsync(searchUrl); + } + + try + { + var rows = GetReleaseRows(results); + foreach (var row in rows) { - releases.Add(release); + var release = ParseReleaseRow(row); + if (release != null) + { + releases.Add(release); + } } } - } - catch (Exception ex) - { - OnParseError(results.ContentString, ex); + catch (Exception ex) + { + OnParseError(results.ContentString, ex); + } } - return releases; + return releases.OrderByDescending(o => o.PublishDate).ToArray(); } public override async Task Download(Uri link) @@ -1504,20 +1510,21 @@ namespace Jackett.Common.Indexers return await base.Download(link); } - private string CreateSearchUrlForQuery(in TorznabQuery query) + private IEnumerable CreateSearchUrlsForQuery(TorznabQuery query) { var queryCollection = new NameValueCollection(); var searchString = query.SearchTerm; // replace any space, special char, etc. with % (wildcard) - var ReplaceRegex = new Regex("[^a-zA-Zа-яА-Я0-9]+"); if (!string.IsNullOrWhiteSpace(searchString)) - searchString = ReplaceRegex.Replace(searchString, "%"); + { + searchString = new Regex("[^a-zA-Zа-яА-Я0-9]+").Replace(searchString, "%"); + } // if the search string is empty use the getnew view if (string.IsNullOrWhiteSpace(searchString)) { - queryCollection.Add("nm", searchString); + queryCollection.Set("nm", searchString); } else // use the normal search { @@ -1530,15 +1537,24 @@ namespace Jackett.Common.Indexers { searchString += " Серии: " + query.Episode; } - queryCollection.Add("nm", searchString); + queryCollection.Set("nm", searchString); } if (query.HasSpecifiedCategories) - queryCollection.Add("f", string.Join(",", MapTorznabCapsToTrackers(query))); + { + var trackerCategories = MapTorznabCapsToTrackers(query).Distinct().ToList(); - var searchUrl = SearchUrl + "?" + queryCollection.GetQueryString(); + foreach (var trackerCategoriesChunk in trackerCategories.ChunkBy(200)) + { + queryCollection.Set("f", string.Join(",", trackerCategoriesChunk)); - return searchUrl; + yield return SearchUrl + "?" + queryCollection.GetQueryString(); + } + } + else + { + yield return SearchUrl + "?" + queryCollection.GetQueryString(); + } } private IHtmlCollection GetReleaseRows(WebResult results)