From a99093386a510a6209664788581fab0a936e17fb Mon Sep 17 00:00:00 2001 From: Bogdan Date: Sat, 25 Feb 2023 23:11:53 +0200 Subject: [PATCH] cardigann: improve GetLongFromString and parse fields (#14094) --- .../Indexers/CardigannIndexer.cs | 30 ++++--------------- src/Jackett.Common/Utils/ParseUtil.cs | 25 +++++++++++----- .../Common/Utils/ParseUtilTests.cs | 1 + 3 files changed, 25 insertions(+), 31 deletions(-) diff --git a/src/Jackett.Common/Indexers/CardigannIndexer.cs b/src/Jackett.Common/Indexers/CardigannIndexer.cs index e633f8aaf..893d51b2d 100644 --- a/src/Jackett.Common/Indexers/CardigannIndexer.cs +++ b/src/Jackett.Common/Indexers/CardigannIndexer.cs @@ -2068,45 +2068,27 @@ 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); + release.TMDb = ParseUtil.GetLongFromString(value); 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); + release.RageID = ParseUtil.GetLongFromString(value); 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); + release.TVDBId = ParseUtil.GetLongFromString(value); 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); + release.TVMazeId = ParseUtil.GetLongFromString(value); 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); + release.TraktId = ParseUtil.GetLongFromString(value); 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); + release.DoubanId = ParseUtil.GetLongFromString(value); value = release.DoubanId.ToString(); break; case "genre": diff --git a/src/Jackett.Common/Utils/ParseUtil.cs b/src/Jackett.Common/Utils/ParseUtil.cs index d203cc5b4..d7d0df4f5 100644 --- a/src/Jackett.Common/Utils/ParseUtil.cs +++ b/src/Jackett.Common/Utils/ParseUtil.cs @@ -75,14 +75,25 @@ namespace Jackett.Common.Utils public static long? GetLongFromString(string str) { - if (str == null) + if (string.IsNullOrWhiteSpace(str)) return null; - var IdRegEx = new Regex(@"(\d+)", RegexOptions.Compiled); - var IdMatch = IdRegEx.Match(str); - if (!IdMatch.Success) - return null; - var Id = IdMatch.Groups[1].Value; - return CoerceLong(Id); + + var extractedLong = string.Empty; + + foreach (var c in str) + { + if (c < '0' || c > '9') + { + if (extractedLong.Length > 0) + break; + + continue; + } + + extractedLong += c; + } + + return CoerceLong(extractedLong); } public static int? GetImdbID(string imdbstr) diff --git a/src/Jackett.Test/Common/Utils/ParseUtilTests.cs b/src/Jackett.Test/Common/Utils/ParseUtilTests.cs index c00613131..341ab4fee 100644 --- a/src/Jackett.Test/Common/Utils/ParseUtilTests.cs +++ b/src/Jackett.Test/Common/Utils/ParseUtilTests.cs @@ -89,6 +89,7 @@ namespace Jackett.Test.Common.Utils [TestCase("1", 1)] [TestCase("1000 grabs", 1000)] [TestCase("asdf123asdf", 123)] + [TestCase("asdf123asdf456asdf", 123)] public void should_parse_long_from_string(string original, long? parsedInt) { ParseUtil.GetLongFromString(original).Should().Be(parsedInt);