mirror of
https://github.com/Jackett/Jackett
synced 2025-02-25 15:42:48 +00:00
Cardigann: add support for .Result.* variables
This commit is contained in:
parent
4453edd441
commit
f63a0f93e0
1 changed files with 40 additions and 11 deletions
|
@ -767,7 +767,7 @@ namespace Jackett.Indexers
|
||||||
return IndexerConfigurationStatus.Completed;
|
return IndexerConfigurationStatus.Completed;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected string applyFilters(string Data, List<filterBlock> Filters)
|
protected string applyFilters(string Data, List<filterBlock> Filters, Dictionary<string, object> variables = null)
|
||||||
{
|
{
|
||||||
if (Filters == null)
|
if (Filters == null)
|
||||||
return Data;
|
return Data;
|
||||||
|
@ -802,6 +802,7 @@ namespace Jackett.Indexers
|
||||||
case "re_replace":
|
case "re_replace":
|
||||||
var regexpreplace_pattern = (string)Filter.Args[0];
|
var regexpreplace_pattern = (string)Filter.Args[0];
|
||||||
var regexpreplace_replacement = (string)Filter.Args[1];
|
var regexpreplace_replacement = (string)Filter.Args[1];
|
||||||
|
regexpreplace_replacement = applyGoTemplateText(regexpreplace_replacement, variables);
|
||||||
Regex regexpreplace_regex = new Regex(regexpreplace_pattern);
|
Regex regexpreplace_regex = new Regex(regexpreplace_pattern);
|
||||||
Data = regexpreplace_regex.Replace(Data, regexpreplace_replacement);
|
Data = regexpreplace_regex.Replace(Data, regexpreplace_replacement);
|
||||||
break;
|
break;
|
||||||
|
@ -819,6 +820,7 @@ namespace Jackett.Indexers
|
||||||
case "replace":
|
case "replace":
|
||||||
var from = (string)Filter.Args[0];
|
var from = (string)Filter.Args[0];
|
||||||
var to = (string)Filter.Args[1];
|
var to = (string)Filter.Args[1];
|
||||||
|
to = applyGoTemplateText(to, variables);
|
||||||
Data = Data.Replace(from, to);
|
Data = Data.Replace(from, to);
|
||||||
break;
|
break;
|
||||||
case "trim":
|
case "trim":
|
||||||
|
@ -830,15 +832,17 @@ namespace Jackett.Indexers
|
||||||
break;
|
break;
|
||||||
case "prepend":
|
case "prepend":
|
||||||
var prependstr = (string)Filter.Args;
|
var prependstr = (string)Filter.Args;
|
||||||
Data = prependstr + Data;
|
Data = applyGoTemplateText(prependstr, variables) + Data;
|
||||||
break;
|
break;
|
||||||
case "append":
|
case "append":
|
||||||
var str = (string)Filter.Args;
|
var str = (string)Filter.Args;
|
||||||
Data += str;
|
Data += applyGoTemplateText(str, variables);
|
||||||
break;
|
break;
|
||||||
case "timeago":
|
case "timeago":
|
||||||
case "fuzzytime":
|
|
||||||
case "reltime":
|
case "reltime":
|
||||||
|
Data = DateTimeUtil.FromTimeAgo(Data).ToString(DateTimeUtil.RFC1123ZPattern);
|
||||||
|
break;
|
||||||
|
case "fuzzytime":
|
||||||
var timestr = (string)Filter.Args;
|
var timestr = (string)Filter.Args;
|
||||||
Data = DateTimeUtil.FromUnknown(timestr).ToString(DateTimeUtil.RFC1123ZPattern);
|
Data = DateTimeUtil.FromUnknown(timestr).ToString(DateTimeUtil.RFC1123ZPattern);
|
||||||
break;
|
break;
|
||||||
|
@ -873,11 +877,11 @@ namespace Jackett.Indexers
|
||||||
return Element.QuerySelector(Selector);
|
return Element.QuerySelector(Selector);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected string handleSelector(selectorBlock Selector, IElement Dom)
|
protected string handleSelector(selectorBlock Selector, IElement Dom, Dictionary<string, object> variables = null)
|
||||||
{
|
{
|
||||||
if (Selector.Text != null)
|
if (Selector.Text != null)
|
||||||
{
|
{
|
||||||
return applyFilters(Selector.Text, Selector.Filters);
|
return applyFilters(Selector.Text, Selector.Filters, variables);
|
||||||
}
|
}
|
||||||
|
|
||||||
IElement selection = Dom;
|
IElement selection = Dom;
|
||||||
|
@ -924,7 +928,7 @@ namespace Jackett.Indexers
|
||||||
value = selection.TextContent;
|
value = selection.TextContent;
|
||||||
}
|
}
|
||||||
|
|
||||||
return applyFilters(ParseUtil.NormalizeSpace(value), Selector.Filters);
|
return applyFilters(ParseUtil.NormalizeSpace(value), Selector.Filters, variables);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Uri resolvePath(string path)
|
protected Uri resolvePath(string path)
|
||||||
|
@ -1083,9 +1087,10 @@ namespace Jackett.Indexers
|
||||||
FieldModifiers.Add(FieldParts[i]);
|
FieldModifiers.Add(FieldParts[i]);
|
||||||
|
|
||||||
string value = null;
|
string value = null;
|
||||||
|
var variablesKey = ".Result." + FieldName;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
value = handleSelector(Field.Value, Row);
|
value = handleSelector(Field.Value, Row, variables);
|
||||||
switch (FieldName)
|
switch (FieldName)
|
||||||
{
|
{
|
||||||
case "download":
|
case "download":
|
||||||
|
@ -1098,6 +1103,7 @@ namespace Jackett.Indexers
|
||||||
{
|
{
|
||||||
release.Link = resolvePath(value);
|
release.Link = resolvePath(value);
|
||||||
}
|
}
|
||||||
|
value = release.Link.ToString();
|
||||||
break;
|
break;
|
||||||
case "details":
|
case "details":
|
||||||
var url = resolvePath(value);
|
var url = resolvePath(value);
|
||||||
|
@ -1105,6 +1111,7 @@ namespace Jackett.Indexers
|
||||||
release.Comments = url;
|
release.Comments = url;
|
||||||
if (release.Guid == null)
|
if (release.Guid == null)
|
||||||
release.Guid = url;
|
release.Guid = url;
|
||||||
|
value = url.ToString();
|
||||||
break;
|
break;
|
||||||
case "comments":
|
case "comments":
|
||||||
var CommentsUrl = resolvePath(value);
|
var CommentsUrl = resolvePath(value);
|
||||||
|
@ -1112,30 +1119,37 @@ namespace Jackett.Indexers
|
||||||
release.Comments = CommentsUrl;
|
release.Comments = CommentsUrl;
|
||||||
if (release.Guid == null)
|
if (release.Guid == null)
|
||||||
release.Guid = CommentsUrl;
|
release.Guid = CommentsUrl;
|
||||||
|
value = CommentsUrl.ToString();
|
||||||
break;
|
break;
|
||||||
case "title":
|
case "title":
|
||||||
if (FieldModifiers.Contains("append"))
|
if (FieldModifiers.Contains("append"))
|
||||||
release.Title += value;
|
release.Title += value;
|
||||||
else
|
else
|
||||||
release.Title = value;
|
release.Title = value;
|
||||||
|
value = release.Title;
|
||||||
break;
|
break;
|
||||||
case "description":
|
case "description":
|
||||||
if (FieldModifiers.Contains("append"))
|
if (FieldModifiers.Contains("append"))
|
||||||
release.Description += value;
|
release.Description += value;
|
||||||
else
|
else
|
||||||
release.Description = value;
|
release.Description = value;
|
||||||
|
value = release.Description;
|
||||||
break;
|
break;
|
||||||
case "category":
|
case "category":
|
||||||
release.Category = MapTrackerCatToNewznab(value);
|
release.Category = MapTrackerCatToNewznab(value);
|
||||||
|
value = release.Category.ToString();
|
||||||
break;
|
break;
|
||||||
case "size":
|
case "size":
|
||||||
release.Size = ReleaseInfo.GetBytes(value);
|
release.Size = ReleaseInfo.GetBytes(value);
|
||||||
|
value = release.Size.ToString();
|
||||||
break;
|
break;
|
||||||
case "leechers":
|
case "leechers":
|
||||||
|
var Leechers = ParseUtil.CoerceInt(value);
|
||||||
if (release.Peers == null)
|
if (release.Peers == null)
|
||||||
release.Peers = ParseUtil.CoerceInt(value);
|
release.Peers = Leechers;
|
||||||
else
|
else
|
||||||
release.Peers += ParseUtil.CoerceInt(value);
|
release.Peers += Leechers;
|
||||||
|
value = Leechers.ToString();
|
||||||
break;
|
break;
|
||||||
case "seeders":
|
case "seeders":
|
||||||
release.Seeders = ParseUtil.CoerceInt(value);
|
release.Seeders = ParseUtil.CoerceInt(value);
|
||||||
|
@ -1143,55 +1157,70 @@ namespace Jackett.Indexers
|
||||||
release.Peers = release.Seeders;
|
release.Peers = release.Seeders;
|
||||||
else
|
else
|
||||||
release.Peers += release.Seeders;
|
release.Peers += release.Seeders;
|
||||||
|
value = release.Seeders.ToString();
|
||||||
break;
|
break;
|
||||||
case "date":
|
case "date":
|
||||||
release.PublishDate = DateTimeUtil.FromUnknown(value);
|
release.PublishDate = DateTimeUtil.FromUnknown(value);
|
||||||
|
value = release.PublishDate.ToString(DateTimeUtil.RFC1123ZPattern);
|
||||||
break;
|
break;
|
||||||
case "files":
|
case "files":
|
||||||
release.Files = ParseUtil.CoerceLong(value);
|
release.Files = ParseUtil.CoerceLong(value);
|
||||||
|
value = release.Files.ToString();
|
||||||
break;
|
break;
|
||||||
case "grabs":
|
case "grabs":
|
||||||
release.Grabs = ParseUtil.CoerceLong(value);
|
release.Grabs = ParseUtil.CoerceLong(value);
|
||||||
|
value = release.Grabs.ToString();
|
||||||
break;
|
break;
|
||||||
case "downloadvolumefactor":
|
case "downloadvolumefactor":
|
||||||
release.DownloadVolumeFactor = ParseUtil.CoerceDouble(value);
|
release.DownloadVolumeFactor = ParseUtil.CoerceDouble(value);
|
||||||
|
value = release.DownloadVolumeFactor.ToString();
|
||||||
break;
|
break;
|
||||||
case "uploadvolumefactor":
|
case "uploadvolumefactor":
|
||||||
release.UploadVolumeFactor = ParseUtil.CoerceDouble(value);
|
release.UploadVolumeFactor = ParseUtil.CoerceDouble(value);
|
||||||
|
value = release.UploadVolumeFactor.ToString();
|
||||||
break;
|
break;
|
||||||
case "minimumratio":
|
case "minimumratio":
|
||||||
release.MinimumRatio = ParseUtil.CoerceDouble(value);
|
release.MinimumRatio = ParseUtil.CoerceDouble(value);
|
||||||
|
value = release.MinimumRatio.ToString();
|
||||||
break;
|
break;
|
||||||
case "minimumseedtime":
|
case "minimumseedtime":
|
||||||
release.MinimumSeedTime = ParseUtil.CoerceLong(value);
|
release.MinimumSeedTime = ParseUtil.CoerceLong(value);
|
||||||
|
value = release.MinimumSeedTime.ToString();
|
||||||
break;
|
break;
|
||||||
case "imdb":
|
case "imdb":
|
||||||
release.Imdb = ParseUtil.GetLongFromString(value);
|
release.Imdb = ParseUtil.GetLongFromString(value);
|
||||||
|
value = release.Imdb.ToString();
|
||||||
break;
|
break;
|
||||||
case "rageid":
|
case "rageid":
|
||||||
Regex RageIDRegEx = new Regex(@"(\d+)", RegexOptions.Compiled);
|
Regex RageIDRegEx = new Regex(@"(\d+)", RegexOptions.Compiled);
|
||||||
var RageIDMatch = RageIDRegEx.Match(value);
|
var RageIDMatch = RageIDRegEx.Match(value);
|
||||||
var RageID = RageIDMatch.Groups[1].Value;
|
var RageID = RageIDMatch.Groups[1].Value;
|
||||||
release.RageID = ParseUtil.CoerceLong(RageID);
|
release.RageID = ParseUtil.CoerceLong(RageID);
|
||||||
|
value = release.RageID.ToString();
|
||||||
break;
|
break;
|
||||||
case "tvdbid":
|
case "tvdbid":
|
||||||
Regex TVDBIdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled);
|
Regex TVDBIdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled);
|
||||||
var TVDBIdMatch = TVDBIdRegEx.Match(value);
|
var TVDBIdMatch = TVDBIdRegEx.Match(value);
|
||||||
var TVDBId = TVDBIdMatch.Groups[1].Value;
|
var TVDBId = TVDBIdMatch.Groups[1].Value;
|
||||||
release.TVDBId = ParseUtil.CoerceLong(TVDBId);
|
release.TVDBId = ParseUtil.CoerceLong(TVDBId);
|
||||||
|
value = release.TVDBId.ToString();
|
||||||
break;
|
break;
|
||||||
case "banner":
|
case "banner":
|
||||||
if(!string.IsNullOrWhiteSpace(value)) {
|
if(!string.IsNullOrWhiteSpace(value)) {
|
||||||
var bannerurl = resolvePath(value);
|
var bannerurl = resolvePath(value);
|
||||||
release.BannerUrl = bannerurl;
|
release.BannerUrl = bannerurl;
|
||||||
}
|
}
|
||||||
|
value = release.BannerUrl.ToString();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
variables[variablesKey] = value;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
if (!variables.ContainsKey(variablesKey))
|
||||||
|
variables[variablesKey] = null;
|
||||||
if (OptionalFileds.Contains(Field.Key) || FieldModifiers.Contains("optional"))
|
if (OptionalFileds.Contains(Field.Key) || FieldModifiers.Contains("optional"))
|
||||||
continue;
|
continue;
|
||||||
throw new Exception(string.Format("Error while parsing field={0}, selector={1}, value={2}: {3}", Field.Key, Field.Value.Selector, (value == null ? "<null>" : value), ex.Message));
|
throw new Exception(string.Format("Error while parsing field={0}, selector={1}, value={2}: {3}", Field.Key, Field.Value.Selector, (value == null ? "<null>" : value), ex.Message));
|
||||||
|
|
Loading…
Reference in a new issue