mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 17:34:09 +02:00
rutracker: use supported 200 categories per search request
This commit is contained in:
12
src/Jackett.Common/Extensions/ListExtensions.cs
Normal file
12
src/Jackett.Common/Extensions/ListExtensions.cs
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
@@ -8,6 +8,7 @@ using System.Text.RegularExpressions;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using AngleSharp.Dom;
|
using AngleSharp.Dom;
|
||||||
using AngleSharp.Html.Parser;
|
using AngleSharp.Html.Parser;
|
||||||
|
using Jackett.Common.Extensions;
|
||||||
using Jackett.Common.Models;
|
using Jackett.Common.Models;
|
||||||
using Jackett.Common.Models.IndexerConfig;
|
using Jackett.Common.Models.IndexerConfig;
|
||||||
using Jackett.Common.Models.IndexerConfig.Bespoke;
|
using Jackett.Common.Models.IndexerConfig.Bespoke;
|
||||||
@@ -1453,36 +1454,41 @@ namespace Jackett.Common.Indexers
|
|||||||
|
|
||||||
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
protected override async Task<IEnumerable<ReleaseInfo>> PerformQuery(TorznabQuery query)
|
||||||
{
|
{
|
||||||
var searchUrl = CreateSearchUrlForQuery(query);
|
var searchUrls = CreateSearchUrlsForQuery(query);
|
||||||
|
|
||||||
var results = await RequestWithCookiesAsync(searchUrl);
|
|
||||||
if (!results.ContentString.Contains("id=\"logged-in-username\""))
|
|
||||||
{
|
|
||||||
// re login
|
|
||||||
await ApplyConfiguration(null);
|
|
||||||
results = await RequestWithCookiesAsync(searchUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
var releases = new List<ReleaseInfo>();
|
var releases = new List<ReleaseInfo>();
|
||||||
|
|
||||||
try
|
foreach (var searchUrl in searchUrls)
|
||||||
{
|
{
|
||||||
var rows = GetReleaseRows(results);
|
Console.WriteLine(searchUrl);
|
||||||
foreach (var row in rows)
|
|
||||||
|
var results = await RequestWithCookiesAsync(searchUrl);
|
||||||
|
if (!results.ContentString.Contains("id=\"logged-in-username\""))
|
||||||
{
|
{
|
||||||
var release = ParseReleaseRow(row);
|
// re login
|
||||||
if (release != null)
|
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)
|
||||||
catch (Exception ex)
|
{
|
||||||
{
|
OnParseError(results.ContentString, ex);
|
||||||
OnParseError(results.ContentString, ex);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return releases;
|
return releases.OrderByDescending(o => o.PublishDate).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task<byte[]> Download(Uri link)
|
public override async Task<byte[]> Download(Uri link)
|
||||||
@@ -1504,20 +1510,21 @@ namespace Jackett.Common.Indexers
|
|||||||
return await base.Download(link);
|
return await base.Download(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
private string CreateSearchUrlForQuery(in TorznabQuery query)
|
private IEnumerable<string> CreateSearchUrlsForQuery(TorznabQuery query)
|
||||||
{
|
{
|
||||||
var queryCollection = new NameValueCollection();
|
var queryCollection = new NameValueCollection();
|
||||||
|
|
||||||
var searchString = query.SearchTerm;
|
var searchString = query.SearchTerm;
|
||||||
// replace any space, special char, etc. with % (wildcard)
|
// replace any space, special char, etc. with % (wildcard)
|
||||||
var ReplaceRegex = new Regex("[^a-zA-Zа-яА-Я0-9]+");
|
|
||||||
if (!string.IsNullOrWhiteSpace(searchString))
|
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 the search string is empty use the getnew view
|
||||||
if (string.IsNullOrWhiteSpace(searchString))
|
if (string.IsNullOrWhiteSpace(searchString))
|
||||||
{
|
{
|
||||||
queryCollection.Add("nm", searchString);
|
queryCollection.Set("nm", searchString);
|
||||||
}
|
}
|
||||||
else // use the normal search
|
else // use the normal search
|
||||||
{
|
{
|
||||||
@@ -1530,15 +1537,24 @@ namespace Jackett.Common.Indexers
|
|||||||
{
|
{
|
||||||
searchString += " Серии: " + query.Episode;
|
searchString += " Серии: " + query.Episode;
|
||||||
}
|
}
|
||||||
queryCollection.Add("nm", searchString);
|
queryCollection.Set("nm", searchString);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (query.HasSpecifiedCategories)
|
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)
|
private IHtmlCollection<IElement> GetReleaseRows(WebResult results)
|
||||||
|
Reference in New Issue
Block a user