common: simplify normalizing IMDb Id and add tests

This commit is contained in:
Bogdan
2023-05-21 12:09:32 +03:00
parent e29f409164
commit c6f4a55444
17 changed files with 53 additions and 27 deletions

View File

@@ -209,7 +209,7 @@ namespace Jackett.Common.Indexers.Abstract
var jMovieTv = row.Value<JToken>("movie_tv");
if (jMovieTv != null && jMovieTv.HasValues)
{
imdb = ParseUtil.GetImdbID(jMovieTv.Value<string>("imdb"));
imdb = ParseUtil.GetImdbId(jMovieTv.Value<string>("imdb"));
if (long.TryParse(jMovieTv.Value<string>("tvdb"), out var tvdbParsed))
tvdb = tvdbParsed;
if (long.TryParse(jMovieTv.Value<string>("tmdb"), out var tmdbParsed))

View File

@@ -98,7 +98,7 @@ namespace Jackett.Common.Indexers.Abstract
Link = new Uri((string)r["download_url"])
};
release.Guid = release.Link;
release.Imdb = ParseUtil.GetImdbID((string)r["imdb_id"]);
release.Imdb = ParseUtil.GetImdbId((string)r["imdb_id"]);
var freeleech = (bool)r["freeleech"];
if (freeleech)
release.DownloadVolumeFactor = 0;

View File

@@ -270,7 +270,7 @@ namespace Jackett.Common.Indexers.Abstract
if (imdbInTags)
release.Imdb = tags
.Select(tag => ParseUtil.GetImdbID((string)tag))
.Select(tag => ParseUtil.GetImdbId((string)tag))
.Where(tag => tag != null).FirstIfSingleOrDefault();
if (r["torrents"] is JArray)

View File

@@ -124,7 +124,7 @@ namespace Jackett.Common.Indexers
else if (query.IsMovieSearch)
postData.Add(BHDParams.categories, "Movies");
var imdbId = ParseUtil.GetImdbID(query.ImdbID);
var imdbId = ParseUtil.GetImdbId(query.ImdbID);
if (imdbId != null)
postData.Add(BHDParams.imdb_id, imdbId.ToString());
if (query.IsTmdbQuery)
@@ -158,7 +158,7 @@ namespace Jackett.Common.Indexers
};
if (!string.IsNullOrEmpty(bhdResult.imdb_id))
releaseInfo.Imdb = ParseUtil.GetImdbID(bhdResult.imdb_id);
releaseInfo.Imdb = ParseUtil.GetImdbId(bhdResult.imdb_id);
releaseInfo.DownloadVolumeFactor = 1;
releaseInfo.UploadVolumeFactor = 1;

View File

@@ -161,7 +161,7 @@ namespace Jackett.Common.Indexers
descriptions.Add("Origin: " + btnResult.Origin);
if (!string.IsNullOrWhiteSpace(btnResult.Series))
descriptions.Add("Youtube Trailer: <a href=\"" + btnResult.YoutubeTrailer + "\">" + btnResult.YoutubeTrailer + "</a>");
var imdb = ParseUtil.GetImdbID(btnResult.ImdbID);
var imdb = ParseUtil.GetImdbId(btnResult.ImdbID);
var link = new Uri(btnResult.DownloadURL);
var details = new Uri($"{SiteLink}torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}");
var publishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time);

View File

