1
0
Fork 0
mirror of https://github.com/Jackett/Jackett synced 2025-03-10 22:23:20 +00:00

[Cardigann] Add infohash feature for download block (#12258)

This commit is contained in:
mikeoscar2006 2021-09-06 09:12:15 +05:30 committed by GitHub
parent 4bbb2f6aad
commit 2ea2b0b1de
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 75 additions and 6 deletions

View file

@ -1715,9 +1715,8 @@ namespace Jackett.Common.Indexers
if (queryCollection.Count > 0)
{
if (!requestLinkStr.Contains("?"))
requestLinkStr += "?" + queryCollection.GetQueryString(Encoding, separator: request.Queryseparator).Substring(1);
else
requestLinkStr += queryCollection.GetQueryString(Encoding, separator: request.Queryseparator);
requestLinkStr += "?";
requestLinkStr += queryCollection.GetQueryString(Encoding, separator: request.Queryseparator);
}
var response = await RequestWithCookiesAndRetryAsync(requestLinkStr, null, method, referer, pairs);
@ -1751,13 +1750,75 @@ namespace Jackett.Common.Indexers
var Download = Definition.Download;
var variables = GetBaseTemplateVariables();
AddTemplateVariablesFromUri(variables, link, ".DownloadUri");
WebResult response = null;
if (Download.Before != null)
await handleRequest(Download.Before, variables, link.ToString());
response = await handleRequest(Download.Before, variables, link.ToString());
if (Download.Method == "post")
method = RequestType.POST;
if (Download.Infohash != null)
{
var hashBlock = Download.Infohash.Hash;
var hashSelector = applyGoTemplateText(hashBlock.Selector, variables);
var titleBlock = Download.Infohash.Title;
var titleSelector = applyGoTemplateText(titleBlock.Selector, variables);
if (Download.Selectors != null)
try
{
var headers = ParseCustomHeaders(Definition.Search?.Headers, variables);
var results = "";
var searchResultParser = new HtmlParser();
if (!Download.Infohash.Before || Download.Before == null || response == null)
{
response = await RequestWithCookiesAsync(link.ToString(), headers: headers);
if (response.IsRedirect)
response = await RequestWithCookiesAsync(response.RedirectingTo, headers: headers);
}
results = response.ContentString;
var searchResultDocument = searchResultParser.ParseDocument(results);
var hashElement = searchResultDocument.QuerySelector(hashSelector);
if (hashElement == null)
{
logger.Debug(
$"CardigannIndexer ({Id}): Hash selector {hashSelector} could not match any elements.");
throw new Exception($"InfoHash selectors didn't match");
}
var hash = string.Empty;
if (hashBlock.Attribute != null)
hash = hashElement.GetAttribute(hashBlock.Attribute);
else
hash = hashElement.TextContent;
hash = applyFilters(hash, hashBlock.Filters, variables);
var titleElement = searchResultDocument.QuerySelector(titleSelector);
if (titleElement == null)
{
logger.Debug(
$"CardigannIndexer ({Id}): Title selector {titleSelector} could not match any elements.");
throw new Exception($"InfoHash selectors didn't match");
}
var title = string.Empty;
if (titleBlock.Attribute != null)
title = titleElement.GetAttribute(titleBlock.Attribute);
else
title = titleElement.TextContent;
title = applyFilters(title, titleBlock.Filters, variables);
var magnet = MagnetUtil.InfoHashToPublicMagnet(hash, title);
var torrentLink = resolvePath(magnet.AbsoluteUri, link);
return await base.Download(torrentLink, method, torrentLink.ToString());
}
catch (Exception e)
{
logger.Error(e,
$"CardigannIndexer ({Id}): An exception occurred while trying infohash block with hashSelector {hashSelector} and titleSelector {titleSelector}"
);
}
}
else if (Download.Selectors != null)
{
var headers = ParseCustomHeaders(Definition.Search?.Headers, variables);
var results = "";
@ -1769,7 +1830,7 @@ namespace Jackett.Common.Indexers
try
{
var response = await RequestWithCookiesAsync(link.ToString(), headers: headers);
response = await RequestWithCookiesAsync(link.ToString(), headers: headers);
if (response.IsRedirect)
response = await RequestWithCookiesAsync(response.RedirectingTo, headers: headers);
results = response.ContentString;

View file

@ -165,11 +165,19 @@ namespace Jackett.Common.Models
public string Queryseparator { get; set; } = "&";
}
public class infohashBlock
{
public downloadsField Hash { get; set; }
public downloadsField Title { get; set; }
public bool Before { get; set; } = false;
}
public class downloadBlock
{
public List<downloadsField> Selectors { get; set; }
public string Method { get; set; }
public requestBlock Before { get; set; }
public infohashBlock Infohash { get; set; }
}
public class downloadsField