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");
|
||||
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))
|
||||
|
@@ -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;
|
||||
|
@@ -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)
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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"];
|
||||
|
@@ -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"
|
||||
|
@@ -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");
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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,
|
||||
|
@@ -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
|
||||
{
|
||||
|
@@ -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
|
||||
|
@@ -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"
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user