From b751db6936b52ff57b3b78ab2d37215e3991f457 Mon Sep 17 00:00:00 2001 From: Bogdan Date: Wed, 22 Feb 2023 22:44:16 +0200 Subject: [PATCH] cardigann: minor improvements (#14070) --- .../Indexers/CardigannIndexer.cs | 83 +++++++++---------- src/Jackett.Common/Utils/ParseUtil.cs | 38 +++++++-- 2 files changed, 71 insertions(+), 50 deletions(-) diff --git a/src/Jackett.Common/Indexers/CardigannIndexer.cs b/src/Jackett.Common/Indexers/CardigannIndexer.cs index d2dd0e55a..fba4f6490 100644 --- a/src/Jackett.Common/Indexers/CardigannIndexer.cs +++ b/src/Jackett.Common/Indexers/CardigannIndexer.cs @@ -304,10 +304,10 @@ namespace Jackett.Common.Indexers protected delegate string TemplateTextModifier(string str); protected string applyGoTemplateText(string template, Dictionary variables = null, TemplateTextModifier modifier = null) { - if (variables == null) - { - variables = GetBaseTemplateVariables(); - } + if (string.IsNullOrWhiteSpace(template) || !template.Contains("{{")) + return template; + + variables ??= GetBaseTemplateVariables(); // handle re_replace expression // Example: {{ re_replace .Query.Keywords "[^a-zA-Z0-9]+" "%" }} @@ -495,21 +495,20 @@ namespace Jackett.Common.Indexers } // handle simple variables - var VariablesRegEx = new Regex(@"{{\s*(\..+?)\s*}}"); - var VariablesRegExMatches = VariablesRegEx.Match(template); + var variablesRegex = new Regex(@"{{\s*(\..+?)\s*}}"); + var variablesRegexMatches = variablesRegex.Match(template); - while (VariablesRegExMatches.Success) + while (variablesRegexMatches.Success) { - var expanded = string.Empty; - - var all = VariablesRegExMatches.Groups[0].Value; - var variable = VariablesRegExMatches.Groups[1].Value; + var all = variablesRegexMatches.Groups[0].Value; + var variable = variablesRegexMatches.Groups[1].Value; var value = (string)variables[variable]; if (modifier != null) value = modifier(value); + template = template.Replace(all, value); - VariablesRegExMatches = VariablesRegExMatches.NextMatch(); + variablesRegexMatches = variablesRegexMatches.NextMatch(); } return template; @@ -2014,7 +2013,7 @@ namespace Jackett.Common.Indexers value = release.Size.ToString(); break; case "leechers": - var leechers = ReleaseInfo.GetBytes(value); + var leechers = ParseUtil.CoerceLong(value); leechers = leechers < 5000000L ? leechers : 0; // to fix #6558 if (release.Peers == null) release.Peers = leechers; @@ -2023,7 +2022,7 @@ namespace Jackett.Common.Indexers value = leechers.ToString(); break; case "seeders": - release.Seeders = ReleaseInfo.GetBytes(value); + release.Seeders = ParseUtil.CoerceLong(value); release.Seeders = release.Seeders < 5000000L ? release.Seeders : 0; // to fix #6558 if (release.Peers == null) release.Peers = release.Seeders; @@ -2036,11 +2035,11 @@ namespace Jackett.Common.Indexers value = release.PublishDate.ToString(DateTimeUtil.Rfc1123ZPattern); break; case "files": - release.Files = ReleaseInfo.GetBytes(value); + release.Files = ParseUtil.CoerceLong(value); value = release.Files.ToString(); break; case "grabs": - release.Grabs = ReleaseInfo.GetBytes(value); + release.Grabs = ParseUtil.CoerceLong(value); value = release.Grabs.ToString(); break; case "downloadvolumefactor": @@ -2065,58 +2064,58 @@ namespace Jackett.Common.Indexers value = release.Imdb.ToString(); break; case "tmdbid": - var TmdbIDRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); - var TmdbIDMatch = TmdbIDRegEx.Match(value); - var TmdbID = TmdbIDMatch.Groups[1].Value; - release.TMDb = ParseUtil.CoerceLong(TmdbID); + var tmdbIdRegex = new Regex(@"(\d+)", RegexOptions.Compiled); + var tmdbIdMatch = tmdbIdRegex.Match(value); + var tmdbId = tmdbIdMatch.Groups[1].Value; + release.TMDb = ParseUtil.CoerceLong(tmdbId); value = release.TMDb.ToString(); break; case "rageid": - var RageIDRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); - var RageIDMatch = RageIDRegEx.Match(value); - var RageID = RageIDMatch.Groups[1].Value; - release.RageID = ParseUtil.CoerceLong(RageID); + var rageIdRegex = new Regex(@"(\d+)", RegexOptions.Compiled); + var rageIdMatch = rageIdRegex.Match(value); + var rageId = rageIdMatch.Groups[1].Value; + release.RageID = ParseUtil.CoerceLong(rageId); value = release.RageID.ToString(); break; case "tvdbid": - var TVDBIdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); - var TVDBIdMatch = TVDBIdRegEx.Match(value); - var TVDBId = TVDBIdMatch.Groups[1].Value; - release.TVDBId = ParseUtil.CoerceLong(TVDBId); + var tvdbIdRegex = new Regex(@"(\d+)", RegexOptions.Compiled); + var tvdbIdMatch = tvdbIdRegex.Match(value); + var tvdbId = tvdbIdMatch.Groups[1].Value; + release.TVDBId = ParseUtil.CoerceLong(tvdbId); value = release.TVDBId.ToString(); break; case "tvmazeid": - var TVMazeIdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); - var TVMazeIdMatch = TVMazeIdRegEx.Match(value); - var TVMazeId = TVMazeIdMatch.Groups[1].Value; - release.TVMazeId = ParseUtil.CoerceLong(TVMazeId); + var tvMazeIdRegex = new Regex(@"(\d+)", RegexOptions.Compiled); + var tvMazeIdMatch = tvMazeIdRegex.Match(value); + var tvMazeId = tvMazeIdMatch.Groups[1].Value; + release.TVMazeId = ParseUtil.CoerceLong(tvMazeId); value = release.TVMazeId.ToString(); break; case "traktid": - var TraktIdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); - var TraktIdMatch = TraktIdRegEx.Match(value); - var TraktId = TraktIdMatch.Groups[1].Value; - release.TraktId = ParseUtil.CoerceLong(TraktId); + var traktIdRegex = new Regex(@"(\d+)", RegexOptions.Compiled); + var traktIdMatch = traktIdRegex.Match(value); + var traktId = traktIdMatch.Groups[1].Value; + release.TraktId = ParseUtil.CoerceLong(traktId); value = release.TraktId.ToString(); break; case "doubanid": - var DoubanIDRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); - var DoubanIDMatch = DoubanIDRegEx.Match(value); - var DoubanID = DoubanIDMatch.Groups[1].Value; - release.DoubanId = ParseUtil.CoerceLong(DoubanID); + var doubanIdRegex = new Regex(@"(\d+)", RegexOptions.Compiled); + var doubanIdMatch = doubanIdRegex.Match(value); + var doubanId = doubanIdMatch.Groups[1].Value; + release.DoubanId = ParseUtil.CoerceLong(doubanId); value = release.DoubanId.ToString(); break; case "genre": if (release.Genres == null) release.Genres = new List(); char[] delimiters = { ',', ' ', '/', ')', '(', '.', ';', '[', ']', '"', '|', ':' }; - var releaseGenres = release.Genres.Union(value.Split(delimiters, System.StringSplitOptions.RemoveEmptyEntries)); + var releaseGenres = release.Genres.Union(value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries)); releaseGenres = releaseGenres.Select(x => x.Replace("_", " ")); release.Genres = releaseGenres.ToList(); value = string.Join(",", release.Genres); break; case "year": - release.Year = ReleaseInfo.GetBytes(value); + release.Year = ParseUtil.CoerceLong(value); value = release.Year.ToString(); break; case "author": diff --git a/src/Jackett.Common/Utils/ParseUtil.cs b/src/Jackett.Common/Utils/ParseUtil.cs index 4ee5445f4..3899964ba 100644 --- a/src/Jackett.Common/Utils/ParseUtil.cs +++ b/src/Jackett.Common/Utils/ParseUtil.cs @@ -18,10 +18,32 @@ namespace Jackett.Common.Utils public static string NormalizeMultiSpaces(string s) => new Regex(@"\s+").Replace(NormalizeSpace(s), " "); - public static string NormalizeNumber(string s) => - NormalizeSpace(s) - .Replace("-", "0") - .Replace(",", ""); + private static string NormalizeNumber(string s, bool isInt = false) + { + var valStr = new string(s.Where(c => char.IsDigit(c) || c == '.' || c == ',').ToArray()); + + valStr = valStr.Trim().Replace("-", "0"); + + if (isInt) + { + if (valStr.Contains(',') && valStr.Contains('.')) + return valStr; + + valStr = valStr.Length == 0 ? "0" : valStr.Replace(".", ","); + + return valStr; + } + + valStr = valStr.Length == 0 ? "0" : valStr.Replace(",", "."); + + if (valStr.Count(c => c == '.') > 1) + { + var lastOcc = valStr.LastIndexOf('.'); + valStr = valStr.Substring(0, lastOcc).Replace(".", string.Empty) + valStr.Substring(lastOcc); + } + + return valStr; + } public static string RemoveInvalidXmlChars(string text) => string.IsNullOrEmpty(text) ? "" : InvalidXmlChars.Replace(text, ""); @@ -29,17 +51,17 @@ namespace Jackett.Common.Utils public static float CoerceFloat(string str) => float.Parse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture); - public static int CoerceInt(string str) => int.Parse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture); + public static int CoerceInt(string str) => int.Parse(NormalizeNumber(str, true), NumberStyles.Any, CultureInfo.InvariantCulture); - public static long CoerceLong(string str) => long.Parse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture); + public static long CoerceLong(string str) => long.Parse(NormalizeNumber(str, true), NumberStyles.Any, CultureInfo.InvariantCulture); public static bool TryCoerceDouble(string str, out double result) => double.TryParse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture, out result); public static bool TryCoerceFloat(string str, out float result) => float.TryParse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture, out result); - public static bool TryCoerceInt(string str, out int result) => int.TryParse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture, out result); + public static bool TryCoerceInt(string str, out int result) => int.TryParse(NormalizeNumber(str, true), NumberStyles.Any, CultureInfo.InvariantCulture, out result); - public static bool TryCoerceLong(string str, out long result) => long.TryParse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture, out result); + public static bool TryCoerceLong(string str, out long result) => long.TryParse(NormalizeNumber(str, true), NumberStyles.Any, CultureInfo.InvariantCulture, out result); public static string GetArgumentFromQueryString(string url, string argument) {