Skip to content

Commit

Permalink
rutracker: use supported 200 categories per search request
Browse files Browse the repository at this point in the history
  • Loading branch information
mynameisbogdan committed May 28, 2023
1 parent 147549c commit 1a49430
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 28 deletions.
12 changes: 12 additions & 0 deletions src/Jackett.Common/Extensions/ListExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System.Collections.Generic;
using System.Linq;

namespace Jackett.Common.Extensions
{
public static class ListExtensions
{
public static List<List<T>> ChunkBy<T>(this List<T> 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();
}
}
72 changes: 44 additions & 28 deletions src/Jackett.Common/Indexers/RuTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
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;
Expand Down Expand Up @@ -1453,36 +1454,41 @@ public override async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken

protected override async Task<IEnumerable<ReleaseInfo>> 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<ReleaseInfo>();

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\""))
{
// re login
await ApplyConfiguration(null);
results = await RequestWithCookiesAsync(searchUrl);
}

try
{
var release = ParseReleaseRow(row);
if (release != null)
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<byte[]> Download(Uri link)
Expand All @@ -1504,20 +1510,21 @@ public override async Task<byte[]> Download(Uri link)
return await base.Download(link);
}

private string CreateSearchUrlForQuery(in TorznabQuery query)
private IEnumerable<string> 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
{
Expand All @@ -1530,15 +1537,24 @@ private string CreateSearchUrlForQuery(in TorznabQuery query)
{
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<IElement> GetReleaseRows(WebResult results)
Expand Down

0 comments on commit 1a49430

Please sign in to comment.