@@ -158,7 +158,7 @@ namespace Jackett.Common.Indexers
var publishDate = DateTime.Parse(row.Value<string>("upload_date") + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
var downloadVolumeFactor = isFreeleech ? 0 : 1;
var uploadVolumeFactor = row.Value<bool>("doubleup") ? 2 : 1;
var imdbId = ((JObject)row).ContainsKey("imdb") ? ParseUtil.GetImdbID(row.Value<string>("imdb")) : null;
var imdbId = ((JObject)row).ContainsKey("imdb") ? ParseUtil.GetImdbId(row.Value<string>("imdb")) : null;
var link = new Uri(row.Value<string>("download_link"));
var release = new ReleaseInfo

View File

@@ -155,7 +155,7 @@ namespace Jackett.Common.Indexers
var imdbID = (string)result["imdbId"];
if (!string.IsNullOrEmpty(imdbID))
release.Imdb = ParseUtil.GetImdbID(imdbID);
release.Imdb = ParseUtil.GetImdbId(imdbID);
release.MinimumRatio = 1;
release.MinimumSeedTime = 172800; // 48 hours

View File

@@ -97,7 +97,7 @@ namespace Jackett.Common.Indexers
{
var requestData = new JObject();
var queryString = query.GetQueryString();
var imdbId = ParseUtil.GetImdbID(query.ImdbID);
var imdbId = ParseUtil.GetImdbId(query.ImdbID);
if (imdbId != null)
requestData["imdb"] = new JObject
@@ -175,7 +175,7 @@ namespace Jackett.Common.Indexers
};
if (r.ContainsKey("imdb"))
release.Imdb = ParseUtil.GetImdbID((string)r["imdb"]["id"]);
release.Imdb = ParseUtil.GetImdbId((string)r["imdb"]["id"]);
if (r.ContainsKey("tvdb"))
release.TVDBId = (long)r["tvdb"]["id"];

View File

@@ -195,7 +195,7 @@ namespace Jackett.Common.Indexers
var imdbLink = row.Children[1].QuerySelector("a[href*=imdb]");
if (imdbLink != null)
release.Imdb = ParseUtil.GetImdbID(imdbLink.GetAttribute("href").Split('/').Last());
release.Imdb = ParseUtil.GetImdbId(imdbLink.GetAttribute("href").Split('/').Last());
var dateStr = row.Children[4].TextContent.Trim();
//"July 11, 2015, 13:34:09", "Today|Yesterday at 20:04:23"

View File

@@ -237,7 +237,7 @@ namespace Jackett.Common.Indexers
var episodeInfo = item.Value<JToken>("episode_info");
if (episodeInfo.HasValues)
{
release.Imdb = ParseUtil.GetImdbID(episodeInfo.Value<string>("imdb"));
release.Imdb = ParseUtil.GetImdbId(episodeInfo.Value<string>("imdb"));
release.TVDBId = episodeInfo.Value<long?>("tvdb");
release.RageID = episodeInfo.Value<long?>("tvrage");
release.TMDb = episodeInfo.Value<long?>("themoviedb");

View File

@@ -190,7 +190,7 @@ namespace Jackett.Common.Indexers
var category = row.QuerySelector(".br_type > a").GetAttribute("href").Replace("browse.php?cat=", string.Empty);
var qImdb = row.QuerySelector("a[href*=\"www.imdb.com/\"]");
var imdb = qImdb != null ? ParseUtil.GetImdbID(qImdb.GetAttribute("href").Split('/').Last()) : null;
var imdb = qImdb != null ? ParseUtil.GetImdbId(qImdb.GetAttribute("href").Split('/').Last()) : null;
var release = new ReleaseInfo
{

View File

@@ -149,7 +149,7 @@ namespace Jackett.Common.Indexers
Files = item.Value<long>("numfiles"),
Seeders = item.Value<int>("seeders"),
Peers = item.Value<int>("leechers") + item.Value<int>("seeders"),
Imdb = ParseUtil.GetImdbID(item.Value<string>("imdbid")),
Imdb = ParseUtil.GetImdbId(item.Value<string>("imdbid")),
MinimumRatio = 1,
MinimumSeedTime = 0,
DownloadVolumeFactor = dlVolumeFactor,

View File

@@ -230,7 +230,7 @@ namespace Jackett.Common.Indexers
var downloadMultiplier = (double?)row["download-multiplier"] ?? 1;
var link = new Uri(SiteLink + "download.php/" + torrentId + "/" + torrentId + ".torrent");
var publishDate = DateTimeUtil.UnixTimestampToDateTime((long)row.ctime).ToLocalTime();
var imdb = ParseUtil.GetImdbID(imdbId);
var imdb = ParseUtil.GetImdbId(imdbId);
var release = new ReleaseInfo
{

View File

@@ -54,7 +54,7 @@ namespace Jackett.Common.Models.DTO
// try to build an IMDB Query (tt plus 6 to 8 digits)
if (stringQuery.SanitizedSearchTerm.StartsWith("tt") && stringQuery.SanitizedSearchTerm.Length <= 10)
{
var imdbId = ParseUtil.GetFullImdbID(stringQuery.SanitizedSearchTerm);
var imdbId = ParseUtil.GetFullImdbId(stringQuery.SanitizedSearchTerm);
if (imdbId != null)
{
return new TorznabQuery

View File

@@ -11,7 +11,7 @@ namespace Jackett.Common.Utils
new Regex(
@"(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]",
RegexOptions.Compiled);
private static readonly Regex ImdbId = new Regex(@"^(?:tt)?(\d{1,8})$", RegexOptions.Compiled);
private static readonly Regex ImdbIdRegex = new Regex(@"^(?:tt)?(\d{1,8})$", RegexOptions.Compiled);
public static string NormalizeSpace(string s) => s?.Trim() ?? string.Empty;
@@ -96,24 +96,33 @@ namespace Jackett.Common.Utils
return CoerceLong(extractedLong);
}
public static int? GetImdbID(string imdbstr)
public static int? GetImdbId(string value)
{
if (imdbstr == null)
if (value == null)
{
return null;
var match = ImdbId.Match(imdbstr);
}
var match = ImdbIdRegex.Match(value);
if (!match.Success)
{
return null;
}
return int.Parse(match.Groups[1].Value, NumberStyles.Any, CultureInfo.InvariantCulture);
}
public static string GetFullImdbID(string imdbstr)
public static string GetFullImdbId(string value)
{
var imdbid = GetImdbID(imdbstr);
if (imdbid == null)
var imdbId = GetImdbId(value);
if (imdbId == null || imdbId == 0)
{
return null;
var imdbLen = ((int)imdbid > 9999999) ? "D8" : "D7";
return "tt" + ((int)imdbid).ToString(imdbLen);
}
return $"tt{imdbId.GetValueOrDefault():D7}";
}
// ex: " 3.5 gb " -> "3758096384" , "3,5GB" -> "3758096384" , "296,98 MB" -> "311406100.48" , "1.018,29 MB" -> "1067754455.04"

View File

@@ -365,7 +365,7 @@ namespace Jackett.Server.Controllers
}
*/
CurrentQuery.ImdbID = ParseUtil.GetFullImdbID(CurrentQuery.ImdbID); // normalize ImdbID
CurrentQuery.ImdbID = ParseUtil.GetFullImdbId(CurrentQuery.ImdbID); // normalize ImdbID
if (CurrentQuery.ImdbID == null)
{
logger.Warn($"A search request from {Request.HttpContext.Connection.RemoteIpAddress} was made with an invalid imdbid.");
@@ -554,7 +554,7 @@ namespace Jackett.Server.Controllers
torrent_id = release.Guid.AbsoluteUri, // GUID and (Link or Magnet) are mandatory
details_url = release.Details?.AbsoluteUri,
download_url = (release.Link != null ? release.Link.AbsoluteUri : release.MagnetUri.AbsoluteUri),
imdb_id = release.Imdb.HasValue ? ParseUtil.GetFullImdbID("tt" + release.Imdb) : null,
imdb_id = release.Imdb.HasValue ? ParseUtil.GetFullImdbId("tt" + release.Imdb) : null,
freeleech = (release.DownloadVolumeFactor == 0 ? true : false),
type = "movie",
size = (long)release.Size / (1024 * 1024), // This is in MB

View File

@@ -94,5 +94,22 @@ namespace Jackett.Test.Common.Utils
{
ParseUtil.GetLongFromString(original).Should().Be(parsedInt);
}
[TestCase("tt0183790", "tt0183790")]
[TestCase("0183790", "tt0183790")]
[TestCase("183790", "tt0183790")]
[TestCase("tt10001870", "tt10001870")]
[TestCase("10001870", "tt10001870")]
[TestCase("tt", null)]
[TestCase("tt0", null)]
[TestCase("abc", null)]
[TestCase("abc0", null)]
[TestCase("0", null)]
[TestCase("", null)]
[TestCase(null, null)]
public void should_parse_full_imdb_id_from_string(string input, string expected)
{
ParseUtil.GetFullImdbId(input).Should().Be(expected);
}
}
}