diff --git a/src/Jackett.Common/Indexers/AniDUB.cs b/src/Jackett.Common/Indexers/AniDUB.cs index a3e38b7e2..538ec66d7 100644 --- a/src/Jackett.Common/Indexers/AniDUB.cs +++ b/src/Jackett.Common/Indexers/AniDUB.cs @@ -311,7 +311,7 @@ namespace Jackett.Common.Indexers const string SizeSelector = ".list.down > .red"; var sizeStr = tabNode.QuerySelector(SizeSelector).Text(); - return ReleaseInfo.GetBytes(sizeStr); + return ParseUtil.GetBytes(sizeStr); } private Uri GetReleaseLink(IElement tabNode) => diff --git a/src/Jackett.Common/Indexers/Anidex.cs b/src/Jackett.Common/Indexers/Anidex.cs index a5f4721be..dddb1ca9f 100644 --- a/src/Jackett.Common/Indexers/Anidex.cs +++ b/src/Jackett.Common/Indexers/Anidex.cs @@ -219,7 +219,7 @@ namespace Jackett.Common.Indexers release.Title = ParseStringValueFromRow(r, nameof(release.Title), "td:nth-child(3) span") + " " + language; release.Link = ParseValueFromRow(r, nameof(release.Link), "a[href^=\"/dl/\"]", (e) => GetAbsoluteUrl(e.Attributes["href"].Value)); release.MagnetUri = ParseValueFromRow(r, nameof(release.MagnetUri), "a[href^=\"magnet:?\"]", (e) => new Uri(e.Attributes["href"].Value)); - release.Size = ParseValueFromRow(r, nameof(release.Size), "td:nth-child(7)", (e) => ReleaseInfo.GetBytes(e.Text())); + release.Size = ParseValueFromRow(r, nameof(release.Size), "td:nth-child(7)", (e) => ParseUtil.GetBytes(e.Text())); release.PublishDate = ParseValueFromRow(r, nameof(release.PublishDate), "td:nth-child(8)", (e) => DateTime.ParseExact(e.Attributes["title"].Value, "yyyy-MM-dd HH:mm:ss UTC", CultureInfo.InvariantCulture)); release.Seeders = ParseIntValueFromRow(r, nameof(release.Seeders), "td:nth-child(9)"); release.Peers = ParseIntValueFromRow(r, nameof(release.Peers), "td:nth-child(10)") + release.Seeders; diff --git a/src/Jackett.Common/Indexers/AnimeTorrents.cs b/src/Jackett.Common/Indexers/AnimeTorrents.cs index 6e20db9e0..b872e4c40 100644 --- a/src/Jackett.Common/Indexers/AnimeTorrents.cs +++ b/src/Jackett.Common/Indexers/AnimeTorrents.cs @@ -171,7 +171,7 @@ namespace Jackett.Common.Indexers } var sizeStr = row.QuerySelector("td:nth-of-type(6)").TextContent; - release.Size = ReleaseInfo.GetBytes(sizeStr); + release.Size = ParseUtil.GetBytes(sizeStr); var connections = row.QuerySelector("td:nth-of-type(8)").TextContent.Trim().Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); diff --git a/src/Jackett.Common/Indexers/AudioBookBay.cs b/src/Jackett.Common/Indexers/AudioBookBay.cs index 742edc2a7..61eb7df1f 100644 --- a/src/Jackett.Common/Indexers/AudioBookBay.cs +++ b/src/Jackett.Common/Indexers/AudioBookBay.cs @@ -241,7 +241,7 @@ namespace Jackett.Common.Indexers title += $" [{matchBitrate.Groups[1].Value.Trim()}]"; var matchSize = Regex.Match(infoString, @"File Size: (.+?)s?$", RegexOptions.IgnoreCase); - var size = matchSize.Groups[1].Success ? ReleaseInfo.GetBytes(matchSize.Groups[1].Value) : 0; + var size = matchSize.Groups[1].Success ? ParseUtil.GetBytes(matchSize.Groups[1].Value) : 0; var matchDateAdded = Regex.Match(infoString, @"Posted: (\d{1,2} \D{3} \d{4})", RegexOptions.IgnoreCase); var publishDate = matchDateAdded.Groups[1].Success && DateTime.TryParseExact(matchDateAdded.Groups[1].Value, "d MMM yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var parsedDate) ? parsedDate : DateTime.Now; diff --git a/src/Jackett.Common/Indexers/BJShare.cs b/src/Jackett.Common/Indexers/BJShare.cs index e37a2c84d..6ef116eb2 100644 --- a/src/Jackett.Common/Indexers/BJShare.cs +++ b/src/Jackett.Common/Indexers/BJShare.cs @@ -417,7 +417,7 @@ namespace Jackett.Common.Indexers if (!query.IsImdbQuery && !query.MatchQueryStringAND(release.Title, null, searchTerm)) continue; var size = qSize.TextContent; - release.Size = ReleaseInfo.GetBytes(size); + release.Size = ParseUtil.GetBytes(size); release.Link = new Uri(SiteLink + qDlLink.GetAttribute("href")); release.Details = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); release.Guid = release.Link; @@ -490,7 +490,7 @@ namespace Jackett.Common.Indexers if (line.StartsWith("Tamanho:")) { var size = line.Substring("Tamanho: ".Length); - release.Size = ReleaseInfo.GetBytes(size); + release.Size = ParseUtil.GetBytes(size); } else if (line.StartsWith("Lançado em: ")) { diff --git a/src/Jackett.Common/Indexers/BakaBT.cs b/src/Jackett.Common/Indexers/BakaBT.cs index 8352dbd04..98ab76c0a 100644 --- a/src/Jackett.Common/Indexers/BakaBT.cs +++ b/src/Jackett.Common/Indexers/BakaBT.cs @@ -12,6 +12,7 @@ using AngleSharp.Html.Parser; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig.Bespoke; using Jackett.Common.Services.Interfaces; +using Jackett.Common.Utils; using Jackett.Common.Utils.Clients; using Newtonsoft.Json.Linq; using NLog; @@ -220,7 +221,7 @@ namespace Jackett.Common.Indexers release.MinimumSeedTime = 172800; // 48 hours var size = row.QuerySelector(".size").TextContent; - release.Size = ReleaseInfo.GetBytes(size); + release.Size = ParseUtil.GetBytes(size); //22 Jul 15 var dateStr = row.QuerySelector(".added").TextContent.Replace("'", string.Empty); diff --git a/src/Jackett.Common/Indexers/BitHDTV.cs b/src/Jackett.Common/Indexers/BitHDTV.cs index 88d1cfb41..0c5037a84 100644 --- a/src/Jackett.Common/Indexers/BitHDTV.cs +++ b/src/Jackett.Common/Indexers/BitHDTV.cs @@ -163,7 +163,7 @@ namespace Jackett.Common.Indexers var pubDate = DateTime.ParseExact(dateString, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture); release.PublishDate = DateTime.SpecifyKind(pubDate, DateTimeKind.Local); var sizeStr = row.Children[6].TextContent; - release.Size = ReleaseInfo.GetBytes(sizeStr); + release.Size = ParseUtil.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.Children[8].TextContent.Trim()); release.Peers = ParseUtil.CoerceInt(row.Children[9].TextContent.Trim()) + release.Seeders; switch (row.GetAttribute("bgcolor")) diff --git a/src/Jackett.Common/Indexers/BrasilTracker.cs b/src/Jackett.Common/Indexers/BrasilTracker.cs index 915f64e0d..cf4c86e65 100644 --- a/src/Jackett.Common/Indexers/BrasilTracker.cs +++ b/src/Jackett.Common/Indexers/BrasilTracker.cs @@ -289,7 +289,7 @@ namespace Jackett.Common.Indexers if (!query.IsImdbQuery && !query.MatchQueryStringAND(release.Title, null, searchTerm)) continue; var size = qSize.TextContent; - release.Size = ReleaseInfo.GetBytes(size); + release.Size = ParseUtil.GetBytes(size); release.Link = new Uri(SiteLink + qDlLink.GetAttribute("href")); release.Details = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); release.Guid = release.Link; diff --git a/src/Jackett.Common/Indexers/CardigannIndexer.cs b/src/Jackett.Common/Indexers/CardigannIndexer.cs index 2d0bb2db9..6616d14ce 100644 --- a/src/Jackett.Common/Indexers/CardigannIndexer.cs +++ b/src/Jackett.Common/Indexers/CardigannIndexer.cs @@ -2018,7 +2018,7 @@ namespace Jackett.Common.Indexers value = release.Category.ToString(); break; case "size": - release.Size = ReleaseInfo.GetBytes(value); + release.Size = ParseUtil.GetBytes(value); value = release.Size.ToString(); break; case "leechers": diff --git a/src/Jackett.Common/Indexers/DarmoweTorrenty.cs b/src/Jackett.Common/Indexers/DarmoweTorrenty.cs index 22b7e346a..07f909216 100644 --- a/src/Jackett.Common/Indexers/DarmoweTorrenty.cs +++ b/src/Jackett.Common/Indexers/DarmoweTorrenty.cs @@ -192,7 +192,7 @@ namespace Jackett.Common.Indexers InfoHash = infoHash, // magnet link is auto generated from infohash Guid = detailsLink, Details = detailsLink, - Size = sizeMatch.Success ? ReleaseInfo.GetBytes(sizeMatch.Groups[1].Value) : 0 + Size = sizeMatch.Success ? ParseUtil.GetBytes(sizeMatch.Groups[1].Value) : 0 }; return release; } diff --git a/src/Jackett.Common/Indexers/DivxTotal.cs b/src/Jackett.Common/Indexers/DivxTotal.cs index fa4d86dc1..2b4950fae 100644 --- a/src/Jackett.Common/Indexers/DivxTotal.cs +++ b/src/Jackett.Common/Indexers/DivxTotal.cs @@ -464,7 +464,7 @@ namespace Jackett.Common.Indexers { try { - var parsedSize = ReleaseInfo.GetBytes(sizeToParse); + var parsedSize = ParseUtil.GetBytes(sizeToParse); return parsedSize > 0 ? parsedSize : sizeDefault; } catch diff --git a/src/Jackett.Common/Indexers/DonTorrent.cs b/src/Jackett.Common/Indexers/DonTorrent.cs index 4b7d46aa1..549277780 100644 --- a/src/Jackett.Common/Indexers/DonTorrent.cs +++ b/src/Jackett.Common/Indexers/DonTorrent.cs @@ -11,6 +11,7 @@ using AngleSharp.Html.Parser; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig; using Jackett.Common.Services.Interfaces; +using Jackett.Common.Utils; using Newtonsoft.Json.Linq; using NLog; using static Jackett.Common.Models.IndexerConfig.ConfigurationData; @@ -382,7 +383,7 @@ namespace Jackett.Common.Indexers var sizeStr = data3[1].TextContent; //"Tamaño: {0}" -- needs trimming, contains number of episodes available var publishDate = TryToParseDate(publishStr, DateTime.Now); - var size = ReleaseInfo.GetBytes(sizeStr); + var size = ParseUtil.GetBytes(sizeStr); var release = GenerateRelease(title, link, link, GetCategory(title, link), publishDate, size); releases.Add(release); @@ -496,7 +497,7 @@ namespace Jackett.Common.Indexers // guess size long size; if (moreinfo.Length == 2) - size = ReleaseInfo.GetBytes(moreinfo[1].QuerySelector("p").TextContent); + size = ParseUtil.GetBytes(moreinfo[1].QuerySelector("p").TextContent); else if (title.ToLower().Contains("4k")) size = 53687091200L; // 50 GB else if (title.ToLower().Contains("1080p")) diff --git a/src/Jackett.Common/Indexers/EraiRaws.cs b/src/Jackett.Common/Indexers/EraiRaws.cs index 49df49f48..8a044114a 100644 --- a/src/Jackett.Common/Indexers/EraiRaws.cs +++ b/src/Jackett.Common/Indexers/EraiRaws.cs @@ -8,6 +8,7 @@ using System.Xml; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig; using Jackett.Common.Services.Interfaces; +using Jackett.Common.Utils; using Newtonsoft.Json.Linq; using NLog; using static Jackett.Common.Models.IndexerConfig.ConfigurationData; @@ -320,7 +321,7 @@ namespace Jackett.Common.Indexers { Title = StripTitle(feedItem.Title); Quality = feedItem.Quality; - Size = ReleaseInfo.GetBytes(feedItem.Size); + Size = ParseUtil.GetBytes(feedItem.Size); DetailsLink = ParseDetailsLink(feedItem.Description); InfoHash = feedItem.InfoHash; SubTitles = feedItem.SubTitles.Replace("[", " ").Replace("]", " ").ToUpper(); diff --git a/src/Jackett.Common/Indexers/FunFile.cs b/src/Jackett.Common/Indexers/FunFile.cs index 2b870306b..8cac4c822 100644 --- a/src/Jackett.Common/Indexers/FunFile.cs +++ b/src/Jackett.Common/Indexers/FunFile.cs @@ -213,7 +213,7 @@ namespace Jackett.Common.Indexers Details = details, Title = title, Category = MapTrackerCatToNewznab(cat), - Size = ReleaseInfo.GetBytes(row.Children[7].TextContent), + Size = ParseUtil.GetBytes(row.Children[7].TextContent), Files = ParseUtil.CoerceInt(row.Children[3].TextContent), Grabs = ParseUtil.CoerceInt(row.Children[8].TextContent), Seeders = seeders, diff --git a/src/Jackett.Common/Indexers/GazelleGames.cs b/src/Jackett.Common/Indexers/GazelleGames.cs index d2bb2d888..7293ebca4 100644 --- a/src/Jackett.Common/Indexers/GazelleGames.cs +++ b/src/Jackett.Common/Indexers/GazelleGames.cs @@ -301,7 +301,7 @@ namespace Jackett.Common.Indexers var details = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); var grabs = ParseUtil.CoerceLong(qGrabs.TextContent); var leechers = ParseUtil.CoerceInt(qLeechers.TextContent); - var size = ReleaseInfo.GetBytes(sizeString); + var size = ParseUtil.GetBytes(sizeString); var release = new ReleaseInfo { diff --git a/src/Jackett.Common/Indexers/HDSpace.cs b/src/Jackett.Common/Indexers/HDSpace.cs index 821e74cd5..0428e6b04 100644 --- a/src/Jackett.Common/Indexers/HDSpace.cs +++ b/src/Jackett.Common/Indexers/HDSpace.cs @@ -175,7 +175,7 @@ namespace Jackett.Common.Indexers //"July 11, 2015, 13:34:09", "Today|Yesterday at 20:04:23" release.PublishDate = DateTimeUtil.FromUnknown(dateStr); var sizeStr = row.Children[5].TextContent; - release.Size = ReleaseInfo.GetBytes(sizeStr); + release.Size = ParseUtil.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.Children[7].TextContent); release.Peers = ParseUtil.CoerceInt(row.Children[8].TextContent) + release.Seeders; var grabs = row.QuerySelector("td:nth-child(10)").TextContent; diff --git a/src/Jackett.Common/Indexers/HDTorrents.cs b/src/Jackett.Common/Indexers/HDTorrents.cs index 8e15de33c..41da5f1ad 100644 --- a/src/Jackett.Common/Indexers/HDTorrents.cs +++ b/src/Jackett.Common/Indexers/HDTorrents.cs @@ -171,7 +171,7 @@ namespace Jackett.Common.Indexers var link = new Uri(SiteLink + row.Children[4].FirstElementChild.GetAttribute("href")); var description = row.Children[2].QuerySelector("span")?.TextContent.Trim(); - var size = ReleaseInfo.GetBytes(row.Children[7].TextContent); + var size = ParseUtil.GetBytes(row.Children[7].TextContent); var dateAdded = string.Join(" ", row.Children[6].FirstElementChild.Attributes.Select(a => a.Name).Take(4)); var publishDate = DateTime.ParseExact(dateAdded, "dd MMM yyyy HH:mm:ss", CultureInfo.InvariantCulture); diff --git a/src/Jackett.Common/Indexers/IPTorrents.cs b/src/Jackett.Common/Indexers/IPTorrents.cs index a6e2e5baf..0f81bed76 100644 --- a/src/Jackett.Common/Indexers/IPTorrents.cs +++ b/src/Jackett.Common/Indexers/IPTorrents.cs @@ -316,7 +316,7 @@ namespace Jackett.Common.Indexers // Torrents - Category column == Icons var cat = MapTrackerCatToNewznab(catIcon.GetAttribute("href").Substring(1)); - var size = ReleaseInfo.GetBytes(row.Children[5].TextContent); + var size = ParseUtil.GetBytes(row.Children[5].TextContent); var colIndex = 6; int? files = null; diff --git a/src/Jackett.Common/Indexers/ImmortalSeed.cs b/src/Jackett.Common/Indexers/ImmortalSeed.cs index 6e785522d..1195baf29 100644 --- a/src/Jackett.Common/Indexers/ImmortalSeed.cs +++ b/src/Jackett.Common/Indexers/ImmortalSeed.cs @@ -239,7 +239,7 @@ namespace Jackett.Common.Indexers if (dateMatch.Success) release.PublishDate = DateTime.ParseExact(dateMatch.Value, "yyyy-MM-dd hh:mm tt", CultureInfo.InvariantCulture); - release.Size = ReleaseInfo.GetBytes(row.QuerySelector("td:nth-of-type(5)").TextContent.Trim()); + release.Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(5)").TextContent.Trim()); release.Seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(7)").TextContent.Trim()); release.Peers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(8)").TextContent.Trim()) + release.Seeders; diff --git a/src/Jackett.Common/Indexers/Libble.cs b/src/Jackett.Common/Indexers/Libble.cs index c0874110d..1d55f30e3 100644 --- a/src/Jackett.Common/Indexers/Libble.cs +++ b/src/Jackett.Common/Indexers/Libble.cs @@ -248,7 +248,7 @@ namespace Jackett.Common.Indexers release.Grabs = ParseUtil.CoerceInt(releaseDetails.QuerySelector("td:nth-child(5)").TextContent); release.Seeders = ParseUtil.CoerceInt(releaseDetails.QuerySelector("td:nth-child(6)").TextContent); release.Peers = release.Seeders + ParseUtil.CoerceInt(releaseDetails.QuerySelector("td:nth-child(7)").TextContent); - release.Size = ReleaseInfo.GetBytes(releaseDetails.QuerySelector("td:nth-child(4)").TextContent.Trim()); + release.Size = ParseUtil.GetBytes(releaseDetails.QuerySelector("td:nth-child(4)").TextContent.Trim()); release.Poster = releaseThumbnailUri; release.Category = releaseNewznabCategory; release.MinimumSeedTime = 259200; // 72 hours diff --git a/src/Jackett.Common/Indexers/LostFilm.cs b/src/Jackett.Common/Indexers/LostFilm.cs index 7a8c9a8ce..cf2199f8a 100644 --- a/src/Jackett.Common/Indexers/LostFilm.cs +++ b/src/Jackett.Common/Indexers/LostFilm.cs @@ -771,7 +771,7 @@ namespace Jackett.Common.Indexers Title = string.Join(" - ", titleComponents.Where(s => !string.IsNullOrEmpty(s))), Link = link, Guid = link, - Size = ReleaseInfo.GetBytes(sizeString), + Size = ParseUtil.GetBytes(sizeString), // add missing torznab fields not available from results Seeders = 1, Peers = 2, diff --git a/src/Jackett.Common/Indexers/MyAnonamouse.cs b/src/Jackett.Common/Indexers/MyAnonamouse.cs index 91cc3b9ca..95f971b61 100644 --- a/src/Jackett.Common/Indexers/MyAnonamouse.cs +++ b/src/Jackett.Common/Indexers/MyAnonamouse.cs @@ -252,7 +252,7 @@ namespace Jackett.Common.Indexers Files = item.Value("numfiles"), Seeders = item.Value("seeders"), Peers = item.Value("seeders") + item.Value("leechers"), - Size = ReleaseInfo.GetBytes(item.Value("size")), + Size = ParseUtil.GetBytes(item.Value("size")), DownloadVolumeFactor = item.Value("free") ? 0 : 1, UploadVolumeFactor = 1, diff --git a/src/Jackett.Common/Indexers/NCore.cs b/src/Jackett.Common/Indexers/NCore.cs index 67069fa04..35031ee09 100644 --- a/src/Jackett.Common/Indexers/NCore.cs +++ b/src/Jackett.Common/Indexers/NCore.cs @@ -265,7 +265,7 @@ namespace Jackett.Common.Indexers row.QuerySelector(".box_feltoltve2").InnerHtml.Replace("
", " "), CultureInfo.InvariantCulture); var sizeSplit = row.QuerySelector(".box_meret2").TextContent.Split(' '); - var size = ReleaseInfo.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0])); + var size = ParseUtil.GetBytes(sizeSplit[1].ToLower(), ParseUtil.CoerceFloat(sizeSplit[0])); var catLink = row.QuerySelector("a:has(img[class='categ_link'])").GetAttribute("href"); var cat = ParseUtil.GetArgumentFromQueryString(catLink, "tipus"); var title = torrentTxt.GetAttribute("title"); diff --git a/src/Jackett.Common/Indexers/NorBits.cs b/src/Jackett.Common/Indexers/NorBits.cs index e806a11be..dd298a0c1 100644 --- a/src/Jackett.Common/Indexers/NorBits.cs +++ b/src/Jackett.Common/Indexers/NorBits.cs @@ -281,7 +281,7 @@ namespace Jackett.Common.Indexers Link = link, Title = title, Category = MapTrackerCatToNewznab(cat), - Size = ReleaseInfo.GetBytes(row.QuerySelector("td:nth-of-type(7)").TextContent), + Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(7)").TextContent), Files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(3) > a")?.TextContent.Trim()), Grabs = ParseUtil.CoerceLong(row.QuerySelector("td:nth-of-type(8)")?.FirstChild?.TextContent.Trim()), Seeders = seeders, diff --git a/src/Jackett.Common/Indexers/PirateTheNet.cs b/src/Jackett.Common/Indexers/PirateTheNet.cs index 953f3885a..a74acd91b 100644 --- a/src/Jackett.Common/Indexers/PirateTheNet.cs +++ b/src/Jackett.Common/Indexers/PirateTheNet.cs @@ -173,7 +173,7 @@ namespace Jackett.Common.Indexers var files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(4)").TextContent); var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(8)").TextContent); var details = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - var size = ReleaseInfo.GetBytes(sizeStr); + var size = ParseUtil.GetBytes(sizeStr); var leechers = ParseUtil.CoerceInt(qLeechers.Text()); var title = qDetailsLink.GetAttribute("alt"); var release = new ReleaseInfo diff --git a/src/Jackett.Common/Indexers/PixelHD.cs b/src/Jackett.Common/Indexers/PixelHD.cs index d1d700774..cc675d54a 100644 --- a/src/Jackett.Common/Indexers/PixelHD.cs +++ b/src/Jackett.Common/Indexers/PixelHD.cs @@ -185,7 +185,7 @@ namespace Jackett.Common.Indexers var link = new Uri(SiteLink + Row.QuerySelector("a[href^=\"torrents.php?action=download\"]").GetAttribute("href")); var seeders = ParseUtil.CoerceInt(Seeders.TextContent); var details = new Uri(SiteLink + title.GetAttribute("href")); - var size = ReleaseInfo.GetBytes(Size.TextContent); + var size = ParseUtil.GetBytes(Size.TextContent); var leechers = ParseUtil.CoerceInt(Leechers.TextContent); var grabs = ParseUtil.CoerceLong(Grabs.TextContent); var publishDate = DateTimeUtil.FromTimeAgo(added.TextContent); diff --git a/src/Jackett.Common/Indexers/PornoLab.cs b/src/Jackett.Common/Indexers/PornoLab.cs index 12c613c1c..6eb845c0e 100644 --- a/src/Jackett.Common/Indexers/PornoLab.cs +++ b/src/Jackett.Common/Indexers/PornoLab.cs @@ -311,7 +311,7 @@ namespace Jackett.Common.Indexers var title = configData.StripRussianLetters.Value ? s_StripRussianRegex.Replace(qDetailsLink.TextContent, "") : qDetailsLink.TextContent; - var size = ReleaseInfo.GetBytes(qSize.TextContent); + var size = ParseUtil.GetBytes(qSize.TextContent); var leechers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(8)").TextContent); var grabs = ParseUtil.CoerceLong(row.QuerySelector("td:nth-child(9)").TextContent); var publishDate = DateTimeUtil.UnixTimestampToDateTime(long.Parse(row.QuerySelector("td:nth-child(11) u").TextContent)); diff --git a/src/Jackett.Common/Indexers/PreToMe.cs b/src/Jackett.Common/Indexers/PreToMe.cs index 0714297e4..371ac114f 100644 --- a/src/Jackett.Common/Indexers/PreToMe.cs +++ b/src/Jackett.Common/Indexers/PreToMe.cs @@ -270,7 +270,7 @@ namespace Jackett.Common.Indexers Guid = details, Link = link, PublishDate = publishDate, - Size = ReleaseInfo.GetBytes(row.QuerySelector("td:nth-of-type(8)")?.TextContent), + Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(8)")?.TextContent), Category = MapTrackerCatToNewznab(cat), Files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(4)")?.TextContent), Grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(9)")?.TextContent), diff --git a/src/Jackett.Common/Indexers/RevolutionTT.cs b/src/Jackett.Common/Indexers/RevolutionTT.cs index 5ad62c387..0720b9793 100644 --- a/src/Jackett.Common/Indexers/RevolutionTT.cs +++ b/src/Jackett.Common/Indexers/RevolutionTT.cs @@ -172,7 +172,7 @@ namespace Jackett.Common.Indexers var dateString = row.QuerySelector("td:nth-child(6) nobr").TextContent.Trim(); var publishDate = DateTime.ParseExact(dateString, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture); - var size = ReleaseInfo.GetBytes(row.QuerySelector("td:nth-child(7)").InnerHtml.Split('<').First().Trim()); + var size = ParseUtil.GetBytes(row.QuerySelector("td:nth-child(7)").InnerHtml.Split('<').First().Trim()); var files = ParseUtil.GetLongFromString(row.QuerySelector("td:nth-child(7) > a").TextContent); var grabs = ParseUtil.GetLongFromString(row.QuerySelector("td:nth-child(8)").TextContent); var seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(9)").TextContent); diff --git a/src/Jackett.Common/Indexers/RuTracker.cs b/src/Jackett.Common/Indexers/RuTracker.cs index 028eb46ec..2728030b4 100644 --- a/src/Jackett.Common/Indexers/RuTracker.cs +++ b/src/Jackett.Common/Indexers/RuTracker.cs @@ -1625,7 +1625,7 @@ namespace Jackett.Common.Indexers return MapTrackerCatToNewznab(cat); } - private long GetSizeOfRelease(in IElement row) => ReleaseInfo.GetBytes(row.QuerySelector("td.tor-size")?.GetAttribute("data-ts_text")); + private long GetSizeOfRelease(in IElement row) => ParseUtil.GetBytes(row.QuerySelector("td.tor-size")?.GetAttribute("data-ts_text")); private DateTime GetPublishDateOfRelease(in IElement row) => DateTimeUtil.UnixTimestampToDateTime(long.Parse(row.QuerySelector("td:nth-child(10)")?.GetAttribute("data-ts_text"))); diff --git a/src/Jackett.Common/Indexers/SceneTime.cs b/src/Jackett.Common/Indexers/SceneTime.cs index 50b96b11a..c469a93b8 100644 --- a/src/Jackett.Common/Indexers/SceneTime.cs +++ b/src/Jackett.Common/Indexers/SceneTime.cs @@ -200,7 +200,7 @@ namespace Jackett.Common.Indexers Title = title, Category = MapTrackerCatToNewznab(cat), PublishDate = publishDate, - Size = ReleaseInfo.GetBytes(row.Children[sizeIndex].TextContent), + Size = ParseUtil.GetBytes(row.Children[sizeIndex].TextContent), Seeders = seeders, Peers = ParseUtil.CoerceInt(row.Children[leechersIndex].TextContent.Trim()) + seeders, DownloadVolumeFactor = row.QuerySelector("font > b:contains(Freeleech)") != null ? 0 : 1, diff --git a/src/Jackett.Common/Indexers/Sharewood.cs b/src/Jackett.Common/Indexers/Sharewood.cs index 4c40c64b9..47bc3011b 100644 --- a/src/Jackett.Common/Indexers/Sharewood.cs +++ b/src/Jackett.Common/Indexers/Sharewood.cs @@ -294,7 +294,7 @@ namespace Jackett.Common.Indexers Guid = details, Category = MapTrackerCatToNewznab(cat), PublishDate = publishDate, - Size = ReleaseInfo.GetBytes(sizeString), + Size = ParseUtil.GetBytes(sizeString), Grabs = row.Value("times_completed"), Seeders = row.Value("seeders"), Peers = row.Value("leechers") + row.Value("seeders"), diff --git a/src/Jackett.Common/Indexers/SpeedCD.cs b/src/Jackett.Common/Indexers/SpeedCD.cs index 46583d804..ac48fe543 100644 --- a/src/Jackett.Common/Indexers/SpeedCD.cs +++ b/src/Jackett.Common/Indexers/SpeedCD.cs @@ -226,7 +226,7 @@ namespace Jackett.Common.Indexers Title = title, Category = MapTrackerCatToNewznab(cat), PublishDate = DateTime.ParseExact(pubDateStr, "dddd, MMMM d, yyyy h:mmtt", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal), - Size = ReleaseInfo.GetBytes(row.QuerySelector("td:nth-child(6)")?.TextContent), + Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-child(6)")?.TextContent), Grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(7)")?.TextContent), Seeders = seeders, Peers = seeders + leechers, diff --git a/src/Jackett.Common/Indexers/Toloka.cs b/src/Jackett.Common/Indexers/Toloka.cs index a69430607..732fa3e07 100644 --- a/src/Jackett.Common/Indexers/Toloka.cs +++ b/src/Jackett.Common/Indexers/Toloka.cs @@ -294,7 +294,7 @@ namespace Jackett.Common.Indexers Title = _titleParser.Parse(title, category, configData.StripCyrillicLetters.Value), Description = title, Category = category, - Size = ReleaseInfo.GetBytes(row.QuerySelector("td:nth-child(7)").TextContent), + Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-child(7)").TextContent), Seeders = seeders, Peers = leechers + seeders, Grabs = 0, //ParseUtil.CoerceLong(Row.QuerySelector("td:nth-child(9)").TextContent); diff --git a/src/Jackett.Common/Indexers/TorrentBytes.cs b/src/Jackett.Common/Indexers/TorrentBytes.cs index 625abd842..7c45742e9 100644 --- a/src/Jackett.Common/Indexers/TorrentBytes.cs +++ b/src/Jackett.Common/Indexers/TorrentBytes.cs @@ -183,7 +183,7 @@ namespace Jackett.Common.Indexers var added = row.QuerySelector("td:nth-of-type(5)").TextContent.Trim(); release.PublishDate = DateTime.ParseExact(added, "yyyy-MM-ddHH:mm:ss", CultureInfo.InvariantCulture); var sizeStr = row.QuerySelector("td:nth-of-type(7)").TextContent.Trim(); - release.Size = ReleaseInfo.GetBytes(sizeStr); + release.Size = ParseUtil.GetBytes(sizeStr); release.Seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(9)").TextContent.Trim()); release.Peers = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(10)").TextContent.Trim()) + release.Seeders; diff --git a/src/Jackett.Common/Indexers/TorrentHeaven.cs b/src/Jackett.Common/Indexers/TorrentHeaven.cs index 1342845b7..c1da772f5 100644 --- a/src/Jackett.Common/Indexers/TorrentHeaven.cs +++ b/src/Jackett.Common/Indexers/TorrentHeaven.cs @@ -237,7 +237,7 @@ namespace Jackett.Common.Indexers downloadFactor = 1; var title = titleRegexp.Match(qDetailsLink.GetAttribute("onmouseover")).Groups[1].Value; var details = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - var size = ReleaseInfo.GetBytes(qColumn2[1].TextContent); + var size = ParseUtil.GetBytes(qColumn2[1].TextContent); var seeders = ParseUtil.CoerceInt(qColumn1[3].TextContent); var leechers = ParseUtil.CoerceInt(qColumn2[3].TextContent); var publishDate = TimeZoneInfo.ConvertTime(dateGerman, germanyTz, TimeZoneInfo.Local); diff --git a/src/Jackett.Common/Indexers/Uniotaku.cs b/src/Jackett.Common/Indexers/Uniotaku.cs index 06d02a087..e351fffd8 100644 --- a/src/Jackett.Common/Indexers/Uniotaku.cs +++ b/src/Jackett.Common/Indexers/Uniotaku.cs @@ -156,7 +156,7 @@ namespace Jackett.Common.Indexers Link = details, Title = title, Category = MapTrackerCatDescToNewznab(category), - Size = ReleaseInfo.GetBytes(item.SelectToken("[6]")?.Value()), + Size = ParseUtil.GetBytes(item.SelectToken("[6]")?.Value()), Grabs = item.SelectToken("[5]")?.Value(), Seeders = seeders, Peers = seeders + leechers, diff --git a/src/Jackett.Common/Indexers/XSpeeds.cs b/src/Jackett.Common/Indexers/XSpeeds.cs index 4f73e80af..eab92d90b 100644 --- a/src/Jackett.Common/Indexers/XSpeeds.cs +++ b/src/Jackett.Common/Indexers/XSpeeds.cs @@ -309,7 +309,7 @@ namespace Jackett.Common.Indexers release.Seeders = ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(7)").TextContent); release.Peers = release.Seeders + ParseUtil.CoerceInt(row.QuerySelector("td:nth-of-type(8)").TextContent.Trim()); - release.Size = ReleaseInfo.GetBytes(row.QuerySelector("td:nth-of-type(5)").TextContent.Trim()); + release.Size = ParseUtil.GetBytes(row.QuerySelector("td:nth-of-type(5)").TextContent.Trim()); var qPoster = row.QuerySelector("td:nth-of-type(2) .tooltip-content img"); if (qPoster != null) diff --git a/src/Jackett.Common/Indexers/ZonaQ.cs b/src/Jackett.Common/Indexers/ZonaQ.cs index 0c4a6cac5..6544f1d06 100644 --- a/src/Jackett.Common/Indexers/ZonaQ.cs +++ b/src/Jackett.Common/Indexers/ZonaQ.cs @@ -192,7 +192,7 @@ namespace Jackett.Common.Indexers var publishDateStr = row.Children[4].InnerHtml.Split('>').Last(); var publishDate = DateTime.ParseExact(publishDateStr, "dd/MM/yyyy", CultureInfo.InvariantCulture); - var size = ReleaseInfo.GetBytes(row.Children[5].TextContent); + var size = ParseUtil.GetBytes(row.Children[5].TextContent); var seeders = ParseUtil.CoerceInt(row.Children[6].TextContent); var leechers = ParseUtil.CoerceInt(row.Children[7].TextContent); var grabs = ParseUtil.CoerceInt(row.Children[8].TextContent); diff --git a/src/Jackett.Common/Models/ReleaseInfo.cs b/src/Jackett.Common/Models/ReleaseInfo.cs index cda31c0e2..a032c51d5 100644 --- a/src/Jackett.Common/Models/ReleaseInfo.cs +++ b/src/Jackett.Common/Models/ReleaseInfo.cs @@ -97,45 +97,6 @@ namespace Jackett.Common.Models public virtual object Clone() => new ReleaseInfo(this); - // ex: " 3.5 gb " -> "3758096384" , "3,5GB" -> "3758096384" , "296,98 MB" -> "311406100.48" , "1.018,29 MB" -> "1067754455.04" - // ex: "1.018.29mb" -> "1067754455.04" , "-" -> "0" , "---" -> "0" - public static long GetBytes(string str) - { - var valStr = new string(str.Where(c => char.IsDigit(c) || c == '.' || c == ',').ToArray()); - 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); - } - var unit = new string(str.Where(char.IsLetter).ToArray()); - var val = ParseUtil.CoerceFloat(valStr); - return GetBytes(unit, val); - } - - public static long GetBytes(string unit, float value) - { - unit = unit.Replace("i", "").ToLowerInvariant(); - if (unit.Contains("kb")) - return BytesFromKB(value); - if (unit.Contains("mb")) - return BytesFromMB(value); - if (unit.Contains("gb")) - return BytesFromGB(value); - if (unit.Contains("tb")) - return BytesFromTB(value); - return (long)value; - } - - public static long BytesFromTB(float tb) => BytesFromGB(tb * 1024f); - - public static long BytesFromGB(float gb) => BytesFromMB(gb * 1024f); - - public static long BytesFromMB(float mb) => BytesFromKB(mb * 1024f); - - public static long BytesFromKB(float kb) => (long)(kb * 1024f); - - public override string ToString() => - $"[ReleaseInfo: Title={Title}, Guid={Guid}, Link={Link}, Details={Details}, PublishDate={PublishDate}, Category={Category}, Size={Size}, Files={Files}, Grabs={Grabs}, Description={Description}, RageID={RageID}, TVDBId={TVDBId}, Imdb={Imdb}, TMDb={TMDb}, TVMazeId={TVMazeId}, TraktId={TraktId}, DoubanId={DoubanId}, Seeders={Seeders}, Peers={Peers}, Poster={Poster}, InfoHash={InfoHash}, MagnetUri={MagnetUri}, MinimumRatio={MinimumRatio}, MinimumSeedTime={MinimumSeedTime}, DownloadVolumeFactor={DownloadVolumeFactor}, UploadVolumeFactor={UploadVolumeFactor}, Gain={Gain}]"; + public override string ToString() => $"[ReleaseInfo: Title={Title}, Guid={Guid}, Link={Link}, Details={Details}, PublishDate={PublishDate}, Category={Category}, Size={Size}, Files={Files}, Grabs={Grabs}, Description={Description}, RageID={RageID}, TVDBId={TVDBId}, Imdb={Imdb}, TMDb={TMDb}, TVMazeId={TVMazeId}, TraktId={TraktId}, DoubanId={DoubanId}, Seeders={Seeders}, Peers={Peers}, Poster={Poster}, InfoHash={InfoHash}, MagnetUri={MagnetUri}, MinimumRatio={MinimumRatio}, MinimumSeedTime={MinimumSeedTime}, DownloadVolumeFactor={DownloadVolumeFactor}, UploadVolumeFactor={UploadVolumeFactor}, Gain={Gain}]"; } } diff --git a/src/Jackett.Common/Utils/ParseUtil.cs b/src/Jackett.Common/Utils/ParseUtil.cs index 3899964ba..d203cc5b4 100644 --- a/src/Jackett.Common/Utils/ParseUtil.cs +++ b/src/Jackett.Common/Utils/ParseUtil.cs @@ -104,5 +104,43 @@ namespace Jackett.Common.Utils var imdbLen = ((int)imdbid > 9999999) ? "D8" : "D7"; return "tt" + ((int)imdbid).ToString(imdbLen); } + + // ex: " 3.5 gb " -> "3758096384" , "3,5GB" -> "3758096384" , "296,98 MB" -> "311406100.48" , "1.018,29 MB" -> "1067754455.04" + // ex: "1.018.29mb" -> "1067754455.04" , "-" -> "0" , "---" -> "0" + public static long GetBytes(string str) + { + var valStr = new string(str.Where(c => char.IsDigit(c) || c == '.' || c == ',').ToArray()); + 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); + } + var unit = new string(str.Where(char.IsLetter).ToArray()); + var val = CoerceFloat(valStr); + return GetBytes(unit, val); + } + + public static long GetBytes(string unit, float value) + { + unit = unit.Replace("i", "").ToLowerInvariant(); + if (unit.Contains("kb")) + return BytesFromKB(value); + if (unit.Contains("mb")) + return BytesFromMB(value); + if (unit.Contains("gb")) + return BytesFromGB(value); + if (unit.Contains("tb")) + return BytesFromTB(value); + return (long)value; + } + + public static long BytesFromTB(float tb) => BytesFromGB(tb * 1024f); + + public static long BytesFromGB(float gb) => BytesFromMB(gb * 1024f); + + public static long BytesFromMB(float mb) => BytesFromKB(mb * 1024f); + + public static long BytesFromKB(float kb) => (long)(kb * 1024f); } } diff --git a/src/Jackett.Test/Common/Utils/ParseUtilTests.cs b/src/Jackett.Test/Common/Utils/ParseUtilTests.cs index 6bf348361..c00613131 100644 --- a/src/Jackett.Test/Common/Utils/ParseUtilTests.cs +++ b/src/Jackett.Test/Common/Utils/ParseUtilTests.cs @@ -39,6 +39,19 @@ namespace Jackett.Test.Common.Utils description.Value.Should().Contain("Know Your Role and Shut Your Mouth!"); } + [TestCase("1023.4 KB", 1047961)] + [TestCase("1023.4 MB", 1073112704)] + [TestCase("1,023.4 MB", 1073112704)] + [TestCase("1.023,4 MB", 1073112704)] + [TestCase("1 023,4 MB", 1073112704)] + [TestCase("1.023.4 MB", 1073112704)] + [TestCase("1023.4 GB", 1098867408896)] + [TestCase("1023.4 TB", 1125240226709504)] + public void should_parse_size(string stringSize, long size) + { + ParseUtil.GetBytes(stringSize).Should().Be(size); + } + [TestCase(" some string ", "some string")] public void should_normalize_multiple_spaces(string original, string newString) {