diff --git a/src/Jackett.Common/Definitions/movietorrent.yml b/src/Jackett.Common/Definitions/movietorrent.yml index 179ee0228..a96190b89 100644 --- a/src/Jackett.Common/Definitions/movietorrent.yml +++ b/src/Jackett.Common/Definitions/movietorrent.yml @@ -10,6 +10,8 @@ links: - https://movietorrent.co/ caps: + limitsDefault: 36 + limitsMax: 36 categorymappings: - {id: 1, cat: Movies, desc: "Bollywood"} - {id: 2, cat: Movies/HD, desc: "1080p"} @@ -74,6 +76,9 @@ download: - name: validfilename search: + pageSize: 12 + pageable: true + paths: - path: "?s={{ .Keywords }}" - path: "/page/2/?s={{ .Keywords }}" diff --git a/src/Jackett.Common/Definitions/schema.json b/src/Jackett.Common/Definitions/schema.json index e5c1ac610..f524f3ea1 100644 --- a/src/Jackett.Common/Definitions/schema.json +++ b/src/Jackett.Common/Definitions/schema.json @@ -93,6 +93,14 @@ "type": "object", "additionalProperties": false, "properties": { + "limitsDefault": { + "type": "integer", + "minimum": 1 + }, + "limitsMax": { + "type": "integer", + "minimum": 1 + }, "categories": { "type": "object", "additionalProperties": false, @@ -482,6 +490,13 @@ "type": "object", "additionalProperties": false, "properties": { + "pageSize": { + "type": "integer", + "minimum": 1 + }, + "pageable": { + "type": "boolean" + }, "path": { "type": "string" }, diff --git a/src/Jackett.Common/Indexers/BaseIndexer.cs b/src/Jackett.Common/Indexers/BaseIndexer.cs index f5afc3613..af6232706 100644 --- a/src/Jackett.Common/Indexers/BaseIndexer.cs +++ b/src/Jackett.Common/Indexers/BaseIndexer.cs @@ -35,6 +35,7 @@ namespace Jackett.Common.Indexers public virtual string Type { get; protected set; } public virtual bool SupportsPagination => false; + public virtual int PageSize => 0; public virtual bool IsConfigured { get; protected set; } public virtual string[] Tags { get; protected set; } diff --git a/src/Jackett.Common/Indexers/CardigannIndexer.cs b/src/Jackett.Common/Indexers/CardigannIndexer.cs index 4db00b9da..73c3ca707 100644 --- a/src/Jackett.Common/Indexers/CardigannIndexer.cs +++ b/src/Jackett.Common/Indexers/CardigannIndexer.cs @@ -27,6 +27,8 @@ namespace Jackett.Common.Indexers { public class CardigannIndexer : BaseWebIndexer { + public override int PageSize => Definition.Search != null && Definition.Search.PageSize > 0 ? Definition.Search.PageSize : 1; + protected IndexerDefinition Definition; protected WebResult landingResult; protected IHtmlDocument landingResultDocument; @@ -124,6 +126,8 @@ namespace Jackett.Common.Indexers TorznabCaps = new TorznabCapabilities(); TorznabCaps.ParseCardigannSearchModes(Definition.Caps.Modes); TorznabCaps.SupportsRawSearch = Definition.Caps.Allowrawsearch; + TorznabCaps.LimitsDefault = Definition.Caps.LimitsDefault ?? TorznabCaps.LimitsDefault; + TorznabCaps.LimitsMax = Definition.Caps.LimitsMax ?? TorznabCaps.LimitsMax; // init config Data configData = new ConfigurationData(); @@ -1353,6 +1357,8 @@ namespace Jackett.Common.Indexers variables[".Query.Keywords"] = string.Join(" ", KeywordTokens); variables[".Keywords"] = applyFilters((string)variables[".Query.Keywords"], Search.Keywordsfilters, variables); + var pageSize = PageSize; + // TODO: prepare queries first and then send them parallel var SearchPaths = Search.Paths; foreach (var SearchPath in SearchPaths) @@ -1734,14 +1740,28 @@ namespace Jackett.Common.Indexers OnParseError(results, ex); } } + + pageSize = pageSize == 1 ? releases.Count : pageSize; + + if (Search.Pageable && !IsFullPage(releases, pageSize)) + { + break; + } } if (query.Limit > 0) + { releases = releases.Take(query.Limit).ToList(); + } return releases; } + protected virtual bool IsFullPage(IList page, int pageSize) + { + return pageSize != 0 && page.Count >= pageSize; + } + protected async Task handleRequest(requestBlock request, Dictionary variables = null, string referer = null) { var requestLinkStr = resolvePath(applyGoTemplateText(request.Path, variables)).ToString(); diff --git a/src/Jackett.Common/Models/IndexerDefinition.cs b/src/Jackett.Common/Models/IndexerDefinition.cs index 458f9051a..426251d01 100644 --- a/src/Jackett.Common/Models/IndexerDefinition.cs +++ b/src/Jackett.Common/Models/IndexerDefinition.cs @@ -69,6 +69,8 @@ namespace Jackett.Common.Models public class capabilitiesBlock { + public int? LimitsMax { get; set; } + public int? LimitsDefault { get; set; } public Dictionary Categories { get; set; } public List Categorymappings { get; set; } public Dictionary> Modes { get; set; } @@ -137,6 +139,8 @@ namespace Jackett.Common.Models public class searchBlock { + public int PageSize { get; set; } + public bool Pageable { get; set; } public string Path { get; set; } public List Paths { get; set; } public Dictionary> Headers { get; set; }