mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 17:34:09 +02:00
common: simplify normalizing IMDb Id and add tests
This commit is contained in:
@@ -209,7 +209,7 @@ namespace Jackett.Common.Indexers.Abstract
|
|||||||
var jMovieTv = row.Value<JToken>("movie_tv");
|
var jMovieTv = row.Value<JToken>("movie_tv");
|
||||||
if (jMovieTv != null && jMovieTv.HasValues)
|
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))
|
if (long.TryParse(jMovieTv.Value<string>("tvdb"), out var tvdbParsed))
|
||||||
tvdb = tvdbParsed;
|
tvdb = tvdbParsed;
|
||||||
if (long.TryParse(jMovieTv.Value<string>("tmdb"), out var tmdbParsed))
|
if (long.TryParse(jMovieTv.Value<string>("tmdb"), out var tmdbParsed))
|
||||||
|
@@ -98,7 +98,7 @@ namespace Jackett.Common.Indexers.Abstract
|
|||||||
Link = new Uri((string)r["download_url"])
|
Link = new Uri((string)r["download_url"])
|
||||||
};
|
};
|
||||||
release.Guid = release.Link;
|
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"];
|
var freeleech = (bool)r["freeleech"];
|
||||||
if (freeleech)
|
if (freeleech)
|
||||||
release.DownloadVolumeFactor = 0;
|
release.DownloadVolumeFactor = 0;
|
||||||
|
@@ -270,7 +270,7 @@ namespace Jackett.Common.Indexers.Abstract
|
|||||||
|
|
||||||
if (imdbInTags)
|
if (imdbInTags)
|
||||||
release.Imdb = tags
|
release.Imdb = tags
|
||||||
.Select(tag => ParseUtil.GetImdbID((string)tag))
|
.Select(tag => ParseUtil.GetImdbId((string)tag))
|
||||||
.Where(tag => tag != null).FirstIfSingleOrDefault();
|
.Where(tag => tag != null).FirstIfSingleOrDefault();
|
||||||
|
|
||||||
if (r["torrents"] is JArray)
|
if (r["torrents"] is JArray)
|
||||||
|
@@ -124,7 +124,7 @@ namespace Jackett.Common.Indexers
|
|||||||
else if (query.IsMovieSearch)
|
else if (query.IsMovieSearch)
|
||||||
postData.Add(BHDParams.categories, "Movies");
|
postData.Add(BHDParams.categories, "Movies");
|
||||||
|
|
||||||
var imdbId = ParseUtil.GetImdbID(query.ImdbID);
|
var imdbId = ParseUtil.GetImdbId(query.ImdbID);
|
||||||
if (imdbId != null)
|
if (imdbId != null)
|
||||||
postData.Add(BHDParams.imdb_id, imdbId.ToString());
|
postData.Add(BHDParams.imdb_id, imdbId.ToString());
|
||||||
if (query.IsTmdbQuery)
|
if (query.IsTmdbQuery)
|
||||||
@@ -158,7 +158,7 @@ namespace Jackett.Common.Indexers
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(bhdResult.imdb_id))
|
if (!string.IsNullOrEmpty(bhdResult.imdb_id))
|
||||||
releaseInfo.Imdb = ParseUtil.GetImdbID(bhdResult.imdb_id);
|
releaseInfo.Imdb = ParseUtil.GetImdbId(bhdResult.imdb_id);
|
||||||
|
|
||||||
releaseInfo.DownloadVolumeFactor = 1;
|
releaseInfo.DownloadVolumeFactor = 1;
|
||||||
releaseInfo.UploadVolumeFactor = 1;
|
releaseInfo.UploadVolumeFactor = 1;
|
||||||
|
@@ -161,7 +161,7 @@ namespace Jackett.Common.Indexers
|
|||||||
descriptions.Add("Origin: " + btnResult.Origin);
|
descriptions.Add("Origin: " + btnResult.Origin);
|
||||||
if (!string.IsNullOrWhiteSpace(btnResult.Series))
|
if (!string.IsNullOrWhiteSpace(btnResult.Series))
|
||||||
descriptions.Add("Youtube Trailer: <a href=\"" + btnResult.YoutubeTrailer + "\">" + btnResult.YoutubeTrailer + "</a>");
|
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 link = new Uri(btnResult.DownloadURL);
|
||||||
var details = new Uri($"{SiteLink}torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}");
|
var details = new Uri($"{SiteLink}torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}");
|
||||||
var publishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time);
|
var publishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time);
|
||||||
|
@@ -158,7 +158,7 @@ namespace Jackett.Common.Indexers
|
|||||||
var publishDate = DateTime.Parse(row.Value<string>("upload_date") + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
|
var publishDate = DateTime.Parse(row.Value<string>("upload_date") + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
|
||||||
var downloadVolumeFactor = isFreeleech ? 0 : 1;
|
var downloadVolumeFactor = isFreeleech ? 0 : 1;
|
||||||
var uploadVolumeFactor = row.Value<bool>("doubleup") ? 2 : 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 link = new Uri(row.Value<string>("download_link"));
|
||||||
|
|
||||||
var release = new ReleaseInfo
|
var release = new ReleaseInfo
|
||||||
|
@@ -155,7 +155,7 @@ namespace Jackett.Common.Indexers
|
|||||||
|
|
||||||
var imdbID = (string)result["imdbId"];
|
var imdbID = (string)result["imdbId"];
|
||||||
if (!string.IsNullOrEmpty(imdbID))
|
if (!string.IsNullOrEmpty(imdbID))
|
||||||
release.Imdb = ParseUtil.GetImdbID(imdbID);
|
release.Imdb = ParseUtil.GetImdbId(imdbID);
|
||||||
|
|
||||||
release.MinimumRatio = 1;
|
release.MinimumRatio = 1;
|
||||||
release.MinimumSeedTime = 172800; // 48 hours
|
release.MinimumSeedTime = 172800; // 48 hours
|
||||||
|
@@ -97,7 +97,7 @@ namespace Jackett.Common.Indexers
|
|||||||
{
|
{
|
||||||
var requestData = new JObject();
|
var requestData = new JObject();
|
||||||
var queryString = query.GetQueryString();
|
var queryString = query.GetQueryString();
|
||||||
var imdbId = ParseUtil.GetImdbID(query.ImdbID);
|
var imdbId = ParseUtil.GetImdbId(query.ImdbID);
|
||||||
|
|
||||||
if (imdbId != null)
|
if (imdbId != null)
|
||||||
requestData["imdb"] = new JObject
|
requestData["imdb"] = new JObject
|
||||||
@@ -175,7 +175,7 @@ namespace Jackett.Common.Indexers
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (r.ContainsKey("imdb"))
|
if (r.ContainsKey("imdb"))
|
||||||
release.Imdb = ParseUtil.GetImdbID((string)r["imdb"]["id"]);
|
release.Imdb = ParseUtil.GetImdbId((string)r["imdb"]["id"]);
|
||||||
|
|
||||||
if (r.ContainsKey("tvdb"))
|
if (r.ContainsKey("tvdb"))
|
||||||
release.TVDBId = (long)r["tvdb"]["id"];
|
release.TVDBId = (long)r["tvdb"]["id"];
|
||||||
|
@@ -195,7 +195,7 @@ namespace Jackett.Common.Indexers
|
|||||||
|
|
||||||
var imdbLink = row.Children[1].QuerySelector("a[href*=imdb]");
|
var imdbLink = row.Children[1].QuerySelector("a[href*=imdb]");
|
||||||
if (imdbLink != null)
|
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();
|
var dateStr = row.Children[4].TextContent.Trim();
|
||||||
//"July 11, 2015, 13:34:09", "Today|Yesterday at 20:04:23"
|
//"July 11, 2015, 13:34:09", "Today|Yesterday at 20:04:23"
|
||||||
|
@@ -237,7 +237,7 @@ namespace Jackett.Common.Indexers
|
|||||||
var episodeInfo = item.Value<JToken>("episode_info");
|
var episodeInfo = item.Value<JToken>("episode_info");
|
||||||
if (episodeInfo.HasValues)
|
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.TVDBId = episodeInfo.Value<long?>("tvdb");
|
||||||
release.RageID = episodeInfo.Value<long?>("tvrage");
|
release.RageID = episodeInfo.Value<long?>("tvrage");
|
||||||
release.TMDb = episodeInfo.Value<long?>("themoviedb");
|
release.TMDb = episodeInfo.Value<long?>("themoviedb");
|
||||||
|
@@ -190,7 +190,7 @@ namespace Jackett.Common.Indexers
|
|||||||
var category = row.QuerySelector(".br_type > a").GetAttribute("href").Replace("browse.php?cat=", string.Empty);
|
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 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
|
var release = new ReleaseInfo
|
||||||
{
|
{
|
||||||
|
@@ -149,7 +149,7 @@ namespace Jackett.Common.Indexers
|
|||||||
Files = item.Value<long>("numfiles"),
|
Files = item.Value<long>("numfiles"),
|
||||||
Seeders = item.Value<int>("seeders"),
|
Seeders = item.Value<int>("seeders"),
|
||||||
Peers = item.Value<int>("leechers") + 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,
|
MinimumRatio = 1,
|
||||||
MinimumSeedTime = 0,
|
MinimumSeedTime = 0,
|
||||||
DownloadVolumeFactor = dlVolumeFactor,
|
DownloadVolumeFactor = dlVolumeFactor,
|
||||||
|
@@ -230,7 +230,7 @@ namespace Jackett.Common.Indexers
|
|||||||
var downloadMultiplier = (double?)row["download-multiplier"] ?? 1;
|
var downloadMultiplier = (double?)row["download-multiplier"] ?? 1;
|
||||||
var link = new Uri(SiteLink + "download.php/" + torrentId + "/" + torrentId + ".torrent");
|
var link = new Uri(SiteLink + "download.php/" + torrentId + "/" + torrentId + ".torrent");
|
||||||
var publishDate = DateTimeUtil.UnixTimestampToDateTime((long)row.ctime).ToLocalTime();
|
var publishDate = DateTimeUtil.UnixTimestampToDateTime((long)row.ctime).ToLocalTime();
|
||||||
var imdb = ParseUtil.GetImdbID(imdbId);
|
var imdb = ParseUtil.GetImdbId(imdbId);
|
||||||
|
|
||||||
var release = new ReleaseInfo
|
var release = new ReleaseInfo
|
||||||
{
|
{
|
||||||
|
@@ -54,7 +54,7 @@ namespace Jackett.Common.Models.DTO
|
|||||||
// try to build an IMDB Query (tt plus 6 to 8 digits)
|
// try to build an IMDB Query (tt plus 6 to 8 digits)
|
||||||
if (stringQuery.SanitizedSearchTerm.StartsWith("tt") && stringQuery.SanitizedSearchTerm.Length <= 10)
|
if (stringQuery.SanitizedSearchTerm.StartsWith("tt") && stringQuery.SanitizedSearchTerm.Length <= 10)
|
||||||
{
|
{
|
||||||
var imdbId = ParseUtil.GetFullImdbID(stringQuery.SanitizedSearchTerm);
|
var imdbId = ParseUtil.GetFullImdbId(stringQuery.SanitizedSearchTerm);
|
||||||
if (imdbId != null)
|
if (imdbId != null)
|
||||||
{
|
{
|
||||||
return new TorznabQuery
|
return new TorznabQuery
|
||||||
|
@@ -11,7 +11,7 @@ namespace Jackett.Common.Utils
|
|||||||
new Regex(
|
new Regex(
|
||||||
@"(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]",
|
@"(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]",
|
||||||
RegexOptions.Compiled);
|
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;
|
public static string NormalizeSpace(string s) => s?.Trim() ?? string.Empty;
|
||||||
|
|
||||||
@@ -96,24 +96,33 @@ namespace Jackett.Common.Utils
|
|||||||
return CoerceLong(extractedLong);
|
return CoerceLong(extractedLong);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int? GetImdbID(string imdbstr)
|
public static int? GetImdbId(string value)
|
||||||
{
|
{
|
||||||
if (imdbstr == null)
|
if (value == null)
|
||||||
|
{
|
||||||
return null;
|
return null;
|
||||||
var match = ImdbId.Match(imdbstr);
|
}
|
||||||
|
|
||||||
|
var match = ImdbIdRegex.Match(value);
|
||||||
|
|
||||||
if (!match.Success)
|
if (!match.Success)
|
||||||
|
{
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return int.Parse(match.Groups[1].Value, NumberStyles.Any, CultureInfo.InvariantCulture);
|
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);
|
var imdbId = GetImdbId(value);
|
||||||
if (imdbid == null)
|
|
||||||
|
if (imdbId == null || imdbId == 0)
|
||||||
|
{
|
||||||
return null;
|
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"
|
// ex: " 3.5 gb " -> "3758096384" , "3,5GB" -> "3758096384" , "296,98 MB" -> "311406100.48" , "1.018,29 MB" -> "1067754455.04"
|
||||||
|
@@ -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)
|
if (CurrentQuery.ImdbID == null)
|
||||||
{
|
{
|
||||||
logger.Warn($"A search request from {Request.HttpContext.Connection.RemoteIpAddress} was made with an invalid imdbid.");
|
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
|
torrent_id = release.Guid.AbsoluteUri, // GUID and (Link or Magnet) are mandatory
|
||||||
details_url = release.Details?.AbsoluteUri,
|
details_url = release.Details?.AbsoluteUri,
|
||||||
download_url = (release.Link != null ? release.Link.AbsoluteUri : release.MagnetUri.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),
|
freeleech = (release.DownloadVolumeFactor == 0 ? true : false),
|
||||||
type = "movie",
|
type = "movie",
|
||||||
size = (long)release.Size / (1024 * 1024), // This is in MB
|
size = (long)release.Size / (1024 * 1024), // This is in MB
|
||||||
|
@@ -94,5 +94,22 @@ namespace Jackett.Test.Common.Utils
|
|||||||
{
|
{
|
||||||
ParseUtil.GetLongFromString(original).Should().Be(parsedInt);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user