From b5a6aab894d45c2d43f71e4db3452e5932d77fa7 Mon Sep 17 00:00:00 2001 From: Cory Date: Thu, 26 Mar 2020 17:15:28 -0500 Subject: [PATCH] core: prefer object initializers (#7342) --- src/Jackett.Common/Indexers/720pier.cs | 67 +++++++-------- .../Indexers/Abstract/GazelleTracker.cs | 47 +++++----- src/Jackett.Common/Indexers/AniDub.cs | 5 +- src/Jackett.Common/Indexers/AnimeBytes.cs | 3 +- src/Jackett.Common/Indexers/AnimeTorrents.cs | 16 ++-- .../Indexers/BroadcastTheNet.cs | 71 +++++++++------- .../Indexers/CardigannIndexer.cs | 61 +++++++------ src/Jackett.Common/Indexers/Corsarored.cs | 38 ++++----- src/Jackett.Common/Indexers/DigitalHive.cs | 17 ++-- src/Jackett.Common/Indexers/DivxTotal.cs | 41 +++++---- src/Jackett.Common/Indexers/EliteTracker.cs | 26 +++--- src/Jackett.Common/Indexers/EpubLibre.cs | 1 - src/Jackett.Common/Indexers/GazelleGames.cs | 85 ++++++++----------- src/Jackett.Common/Indexers/HDBitsApi.cs | 84 +++++++++--------- src/Jackett.Common/Indexers/HDOlimpo.cs | 64 +++++++------- src/Jackett.Common/Indexers/HorribleSubs.cs | 7 +- src/Jackett.Common/Indexers/LostFilm.cs | 56 +++++++----- src/Jackett.Common/Indexers/MejorTorrent.cs | 44 +++++----- src/Jackett.Common/Indexers/MoreThanTV.cs | 12 +-- src/Jackett.Common/Indexers/MyAnonamouse.cs | 32 +++---- src/Jackett.Common/Indexers/NewRealWorld.cs | 67 ++++++++------- src/Jackett.Common/Indexers/Newpct.cs | 64 +++++++------- src/Jackett.Common/Indexers/PassThePopcorn.cs | 49 ++++++----- src/Jackett.Common/Indexers/PiXELHD.cs | 56 ++++++------ src/Jackett.Common/Indexers/PirateTheNet.cs | 51 +++++------ src/Jackett.Common/Indexers/PolishTracker.cs | 8 +- src/Jackett.Common/Indexers/Pretome.cs | 60 +++++++------ src/Jackett.Common/Indexers/Rarbg.cs | 80 +++++++++-------- src/Jackett.Common/Indexers/RevolutionTT.cs | 6 +- src/Jackett.Common/Indexers/SceneHD.cs | 7 +- src/Jackett.Common/Indexers/SceneTime.cs | 1 + src/Jackett.Common/Indexers/Shazbat.cs | 1 + src/Jackett.Common/Indexers/ShowRSS.cs | 58 ++++++------- src/Jackett.Common/Indexers/SolidTorrents.cs | 50 +++++------ src/Jackett.Common/Indexers/SpeedCD.cs | 40 ++++----- src/Jackett.Common/Indexers/TVVault.cs | 69 ++++++++------- src/Jackett.Common/Indexers/TVstore.cs | 36 ++++---- src/Jackett.Common/Indexers/TorrentDay.cs | 50 +++++------ src/Jackett.Common/Indexers/TorrentHeaven.cs | 60 ++++++------- src/Jackett.Common/Indexers/TorrentNetwork.cs | 71 +++++++++------- .../Indexers/TorrentSyndikat.cs | 81 ++++++++---------- src/Jackett.Common/Indexers/Torrentech.cs | 16 ++-- src/Jackett.Common/Indexers/Torrentscsv.cs | 65 +++++++------- src/Jackett.Common/Indexers/Xthor.cs | 16 ++-- src/Jackett.Common/Indexers/pornolab.cs | 60 ++++++------- src/Jackett.Common/Indexers/rutracker.cs | 56 ++++++------ src/Jackett.Common/Indexers/toloka.cs | 52 ++++++------ src/Jackett.Common/Indexers/yts.cs | 11 ++- .../Models/Config/ServerConfig.cs | 2 +- src/Jackett.Common/Models/DTO/ApiSearch.cs | 10 +-- .../Bespoke/ConfigurationHDBitsApi.cs | 6 +- .../Models/IndexerConfig/ConfigurationData.cs | 10 ++- src/Jackett.Common/Models/ReleaseInfo.cs | 2 +- src/Jackett.Common/Models/TorznabQuery.cs | 45 +++++----- src/Jackett.Common/Services/CacheService.cs | 23 ++--- src/Jackett.Common/Services/ImdbResolver.cs | 6 +- .../Services/IndexerManagerService.cs | 16 ++-- src/Jackett.Common/Services/UpdateService.cs | 8 +- .../Utils/Clients/HttpWebClient2.cs | 12 ++- .../Utils/Clients/HttpWebClient2NetCore.cs | 12 ++- src/Jackett.Common/Utils/JsonContent.cs | 2 +- src/Jackett.Common/Utils/LoggingSetup.cs | 38 +++++---- 62 files changed, 1146 insertions(+), 1064 deletions(-) diff --git a/src/Jackett.Common/Indexers/720pier.cs b/src/Jackett.Common/Indexers/720pier.cs index a8e1c3ef2..e11e46aff 100644 --- a/src/Jackett.Common/Indexers/720pier.cs +++ b/src/Jackett.Common/Indexers/720pier.cs @@ -186,29 +186,12 @@ namespace Jackett.Common.Indexers { try { - var release = new ReleaseInfo - { - MinimumRatio = 1, - MinimumSeedTime = 0, - DownloadVolumeFactor = 1, - UploadVolumeFactor = 1, - Seeders = ParseUtil.CoerceInt(row.QuerySelector("span.seed").TextContent), - Grabs = ParseUtil.CoerceLong(row.QuerySelector("span.complet").TextContent), - }; - release.Peers = ParseUtil.CoerceInt(row.QuerySelector("span.leech").TextContent) + release.Seeders; - + var seeders = ParseUtil.CoerceInt(row.QuerySelector("span.seed").TextContent); + var grabs = ParseUtil.CoerceLong(row.QuerySelector("span.complet").TextContent); var qDetailsLink = row.QuerySelector("a.topictitle"); - - release.Title = qDetailsLink.TextContent; - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - release.Guid = release.Comments; - var detailsResult = await RequestStringWithCookies(SiteLink + qDetailsLink.GetAttribute("href")); var detailsResultDocument = resultParser.ParseDocument(detailsResult.Content); var qDownloadLink = detailsResultDocument.QuerySelector("table.table2 > tbody > tr > td > a[href^=\"/download/torrent\"]"); - - release.Link = new Uri(SiteLink + qDownloadLink.GetAttribute("href").TrimStart('/')); - var author = row.QuerySelector("dd.lastpost > span"); var timestr = author.TextContent.Split('\n') .Where(str => !string.IsNullOrWhiteSpace(str)) //Filter blank lines @@ -216,24 +199,38 @@ namespace Jackett.Common.Indexers .FirstOrDefault() .Trim(); - release.PublishDate = DateTimeUtil.FromUnknown(timestr, "UK"); - var forum = row.QuerySelector("a[href^=\"./viewforum.php?f=\"]"); var forumid = forum.GetAttribute("href").Split('=')[1]; - - release.Category = MapTrackerCatToNewznab(forumid); - - var size = row.QuerySelector("dl.row-item > dt > div.list-inner > div[style^=\"float:right\"]").TextContent; - size = size.Replace("GiB", "GB"); - size = size.Replace("MiB", "MB"); - size = size.Replace("KiB", "KB"); - - size = size.Replace("ГБ", "GB"); - size = size.Replace("МБ", "MB"); - size = size.Replace("КБ", "KB"); - - release.Size = ReleaseInfo.GetBytes(size); - + var sizeString = row.QuerySelector("dl.row-item > dt > div.list-inner > div[style^=\"float:right\"]") + .TextContent + .Replace("GiB", "GB") + .Replace("MiB", "MB") + .Replace("KiB", "KB") + .Replace("ГБ", "GB") + .Replace("МБ", "MB") + .Replace("КБ", "KB"); + var comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + var leechers = ParseUtil.CoerceInt(row.QuerySelector("span.leech").TextContent); + var link = new Uri(SiteLink + qDownloadLink.GetAttribute("href").TrimStart('/')); + var publishDate = DateTimeUtil.FromUnknown(timestr, "UK"); + var size = ReleaseInfo.GetBytes(sizeString); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 0, + DownloadVolumeFactor = 1, + UploadVolumeFactor = 1, + Seeders = seeders, + Grabs = grabs, + Peers = leechers + seeders, + Title = qDetailsLink.TextContent, + Comments = comments, + Guid = comments, + Link = link, + PublishDate = publishDate, + Category = MapTrackerCatToNewznab(forumid), + Size = size, + }; releases.Add(release); } catch (Exception ex) diff --git a/src/Jackett.Common/Indexers/Abstract/GazelleTracker.cs b/src/Jackett.Common/Indexers/Abstract/GazelleTracker.cs index a0612314b..f13f68b34 100644 --- a/src/Jackett.Common/Indexers/Abstract/GazelleTracker.cs +++ b/src/Jackett.Common/Indexers/Abstract/GazelleTracker.cs @@ -146,12 +146,13 @@ namespace Jackett.Common.Indexers.Abstract var searchString = GetSearchTerm(query); var searchUrl = APIUrl; - var queryCollection = new NameValueCollection(); - - queryCollection.Add("action", "browse"); - //queryCollection.Add("group_results", "0"); # results won't include all information - queryCollection.Add("order_by", "time"); - queryCollection.Add("order_way", "desc"); + var queryCollection = new NameValueCollection + { + { "action", "browse" }, + //{"group_results", "0"}, # results won't include all information + { "order_by", "time" }, + { "order_way", "desc" } + }; if (!string.IsNullOrWhiteSpace(query.ImdbID)) @@ -208,26 +209,28 @@ namespace Jackett.Common.Indexers.Abstract var tags = r["tags"].ToList(); var groupYear = (string)r["groupYear"]; var releaseType = (string)r["releaseType"]; - - var release = new ReleaseInfo(); - - release.PublishDate = groupTime; - - if (!string.IsNullOrEmpty(cover)) - release.BannerUrl = new Uri(cover); - - release.Title = ""; + var title = new StringBuilder(); if (!string.IsNullOrEmpty(artist)) - release.Title += artist + " - "; - release.Title += groupName; + title.Append(artist + " - "); + title.Append(groupName); if (!string.IsNullOrEmpty(groupYear) && groupYear != "0") - release.Title += " [" + groupYear + "]"; + title.Append(" [" + groupYear + "]"); if (!string.IsNullOrEmpty(releaseType) && releaseType != "Unknown") - release.Title += " [" + releaseType + "]"; + title.Append(" [" + releaseType + "]"); + var description = tags?.Any() == true && !string.IsNullOrEmpty(tags[0].ToString()) + ? "Tags: " + string.Join(", ", tags) + "\n" + : null; + Uri banner = null; + if (!string.IsNullOrEmpty(cover)) + banner = new Uri(cover); + var release = new ReleaseInfo + { + PublishDate = groupTime, + Title = title.ToString(), + Description = description, + BannerUrl = banner + }; - release.Description = ""; - if (tags != null && tags.Count > 0 && (string)tags[0] != "") - release.Description += "Tags: " + string.Join(", ", tags) + "\n"; if (imdbInTags) { diff --git a/src/Jackett.Common/Indexers/AniDub.cs b/src/Jackett.Common/Indexers/AniDub.cs index 87fd382b7..715875259 100644 --- a/src/Jackett.Common/Indexers/AniDub.cs +++ b/src/Jackett.Common/Indexers/AniDub.cs @@ -220,12 +220,11 @@ namespace Jackett.Common.Indexers } var seeders = GetReleaseSeeders(tabNode); - - + var guid = new Uri(GetReleaseGuid(url, tabNode)); var release = new ReleaseInfo { Title = BuildReleaseTitle(baseTitle, tabNode), - Guid = new Uri(GetReleaseGuid(url, tabNode)), + Guid = guid, Comments = uri, Link = GetReleaseLink(tabNode), PublishDate = date, diff --git a/src/Jackett.Common/Indexers/AnimeBytes.cs b/src/Jackett.Common/Indexers/AnimeBytes.cs index b760c39bb..39d11806f 100644 --- a/src/Jackett.Common/Indexers/AnimeBytes.cs +++ b/src/Jackett.Common/Indexers/AnimeBytes.cs @@ -363,13 +363,14 @@ namespace Jackett.Common.Indexers releaseTitle = string.Format("{0}{1} {2} {3}", releasegroup, title, releaseInfo, infoString); } + var guid = new Uri(CommentsLinkUri + "&nh=" + StringUtil.Hash(title)); var release = new ReleaseInfo { MinimumRatio = 1, MinimumSeedTime = MinimumSeedTime, Title = releaseTitle, Comments = CommentsLinkUri, - Guid = new Uri(CommentsLinkUri + "&nh=" + StringUtil.Hash(title)), // Sonarr should dedupe on this url - allow a url per name. + Guid = guid, // Sonarr should dedupe on this url - allow a url per name. Link = LinkUri, BannerUrl = ImageUrl, PublishDate = PublushDate, diff --git a/src/Jackett.Common/Indexers/AnimeTorrents.cs b/src/Jackett.Common/Indexers/AnimeTorrents.cs index e48d9cd19..e274403a5 100644 --- a/src/Jackett.Common/Indexers/AnimeTorrents.cs +++ b/src/Jackett.Common/Indexers/AnimeTorrents.cs @@ -98,15 +98,15 @@ namespace Jackett.Common.Indexers // replace any space, special char, etc. with % (wildcard) var ReplaceRegex = new Regex("[^a-zA-Z0-9]+"); searchString = ReplaceRegex.Replace(searchString, "%"); - var searchUrl = SearchUrl; - var queryCollection = new NameValueCollection(); - - queryCollection.Add("total", "146"); // Not sure what this is about but its required! - queryCollection.Add("cat", MapTorznabCapsToTrackers(query).FirstIfSingleOrDefault("0")); - queryCollection.Add("searchin", "filename"); - queryCollection.Add("search", searchString); - queryCollection.Add("page", "1"); + var queryCollection = new NameValueCollection + { + {"total", "146"}, // Not sure what this is about but its required! + {"cat", MapTorznabCapsToTrackers(query).FirstIfSingleOrDefault("0")}, + {"page", "1"}, + {"searchin", "filename"}, + {"search", searchString} + }; searchUrl += "?" + queryCollection.GetQueryString(); var extraHeaders = new Dictionary() diff --git a/src/Jackett.Common/Indexers/BroadcastTheNet.cs b/src/Jackett.Common/Indexers/BroadcastTheNet.cs index dc7ae0da2..ad6b120d9 100644 --- a/src/Jackett.Common/Indexers/BroadcastTheNet.cs +++ b/src/Jackett.Common/Indexers/BroadcastTheNet.cs @@ -99,11 +99,13 @@ namespace Jackett.Common.Indexers searchString = Regex.Replace(searchString, @"[Ss]{1}\d{2}", $"Season {query.Season}"); } - var parameters = new JArray(); - parameters.Add(new JValue(configData.Key.Value)); - parameters.Add(new JValue(searchString.Trim())); - parameters.Add(new JValue(btnResults)); - parameters.Add(new JValue(btnOffset)); + var parameters = new JArray + { + new JValue(configData.Key.Value), + new JValue(searchString.Trim()), + new JValue(btnResults), + new JValue(btnOffset) + }; var response = await PostDataWithCookiesAndRetry(APIBASE, null, null, null, new Dictionary() { { "Accept", "application/json-rpc, application/json"}, @@ -114,35 +116,12 @@ namespace Jackett.Common.Indexers { var btnResponse = JsonConvert.DeserializeObject(response.Content); - if (btnResponse != null && btnResponse.Result != null && btnResponse.Result.Torrents != null) + if (btnResponse?.Result?.Torrents != null) { foreach (var itemKey in btnResponse.Result.Torrents) { - var descriptions = new List(); var btnResult = itemKey.Value; - var item = new ReleaseInfo(); - if (!string.IsNullOrEmpty(btnResult.SeriesBanner)) - item.BannerUrl = new Uri(btnResult.SeriesBanner); - item.Category = MapTrackerCatToNewznab(btnResult.Resolution); - if (item.Category.Count == 0) // default to TV - item.Category.Add(TorznabCatType.TV.ID); - item.Comments = new Uri($"{SiteLink}torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}"); - item.Guid = new Uri(btnResult.DownloadURL); - if (!string.IsNullOrWhiteSpace(btnResult.ImdbID)) - item.Imdb = ParseUtil.CoerceLong(btnResult.ImdbID); - item.Link = new Uri(btnResult.DownloadURL); - item.MinimumRatio = 1; - item.PublishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time); - item.RageID = btnResult.TvrageID; - item.Seeders = btnResult.Seeders; - item.Peers = btnResult.Seeders + btnResult.Leechers; - item.Size = btnResult.Size; - item.TVDBId = btnResult.TvdbID; - item.Title = btnResult.ReleaseName; - item.UploadVolumeFactor = 1; - item.DownloadVolumeFactor = 0; // ratioless - item.Grabs = btnResult.Snatched; - + var descriptions = new List(); if (!string.IsNullOrWhiteSpace(btnResult.Series)) descriptions.Add("Series: " + btnResult.Series); if (!string.IsNullOrWhiteSpace(btnResult.GroupName)) @@ -159,10 +138,36 @@ namespace Jackett.Common.Indexers descriptions.Add("Origin: " + btnResult.Origin); if (!string.IsNullOrWhiteSpace(btnResult.Series)) descriptions.Add("Youtube Trailer: " + btnResult.YoutubeTrailer + ""); + var imdb = ParseUtil.GetImdbID(btnResult.ImdbID); + var link = new Uri(btnResult.DownloadURL); + var comments = new Uri($"{SiteLink}torrents.php?id={btnResult.GroupID}&torrentid={btnResult.TorrentID}"); + var publishDate = DateTimeUtil.UnixTimestampToDateTime(btnResult.Time); + var release = new ReleaseInfo + { + Category = MapTrackerCatToNewznab(btnResult.Resolution), + Comments = comments, + Guid = link, + Link = link, + MinimumRatio = 1, + PublishDate = publishDate, + RageID = btnResult.TvrageID, + Seeders = btnResult.Seeders, + Peers = btnResult.Seeders + btnResult.Leechers, + Size = btnResult.Size, + TVDBId = btnResult.TvdbID, + Title = btnResult.ReleaseName, + UploadVolumeFactor = 1, + DownloadVolumeFactor = 0, // ratioless + Grabs = btnResult.Snatched, + Description = string.Join("
\n", descriptions), + Imdb = imdb + }; + if (!string.IsNullOrEmpty(btnResult.SeriesBanner)) + release.BannerUrl = new Uri(btnResult.SeriesBanner); + if (!release.Category.Any()) // default to TV + release.Category.Add(TorznabCatType.TV.ID); - item.Description = string.Join("
\n", descriptions); - - releases.Add(item); + releases.Add(release); } } } diff --git a/src/Jackett.Common/Indexers/CardigannIndexer.cs b/src/Jackett.Common/Indexers/CardigannIndexer.cs index 658d2dd79..04425e458 100644 --- a/src/Jackett.Common/Indexers/CardigannIndexer.cs +++ b/src/Jackett.Common/Indexers/CardigannIndexer.cs @@ -52,9 +52,11 @@ namespace Jackett.Common.Indexers // Add default data if necessary if (Definition.Settings == null) { - Definition.Settings = new List(); - Definition.Settings.Add(new settingsField { Name = "username", Label = "Username", Type = "text" }); - Definition.Settings.Add(new settingsField { Name = "password", Label = "Password", Type = "password" }); + Definition.Settings = new List + { + new settingsField { Name = "username", Label = "Username", Type = "text" }, + new settingsField { Name = "password", Label = "Password", Type = "password" } + }; } if (Definition.Encoding == null) @@ -71,10 +73,11 @@ namespace Jackett.Common.Indexers // convert definitions with a single search Path to a Paths entry if (Definition.Search.Path != null) { - var legacySearchPath = new searchPathBlock(); - legacySearchPath.Path = Definition.Search.Path; - legacySearchPath.Inheritinputs = true; - Definition.Search.Paths.Add(legacySearchPath); + Definition.Search.Paths.Add(new searchPathBlock + { + Path = Definition.Search.Path, + Inheritinputs = true + }); } // init missing mandatory attributes @@ -90,9 +93,10 @@ namespace Jackett.Common.Indexers DefaultSiteLink += "/"; Language = Definition.Language; Type = Definition.Type; - TorznabCaps = new TorznabCapabilities(); - - TorznabCaps.SupportsImdbMovieSearch = Definition.Caps.Modes.Where(c => c.Key == "movie-search" && c.Value.Contains("imdbid")).Any(); + TorznabCaps = new TorznabCapabilities + { + SupportsImdbMovieSearch = Definition.Caps.Modes.Any(c => c.Key == "movie-search" && c.Value.Contains("imdbid")) + }; if (Definition.Caps.Modes.ContainsKey("music-search")) TorznabCaps.SupportedMusicSearchParamsList = Definition.Caps.Modes["music-search"]; @@ -204,9 +208,10 @@ namespace Jackett.Common.Indexers protected Dictionary getTemplateVariablesFromConfigData() { - var variables = new Dictionary(); - - variables[".Config.sitelink"] = SiteLink; + var variables = new Dictionary + { + [".Config.sitelink"] = SiteLink + }; foreach (var Setting in Definition.Settings) { var item = configData.GetDynamic(Setting.Name); @@ -509,10 +514,12 @@ namespace Jackett.Common.Indexers var CloudFlareCaptchaChallenge = landingResultDocument.QuerySelector("script[src=\"/cdn-cgi/scripts/cf.challenge.js\"]"); if (CloudFlareCaptchaChallenge != null) { - var CloudFlareQueryCollection = new NameValueCollection(); - CloudFlareQueryCollection["id"] = CloudFlareCaptchaChallenge.GetAttribute("data-ray"); + var CloudFlareQueryCollection = new NameValueCollection + { + ["id"] = CloudFlareCaptchaChallenge.GetAttribute("data-ray"), - CloudFlareQueryCollection["g-recaptcha-response"] = CaptchaConfigItem.Value; + ["g-recaptcha-response"] = CaptchaConfigItem.Value + }; var ClearanceUrl = resolvePath("/cdn-cgi/l/chk_captcha?" + CloudFlareQueryCollection.GetQueryString()); var ClearanceResult = await RequestStringWithCookies(ClearanceUrl.ToString(), null, SiteLink); @@ -890,12 +897,14 @@ namespace Jackett.Common.Indexers if (cloudFlareCaptchaScript != null && grecaptcha != null && cloudFlareCaptchaDisplay) { hasCaptcha = true; - var CaptchaItem = new RecaptchaItem(); - CaptchaItem.Name = "Captcha"; - CaptchaItem.Version = "2"; - CaptchaItem.SiteKey = grecaptcha.GetAttribute("data-sitekey"); - if (CaptchaItem.SiteKey == null) // some sites don't store the sitekey in the .g-recaptcha div (e.g. cloudflare captcha challenge page) - CaptchaItem.SiteKey = landingResultDocument.QuerySelector("[data-sitekey]").GetAttribute("data-sitekey"); + var CaptchaItem = new RecaptchaItem + { + Name = "Captcha", + Version = "2", + // some sites don't store the sitekey in the .g-recaptcha div (e.g. cloudflare captcha challenge page) + SiteKey = grecaptcha.GetAttribute("data-sitekey") ?? + landingResultDocument.QuerySelector("[data-sitekey]").GetAttribute("data-sitekey") + }; configData.AddDynamic("Captcha", CaptchaItem); } @@ -1400,9 +1409,11 @@ namespace Jackett.Common.Indexers { try { - var release = new ReleaseInfo(); - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 172800 // 48 hours + }; // Parse fields foreach (var Field in Search.Fields) diff --git a/src/Jackett.Common/Indexers/Corsarored.cs b/src/Jackett.Common/Indexers/Corsarored.cs index ce8f9e9bd..143179412 100644 --- a/src/Jackett.Common/Indexers/Corsarored.cs +++ b/src/Jackett.Common/Indexers/Corsarored.cs @@ -219,35 +219,33 @@ namespace Jackett.Common.Indexers private ReleaseInfo MakeRelease(JToken torrent) { //https://corsaro.red/details/E5BB62E2E58C654F4450325046723A3F013CD7A4 - var release = new ReleaseInfo + var magnetUri = new Uri((string)torrent["magnet"]); + var comments = new Uri($"{SiteLink}details/{(string)torrent["hash"]}"); + var seeders = (int)torrent["seeders"]; + var publishDate = torrent["last_updated"] != null + ? DateTime.Parse((string)torrent["last_updated"]) + : DateTime.Now; + var cat = (int)torrent["category"]; + var size = torrent["size"]?.ToObject(); + return new ReleaseInfo { Title = (string)torrent["title"], Grabs = (long)torrent["completed"], Description = $"{(string)torrent["category"]} {(string)torrent["description"]}", - Seeders = (int)torrent["seeders"], + Seeders = seeders, InfoHash = (string)torrent["hash"], - MagnetUri = new Uri((string)torrent["magnet"]), - Comments = new Uri($"{SiteLink}details/{(string)torrent["hash"]}"), + MagnetUri = magnetUri, + Comments = comments, MinimumRatio = 1, MinimumSeedTime = 172800, // 48 hours DownloadVolumeFactor = 0, - UploadVolumeFactor = 1 + UploadVolumeFactor = 1, + Guid = comments, + Peers = seeders + (int)torrent["leechers"], + PublishDate = publishDate, + Category = MapTrackerCatToNewznab(cat.ToString()), + Size = size }; - - release.Guid = release.Comments; - release.Peers = release.Seeders + (int)torrent["leechers"]; - - release.PublishDate = DateTime.Now; - if (torrent["last_updated"] != null) - release.PublishDate = DateTime.Parse((string)torrent["last_updated"]); - - var cat = (int)torrent["category"]; - release.Category = MapTrackerCatToNewznab(cat.ToString()); - - if (torrent["size"] != null) - release.Size = (long)torrent["size"]; - - return release; } } } diff --git a/src/Jackett.Common/Indexers/DigitalHive.cs b/src/Jackett.Common/Indexers/DigitalHive.cs index 5f60d7e56..e6641a847 100644 --- a/src/Jackett.Common/Indexers/DigitalHive.cs +++ b/src/Jackett.Common/Indexers/DigitalHive.cs @@ -102,16 +102,15 @@ namespace Jackett.Common.Indexers result.Captcha.Version = "2"; return result; } - else + + return new ConfigurationDataBasicLogin { - var result = new ConfigurationDataBasicLogin(); - result.SiteLink.Value = configData.SiteLink.Value; - result.Instructions.Value = configData.Instructions.Value; - result.Username.Value = configData.Username.Value; - result.Password.Value = configData.Password.Value; - result.CookieHeader.Value = loginPage.Cookies; - return result; - } + SiteLink = {Value = configData.SiteLink.Value}, + Instructions = {Value = configData.Instructions.Value}, + Username = {Value = configData.Username.Value}, + Password = {Value = configData.Password.Value}, + CookieHeader = {Value = loginPage.Cookies} + }; } public override async Task ApplyConfiguration(JToken configJson) diff --git a/src/Jackett.Common/Indexers/DivxTotal.cs b/src/Jackett.Common/Indexers/DivxTotal.cs index 07d817773..6742a1c31 100644 --- a/src/Jackett.Common/Indexers/DivxTotal.cs +++ b/src/Jackett.Common/Indexers/DivxTotal.cs @@ -294,28 +294,25 @@ namespace Jackett.Common.Indexers private void GenerateRelease(ICollection releases, string title, string commentsLink, string downloadLink, string cat, DateTime publishDate, long size) { - // ReSharper disable once UseObjectOrCollectionInitializer - var release = new ReleaseInfo(); - - release.Title = title; - release.Comments = new Uri(commentsLink); - release.Link = new Uri(downloadLink); - release.Guid = release.Link; - - release.Category = MapTrackerCatToNewznab(cat); - release.PublishDate = publishDate; - release.Size = size; - - release.Files = 1; - - release.Seeders = 1; - release.Peers = 2; - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 1; - + var link = new Uri(downloadLink); + var comments = new Uri(commentsLink); + var release = new ReleaseInfo + { + Title = title, + Comments = comments, + Link = link, + Guid = link, + Category = MapTrackerCatToNewznab(cat), + PublishDate = publishDate, + Size = size, + Files = 1, + Seeders = 1, + Peers = 2, + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1, + }; releases.Add(release); } diff --git a/src/Jackett.Common/Indexers/EliteTracker.cs b/src/Jackett.Common/Indexers/EliteTracker.cs index b29b606d9..212be3bf7 100644 --- a/src/Jackett.Common/Indexers/EliteTracker.cs +++ b/src/Jackett.Common/Indexers/EliteTracker.cs @@ -165,8 +165,8 @@ namespace Jackett.Common.Indexers var pairs = new Dictionary { {"do", "search"}, - {"search_type", !string.IsNullOrWhiteSpace(query.ImdbID) ? "t_genre" : "t_name"}, - {"keywords", !string.IsNullOrWhiteSpace(query.ImdbID) ? query.ImdbID : query.GetQueryString()}, + {"search_type", query.IsImdbQuery ? "t_genre" : "t_name"}, + {"keywords", query.IsImdbQuery ? query.ImdbID : query.GetQueryString()}, {"category", "0"} // multi cat search not supported }; @@ -194,13 +194,12 @@ namespace Jackett.Common.Indexers var cat = row.Children[0].QuerySelector("a").GetAttribute("href").Split('=')[1]; var title = row.Children[1].QuerySelector("a").TextContent; var qLinks = row.Children[2].QuerySelectorAll("a"); - var link = configData.TorrentHTTPSMode.Value ? qLinks[1].GetAttribute("href") : qLinks[0].GetAttribute("href"); - var comments = row.Children[1].QuerySelector("a").GetAttribute("href"); + var link = new Uri(configData.TorrentHTTPSMode.Value ? qLinks[1].GetAttribute("href") : qLinks[0].GetAttribute("href")); + var comments = new Uri(row.Children[1].QuerySelector("a").GetAttribute("href")); var size = row.Children[4].TextContent; var grabs = row.Children[5].QuerySelector("a").TextContent; - var seeders = row.Children[6].QuerySelector("a").TextContent; - var leechers = row.Children[7].QuerySelector("a").TextContent; - + var seeders = ParseUtil.CoerceInt(row.Children[6].QuerySelector("a").TextContent); + var leechers = ParseUtil.CoerceInt(row.Children[7].QuerySelector("a").TextContent); var qTags = row.Children[1].QuerySelector("div:has(span[style=\"float: right;\"])"); var dlVolumeFactor = 1.0; if (qTags.QuerySelector("img[alt^=\"TORRENT GRATUIT\"]") != null) @@ -209,23 +208,22 @@ namespace Jackett.Common.Indexers dlVolumeFactor = 0.5; var upVolumeFactor = qTags.QuerySelector("img[alt^=\"TORRENT X2\"]") != null ? 2.0 : 1.0; - var release = new ReleaseInfo { MinimumRatio = 1, MinimumSeedTime = 0, Category = MapTrackerCatToNewznab(cat), Title = title, - Link = new Uri(link), - Comments = new Uri(comments), + Link = link, + Comments = comments, Size = ReleaseInfo.GetBytes(size), - Seeders = ParseUtil.CoerceInt(seeders), + Seeders = seeders, Grabs = ParseUtil.CoerceLong(grabs), DownloadVolumeFactor = dlVolumeFactor, - UploadVolumeFactor = upVolumeFactor + UploadVolumeFactor = upVolumeFactor, + Peers = leechers + seeders, + Guid = link }; - release.Peers = ParseUtil.CoerceInt(leechers) + release.Seeders; - release.Guid = release.Link; var qTooltip = row.Children[1].QuerySelector("div.tooltip-content"); if (qTooltip != null) diff --git a/src/Jackett.Common/Indexers/EpubLibre.cs b/src/Jackett.Common/Indexers/EpubLibre.cs index 9958353d5..6d5407956 100644 --- a/src/Jackett.Common/Indexers/EpubLibre.cs +++ b/src/Jackett.Common/Indexers/EpubLibre.cs @@ -113,7 +113,6 @@ namespace Jackett.Common.Indexers // publish date is not available in the torrent list, but we add a relative date so we can sort lastPublishDate = lastPublishDate.AddMinutes(-1); - var release = new ReleaseInfo { Title = title, diff --git a/src/Jackett.Common/Indexers/GazelleGames.cs b/src/Jackett.Common/Indexers/GazelleGames.cs index a92e9ff0f..e91d1970e 100644 --- a/src/Jackett.Common/Indexers/GazelleGames.cs +++ b/src/Jackett.Common/Indexers/GazelleGames.cs @@ -5,6 +5,7 @@ using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; +using AngleSharp.Dom; using AngleSharp.Html.Parser; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig; @@ -268,68 +269,50 @@ namespace Jackett.Common.Indexers if (Row.QuerySelector("td.edition_info") != null) // ignore edition rows continue; - var release = new ReleaseInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 80 * 3600; - + // some users have an extra colum (8), we can't use nth-last-child + var sizeString = Row.QuerySelector("td:nth-child(4)").TextContent; + if (string.IsNullOrEmpty(sizeString)) // external links, example BlazBlue: Calamity Trigger Manual - Guide [GameDOX - External Link] + continue; var qDetailsLink = Row.QuerySelector("a[href^=\"torrents.php?id=\"]"); + var title = qDetailsLink.TextContent.Replace(", Freeleech!", "").Replace(", Neutral Leech!", ""); + if (stickyGroup && (query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(title)) // AND match for sticky releases + continue; var qDescription = qDetailsLink.QuerySelector("span.torrent_info_tags"); var qDLLink = Row.QuerySelector("a[href^=\"torrents.php?action=download\"]"); var qTime = Row.QuerySelector("span.time"); - // some users have an extra colum (8), we can't use nth-last-child - var qSize = Row.QuerySelector("td:nth-child(4)"); var qGrabs = Row.QuerySelector("td:nth-child(5)"); var qSeeders = Row.QuerySelector("td:nth-child(6)"); var qLeechers = Row.QuerySelector("td:nth-child(7)"); var qFreeLeech = Row.QuerySelector("strong.freeleech_label"); var qNeutralLeech = Row.QuerySelector("strong.neutralleech_label"); - var RowTitle = Row.GetAttribute("title"); - var Time = qTime.GetAttribute("title"); - release.PublishDate = DateTime.SpecifyKind(DateTime.ParseExact(Time, "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture), DateTimeKind.Unspecified).ToLocalTime(); - release.Category = GroupCategory; - - if (qDescription != null) - release.Description = qDescription.TextContent; - - release.Title = qDetailsLink.TextContent; - release.Title = release.Title.Replace(", Freeleech!", ""); - release.Title = release.Title.Replace(", Neutral Leech!", ""); - - if (stickyGroup) // AND match for sticky releases - if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title)) - continue; - - var Size = qSize.TextContent; - if (string.IsNullOrEmpty(Size)) // external links, example BlazBlue: Calamity Trigger Manual - Guide [GameDOX - External Link] - continue; - release.Size = ReleaseInfo.GetBytes(Size); - - release.Link = new Uri(SiteLink + qDLLink.GetAttribute("href")); - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - release.Guid = release.Link; - - release.Grabs = ParseUtil.CoerceLong(qGrabs.TextContent); - release.Seeders = ParseUtil.CoerceInt(qSeeders.TextContent); - release.Peers = ParseUtil.CoerceInt(qLeechers.TextContent) + release.Seeders; - - if (qFreeLeech != null) + var link = new Uri(SiteLink + qDLLink.GetAttribute("href")); + var seeders = ParseUtil.CoerceInt(qSeeders.TextContent); + var publishDate = DateTime.SpecifyKind( + DateTime.ParseExact(Time, "MMM dd yyyy, HH:mm", CultureInfo.InvariantCulture), + DateTimeKind.Unspecified).ToLocalTime(); + var comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + var grabs = ParseUtil.CoerceLong(qGrabs.TextContent); + var leechers = ParseUtil.CoerceInt(qLeechers.TextContent); + var size = ReleaseInfo.GetBytes(sizeString); + var release = new ReleaseInfo { - release.UploadVolumeFactor = 1; - release.DownloadVolumeFactor = 0; - } - else if (qNeutralLeech != null) - { - release.UploadVolumeFactor = 0; - release.DownloadVolumeFactor = 0; - } - else - { - release.UploadVolumeFactor = 1; - release.DownloadVolumeFactor = 1; - } - + MinimumRatio = 1, + MinimumSeedTime = 288000, //80 hours + Category = GroupCategory, + PublishDate = publishDate, + Size = size, + Comments = comments, + Link = link, + Guid = link, + Grabs = grabs, + Seeders = seeders, + Peers = leechers + seeders, + Title = title, + Description = qDescription?.TextContent, + UploadVolumeFactor = qNeutralLeech is null ? 1 : 0, + DownloadVolumeFactor = qFreeLeech != null || qNeutralLeech != null ? 0 : 1, + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/HDBitsApi.cs b/src/Jackett.Common/Indexers/HDBitsApi.cs index fcccf0a2c..023695bd5 100644 --- a/src/Jackett.Common/Indexers/HDBitsApi.cs +++ b/src/Jackett.Common/Indexers/HDBitsApi.cs @@ -123,14 +123,30 @@ namespace Jackett.Common.Indexers var response = await MakeApiRequest("torrents", requestData); var releases = new List(); - foreach (JObject r in response["data"]) { - var release = new ReleaseInfo(); - release.Title = (string)r["name"]; - release.Comments = new Uri(SiteLink + "details.php?id=" + (string)r["id"]); - release.Link = new Uri(SiteLink + "download.php/" + (string)r["filename"] + "?id=" + (string)r["id"] + "&passkey=" + configData.Passkey.Value); - release.Guid = release.Link; + var link = new Uri( + SiteLink + "download.php/" + (string)r["filename"] + "?id=" + (string)r["id"] + "&passkey=" + + configData.Passkey.Value); + var seeders = (int)r["seeders"]; + var publishDate = DateTimeUtil.UnixTimestampToDateTime((int)r["utadded"]); + var comments = new Uri(SiteLink + "details.php?id=" + (string)r["id"]); + var release = new ReleaseInfo + { + Title = (string)r["name"], + Comments = comments, + Link = link, + Category = MapTrackerCatToNewznab((string)r["type_category"]), + Size = (long)r["size"], + Files = (long)r["numfiles"], + Grabs = (long)r["times_completed"], + Seeders = seeders, + PublishDate = publishDate, + UploadVolumeFactor = GetUploadFactor(r), + DownloadVolumeFactor = GetDownloadFactor(r), + Guid = link, + Peers = seeders + (int)r["leechers"] + }; if (r.ContainsKey("imdb")) { @@ -142,49 +158,31 @@ namespace Jackett.Common.Indexers release.TVDBId = (long)r["tvdb"]["id"]; } - release.UploadVolumeFactor = 1; - int[] mediumsFor50 = { 1, 5, 4 }; - - // 100% Neutral Leech: all XXX content. - if ((int)r["type_category"] == 7) - { - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 0; - } - // 100% Free Leech: all blue torrents. - else if ((string)r["freeleech"] == "yes") - { - release.DownloadVolumeFactor = 0; - } - // 50% Free Leech: all full discs, remuxes, caps and all internal encodes. - else if (mediumsFor50.Contains((int)r["type_medium"]) || (int)r["type_origin"] == 1) - { - release.DownloadVolumeFactor = 0.5; - } - // 25% Free Leech: all TV content that is not an internal encode. - else if ((int)r["type_category"] == 2 && (int)r["type_origin"] != 1) - { - release.DownloadVolumeFactor = 0.75; - } - // 0% Free Leech: all the content not matching any of the above. - else - { - release.DownloadVolumeFactor = 1; - } - - release.Category = MapTrackerCatToNewznab((string)r["type_category"]); - release.Size = (long)r["size"]; - release.Files = (long)r["numfiles"]; - release.Grabs = (long)r["times_completed"]; - release.Seeders = (int)r["seeders"]; - release.Peers = release.Seeders + (int)r["leechers"]; - release.PublishDate = DateTimeUtil.UnixTimestampToDateTime((int)r["utadded"]); releases.Add(release); } return releases; } + private static double GetUploadFactor(JObject r) => (int)r["type_category"] == 7 ? 0 : 1; + + private static double GetDownloadFactor(JObject r) + { + var halfLeechMediums = new[] { 1, 5, 4 }; + // 100% Neutral Leech: all XXX content. + if ((int)r["type_category"] == 7) + return 0; + // 100% Free Leech: all blue torrents. + if ((string)r["freeleech"] == "yes") + return 0; + // 50% Free Leech: all full discs, remuxes, caps and all internal encodes. + if (halfLeechMediums.Contains((int)r["type_medium"]) || (int)r["type_origin"] == 1) + return 0.5; + if ((int)r["type_category"] == 2 && (int)r["type_origin"] != 1) + return 0.75; + return 1; + } + private async Task MakeApiRequest(string url, JObject requestData) { requestData["username"] = configData.Username.Value; diff --git a/src/Jackett.Common/Indexers/HDOlimpo.cs b/src/Jackett.Common/Indexers/HDOlimpo.cs index 6bd641d07..7f2e57814 100644 --- a/src/Jackett.Common/Indexers/HDOlimpo.cs +++ b/src/Jackett.Common/Indexers/HDOlimpo.cs @@ -94,6 +94,7 @@ namespace Jackett.Common.Indexers protected override async Task> PerformQuery(TorznabQuery query) { var includePremium = ((BoolItem)configData.GetDynamic("IncludePremium")).Value; + var cats = MapTorznabCapsToTrackers(query); var pairs = new Dictionary { @@ -104,7 +105,7 @@ namespace Jackett.Common.Indexers {"categoria", MapTorznabCapsToTrackers(query).FirstIfSingleOrDefault("0")} }; - var boundary = "---------------------------" + (DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds.ToString(CultureInfo.InvariantCulture).Replace(".", ""); + var boundary = "---------------------------" + DateTimeUtil.DateTimeToUnixTimestamp(DateTime.UtcNow); var bodyParts = new List(); foreach (var pair in pairs) @@ -157,48 +158,47 @@ namespace Jackett.Common.Indexers { foreach (var torrent in torrents) { - var release = new ReleaseInfo(); - - release.Title = (string)torrent["titulo"] + " " + (string)torrent["titulo_extra"]; - + var title = (string)torrent["titulo"] + " " + (string)torrent["titulo_extra"]; // for downloading "premium" torrents you need special account if ((string)torrent["premium"] == "si") { if (includePremium) - release.Title += " [PREMIUM]"; + title += " [PREMIUM]"; else continue; } - release.Comments = new Uri(CommentsUrl + (string)torrent["id"]); - release.Guid = release.Comments; - - release.PublishDate = DateTime.Now; + var comments = new Uri(CommentsUrl + (string)torrent["id"]); + var publishDate = DateTime.Now; if (torrent["created_at"] != null) - release.PublishDate = DateTime.Parse((string)torrent["created_at"]); - + publishDate = DateTime.Parse((string)torrent["created_at"]); + Uri bannerUrl = null; if (torrent["portada"] != null) - release.BannerUrl = new Uri(BannerUrl + (string)(torrent["portada"]["hash"]) + "." + (string)(torrent["portada"]["ext"])); - - release.Category = MapTrackerCatToNewznab((string)torrent["categoria"]); - release.Size = (long)torrent["size"]; - - release.Seeders = (int)torrent["seeders"]; - release.Peers = release.Seeders + (int)torrent["leechers"]; - release.Grabs = (long)torrent["snatched"]; - - release.InfoHash = (string)torrent["plain_info_hash"]; - release.Link = new Uri(DownloadUrl + (string)torrent["id"]); - - var files = (JArray)JsonConvert.DeserializeObject((string)torrent["files_list"]); - release.Files = files.Count; - - release.DownloadVolumeFactor = (string)torrent["freetorrent"] == "0" ? 1 : 0; - release.UploadVolumeFactor = (string)torrent["doubletorrent"] == "0" ? 1 : 2; - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours + bannerUrl = new Uri(BannerUrl + (string)(torrent["portada"]["hash"]) + "." + (string)(torrent["portada"]["ext"])); + var seeders = (int)torrent["seeders"]; + var link = new Uri(DownloadUrl + (string)torrent["id"]); + var fileCount = ((JArray)JsonConvert.DeserializeObject((string)torrent["files_list"])).Count; + var release = new ReleaseInfo + { + Title = title, + Category = MapTrackerCatToNewznab((string)torrent["categoria"]), + Size = (long)torrent["size"], + Grabs = (long)torrent["snatched"], + InfoHash = (string)torrent["plain_info_hash"], + Link = link, + Files = fileCount, + DownloadVolumeFactor = (string)torrent["freetorrent"] == "0" ? 1 : 0, + UploadVolumeFactor = (string)torrent["doubletorrent"] == "0" ? 1 : 2, + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + PublishDate = publishDate, + Comments = comments, + Guid = comments, + Seeders = seeders, + Peers = seeders + (int)torrent["leechers"], + BannerUrl = bannerUrl + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/HorribleSubs.cs b/src/Jackett.Common/Indexers/HorribleSubs.cs index 40be29f40..e6804950c 100644 --- a/src/Jackett.Common/Indexers/HorribleSubs.cs +++ b/src/Jackett.Common/Indexers/HorribleSubs.cs @@ -111,9 +111,10 @@ namespace Jackett.Common.Indexers var ResultParser = new HtmlParser(); var releases = new List(); var searchString = query.GetQueryString(); - var queryCollection = new NameValueCollection(); - - queryCollection.Add("method", "getlatest"); + var queryCollection = new NameValueCollection + { + { "method", "getlatest" } + }; var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString(); var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty); diff --git a/src/Jackett.Common/Indexers/LostFilm.cs b/src/Jackett.Common/Indexers/LostFilm.cs index 74abc200c..1cd4d30d0 100644 --- a/src/Jackett.Common/Indexers/LostFilm.cs +++ b/src/Jackett.Common/Indexers/LostFilm.cs @@ -608,10 +608,12 @@ namespace Jackett.Common.Indexers private async Task> FetchTrackerReleases(TrackerUrlDetails details) { - var queryCollection = new NameValueCollection(); - queryCollection.Add("c", details.seriesId); - queryCollection.Add("s", details.season); - queryCollection.Add("e", string.IsNullOrEmpty(details.episode) ? "999" : details.episode); // 999 is a synonym for the whole serie + var queryCollection = new NameValueCollection + { + { "c", details.seriesId }, + { "s", details.season }, + { "e", string.IsNullOrEmpty(details.episode) ? "999" : details.episode } // 999 is a synonym for the whole serie + }; var url = ReleaseUrl + "?" + queryCollection.GetQueryString(); logger.Debug("FetchTrackerReleases: " + url); @@ -671,12 +673,12 @@ namespace Jackett.Common.Indexers { try { - var release = new ReleaseInfo(); - - release.Category = new int[] { TorznabCatType.TV.ID }; var detailsInfo = row.QuerySelector("div.inner-box--desc").TextContent; var releaseDetails = parseReleaseDetailsRegex.Match(detailsInfo); + + // ReSharper states "Expression is always false" + // TODO Refactor to get the intended operation if (releaseDetails == null) { throw new FormatException("Failed to map release details string: " + detailsInfo); @@ -697,8 +699,11 @@ namespace Jackett.Common.Indexers quality = Regex.Replace(quality, "1080 ", "1080p ", RegexOptions.IgnoreCase); quality = Regex.Replace(quality, "720 ", "720p ", RegexOptions.IgnoreCase); - var techComponents = new string[] { - "rus", quality, "(LostFilm)" + var techComponents = new[] + { + "rus", + quality, + "(LostFilm)" }; var techInfo = string.Join(" ", techComponents.Where(s => !string.IsNullOrEmpty(s))); @@ -707,27 +712,32 @@ namespace Jackett.Common.Indexers var titleComponents = new string[] { serieTitle, details.GetEpisodeString(), episodeName, techInfo }; - release.Title = string.Join(" - ", titleComponents.Where(s => !string.IsNullOrEmpty(s))); - var downloadLink = row.QuerySelector("div.inner-box--link > a"); - release.Link = new Uri(downloadLink.GetAttribute("href")); - release.Guid = release.Link; - var sizeString = releaseDetails.Groups["size"].Value.ToUpper(); sizeString = sizeString.Replace("ТБ", "TB"); // untested sizeString = sizeString.Replace("ГБ", "GB"); sizeString = sizeString.Replace("МБ", "MB"); sizeString = sizeString.Replace("КБ", "KB"); // untested - release.Size = ReleaseInfo.GetBytes(sizeString); - - // add missing torznab fields not available from results - release.Seeders = 1; - release.Peers = 2; - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 1; - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours + var link = new Uri(downloadLink.GetAttribute("href")); + // TODO this feels sparse compared to other trackers. Expand later + var release = new ReleaseInfo + { + Category = new[] {TorznabCatType.TV.ID}, + Title = string.Join(" - ", titleComponents.Where(s => !string.IsNullOrEmpty(s))), + Link = link, + Guid = link, + Size = ReleaseInfo.GetBytes(sizeString), + // add missing torznab fields not available from results + Seeders = 1, + Peers = 2, + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1, + MinimumRatio = 1, + MinimumSeedTime = 172800 // 48 hours + }; + + // TODO Other trackers don't have this log line. Remove or add to other trackers? logger.Debug("> Add: " + release.Title); releases.Add(release); } diff --git a/src/Jackett.Common/Indexers/MejorTorrent.cs b/src/Jackett.Common/Indexers/MejorTorrent.cs index 27b4bfdd6..aa416d3aa 100644 --- a/src/Jackett.Common/Indexers/MejorTorrent.cs +++ b/src/Jackett.Common/Indexers/MejorTorrent.cs @@ -19,6 +19,7 @@ using WebClient = Jackett.Common.Utils.Clients.WebClient; namespace Jackett.Common.Indexers { + //TODO fix ReSharper notice // ReSharper disable once UnusedType.Global public class MejorTorrent : BaseWebIndexer { @@ -363,32 +364,29 @@ namespace Jackett.Common.Indexers GenerateRelease(releases, title, commentsLink, commentsLink, cat, publishDate, size); } - + // TODO refactor for IEnumerable private void GenerateRelease(ICollection releases, string title, string commentsLink, string downloadLink, string cat, DateTime publishDate, long size) { - // ReSharper disable once UseObjectOrCollectionInitializer - var release = new ReleaseInfo(); - - release.Title = title; - release.Comments = new Uri(commentsLink); - release.Link = new Uri(downloadLink); - release.Guid = release.Link; - - release.Category = MapTrackerCatToNewznab(cat); - release.PublishDate = publishDate; - release.Size = size; - - release.Files = 1; - - release.Seeders = 1; - release.Peers = 2; - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 1; - + var link = new Uri(downloadLink); + var comments = new Uri(commentsLink); + var release = new ReleaseInfo + { + Title = title, + Comments = comments, + Link = link, + Guid = link, + Category = MapTrackerCatToNewznab(cat), + PublishDate = publishDate, + Size = size, + Files = 1, + Seeders = 1, + Peers = 2, + MinimumRatio = 1, + MinimumSeedTime = 172800,// 48 hours + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1 + }; releases.Add(release); } diff --git a/src/Jackett.Common/Indexers/MoreThanTV.cs b/src/Jackett.Common/Indexers/MoreThanTV.cs index b435235f6..9936f88a7 100644 --- a/src/Jackett.Common/Indexers/MoreThanTV.cs +++ b/src/Jackett.Common/Indexers/MoreThanTV.cs @@ -22,7 +22,7 @@ namespace Jackett.Common.Indexers private string LoginUrl => SiteLink + "login.php"; private string SearchUrl => SiteLink + "ajax.php?action=browse&searchstr="; private string DownloadUrl => SiteLink + "torrents.php?action=download&id="; - private string GuidUrl => SiteLink + "torrents.php?torrentid="; + private string CommentsUrl => SiteLink + "torrents.php?torrentid="; private ConfigurationDataBasicLogin ConfigData => (ConfigurationDataBasicLogin)configData; @@ -267,13 +267,13 @@ namespace Jackett.Common.Indexers var grabs = int.Parse(torrentData[1].TextContent, NumberStyles.AllowThousands, CultureInfo.InvariantCulture); var seeders = int.Parse(torrentData[2].TextContent, NumberStyles.AllowThousands, CultureInfo.InvariantCulture); var leechers = int.Parse(torrentData[3].TextContent, NumberStyles.AllowThousands, CultureInfo.InvariantCulture); - var guid = new Uri(GuidUrl + torrentId); - + var comments = new Uri(CommentsUrl + torrentId); + var link = new Uri(DownloadUrl + torrentId); return new ReleaseInfo { Title = title, Category = new List { category }, // Who seasons movies right - Link = new Uri(DownloadUrl + torrentId), + Link = link, PublishDate = publishDate, BannerUrl = banner, Description = description, @@ -282,8 +282,8 @@ namespace Jackett.Common.Indexers Files = files, Size = size, Grabs = grabs, - Guid = guid, - Comments = guid, + Guid = comments, + Comments = comments, DownloadVolumeFactor = 0, // ratioless tracker UploadVolumeFactor = 1 }; diff --git a/src/Jackett.Common/Indexers/MyAnonamouse.cs b/src/Jackett.Common/Indexers/MyAnonamouse.cs index 24c518e94..94c769bc9 100644 --- a/src/Jackett.Common/Indexers/MyAnonamouse.cs +++ b/src/Jackett.Common/Indexers/MyAnonamouse.cs @@ -168,21 +168,22 @@ namespace Jackett.Common.Indexers { var releases = new List(); - var qParams = new NameValueCollection(); - qParams.Add("tor[text]", query.GetQueryString()); - qParams.Add("tor[srchIn][title]", "true"); - qParams.Add("tor[srchIn][author]", "true"); - qParams.Add("tor[searchType]", "all"); - qParams.Add("tor[searchIn]", "torrents"); - qParams.Add("tor[hash]", ""); - qParams.Add("tor[sortType]", "default"); - qParams.Add("tor[startNumber]", "0"); - - qParams.Add("thumbnails", "1"); // gives links for thumbnail sized versions of their posters - //qParams.Add("posterLink", "1"); // gives links for a full sized poster - //qParams.Add("dlLink", "1"); // include the url to download the torrent - qParams.Add("description", "1"); // include the description - //qParams.Add("bookmarks", "0"); // include if the item is bookmarked or not + var qParams = new NameValueCollection + { + {"tor[text]", query.GetQueryString()}, + {"tor[srchIn][title]", "true"}, + {"tor[srchIn][author]", "true"}, + {"tor[searchType]", "all"}, + {"tor[searchIn]", "torrents"}, + {"tor[hash]", ""}, + {"tor[sortType]", "default"}, + {"tor[startNumber]", "0"}, + {"thumbnails", "1"}, // gives links for thumbnail sized versions of their posters + //{ "posterLink", "1"}, // gives links for a full sized poster + //{ "dlLink", "1"}, // include the url to download the torrent + {"description", "1"}, // include the description + //{"bookmarks", "0"} // include if the item is bookmarked or not + }; var catList = MapTorznabCapsToTrackers(query); if (catList.Any()) @@ -225,6 +226,7 @@ namespace Jackett.Common.Indexers foreach (var item in jsonContent.Value("data")) { + //TODO shift to ReleaseInfo object initializer for consistency var release = new ReleaseInfo(); var id = item.Value("id"); diff --git a/src/Jackett.Common/Indexers/NewRealWorld.cs b/src/Jackett.Common/Indexers/NewRealWorld.cs index 593bfe8b8..824321db5 100644 --- a/src/Jackett.Common/Indexers/NewRealWorld.cs +++ b/src/Jackett.Common/Indexers/NewRealWorld.cs @@ -131,19 +131,20 @@ namespace Jackett.Common.Indexers var searchString = query.GetQueryString(); var searchUrl = BrowseUrl; - var queryCollection = new NameValueCollection(); - queryCollection.Add("showsearch", "1"); - queryCollection.Add("incldead", "1"); - queryCollection.Add("orderby", "added"); - queryCollection.Add("sort", "desc"); + var queryCollection = new NameValueCollection + { + {"showsearch", "1"}, + {"incldead", "1"}, + {"orderby", "added"}, + {"sort", "desc"}, + {"cat", MapTorznabCapsToTrackers(query).FirstIfSingleOrDefault("0")} + }; if (!string.IsNullOrWhiteSpace(searchString)) { queryCollection.Add("search", searchString); } - queryCollection.Add("cat", MapTorznabCapsToTrackers(query).FirstIfSingleOrDefault("0")); - searchUrl += "?" + queryCollection.GetQueryString(); var response = await RequestStringWithCookies(searchUrl); @@ -162,15 +163,10 @@ namespace Jackett.Common.Indexers foreach (var row in rows) { - var release = new ReleaseInfo(); - release.MinimumRatio = 0.75; - release.MinimumSeedTime = 0; - var qDetailsLink = row.QuerySelector("a[href^=details.php?id=]"); - release.Title = qDetailsLink.Text(); - - if (!query.MatchQueryStringAND(release.Title)) + var title = qDetailsLink.TextContent; + if (!query.MatchQueryStringAND(title)) continue; var qCatLink = row.QuerySelector("a[href^=\"browse.php?cat=\"]"); @@ -181,7 +177,6 @@ namespace Jackett.Common.Indexers var qDownloadLink = row.QuerySelector("a[href*=\"download\"]"); var catStr = qCatLink.GetAttribute("href").Split('=')[1]; - release.Category = MapTrackerCatToNewznab(catStr); var dlLink = qDownloadLink.GetAttribute("href"); if (dlLink.Contains("javascript")) // depending on the user agent the DL link is a javascript call @@ -189,27 +184,33 @@ namespace Jackett.Common.Indexers var dlLinkParts = dlLink.Split(new char[] { '\'', ',' }); dlLink = SiteLink + "download/" + dlLinkParts[3] + "/" + dlLinkParts[5]; } - release.Link = new Uri(dlLink); - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - release.Guid = release.Link; - - var sizeStr = qSize.TextContent; - release.Size = ReleaseInfo.GetBytes(sizeStr.Replace(".", "").Replace(",", ".")); - - release.Seeders = ParseUtil.CoerceInt(qSeeders.TextContent); - release.Peers = ParseUtil.CoerceInt(qLeechers.TextContent) + release.Seeders; - + var link = new Uri(dlLink); + var seeders = ParseUtil.CoerceInt(qSeeders.Text()); var dateStr = qDateStr.TextContent.Replace('\xA0', ' '); var dateGerman = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); var pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateGerman, germanyTz); - release.PublishDate = pubDateUtc; - - var files = row.QuerySelector("td:contains(Datei) > strong ~ strong").TextContent; - release.Files = ParseUtil.CoerceInt(files); - - release.DownloadVolumeFactor = row.QuerySelector("img[title=\"OnlyUpload\"]") != null ? 0 : 1; - release.UploadVolumeFactor = 1; - + var files = ParseUtil.CoerceInt(row.QuerySelector("td:contains(Datei) > strong ~ strong").TextContent); + var comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + var leechers = ParseUtil.CoerceInt(qLeechers.Text()); + var size = ReleaseInfo.GetBytes(qSize.TextContent.Replace(".", "").Replace(",", ".")); + var downloadVolumeFactor = row.QuerySelector("img[title=\"OnlyUpload\"]") != null ? 0 : 1; + var release = new ReleaseInfo + { + MinimumRatio = 0.75, + MinimumSeedTime = 0, + Title = title, + Category = MapTrackerCatToNewznab(catStr), + Link = link, + Comments = comments, + Guid = link, + Size = size, + Seeders = seeders, + Peers = leechers + seeders, + PublishDate = pubDateUtc, + Files = files, + DownloadVolumeFactor = downloadVolumeFactor, + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/Newpct.cs b/src/Jackett.Common/Indexers/Newpct.cs index ebc4238a2..d752ef808 100644 --- a/src/Jackett.Common/Indexers/Newpct.cs +++ b/src/Jackett.Common/Indexers/Newpct.cs @@ -233,28 +233,20 @@ namespace Jackett.Common.Indexers return null; } - private IEnumerable GetLinkUris(Uri referenceLink) + private static IEnumerable GetLinkUris(Uri referenceLink) { - var uris = new List(); - uris.Add(referenceLink); + var uris = new List() + { + referenceLink + }; if (DefaultSiteLinkUri.Scheme != referenceLink.Scheme && DefaultSiteLinkUri.Host != referenceLink.Host) uris.Add(DefaultSiteLinkUri); - uris = uris.Concat(ExtraSiteLinkUris. - Where(u => - (u.Scheme != referenceLink.Scheme || u.Host != referenceLink.Host) && - (u.Scheme != DefaultSiteLinkUri.Scheme || u.Host != DefaultSiteLinkUri.Host))).ToList(); + uris.AddRange(ExtraSiteLinkUris.Where(u + => (u.Scheme != referenceLink.Scheme || u.Host != referenceLink.Host) && + (u.Scheme != DefaultSiteLinkUri.Scheme || u.Host != DefaultSiteLinkUri.Host))); - var result = new List(); - - foreach (var uri in uris) - { - var ub = new UriBuilder(uri); - ub.Path = referenceLink.LocalPath; - result.Add(ub.Uri); - } - - return result; + return uris.Select(uri => new UriBuilder(uri) { Path = referenceLink.LocalPath }.Uri); } private async Task> PerformQuery(Uri siteLink, TorznabQuery query, int attempts) @@ -596,10 +588,12 @@ namespace Jackett.Common.Indexers var pg = 1; while (pg <= _maxMoviesPages) { - var queryCollection = new Dictionary(); - queryCollection.Add("q", searchStr); - queryCollection.Add("s", searchStr); - queryCollection.Add("pg", pg.ToString()); + var queryCollection = new Dictionary + { + { "q", searchStr }, + { "s", searchStr }, + { "pg", pg.ToString() } + }; WebClientStringResult results = null; IEnumerable items = null; @@ -610,7 +604,7 @@ namespace Jackett.Common.Indexers { var uri = new Uri(validUri, _searchJsonUrl); results = await PostDataWithCookies(uri.AbsoluteUri, queryCollection); - if (results == null || string.IsNullOrEmpty(results.Content)) + if (string.IsNullOrEmpty(results?.Content)) break; items = ParseSearchJsonContent(uri, results.Content); } @@ -754,9 +748,10 @@ namespace Jackett.Common.Indexers var releases = new List(); //Remove path from uri - var ub = new UriBuilder(uri); - ub.Path = string.Empty; - uri = ub.Uri; + uri = new UriBuilder(uri) + { + Path = string.Empty + }.Uri; try { @@ -847,8 +842,10 @@ namespace Jackett.Common.Indexers private NewpctRelease GetReleaseFromData(ReleaseType releaseType, string title, string detailsUrl, string quality, string language, long size, DateTime publishDate) { - var result = new NewpctRelease(); - result.NewpctReleaseType = releaseType; + var result = new NewpctRelease + { + NewpctReleaseType = releaseType + }; //Sanitize title = title.Replace("\t", "").Replace("\x2013", "-"); @@ -927,9 +924,10 @@ namespace Jackett.Common.Indexers release.SeriesName = release.Title.Substring(0, release.SeriesName.IndexOf('-') - 1); } - var titleParts = new List(); - - titleParts.Add(release.SeriesName); + var titleParts = new List + { + release.SeriesName + }; if (release.NewpctReleaseType == ReleaseType.TV) { @@ -988,6 +986,12 @@ namespace Jackett.Common.Indexers private string RemoveDiacritics(string text) { var normalizedString = text.Normalize(NormalizationForm.FormD); + + // https://stackoverflow.com/a/14812065/9719178 + // TODO Better performance version in .Net-Core: + // return string.Concat(normalizedString.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)) + // .Normalize(NormalizationForm.FormC); + var stringBuilder = new StringBuilder(); foreach (var c in normalizedString) diff --git a/src/Jackett.Common/Indexers/PassThePopcorn.cs b/src/Jackett.Common/Indexers/PassThePopcorn.cs index 639990456..ea8d54f46 100644 --- a/src/Jackett.Common/Indexers/PassThePopcorn.cs +++ b/src/Jackett.Common/Indexers/PassThePopcorn.cs @@ -128,19 +128,7 @@ namespace Jackett.Common.Indexers var movieGroupId = (string)movie["GroupId"]; foreach (var torrent in movie["Torrents"]) { - var release = new ReleaseInfo(); var releaseName = (string)torrent["ReleaseName"]; - release.Title = releaseName; - release.Description = $"Title: {movieTitle}"; - release.BannerUrl = coverUri; - release.Imdb = movieImdbId; - release.Comments = new Uri($"{SearchUrl}?id={WebUtility.UrlEncode(movieGroupId)}"); - release.Size = long.Parse((string)torrent["Size"]); - release.Grabs = long.Parse((string)torrent["Snatched"]); - release.Seeders = int.Parse((string)torrent["Seeders"]); - release.Peers = release.Seeders + int.Parse((string)torrent["Leechers"]); - release.PublishDate = DateTime.ParseExact((string)torrent["UploadTime"], "yyyy-MM-dd HH:mm:ss", - CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal).ToLocalTime(); var releaseLinkQuery = new NameValueCollection { @@ -149,14 +137,7 @@ namespace Jackett.Common.Indexers {"authkey", AuthKey}, {"torrent_pass", configData.Passkey.Value}, }; - release.Link = new UriBuilder(SearchUrl) {Query = releaseLinkQuery.GetQueryString()}.Uri; - release.Guid = release.Link; - release.MinimumRatio = 1; - release.MinimumSeedTime = 345600; var free = !(torrent["FreeleechType"] is null); - release.DownloadVolumeFactor = free ? 0 : 1; - release.UploadVolumeFactor = 1; - release.Category = new List { 2000 }; bool.TryParse((string)torrent["GoldenPopcorn"], out var golden); bool.TryParse((string)torrent["Scene"], out var scene); @@ -170,6 +151,36 @@ namespace Jackett.Common.Indexers continue; //Skip release if user only wants Checked if (configFreeOnly && !free) continue; + var link = new Uri($"{SearchUrl}?{releaseLinkQuery.GetQueryString()}"); + var seeders = int.Parse((string)torrent["Seeders"]); + var comments = new Uri($"{SearchUrl}?id={WebUtility.UrlEncode(movieGroupId)}"); + var size = long.Parse((string)torrent["Size"]); + var grabs = long.Parse((string)torrent["Snatched"]); + var publishDate = DateTime.ParseExact((string)torrent["UploadTime"], + "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal) + .ToLocalTime(); + var leechers = int.Parse((string)torrent["Leechers"]); + var release = new ReleaseInfo + { + Title = releaseName, + Description = $"Title: {movieTitle}", + BannerUrl = coverUri, + Imdb = movieImdbId, + Comments = comments, + Size = size, + Grabs = grabs, + Seeders = seeders, + Peers = seeders + leechers, + PublishDate = publishDate, + Link = link, + Guid = link, + MinimumRatio = 1, + MinimumSeedTime = 345600, + DownloadVolumeFactor = 1, + UploadVolumeFactor = 1, + Category = new List { TorznabCatType.Movies.ID } + }; + var titleTags = new List(); var quality = (string)torrent["Quality"]; diff --git a/src/Jackett.Common/Indexers/PiXELHD.cs b/src/Jackett.Common/Indexers/PiXELHD.cs index 53ad39519..1db22dc3c 100644 --- a/src/Jackett.Common/Indexers/PiXELHD.cs +++ b/src/Jackett.Common/Indexers/PiXELHD.cs @@ -4,6 +4,7 @@ using System.Collections.Specialized; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using AngleSharp.Dom; using AngleSharp.Html.Parser; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig; @@ -114,9 +115,11 @@ namespace Jackett.Common.Indexers { var releases = new List(); var searchString = query.GetQueryString(); - var queryCollection = new NameValueCollection(); - queryCollection.Add("order_by", "time"); - queryCollection.Add("order_way", "desc"); + var queryCollection = new NameValueCollection + { + { "order_by", "time" }, + { "order_way", "desc" } + }; if (!string.IsNullOrWhiteSpace(query.ImdbID)) { @@ -126,7 +129,7 @@ namespace Jackett.Common.Indexers { queryCollection.Add("groupname", searchString); } - + //Add anyway after checking above? queryCollection.Add("groupname", searchString); var searchUrl = BrowseUrl + "?" + queryCollection.GetQueryString(); @@ -160,36 +163,41 @@ namespace Jackett.Common.Indexers IMDBId = ParseUtil.CoerceLong(IMDBMatch.Groups[1].Value); } - var GroupTitle = Group.QuerySelector("strong:has(a[title=\"View Torrent\"])").TextContent.Replace(" ]", "]"); + var group = Group.QuerySelector("strong:has(a[title=\"View Torrent\"])").TextContent.Replace(" ]", "]"); var Rows = Group.QuerySelectorAll("tr.group_torrent:has(a[href^=\"torrents.php?id=\"])"); foreach (var Row in Rows) { - var release = new ReleaseInfo(); - release.MinimumRatio = 1; - release.MinimumSeedTime = 72 * 60 * 60; - var title = Row.QuerySelector("a[href^=\"torrents.php?id=\"]"); - var link = Row.QuerySelector("a[href^=\"torrents.php?action=download\"]"); var added = Row.QuerySelector("td:nth-child(3)"); var Size = Row.QuerySelector("td:nth-child(4)"); var Grabs = Row.QuerySelector("td:nth-child(6)"); var Seeders = Row.QuerySelector("td:nth-child(7)"); var Leechers = Row.QuerySelector("td:nth-child(8)"); - - release.Title = GroupTitle + " " + title.TextContent; - release.Category = new List { TorznabCatType.MoviesHD.ID }; - release.Link = new Uri(SiteLink + link.GetAttribute("href")); - release.Comments = new Uri(SiteLink + title.GetAttribute("href")); - release.Guid = release.Link; - release.Size = ReleaseInfo.GetBytes(Size.TextContent); - release.Seeders = ParseUtil.CoerceInt(Seeders.TextContent); - release.Peers = ParseUtil.CoerceInt(Leechers.TextContent) + release.Seeders; - release.Grabs = ParseUtil.CoerceLong(Grabs.TextContent); - release.PublishDate = DateTimeUtil.FromTimeAgo(added.TextContent); - release.BannerUrl = bannerURL; - release.Imdb = IMDBId; - + var link = new Uri(SiteLink + Row.QuerySelector("a[href^=\"torrents.php?action=download\"]").GetAttribute("href")); + var seeders = ParseUtil.CoerceInt(Seeders.TextContent); + var comments = new Uri(SiteLink + title.GetAttribute("href")); + var size = ReleaseInfo.GetBytes(Size.TextContent); + var leechers = ParseUtil.CoerceInt(Leechers.TextContent); + var grabs = ParseUtil.CoerceLong(Grabs.TextContent); + var publishDate = DateTimeUtil.FromTimeAgo(added.TextContent); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 72 * 60 * 60, + Title = group + " " + title.TextContent, + Category = new List {TorznabCatType.MoviesHD.ID}, + Link = link, + Comments = comments, + Guid = link, + Size = size, + Seeders = seeders, + Peers = leechers + seeders, + Grabs = grabs, + PublishDate = publishDate, + BannerUrl = bannerURL, + Imdb = IMDBId + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/PirateTheNet.cs b/src/Jackett.Common/Indexers/PirateTheNet.cs index a28264373..947af2685 100644 --- a/src/Jackett.Common/Indexers/PirateTheNet.cs +++ b/src/Jackett.Common/Indexers/PirateTheNet.cs @@ -136,18 +136,13 @@ namespace Jackett.Common.Indexers var rows = dom.QuerySelectorAll("table.main > tbody > tr"); foreach (var row in rows.Skip(1)) { - var release = new ReleaseInfo(); - release.MinimumRatio = 1; - release.MinimumSeedTime = 72 * 60 * 60; var qDetailsLink = row.QuerySelector("td:nth-of-type(2) > a:nth-of-type(1)"); // link to the movie, not the actual torrent - release.Title = qDetailsLink.GetAttribute("alt"); var qCatIcon = row.QuerySelector("td:nth-of-type(1) > a > img"); var catStr = qCatIcon != null ? qCatIcon.GetAttribute("src").Split('/').Last().Split('.').First() : "packs"; - release.Category = MapTrackerCatToNewznab(catStr); var qSeeders = row.QuerySelector("td:nth-of-type(9)"); var qLeechers = row.QuerySelector("td:nth-of-type(10)"); @@ -155,10 +150,7 @@ namespace Jackett.Common.Indexers var qPudDate = row.QuerySelector("td:nth-of-type(6) > nobr"); var qSize = row.QuerySelector("td:nth-of-type(7)"); - release.Link = new Uri(SiteLink + qDownloadLink.GetAttribute("href").Substring(1)); - release.Title = qDetailsLink.GetAttribute("alt"); - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - release.Guid = release.Link; + var link = new Uri(SiteLink + qDownloadLink.GetAttribute("href").Substring(1)); var dateStr = qPudDate.Text().Trim(); DateTime pubDateUtc; @@ -170,23 +162,32 @@ namespace Jackett.Common.Indexers else pubDateUtc = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "MMM d yyyy hh:mm tt", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); - release.PublishDate = pubDateUtc.ToLocalTime(); - var sizeStr = qSize.Text(); - release.Size = ReleaseInfo.GetBytes(sizeStr); - - release.Seeders = ParseUtil.CoerceInt(qSeeders.Text()); - release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders; - - var files = row.QuerySelector("td:nth-child(4)").TextContent; - release.Files = ParseUtil.CoerceInt(files); - - var grabs = row.QuerySelector("td:nth-child(8)").TextContent; - release.Grabs = ParseUtil.CoerceInt(grabs); - - release.DownloadVolumeFactor = 0; // ratioless - release.UploadVolumeFactor = 1; - + var seeders = ParseUtil.CoerceInt(qSeeders.Text()); + var files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(4)").TextContent); + var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(8)").TextContent); + var comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + var size = ReleaseInfo.GetBytes(sizeStr); + var leechers = ParseUtil.CoerceInt(qLeechers.Text()); + var title = qDetailsLink.GetAttribute("alt"); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 72 * 60 * 60, + Title = title, + Category = MapTrackerCatToNewznab(catStr), + Link = link, + Comments = comments, + Guid = link, + PublishDate = pubDateUtc.ToLocalTime(), + Size = size, + Seeders = seeders, + Peers = leechers + seeders, + Files = files, + Grabs = grabs, + DownloadVolumeFactor = 0, // ratioless + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/PolishTracker.cs b/src/Jackett.Common/Indexers/PolishTracker.cs index da5545e41..4fd372281 100644 --- a/src/Jackett.Common/Indexers/PolishTracker.cs +++ b/src/Jackett.Common/Indexers/PolishTracker.cs @@ -85,9 +85,10 @@ namespace Jackett.Common.Indexers var searchUrl = TorrentApiUrl; var searchString = query.GetQueryString(); - var queryCollection = new List>(); - - queryCollection.Add("tpage", "1"); + var queryCollection = new List> + { + { "tpage", "1" } + }; foreach (var cat in MapTorznabCapsToTrackers(query)) { queryCollection.Add("cat[]", cat); @@ -137,6 +138,7 @@ namespace Jackett.Common.Indexers foreach (var torrent in torrents) { + // TODO convert to ReleaseInfo Initializer var release = new ReleaseInfo(); var descriptions = new List(); release.MinimumRatio = 1; diff --git a/src/Jackett.Common/Indexers/Pretome.cs b/src/Jackett.Common/Indexers/Pretome.cs index e28741acf..cd125a4af 100644 --- a/src/Jackett.Common/Indexers/Pretome.cs +++ b/src/Jackett.Common/Indexers/Pretome.cs @@ -284,45 +284,43 @@ namespace Jackett.Common.Indexers var rows = dom.QuerySelectorAll("table > tbody > tr.browse"); foreach (var row in rows) { - var release = new ReleaseInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - var qLink = row.Children[1].QuerySelector("a"); - release.Title = qLink.GetAttribute("title"); - if (qLink.QuerySelectorAll("span").Length == 1 && release.Title.StartsWith("NEW! |")) + var title = qLink.GetAttribute("title"); + if (qLink.QuerySelectorAll("span").Length == 1 && title.StartsWith("NEW! |")) { - release.Title = release.Title.Substring(6).Trim(); + title = title.Substring(6).Trim(); } - release.Comments = new Uri(SiteLink + qLink.GetAttribute("href")); - release.Guid = release.Comments; - + var comments = new Uri(SiteLink + qLink.GetAttribute("href")); var qDownload = row.Children[2].QuerySelector("a"); - release.Link = new Uri(SiteLink + qDownload.GetAttribute("href")); - var dateStr = Regex.Replace(row.Children[5].InnerHtml, @"\", " "); - release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); - var sizeStr = row.Children[7].TextContent; - release.Size = ReleaseInfo.GetBytes(sizeStr); - - release.Seeders = ParseUtil.CoerceInt(row.Children[9].TextContent); - release.Peers = ParseUtil.CoerceInt(row.Children[10].TextContent) + release.Seeders; - + var seeders = ParseUtil.CoerceInt(row.Children[9].TextContent); + var files = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(4)").TextContent); var cat = row.FirstElementChild.FirstElementChild.GetAttribute("href").Replace("browse.php?", string.Empty); - release.Category = MapTrackerCatToNewznab(cat); - - var files = row.QuerySelector("td:nth-child(4)").TextContent; - release.Files = ParseUtil.CoerceInt(files); - - var grabs = row.QuerySelector("td:nth-child(9)").TextContent; - release.Grabs = ParseUtil.CoerceInt(grabs); - - release.DownloadVolumeFactor = 0; // ratioless - release.UploadVolumeFactor = 1; - + var link = new Uri(SiteLink + qDownload.GetAttribute("href")); + var publishDate = DateTimeUtil.FromTimeAgo(dateStr); + var size = ReleaseInfo.GetBytes(sizeStr); + var leechers = ParseUtil.CoerceInt(row.Children[10].TextContent); + var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(9)").TextContent); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + Title = title, + Comments = comments, + Guid = comments, + Link = link, + PublishDate = publishDate, + Size = size, + Seeders = seeders, + Peers = leechers + seeders, + Category = MapTrackerCatToNewznab(cat), + Files = files, + Grabs = grabs, + DownloadVolumeFactor = 0, // ratioless + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/Rarbg.cs b/src/Jackett.Common/Indexers/Rarbg.cs index 462cd2abf..099e4620c 100644 --- a/src/Jackett.Common/Indexers/Rarbg.cs +++ b/src/Jackett.Common/Indexers/Rarbg.cs @@ -123,9 +123,11 @@ namespace Jackett.Common.Indexers { if (!HasValidToken) { - var queryCollection = new NameValueCollection(); - queryCollection.Add("get_token", "get_token"); - queryCollection.Add("app_id", app_id); + var queryCollection = new NameValueCollection + { + { "get_token", "get_token" }, + { "app_id", app_id } + }; var tokenUrl = ApiEndpoint + "?" + queryCollection.GetQueryString(); @@ -155,13 +157,15 @@ namespace Jackett.Common.Indexers var releases = new List(); var searchString = query.GetQueryString(); - var queryCollection = new NameValueCollection(); - queryCollection.Add("token", token); - queryCollection.Add("format", "json_extended"); - queryCollection.Add("app_id", app_id); - queryCollection.Add("limit", "100"); - queryCollection.Add("ranked", "0"); - queryCollection.Add("sort", _sort); + var queryCollection = new NameValueCollection + { + { "token", token }, + { "format", "json_extended" }, + { "app_id", app_id }, + { "limit", "100" }, + { "ranked", "0" }, + { "sort", _sort } + }; if (query.ImdbID != null) { @@ -235,41 +239,49 @@ namespace Jackett.Common.Indexers foreach (var item in jsonContent.Value("torrent_results")) { - var release = new ReleaseInfo(); - release.Title = WebUtility.HtmlDecode(item.Value("title")); - release.Category = MapTrackerCatDescToNewznab(item.Value("category")); - - release.MagnetUri = new Uri(item.Value("download")); - release.InfoHash = release.MagnetUri.ToString().Split(':')[3].Split('&')[0]; + var magnetUri = new Uri(item.Value("download")); // append app_id to prevent api server returning 403 forbidden - release.Comments = new Uri(item.Value("info_page") + "&app_id=" + app_id); - if (_provideTorrentLink) - release.Link = release.Comments; // in case of a torrent download we grab the link from the details page in Download() - release.Guid = release.MagnetUri; + var comments = new Uri(item.Value("info_page") + "&app_id=" + app_id); + // ex: 2015-08-16 21:25:08 +0000 + var dateStr = item.Value("pubdate").Replace(" +0000", ""); + var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + var seeders = item.Value("seeders"); + var title = WebUtility.HtmlDecode(item.Value("title")); + var infoHash = magnetUri.ToString().Split(':')[3].Split('&')[0]; + var publishDate = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc).ToLocalTime(); + var leechers = item.Value("leechers"); + var size = item.Value("size"); + // in case of a torrent download we grab the link from the details page in Download() + var link = _provideTorrentLink ? comments : default; + var release = new ReleaseInfo + { + Title = title, + Category = MapTrackerCatDescToNewznab(item.Value("category")), + MagnetUri = magnetUri, + InfoHash = infoHash, + Comments = comments, + Link = link, + PublishDate = publishDate, + Guid = magnetUri, + Seeders = seeders, + Peers = leechers + seeders, + Size = size, + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1 + }; var episodeInfo = item.Value("episode_info"); if (episodeInfo.HasValues) { - var imdb = episodeInfo.Value("imdb"); - release.Imdb = ParseUtil.GetImdbID(imdb); + release.Imdb = ParseUtil.GetImdbID(episodeInfo.Value("imdb")); release.TVDBId = episodeInfo.Value("tvdb"); release.RageID = episodeInfo.Value("tvrage"); release.TMDb = episodeInfo.Value("themoviedb"); } - // ex: 2015-08-16 21:25:08 +0000 - var dateStr = item.Value("pubdate").Replace(" +0000", ""); - var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); - release.PublishDate = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc).ToLocalTime(); - - release.Seeders = item.Value("seeders"); - release.Peers = item.Value("leechers") + release.Seeders; - release.Size = item.Value("size"); - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 1; releases.Add(release); } diff --git a/src/Jackett.Common/Indexers/RevolutionTT.cs b/src/Jackett.Common/Indexers/RevolutionTT.cs index 6a0cc4b36..55577835f 100644 --- a/src/Jackett.Common/Indexers/RevolutionTT.cs +++ b/src/Jackett.Common/Indexers/RevolutionTT.cs @@ -334,10 +334,10 @@ namespace Jackett.Common.Indexers release.Title = qLink.QuerySelector("b").TextContent; release.Description = release.Title; - var releaseLink = row.QuerySelector("td:nth-child(4) > a"); - if (releaseLink != null) + var link = row.QuerySelector("td:nth-child(4) > a"); + if (link != null) { - release.Link = new Uri(SiteLink + releaseLink.GetAttribute("href")); + release.Link = new Uri(SiteLink + link.GetAttribute("href")); var dateString = row.QuerySelector("td:nth-child(6) nobr").TextContent.Trim(); //"2015-04-25 23:38:12" diff --git a/src/Jackett.Common/Indexers/SceneHD.cs b/src/Jackett.Common/Indexers/SceneHD.cs index 0997d65f5..191fd9593 100644 --- a/src/Jackett.Common/Indexers/SceneHD.cs +++ b/src/Jackett.Common/Indexers/SceneHD.cs @@ -93,8 +93,10 @@ namespace Jackett.Common.Indexers var releases = new List(); - var qParams = new NameValueCollection(); - qParams.Add("api", ""); + var qParams = new NameValueCollection + { + { "api", "" } + }; if (query.ImdbIDShort != null) qParams.Add("imdb", query.ImdbIDShort); else @@ -119,6 +121,7 @@ namespace Jackett.Common.Indexers foreach (var item in jsonContent) { + //TODO convert to initializer var release = new ReleaseInfo(); var id = item.Value("id"); diff --git a/src/Jackett.Common/Indexers/SceneTime.cs b/src/Jackett.Common/Indexers/SceneTime.cs index 37e72dbe7..400c3982f 100644 --- a/src/Jackett.Common/Indexers/SceneTime.cs +++ b/src/Jackett.Common/Indexers/SceneTime.cs @@ -223,6 +223,7 @@ namespace Jackett.Common.Indexers var rows = dom.QuerySelectorAll("tr.browse"); foreach (var row in rows) { + // TODO convert to initializer var release = new ReleaseInfo(); release.MinimumRatio = 1; release.MinimumSeedTime = 172800; // 48 hours diff --git a/src/Jackett.Common/Indexers/Shazbat.cs b/src/Jackett.Common/Indexers/Shazbat.cs index cc4f5584f..9cb0f6c9a 100644 --- a/src/Jackett.Common/Indexers/Shazbat.cs +++ b/src/Jackett.Common/Indexers/Shazbat.cs @@ -114,6 +114,7 @@ namespace Jackett.Common.Indexers dom.QuerySelector("span:contains(\"Freeleech until:\"):has(span.datetime)") != null; foreach (var row in rows.Skip(1)) { + // TODO switch to initializer var release = new ReleaseInfo(); var titleRow = row.QuerySelector("td:nth-of-type(3)"); foreach (var child in titleRow.Children) diff --git a/src/Jackett.Common/Indexers/ShowRSS.cs b/src/Jackett.Common/Indexers/ShowRSS.cs index 41cbb8265..2467189a2 100644 --- a/src/Jackett.Common/Indexers/ShowRSS.cs +++ b/src/Jackett.Common/Indexers/ShowRSS.cs @@ -67,41 +67,41 @@ namespace Jackett.Common.Indexers try { xmlDoc.LoadXml(result.Content); - ReleaseInfo release; - string serie_title; - foreach (XmlNode node in xmlDoc.GetElementsByTagName("item")) { - release = new ReleaseInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - - serie_title = node.SelectSingleNode(".//*[local-name()='raw_title']").InnerText; - release.Title = serie_title; - - if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title)) + //TODO revisit for refactoring + var title = node.SelectSingleNode(".//*[local-name()='raw_title']").InnerText; + if ((!query.IsImdbQuery || !TorznabCaps.SupportsImdbMovieSearch) && + !query.MatchQueryStringAND(title)) continue; - release.Comments = new Uri(node.SelectSingleNode("link").InnerText); - // Try to guess the category... I'm not proud of myself... - var category = 5030; - if (serie_title.Contains("720p")) - category = 5040; - release.Category = new List { category }; + var category = title.Contains("720p") ? TorznabCatType.TVHD.ID : TorznabCatType.TVSD.ID; var test = node.SelectSingleNode("enclosure"); - release.Guid = new Uri(test.Attributes["url"].Value); - release.PublishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); - - release.Description = node.SelectSingleNode("description").InnerText; - release.InfoHash = node.SelectSingleNode("description").InnerText; - release.Size = 0; - release.Seeders = 1; - release.Peers = 1; - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 1; - release.MagnetUri = new Uri(node.SelectSingleNode("link").InnerText); + var magnetUri = new Uri(node.SelectSingleNode("link").InnerText); + var publishDate = DateTime.Parse(node.SelectSingleNode("pubDate").InnerText, CultureInfo.InvariantCulture); + var infoHash = node.SelectSingleNode("description").InnerText; + //TODO Maybe use magnetUri instead? https://github.com/Jackett/Jackett/pull/7342#discussion_r397552678 + var guid = new Uri(test.Attributes["url"].Value); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + Title = title, + Comments = magnetUri, + Category = new List {category}, + Guid = guid, + PublishDate = publishDate, + Description = infoHash, + InfoHash = infoHash, + Size = 0, + //TODO fix seeder/peer counts if available + Seeders = 1, + Peers = 1, + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1, + MagnetUri = magnetUri + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/SolidTorrents.cs b/src/Jackett.Common/Indexers/SolidTorrents.cs index 31d61ae41..94216946d 100644 --- a/src/Jackett.Common/Indexers/SolidTorrents.cs +++ b/src/Jackett.Common/Indexers/SolidTorrents.cs @@ -138,37 +138,33 @@ namespace Jackett.Common.Indexers return releases; } + //TODO inline single use function private ReleaseInfo MakeRelease(JToken torrent) { - var release = new ReleaseInfo(); - - release.Title = (string)torrent["title"]; - // https://solidtorrents.net/view/5e10885d651df640a70ee826 - release.Comments = new Uri(SiteLink + "view/" + (string)torrent["_id"]); - release.Guid = release.Comments; - - release.PublishDate = DateTime.Now; - if (torrent["imported"] != null) - release.PublishDate = DateTime.Parse((string)torrent["imported"]); - - release.Category = MapTrackerCatToNewznab((string)torrent["category"]); - release.Size = (long)torrent["size"]; - + var comments = new Uri(SiteLink + "view/" + (string)torrent["_id"]); var swarm = torrent["swarm"]; - release.Seeders = (int)swarm["seeders"]; - release.Peers = release.Seeders + (int)swarm["leechers"]; - release.Grabs = (long)swarm["downloads"]; - - release.InfoHash = (string)torrent["infohash"]; - release.MagnetUri = new Uri((string)torrent["magnet"]); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 1; - - return release; + var seeders = (int)swarm["seeders"]; + var publishDate = torrent["imported"] != null ? DateTime.Parse((string)torrent["imported"]) : DateTime.Now; + var magnetUri = new Uri((string)torrent["magnet"]); + return new ReleaseInfo + { + Title = (string)torrent["title"], + Comments = comments, + Guid = comments, + PublishDate = publishDate, + Category = MapTrackerCatToNewznab((string)torrent["category"]), + Size = (long)torrent["size"], + Seeders = seeders, + Peers = seeders + (int)swarm["leechers"], + Grabs = (long)swarm["downloads"], + InfoHash = (string)torrent["infohash"], + MagnetUri = magnetUri, + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1 + }; } } } diff --git a/src/Jackett.Common/Indexers/SpeedCD.cs b/src/Jackett.Common/Indexers/SpeedCD.cs index dec1d7874..0c9101192 100644 --- a/src/Jackett.Common/Indexers/SpeedCD.cs +++ b/src/Jackett.Common/Indexers/SpeedCD.cs @@ -155,7 +155,6 @@ namespace Jackett.Common.Indexers var title = row.QuerySelector("td[class='lft'] > div > a").TextContent.Trim(); var link = new Uri(SiteLink + row.QuerySelector("img[title='Download']").ParentElement.GetAttribute("href").Trim()); - var guid = link; var comments = new Uri(SiteLink + row.QuerySelector("td[class='lft'] > div > a").GetAttribute("href").Trim().Remove(0, 1)); var size = ReleaseInfo.GetBytes(cells[4].TextContent); var grabs = ParseUtil.CoerceInt(cells[5].TextContent); @@ -167,27 +166,24 @@ namespace Jackett.Common.Indexers var cat = row.QuerySelector("img[class^='Tcat']").ParentElement.GetAttribute("href").Trim().Remove(0, 5); long.TryParse(cat, out var category); - - // This fixes the mixed initializer issue, so it's just inconsistent in the code base. - // https://github.com/Jackett/Jackett/pull/7166#discussion_r376817517 - var release = new ReleaseInfo(); - - release.Title = title; - release.Guid = guid; - release.Link = link; - release.PublishDate = publishDate; - release.Size = size; - release.Grabs = grabs; - release.Seeders = seeders; - release.Peers = seeders + leechers; - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - release.Category = MapTrackerCatToNewznab(category.ToString()); - release.Comments = comments; - - release.DownloadVolumeFactor = row.QuerySelector("span:contains(\"[Freeleech]\")") != null ? 0 : 1; - release.UploadVolumeFactor = 1; - + var downloadVolumeFactor = row.QuerySelector("span:contains(\"[Freeleech]\")") != null ? 0 : 1; + var release = new ReleaseInfo + { + Title = title, + Guid = link, + Link = link, + PublishDate = publishDate, + Size = size, + Grabs = grabs, + Seeders = seeders, + Peers = seeders + leechers, + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + Category = MapTrackerCatToNewznab(category.ToString()), + Comments = comments, + DownloadVolumeFactor = downloadVolumeFactor, + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/TVVault.cs b/src/Jackett.Common/Indexers/TVVault.cs index a6e4c799d..b986bd401 100644 --- a/src/Jackett.Common/Indexers/TVVault.cs +++ b/src/Jackett.Common/Indexers/TVVault.cs @@ -78,11 +78,13 @@ namespace Jackett.Common.Indexers var searchString = query.GetQueryString(); var searchUrl = BrowseUrl; - var queryCollection = new NameValueCollection(); - queryCollection.Add("searchstr", StripSearchString(searchString)); - queryCollection.Add("order_by", "s3"); - queryCollection.Add("order_way", "desc"); - queryCollection.Add("disablegrouping", "1"); + var queryCollection = new NameValueCollection + { + { "searchstr", StripSearchString(searchString) }, + { "order_by", "s3" }, + { "order_way", "desc" }, + { "disablegrouping", "1" } + }; searchUrl += "?" + queryCollection.GetQueryString(); @@ -96,11 +98,6 @@ namespace Jackett.Common.Indexers var Rows = SearchResultDocument.QuerySelectorAll(RowsSelector); foreach (var Row in Rows) { - var release = new ReleaseInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 0; - var qDetailsLink = Row.QuerySelector("a[href^=\"torrents.php?id=\"]"); var DescStr = qDetailsLink.NextSibling; var Files = Row.QuerySelector("td:nth-child(3)"); @@ -114,29 +111,35 @@ namespace Jackett.Common.Indexers var TorrentIdParts = qDetailsLink.GetAttribute("href").Split('='); var TorrentId = TorrentIdParts[TorrentIdParts.Length - 1]; var DLLink = "torrents.php?action=download&id=" + TorrentId.ToString(); - - release.Description = DescStr.TextContent.Trim(); - release.Title = qDetailsLink.TextContent + " " + release.Description; - release.PublishDate = DateTimeUtil.FromTimeAgo(Added.TextContent); - release.Category = new List { TvCategoryParser.ParseTvShowQuality(release.Description) }; - - release.Link = new Uri(SiteLink + DLLink); - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - release.Guid = release.Link; - - release.Seeders = ParseUtil.CoerceInt(Seeders.TextContent); - release.Peers = ParseUtil.CoerceInt(Leechers.TextContent) + release.Seeders; - release.Size = ReleaseInfo.GetBytes(Size.TextContent); - release.Grabs = ReleaseInfo.GetBytes(Grabs.TextContent); - release.Files = ReleaseInfo.GetBytes(Files.TextContent); - - if (FreeLeech != null) - release.DownloadVolumeFactor = 0; - else - release.DownloadVolumeFactor = 1; - - release.UploadVolumeFactor = 1; - + var link = new Uri(SiteLink + DLLink); + var seeders = ParseUtil.CoerceInt(Seeders.TextContent); + var description = DescStr.TextContent.Trim(); + var publishDate = DateTimeUtil.FromTimeAgo(Added.TextContent); + var comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + var leechers = ParseUtil.CoerceInt(Leechers.TextContent); + var size = ReleaseInfo.GetBytes(Size.TextContent); + var grabs = ParseUtil.CoerceLong(Grabs.TextContent); + var files = ParseUtil.CoerceLong(Files.TextContent); + var category = new List {TvCategoryParser.ParseTvShowQuality(description)}; + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 0, + Description = description, + Title = qDetailsLink.TextContent + " " + description, + PublishDate = publishDate, + Category = category, + Link = link, + Comments = comments, + Guid = link, + Seeders = seeders, + Peers = leechers + seeders, + Size = size, + Grabs = grabs, + Files = files, + DownloadVolumeFactor = FreeLeech != null ? 0 : 1, + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/TVstore.cs b/src/Jackett.Common/Indexers/TVstore.cs index 3a11e894f..ea4bac6bd 100644 --- a/src/Jackett.Common/Indexers/TVstore.cs +++ b/src/Jackett.Common/Indexers/TVstore.cs @@ -220,28 +220,30 @@ namespace Jackett.Common.Indexers var parser = new HtmlParser(); var dom = parser.ParseDocument(result.Content); var scripts = dom.QuerySelectorAll("script"); + //TODO Linq foreach (var script in scripts) { if (script.TextContent.Contains("catsh=Array")) { - var seriesknowbysite = Regex.Split(script.TextContent, "catl"); - for (var i = 1; i < seriesknowbysite.Length; i++) + //TODO no regex in pattern, investigate using string.Split instead? + var seriesKnowBySite = Regex.Split(script.TextContent, "catl"); + //TODO consider converting to foreach + for (var i = 1; i < seriesKnowBySite.Length; i++) { - try + var id = seriesKnowBySite[i]; + var seriesElement = WebUtility.HtmlDecode(id).Split(';'); + var hungarianName = seriesElement[1].Split('=')[1].Trim('\'').ToLower(); + var englishName = seriesElement[2].Split('=')[1].Trim('\'').ToLower(); + var seriesId = seriesElement[0].Split('=')[1].Trim('\''); + var imdbId = seriesElement[7].Split('=')[-1].Trim('\''); + var seriesDetail = new SeriesDetail { - var id = seriesknowbysite[i]; - var serieselement = WebUtility.HtmlDecode(id).Split(';'); - var sd = new SeriesDetail(); - sd.HunName = serieselement[1].Split('=')[1].Trim('\'').ToLower(); - sd.EngName = serieselement[2].Split('=')[1].Trim('\'').ToLower(); - sd.id = serieselement[0].Split('=')[1].Trim('\''); - sd.imdbid = serieselement[7].Split('=')[1].Trim('\''); - series.Add(sd); - } - catch (IndexOutOfRangeException e) - { - throw (e); - } + HunName = hungarianName, + EngName = englishName, + id = seriesId, + imdbid = imdbId + }; + series.Add(seriesDetail); } } } @@ -250,6 +252,7 @@ namespace Jackett.Common.Indexers protected override async Task> PerformQuery(TorznabQuery query) { + //TODO convert to initializer var releases = new List(); /* If series from sites are indexed than we dont need to reindex them. */ @@ -374,7 +377,6 @@ namespace Jackett.Common.Indexers public string HunName; public string EngName; public string imdbid; - } } diff --git a/src/Jackett.Common/Indexers/TorrentDay.cs b/src/Jackett.Common/Indexers/TorrentDay.cs index aa93b7d6c..77216ba70 100644 --- a/src/Jackett.Common/Indexers/TorrentDay.cs +++ b/src/Jackett.Common/Indexers/TorrentDay.cs @@ -221,33 +221,35 @@ namespace Jackett.Common.Indexers foreach (var torrent in json) { - var release = new ReleaseInfo(); - - release.Title = torrent.name; - if ((query.ImdbID == null || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(release.Title)) + if ((!query.IsImdbQuery || !TorznabCaps.SupportsImdbMovieSearch) && !query.MatchQueryStringAND(torrent.name)) continue; - - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - release.Category = MapTrackerCatToNewznab(torrent.c.ToString()); - - var torrentId = (long)torrent.t; - release.Comments = new Uri(SiteLink + "details.php?id=" + torrentId); - release.Guid = release.Comments; - release.Link = new Uri(SiteLink + "download.php/" + torrentId + "/" + torrentId + ".torrent"); - release.PublishDate = DateTimeUtil.UnixTimestampToDateTime((long)torrent.ctime).ToLocalTime(); - - release.Size = (long)torrent.size; - release.Seeders = (int)torrent.seeders; - release.Peers = release.Seeders + (int)torrent.leechers; - release.Files = (long)torrent.files; - release.Grabs = (long)torrent.completed; + var torrentID = (long)torrent.t; + var comments = new Uri(SiteLink + "details.php?id=" + torrentID); + var seeders = (int)torrent.seeders; var imdbId = (string)torrent["imdb-id"]; - release.Imdb = ParseUtil.GetImdbID(imdbId); var downloadMultiplier = (double?)torrent["download-multiplier"]; - release.DownloadVolumeFactor = downloadMultiplier ?? 1; - release.UploadVolumeFactor = 1; - + var link = new Uri(SiteLink + "download.php/" + torrentID + "/" + torrentID + ".torrent"); + var publishDate = DateTimeUtil.UnixTimestampToDateTime((long)torrent.ctime).ToLocalTime(); + var imdb = ParseUtil.GetImdbID(imdbId); + var release = new ReleaseInfo + { + Title = torrent.name, + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + Category = MapTrackerCatToNewznab(torrent.c.ToString()), + Comments = comments, + Guid = comments, + Link = link, + PublishDate = publishDate, + Size = (long)torrent.size, + Seeders = seeders, + Peers = seeders + (int)torrent.leechers, + Files = (long)torrent.files, + Grabs = (long)torrent.completed, + Imdb = imdb, + DownloadVolumeFactor = downloadMultiplier ?? 1, + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/TorrentHeaven.cs b/src/Jackett.Common/Indexers/TorrentHeaven.cs index af5471f37..dd9c9f024 100644 --- a/src/Jackett.Common/Indexers/TorrentHeaven.cs +++ b/src/Jackett.Common/Indexers/TorrentHeaven.cs @@ -149,6 +149,7 @@ namespace Jackett.Common.Indexers protected override async Task> PerformQuery(TorznabQuery query) { + // TODO verify this code is necessary for TZ data or if builtin exist var startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule( new DateTime(1, 1, 1, 3, 0, 0), 3, 5, DayOfWeek.Sunday); var endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule( @@ -192,11 +193,7 @@ namespace Jackett.Common.Indexers var rows = dom.QuerySelectorAll("table.torrenttable > tbody > tr"); foreach (var row in rows.Skip(1)) { - var release = new ReleaseInfo(); - release.MinimumRatio = 0.8; - release.MinimumSeedTime = 0; var qDetailsLink = row.QuerySelector("a[href^=\"index.php?strWebValue=torrent&strWebAction=details\"]"); - release.Title = titleRegexp.Match(qDetailsLink.GetAttribute("onmouseover")).Groups[1].Value; var qCatLink = row.QuerySelector("a[href^=\"index.php?strWebValue=torrent&strWebAction=search&dir=\"]"); var qDlLink = row.QuerySelector("a[href^=\"index.php?strWebValue=torrent&strWebAction=download&id=\"]"); var qSeeders = row.QuerySelectorAll("td.column1")[3]; @@ -204,37 +201,42 @@ namespace Jackett.Common.Indexers var qDateStr = row.QuerySelector("font:has(a)"); var qSize = row.QuerySelector("td.column2[align=center]"); var catStr = qCatLink.GetAttribute("href").Split('=')[3].Split('#')[0]; - release.Category = MapTrackerCatToNewznab(catStr); - release.Link = new Uri(SiteLink + qDlLink.GetAttribute("href")); - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - release.Guid = release.Link; + var link = new Uri(SiteLink + qDlLink.GetAttribute("href")); var sizeStr = qSize.TextContent; - release.Size = ReleaseInfo.GetBytes(sizeStr); - release.Seeders = ParseUtil.CoerceInt(qSeeders.TextContent); - release.Peers = ParseUtil.CoerceInt(qLeechers.TextContent) + release.Seeders; - var dateStr = qDateStr.TextContent.Trim(); - var dateStrParts = dateStr.Split(); - var dateGerman = dateStrParts[0] switch - { - "Heute" => (DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + TimeSpan.Parse(dateStrParts[1])), - "Gestern" => (DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + TimeSpan.Parse(dateStrParts[1]) - - TimeSpan.FromDays(1)), - _ => DateTime.SpecifyKind( DateTime.ParseExact( - dateStrParts[0] + dateStrParts[1], "dd.MM.yyyyHH:mm", CultureInfo.InvariantCulture), - DateTimeKind.Unspecified) - }; + var dateStr = qDateStr.TextContent.Trim().Replace("Heute", "Today").Replace("Gestern", "Yesterday"); - release.PublishDate = TimeZoneInfo.ConvertTime(dateGerman, germanyTz, TimeZoneInfo.Local); - var grabs = row.QuerySelector("td:nth-child(7)").TextContent; - release.Grabs = ParseUtil.CoerceInt(grabs); + var dateGerman = DateTimeUtil.FromUnknown(dateStr); + double downloadFactor; if (row.QuerySelector("img[src=\"themes/images/freeleech.png\"]") != null || row.QuerySelector("img[src=\"themes/images/onlyup.png\"]") != null) - release.DownloadVolumeFactor = 0; + downloadFactor = 0; else if (row.QuerySelector("img[src=\"themes/images/DL50.png\"]") != null) - release.DownloadVolumeFactor = 0.5; + downloadFactor = 0.5; else - release.DownloadVolumeFactor = 1; - release.UploadVolumeFactor = 1; + downloadFactor = 1; + var title = titleRegexp.Match(qDetailsLink.GetAttribute("onmouseover")).Groups[1].Value; + var comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + var seeders = ParseUtil.CoerceInt(qSeeders.TextContent); + var leechers = ParseUtil.CoerceInt(qLeechers.TextContent); + var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(7)").TextContent); + var publishDate = TimeZoneInfo.ConvertTime(dateGerman, germanyTz, TimeZoneInfo.Local); + var release = new ReleaseInfo + { + MinimumRatio = 0.8, + MinimumSeedTime = 0, + Title = title, + Category = MapTrackerCatToNewznab(catStr), + Comments = comments, + Link = link, + Guid = link, + Size = ReleaseInfo.GetBytes(sizeStr), + Seeders = seeders, + Peers = leechers + seeders, + PublishDate = publishDate, + Grabs = grabs, + DownloadVolumeFactor = downloadFactor, + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/TorrentNetwork.cs b/src/Jackett.Common/Indexers/TorrentNetwork.cs index f6165b016..c154af26b 100644 --- a/src/Jackett.Common/Indexers/TorrentNetwork.cs +++ b/src/Jackett.Common/Indexers/TorrentNetwork.cs @@ -168,11 +168,13 @@ namespace Jackett.Common.Indexers var searchUrl = "browse"; var searchString = query.GetQueryString(); - var queryCollection = new NameValueCollection(); - queryCollection.Add("orderC", "4"); - queryCollection.Add("orderD", "desc"); - queryCollection.Add("start", "0"); - queryCollection.Add("length", "100"); + var queryCollection = new NameValueCollection + { + { "orderC", "4" }, + { "orderD", "desc" }, + { "start", "0" }, + { "length", "100" } + }; if (!string.IsNullOrWhiteSpace(searchString)) queryCollection.Add("search", searchString); @@ -196,42 +198,47 @@ namespace Jackett.Common.Indexers foreach (JArray torrent in data) { - var release = new ReleaseInfo(); - release.MinimumRatio = 0.8; - release.MinimumSeedTime = 172800; // 48 hours - - release.Category = MapTrackerCatToNewznab(torrent[0].ToString()); - release.Title = torrent[1].ToString(); var torrentID = (long)torrent[2]; - release.Comments = new Uri(SiteLink + "torrent/" + torrentID); - release.Guid = release.Comments; - release.Link = new Uri(SiteLink + "sdownload/" + torrentID + "/" + passkey); - release.PublishDate = DateTimeUtil.UnixTimestampToDateTime((double)torrent[3]).ToLocalTime(); + var comments = new Uri(SiteLink + "torrent/" + torrentID); //var preDelaySeconds = (long)torrent[4]; - release.Size = (long)torrent[5]; - release.Seeders = (int)torrent[6]; - release.Peers = release.Seeders + (int)torrent[7]; + var seeders = (int)torrent[6]; //var imdbRating = (double)torrent[8] / 10; var genres = (string)torrent[9]; if (!string.IsNullOrWhiteSpace(genres)) - release.Description = "Genres: " + genres; - - var DownloadVolumeFlag = (long)torrent[10]; - release.UploadVolumeFactor = 1; - if (DownloadVolumeFlag == 2) // Only Up - release.DownloadVolumeFactor = 0; - else if (DownloadVolumeFlag == 1) // 50 % Down - release.DownloadVolumeFactor = 0.5; - else if (DownloadVolumeFlag == 0) - release.DownloadVolumeFactor = 1; - - release.Grabs = (long)torrent[11]; - + genres = "Genres: " + genres; // 12/13/14 unknown, probably IDs/name of the uploader //var row12 = (long)torrent[12]; //var row13 = (string)torrent[13]; //var row14 = (long)torrent[14]; - + var link = new Uri(SiteLink + "sdownload/" + torrentID + "/" + passkey); + var publishDate = DateTimeUtil.UnixTimestampToDateTime((double)torrent[3]).ToLocalTime(); + var downloadVolumeFactor = (long)torrent[10] switch + { + // Only Up + 2 => 0, + // 50 % Down + 1 => 0.5, + // All others 100% down + _ => 1, + }; + var release = new ReleaseInfo + { + MinimumRatio = 0.8, + MinimumSeedTime = 172800, // 48 hours + Category = MapTrackerCatToNewznab(torrent[0].ToString()), + Title = torrent[1].ToString(), + Comments = comments, + Guid = comments, + Link = link, + PublishDate = publishDate, + Size = (long)torrent[5], + Seeders = seeders, + Peers = seeders + (int)torrent[7], + Description = genres, + UploadVolumeFactor = 1, + DownloadVolumeFactor = downloadVolumeFactor, + Grabs = (long)torrent[11] + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/TorrentSyndikat.cs b/src/Jackett.Common/Indexers/TorrentSyndikat.cs index 199071cb0..919de1fb4 100644 --- a/src/Jackett.Common/Indexers/TorrentSyndikat.cs +++ b/src/Jackett.Common/Indexers/TorrentSyndikat.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; +using AngleSharp.Dom; using AngleSharp.Html.Parser; using Jackett.Common.Models; using Jackett.Common.Models.IndexerConfig; @@ -185,63 +186,55 @@ namespace Jackett.Common.Indexers var globalFreeleech = dom.QuerySelector("legend:contains(\"Freeleech\")+ul > li > b:contains(\"Freeleech\")") != null; foreach (var row in rows.Skip(1)) { - var release = new ReleaseInfo(); - release.MinimumRatio = 1; - release.MinimumSeedTime = 96 * 60 * 60; var catStr = row.Children[0].FirstElementChild.GetAttribute("href").Split('=')[1].Split('&')[0]; - release.Category = MapTrackerCatToNewznab(catStr); var qLink = row.Children[2].FirstElementChild; - release.Link = new Uri(SiteLink + qLink.GetAttribute("href")); var descCol = row.Children[1]; var torrentTag = descCol.QuerySelectorAll("span.torrent-tag"); - if (torrentTag.Any()) - release.Description = string.Join(", ", torrentTag.Select(x => x.InnerHtml)); - + //Empty list gives string.Empty in string.Join + var description = string.Join(", ", torrentTag.Select(x => x.InnerHtml)); var qCommentLink = descCol.QuerySelector("a[href*=\"details.php\"]"); - release.Title = qCommentLink.GetAttribute("title"); - release.Comments = new Uri(SiteLink + qCommentLink.GetAttribute("href").Replace("&hit=1", "")); - release.Guid = release.Comments; + var comments = new Uri(SiteLink + qCommentLink.GetAttribute("href").Replace("&hit=1", "")); var torrentDetails = descCol.QuerySelector(".torrent_details"); var rawDateStr = torrentDetails.ChildNodes[1].TextContent; - var dateStr = rawDateStr.Trim().Replace("von", "").Trim(); - DateTime dateGerman; - if (dateStr.StartsWith("Heute ")) - dateGerman = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + TimeSpan.Parse(dateStr.Split(' ')[1]); - else if (dateStr.StartsWith("Gestern ")) - dateGerman = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + TimeSpan.Parse(dateStr.Split(' ')[1]) - TimeSpan.FromDays(1); - else - dateGerman = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); - + var dateStr = rawDateStr.Replace("von", "") + .Replace("Heute", "Today") + .Replace("Gestern", "Yesterday"); + var dateGerman =DateTimeUtil.FromUnknown(dateStr); var pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateGerman, germanyTz); - release.PublishDate = pubDateUtc.ToLocalTime(); - - var imdbLink = descCol.QuerySelector("a[href*=\"&searchin=imdb\"]"); - if (imdbLink != null) - release.Imdb = ParseUtil.GetLongFromString(imdbLink.GetAttribute("href")); - + var longFromString = ParseUtil.GetLongFromString(descCol.QuerySelector("a[href*=\"&searchin=imdb\"]")?.GetAttribute("href")); var sizeFileCountRowChilds = row.Children[5].Children; - release.Size = ReleaseInfo.GetBytes(sizeFileCountRowChilds[0].TextContent); - release.Files = ParseUtil.CoerceInt(sizeFileCountRowChilds[2].TextContent); - - 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(7)").TextContent; - release.Grabs = ParseUtil.CoerceInt(grabs); - - if (globalFreeleech) - release.DownloadVolumeFactor = 0; - else if (row.QuerySelector("span.torrent-tag-free") != null) - release.DownloadVolumeFactor = 0; - else - release.DownloadVolumeFactor = 1; - - release.UploadVolumeFactor = 1; - + var seeders = ParseUtil.CoerceInt(row.Children[7].TextContent); + var link = new Uri(SiteLink + qLink.GetAttribute("href")); + var files = ParseUtil.CoerceInt(sizeFileCountRowChilds[2].TextContent); + var leechers = ParseUtil.CoerceInt(row.Children[8].TextContent); + var grabs = ParseUtil.CoerceInt(row.QuerySelector("td:nth-child(7)").TextContent); + var downloadVolumeFactor = globalFreeleech || row.QuerySelector("span.torrent-tag-free") != null + ? 0 : 1; + var size = ReleaseInfo.GetBytes(sizeFileCountRowChilds[0].TextContent); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 345600, //8 days + Category = MapTrackerCatToNewznab(catStr), + Link = link, + Description = description, + Title = qCommentLink.GetAttribute("title"), + Comments = comments, + Guid = comments, + PublishDate = pubDateUtc.ToLocalTime(), + Imdb = longFromString, + Size = size, + Files = files, + Seeders = seeders, + Peers = leechers + seeders, + Grabs = grabs, + DownloadVolumeFactor = downloadVolumeFactor, + UploadVolumeFactor = 1 + }; releases.Add(release); } } diff --git a/src/Jackett.Common/Indexers/Torrentech.cs b/src/Jackett.Common/Indexers/Torrentech.cs index 26aa1c061..6330e0ffd 100644 --- a/src/Jackett.Common/Indexers/Torrentech.cs +++ b/src/Jackett.Common/Indexers/Torrentech.cs @@ -74,13 +74,14 @@ namespace Jackett.Common.Indexers var searchString = query.GetQueryString(); WebClientStringResult results = null; - var queryCollection = new NameValueCollection(); - - queryCollection.Add("act", "search"); - queryCollection.Add("forums", "all"); - queryCollection.Add("torrents", "1"); - queryCollection.Add("search_in", "titles"); - queryCollection.Add("result_type", "topics"); + var queryCollection = new NameValueCollection + { + { "act", "search" }, + { "forums", "all" }, + { "torrents", "1" }, + { "search_in", "titles" }, + { "result_type", "topics" } + }; // if the search string is empty use the getnew view if (string.IsNullOrWhiteSpace(searchString)) @@ -112,6 +113,7 @@ namespace Jackett.Common.Indexers { try { + //TODO refactor to initializer var release = new ReleaseInfo(); var StatsElements = Row.QuerySelector("td:nth-child(5)"); diff --git a/src/Jackett.Common/Indexers/Torrentscsv.cs b/src/Jackett.Common/Indexers/Torrentscsv.cs index 1d800e587..7349a9dc8 100644 --- a/src/Jackett.Common/Indexers/Torrentscsv.cs +++ b/src/Jackett.Common/Indexers/Torrentscsv.cs @@ -77,11 +77,12 @@ namespace Jackett.Common.Indexers if (string.IsNullOrEmpty(searchString)) searchString = "2020"; - var queryCollection = new NameValueCollection(); - - queryCollection.Add("q", searchString); - queryCollection.Add("size", "500"); - queryCollection.Add("type_", "torrent"); + var queryCollection = new NameValueCollection + { + { "q", searchString }, + { "size", "500" }, + { "type_", "torrent" } + }; var searchUrl = ApiEndpoint + "?" + queryCollection.GetQueryString(); var response = await RequestStringWithCookiesAndRetry(searchUrl, string.Empty); @@ -97,11 +98,12 @@ namespace Jackett.Common.Indexers if (torrent == null) throw new Exception("Error: No data returned!"); - var release = new ReleaseInfo(); - release.Title = torrent.Value("name"); - // construct magnet link from infohash with all public trackers known to man - var magnet_uri = "magnet:?xt=urn:btih:" + torrent.Value("infohash") + + // TODO move trackers to List for reuse elsewhere + // TODO dynamically generate list periodically from online tracker repositories like + // https://torrents.io/tracker-list/ + // https://github.com/ngosang/trackerslist + var magnet = new Uri( "magnet:?xt=urn:btih:" + torrent.Value("infohash") + "&tr=udp://tracker.coppersurfer.tk:6969/announce" + "&tr=udp://tracker.leechers-paradise.org:6969/announce" + "&tr=udp://tracker.internetwarriors.net:1337/announce" + @@ -134,32 +136,35 @@ namespace Jackett.Common.Indexers "&tr=udp://torrentclub.tech:6969/announce" + "&tr=udp://tracker.tvunderground.org.ru:3218/announce" + "&tr=udp://tracker.open-tracker.org:1337/announce" + - "&tr=udp://tracker.justseed.it:1337/announce"; - - release.MagnetUri = new Uri(magnet_uri); - // there is no comments or details link so we point to the web site instead - release.Comments = new Uri(SiteLink); - release.Guid = release.MagnetUri; - release.Link = release.MagnetUri; - release.InfoHash = torrent.Value("infohash").ToString(); + "&tr=udp://tracker.justseed.it:1337/announce"); // convert unix timestamp to human readable date double createdunix = torrent.Value("created_unix"); var dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); dateTime = dateTime.AddSeconds(createdunix); - release.PublishDate = dateTime; - release.Seeders = torrent.Value("seeders"); - release.Peers = torrent.Value("leechers") + release.Seeders; - release.Size = torrent.Value("size_bytes"); - var grabs = torrent.Value("completed"); - if (grabs == null) - grabs = "0"; - release.Grabs = ParseUtil.CoerceInt(grabs); - release.MinimumRatio = 1; - release.MinimumSeedTime = 172800; // 48 hours - release.DownloadVolumeFactor = 0; - release.UploadVolumeFactor = 1; + var seeders = torrent.Value("seeders"); + var grabs = ParseUtil.CoerceInt(torrent.Value("completed") ?? "0"); + var release = new ReleaseInfo + { + Title = torrent.Value("name"), + MagnetUri = magnet, + // there is no comments or details link so we point to the web site instead + Comments = new Uri(SiteLink), + Guid = magnet, + Link = magnet, + InfoHash = torrent.Value("infohash").ToString(), + PublishDate = dateTime, + Seeders = seeders, + Peers = torrent.Value("leechers") + seeders, + Size = torrent.Value("size_bytes"), + Grabs = grabs, + MinimumRatio = 1, + MinimumSeedTime = 172800, // 48 hours + DownloadVolumeFactor = 0, + UploadVolumeFactor = 1 + }; + //TODO isn't there already a function for this? // dummy mappings for sonarr, radarr, etc var categories = string.Join(";", MapTorznabCapsToTrackers(query)); if (!string.IsNullOrEmpty(categories)) @@ -198,7 +203,7 @@ namespace Jackett.Common.Indexers } } // for null category - if (string.IsNullOrEmpty(categories)) + else { release.Category = new List { TorznabCatType.Other.ID }; } diff --git a/src/Jackett.Common/Indexers/Xthor.cs b/src/Jackett.Common/Indexers/Xthor.cs index e6347dc75..da2cced1c 100644 --- a/src/Jackett.Common/Indexers/Xthor.cs +++ b/src/Jackett.Common/Indexers/Xthor.cs @@ -139,7 +139,7 @@ namespace Jackett.Common.Indexers // Warning 1998 is async method with no await calls inside // TODO: Remove pragma by wrapping return in Task.FromResult and removing async - + #pragma warning disable 1998 public override async Task ApplyConfiguration(JToken configJson) @@ -234,6 +234,11 @@ namespace Jackett.Common.Indexers torrent.name = regex.Replace(torrent.name, "$1" + ReplaceMulti + "$2"); } + var publishDate = DateTimeUtil.UnixTimestampToDateTime(torrent.added); + //TODO replace with download link? + var guid = new Uri(TorrentDescriptionUrl.Replace("{id}", torrent.id.ToString())); + var comments = new Uri(TorrentCommentUrl.Replace("{id}", torrent.id.ToString())); + var link = new Uri(torrent.download_link); var release = new ReleaseInfo { // Mapping data @@ -243,18 +248,19 @@ namespace Jackett.Common.Indexers Peers = torrent.seeders + torrent.leechers, MinimumRatio = 1, MinimumSeedTime = 345600, - PublishDate = DateTimeUtil.UnixTimestampToDateTime(torrent.added), + PublishDate = publishDate, Size = torrent.size, Grabs = torrent.times_completed, Files = torrent.numfiles, UploadVolumeFactor = 1, DownloadVolumeFactor = (torrent.freeleech == 1 ? 0 : 1), - Guid = new Uri(TorrentDescriptionUrl.Replace("{id}", torrent.id.ToString())), - Comments = new Uri(TorrentCommentUrl.Replace("{id}", torrent.id.ToString())), - Link = new Uri(torrent.download_link), + Guid = guid, + Comments = comments, + Link = link, TMDb = torrent.tmdb_id }; + //TODO make consistent with other trackers if (DevMode) { Output(release.ToString()); diff --git a/src/Jackett.Common/Indexers/pornolab.cs b/src/Jackett.Common/Indexers/pornolab.cs index 54d32c371..93723f495 100644 --- a/src/Jackett.Common/Indexers/pornolab.cs +++ b/src/Jackett.Common/Indexers/pornolab.cs @@ -23,6 +23,7 @@ namespace Jackett.Common.Indexers protected string cap_sid = null; protected string cap_code_field = null; + private static readonly Regex s_StripRussianRegex = new Regex(@"(\([А-Яа-яЁё\W]+\))|(^[А-Яа-яЁё\W\d]+\/ )|([а-яА-ЯЁё \-]+,+)|([а-яА-ЯЁё]+)"); private new ConfigurationDataPornolab configData { @@ -278,11 +279,6 @@ namespace Jackett.Common.Indexers { try { - var release = new ReleaseInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 0; - var qDownloadLink = Row.QuerySelector("a.tr-dl"); if (qDownloadLink == null) // Expects moderation continue; @@ -290,38 +286,38 @@ namespace Jackett.Common.Indexers var qForumLink = Row.QuerySelector("a.f"); var qDetailsLink = Row.QuerySelector("a.tLink"); var qSize = Row.QuerySelector("td:nth-child(6) u"); - - release.Title = qDetailsLink.TextContent; - - release.Comments = new Uri(SiteLink + "forum/" + qDetailsLink.GetAttribute("href")); - release.Description = qForumLink.TextContent; - release.Link = release.Comments; - release.Guid = release.Link; - release.Size = ReleaseInfo.GetBytes(qSize.TextContent); - - var seeders = Row.QuerySelector("td:nth-child(7) b").TextContent; - if (string.IsNullOrWhiteSpace(seeders)) - seeders = "0"; - release.Seeders = ParseUtil.CoerceInt(seeders); - release.Peers = ParseUtil.CoerceInt(Row.QuerySelector("td:nth-child(8)").TextContent) + release.Seeders; - release.Grabs = ParseUtil.CoerceLong(Row.QuerySelector("td:nth-child(9)").TextContent); + var link = new Uri(SiteLink + "forum/" + qDetailsLink.GetAttribute("href")); + var seederString = Row.QuerySelector("td:nth-child(7) b").TextContent; + var seeders = string.IsNullOrWhiteSpace(seederString) ? 0 : ParseUtil.CoerceInt(seederString); var timestr = Row.QuerySelector("td:nth-child(10) u").TextContent; - release.PublishDate = DateTimeUtil.UnixTimestampToDateTime(long.Parse(timestr)); - var forum = qForumLink; var forumid = forum.GetAttribute("href").Split('=')[1]; - release.Category = MapTrackerCatToNewznab(forumid); - - release.DownloadVolumeFactor = 1; - release.UploadVolumeFactor = 1; - - if (configData.StripRussianLetters.Value) + var title = configData.StripRussianLetters.Value + ? s_StripRussianRegex.Replace(qDetailsLink.TextContent, "") + : qDetailsLink.TextContent; + var size = ReleaseInfo.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(timestr)); + var release = new ReleaseInfo { - var regex = new Regex(@"(\([А-Яа-яЁё\W]+\))|(^[А-Яа-яЁё\W\d]+\/ )|([а-яА-ЯЁё \-]+,+)|([а-яА-ЯЁё]+)"); - release.Title = regex.Replace(release.Title, ""); - } - + MinimumRatio = 1, + MinimumSeedTime = 0, + Title = title, + Comments = link, + Description = qForumLink.TextContent, + Link = link, + Guid = link, + Size = size, + Seeders = seeders, + Peers = leechers + seeders, + Grabs = grabs, + PublishDate = publishDate, + Category = MapTrackerCatToNewznab(forumid), + DownloadVolumeFactor = 1, + UploadVolumeFactor = 1 + }; releases.Add(release); } catch (Exception ex) diff --git a/src/Jackett.Common/Indexers/rutracker.cs b/src/Jackett.Common/Indexers/rutracker.cs index c2fcc165e..af37eac03 100644 --- a/src/Jackett.Common/Indexers/rutracker.cs +++ b/src/Jackett.Common/Indexers/rutracker.cs @@ -1539,42 +1539,46 @@ namespace Jackett.Common.Indexers { try { - var release = new ReleaseInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 0; - var qDownloadLink = Row.QuerySelector("td.tor-size > a.tr-dl"); if (qDownloadLink == null) // Expects moderation continue; - var qDetailsLink = Row.QuerySelector("td.t-title > div.t-title > a.tLink"); var qSize = Row.QuerySelector("td.tor-size"); - - release.Title = qDetailsLink.TextContent; - - release.Comments = new Uri(SiteLink + "forum/" + qDetailsLink.GetAttribute("href")); - release.Link = new Uri(SiteLink + "forum/" + qDownloadLink.GetAttribute("href")); - release.Guid = release.Comments; - release.Size = ReleaseInfo.GetBytes(qSize.GetAttribute("data-ts_text")); - - var seeders = Row.QuerySelector("td:nth-child(7) b").TextContent; - if (string.IsNullOrWhiteSpace(seeders)) - seeders = "0"; - release.Seeders = ParseUtil.CoerceInt(seeders); - release.Peers = ParseUtil.CoerceInt(Row.QuerySelector("td:nth-child(8)").TextContent) + release.Seeders; - release.Grabs = ParseUtil.CoerceLong(Row.QuerySelector("td:nth-child(9)").TextContent); - + var comments = new Uri(SiteLink + "forum/" + qDetailsLink.GetAttribute("href")); + var seedersString = Row.QuerySelector("td:nth-child(7) b").TextContent; + var seeders = string.IsNullOrWhiteSpace(seedersString) ? 0 : ParseUtil.CoerceInt(seedersString); var timestr = Row.QuerySelector("td:nth-child(10)").GetAttribute("data-ts_text"); - release.PublishDate = DateTimeUtil.UnixTimestampToDateTime(long.Parse(timestr)); - var forum = Row.QuerySelector("td.f-name > div.f-name > a"); var forumid = forum.GetAttribute("href").Split('=')[1]; - release.Category = MapTrackerCatToNewznab(forumid); + var link = new Uri(SiteLink + "forum/" + qDownloadLink.GetAttribute("href")); + var size = ReleaseInfo.GetBytes(qSize.GetAttribute("data-ts_text")); + 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(timestr)); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 0, + Title = qDetailsLink.TextContent, + Comments = comments, + Link = link, + Guid = comments, + Size = size, + Seeders = seeders, + Peers = leechers + seeders, + Grabs = grabs, + PublishDate = publishDate, + Category = MapTrackerCatToNewznab(forumid), + DownloadVolumeFactor = 1, + UploadVolumeFactor = 1 + }; - release.DownloadVolumeFactor = 1; - release.UploadVolumeFactor = 1; + + + + + // TODO finish extracting release variables to simiplify release initialization if (release.Category.Contains(TorznabCatType.TV.ID)) { // extract season and episodes diff --git a/src/Jackett.Common/Indexers/toloka.cs b/src/Jackett.Common/Indexers/toloka.cs index b637045cd..bce0eaa49 100644 --- a/src/Jackett.Common/Indexers/toloka.cs +++ b/src/Jackett.Common/Indexers/toloka.cs @@ -247,47 +247,45 @@ namespace Jackett.Common.Indexers { try { - var release = new ReleaseInfo(); - - release.MinimumRatio = 1; - release.MinimumSeedTime = 0; - var qDownloadLink = Row.QuerySelector("td:nth-child(6) > a"); if (qDownloadLink == null) // Expects moderation continue; var qDetailsLink = Row.QuerySelector("td:nth-child(3) > a"); var qSize = Row.QuerySelector("td:nth-child(7)"); - - release.Title = qDetailsLink.TextContent; - - release.Comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); - release.Link = new Uri(SiteLink + qDownloadLink.GetAttribute("href")); - release.Guid = release.Comments; - release.Size = ReleaseInfo.GetBytes(qSize.TextContent); - - var seeders = Row.QuerySelector("td:nth-child(10) > b").TextContent; - if (string.IsNullOrWhiteSpace(seeders)) - seeders = "0"; - release.Seeders = ParseUtil.CoerceInt(seeders); - release.Peers = ParseUtil.CoerceInt(Row.QuerySelector("td:nth-child(11) > b").TextContent) + release.Seeders; - release.Grabs = 0;//ParseUtil.CoerceLong(Row.QuerySelector("td:nth-child(9)").TextContent); - + var seedersStr = Row.QuerySelector("td:nth-child(10) > b").TextContent; + var seeders = string.IsNullOrWhiteSpace(seedersStr) ? 0 : ParseUtil.CoerceInt(seedersStr); var timestr = Row.QuerySelector("td:nth-child(13)").TextContent; - release.PublishDate = DateTimeUtil.FromFuzzyTime(timestr); - var forum = Row.QuerySelector("td:nth-child(2) > a"); var forumid = forum.GetAttribute("href").Split('=')[1]; - release.Category = MapTrackerCatToNewznab(forumid); - - release.DownloadVolumeFactor = 1; - release.UploadVolumeFactor = 1; + var comments = new Uri(SiteLink + qDetailsLink.GetAttribute("href")); + var link = new Uri(SiteLink + qDownloadLink.GetAttribute("href")); + var size = ReleaseInfo.GetBytes(qSize.TextContent); + var leechers = ParseUtil.CoerceInt(Row.QuerySelector("td:nth-child(11) > b").TextContent); + var publishDate = DateTimeUtil.FromFuzzyTime(timestr); + var release = new ReleaseInfo + { + MinimumRatio = 1, + MinimumSeedTime = 0, + Title = qDetailsLink.TextContent, + Comments = comments, + Link = link, + Guid = comments, + Size = size, + Seeders = seeders, + Peers = leechers + seeders, + Grabs = 0, //ParseUtil.CoerceLong(Row.QuerySelector("td:nth-child(9)").TextContent); + PublishDate = publishDate, + Category = MapTrackerCatToNewznab(forumid), + DownloadVolumeFactor = 1, + UploadVolumeFactor = 1 + }; + // TODO cleanup if (release.Category.Contains(TorznabCatType.TV.ID)) { // extract season and episodes var regex = new Regex(".+\\/\\s([^а-яА-я\\/]+)\\s\\/.+Сезон\\s*[:]*\\s+(\\d+).+(?:Серії|Епізод)+\\s*[:]*\\s+(\\d+-*\\d*).+,\\s+(.+)\\]\\s(.+)"); - var title = regex.Replace(release.Title, "$1 - S$2E$3 - rus $4 $5"); title = Regex.Replace(title, "-Rip", "Rip", RegexOptions.IgnoreCase); title = Regex.Replace(title, "WEB-DLRip", "WEBDL", RegexOptions.IgnoreCase); diff --git a/src/Jackett.Common/Indexers/yts.cs b/src/Jackett.Common/Indexers/yts.cs index 911529528..00d99eea4 100644 --- a/src/Jackett.Common/Indexers/yts.cs +++ b/src/Jackett.Common/Indexers/yts.cs @@ -76,11 +76,13 @@ namespace Jackett.Common.Indexers var releases = new List(); var searchString = query.GetQueryString(); - var queryCollection = new NameValueCollection(); + var queryCollection = new NameValueCollection + { - // without this the API sometimes returns nothing - queryCollection.Add("sort", "date_added"); - queryCollection.Add("limit", "50"); + // without this the API sometimes returns nothing + { "sort", "date_added" }, + { "limit", "50" } + }; if (query.ImdbID != null) { @@ -127,6 +129,7 @@ namespace Jackett.Common.Indexers continue; foreach (var torrent_info in torrents) { + //TODO change to initializer var release = new ReleaseInfo(); // append type: BRRip or WEBRip, resolves #3558 via #4577 diff --git a/src/Jackett.Common/Models/Config/ServerConfig.cs b/src/Jackett.Common/Models/Config/ServerConfig.cs index 287970481..31c71f145 100644 --- a/src/Jackett.Common/Models/Config/ServerConfig.cs +++ b/src/Jackett.Common/Models/Config/ServerConfig.cs @@ -129,6 +129,6 @@ namespace Jackett.Common.Models.Config } public void ConfigChanged() => - observers.ForEach(obs=>obs.OnNext(this)); + observers.ForEach(obs => obs.OnNext(this)); } } diff --git a/src/Jackett.Common/Models/DTO/ApiSearch.cs b/src/Jackett.Common/Models/DTO/ApiSearch.cs index 9dfa2c5b4..0dcc82077 100644 --- a/src/Jackett.Common/Models/DTO/ApiSearch.cs +++ b/src/Jackett.Common/Models/DTO/ApiSearch.cs @@ -11,8 +11,10 @@ namespace Jackett.Common.Models.DTO public static TorznabQuery ToTorznabQuery(ApiSearch request) { - var stringQuery = new TorznabQuery(); - stringQuery.QueryType = "search"; + var stringQuery = new TorznabQuery + { + QueryType = "search" + }; var queryStr = request.Query; if (queryStr != null) @@ -38,9 +40,7 @@ namespace Jackett.Common.Models.DTO } stringQuery.SearchTerm = queryStr; - stringQuery.Categories = request.Category; - if (stringQuery.Categories == null) - stringQuery.Categories = new int[0]; + stringQuery.Categories = request.Category ?? new int[0]; stringQuery.ExpandCatsToSubCats(); // try to build an IMDB Query (tt plus 6 to 8 digits) diff --git a/src/Jackett.Common/Models/IndexerConfig/Bespoke/ConfigurationHDBitsApi.cs b/src/Jackett.Common/Models/IndexerConfig/Bespoke/ConfigurationHDBitsApi.cs index 9c3e00bc8..bac0c5f40 100644 --- a/src/Jackett.Common/Models/IndexerConfig/Bespoke/ConfigurationHDBitsApi.cs +++ b/src/Jackett.Common/Models/IndexerConfig/Bespoke/ConfigurationHDBitsApi.cs @@ -7,7 +7,7 @@ namespace Jackett.Common.Models.IndexerConfig.Bespoke public CheckboxItem Codecs { get; private set; } public CheckboxItem Mediums { get; private set; } - public ConfigurationDataHDBitsApi(): base() + public ConfigurationDataHDBitsApi() : base() { Codecs = new CheckboxItem(new Dictionary() { @@ -18,7 +18,7 @@ namespace Jackett.Common.Models.IndexerConfig.Bespoke {"6", "VP9"}, {"4", "XviD"} }) - { Name = "Codec", Values = new string[]{ "1", "5", "2", "3", "6", "4" } }; + { Name = "Codec", Values = new string[] { "1", "5", "2", "3", "6", "4" } }; Mediums = new CheckboxItem(new Dictionary() { @@ -28,7 +28,7 @@ namespace Jackett.Common.Models.IndexerConfig.Bespoke {"5", "Remux"}, {"6", "WEB-DL"} }) - { Name = "Medium", Values = new string[]{ "1", "4", "3", "5", "6" } }; + { Name = "Medium", Values = new string[] { "1", "4", "3", "5", "6" } }; } } } diff --git a/src/Jackett.Common/Models/IndexerConfig/ConfigurationData.cs b/src/Jackett.Common/Models/IndexerConfig/ConfigurationData.cs index b75c82482..db6583c6c 100644 --- a/src/Jackett.Common/Models/IndexerConfig/ConfigurationData.cs +++ b/src/Jackett.Common/Models/IndexerConfig/ConfigurationData.cs @@ -105,10 +105,12 @@ namespace Jackett.Common.Models.IndexerConfig var jArray = new JArray(); foreach (var item in items) { - var jObject = new JObject(); - jObject["id"] = item.ID; - jObject["type"] = item.ItemType.ToString().ToLower(); - jObject["name"] = item.Name; + var jObject = new JObject + { + ["id"] = item.ID, + ["type"] = item.ItemType.ToString().ToLower(), + ["name"] = item.Name + }; switch (item.ItemType) { case ItemType.Recaptcha: diff --git a/src/Jackett.Common/Models/ReleaseInfo.cs b/src/Jackett.Common/Models/ReleaseInfo.cs index 2688b457a..2b411b508 100644 --- a/src/Jackett.Common/Models/ReleaseInfo.cs +++ b/src/Jackett.Common/Models/ReleaseInfo.cs @@ -37,7 +37,7 @@ namespace Jackett.Common.Models public IIndexer Origin; - private static double? GigabytesFromBytes(double? size) => size / 1024.0 / 1024.0 / 1024.0; + private static double? GigabytesFromBytes(double? size) => size / 1024.0 / 1024.0 / 1024.0; public double? Gain => Seeders * GigabytesFromBytes(Size); public ReleaseInfo() diff --git a/src/Jackett.Common/Models/TorznabQuery.cs b/src/Jackett.Common/Models/TorznabQuery.cs index 2e05e6314..606e9aea2 100644 --- a/src/Jackett.Common/Models/TorznabQuery.cs +++ b/src/Jackett.Common/Models/TorznabQuery.cs @@ -105,38 +105,35 @@ namespace Jackett.Common.Models public TorznabQuery Clone() { - var ret = new TorznabQuery(); - ret.QueryType = QueryType; - if (Categories != null && Categories.Length > 0) + var ret = new TorznabQuery + { + QueryType = QueryType, + Extended = Extended, + ApiKey = ApiKey, + Limit = Limit, + Offset = Offset, + Season = Season, + Episode = Episode, + SearchTerm = SearchTerm, + IsTest = IsTest, + Album = Album, + Artist = Artist, + Label = Label, + Track = Track, + Year = Year, + RageID = RageID, + ImdbID = ImdbID + }; + if (Categories?.Length > 0) { ret.Categories = new int[Categories.Length]; Array.Copy(Categories, ret.Categories, Categories.Length); } - ret.Extended = Extended; - ret.ApiKey = ApiKey; - ret.Limit = Limit; - ret.Offset = Offset; - ret.Season = Season; - ret.Episode = Episode; - ret.SearchTerm = SearchTerm; - ret.IsTest = IsTest; - ret.Album = Album; - ret.Artist = Artist; - ret.Label = Label; - ret.Track = Track; - ret.Year = Year; - if (Genre != null) - { - // Make a copied list and then don't use it? - Genre.Select(item => item.Clone()).ToList(); - } - if (QueryStringParts != null && QueryStringParts.Length > 0) + if (QueryStringParts?.Length > 0) { ret.QueryStringParts = new string[QueryStringParts.Length]; Array.Copy(QueryStringParts, ret.QueryStringParts, QueryStringParts.Length); } - ret.RageID = RageID; - ret.ImdbID = ImdbID; return ret; } diff --git a/src/Jackett.Common/Services/CacheService.cs b/src/Jackett.Common/Services/CacheService.cs index d21e67371..9f1b84c2b 100644 --- a/src/Jackett.Common/Services/CacheService.cs +++ b/src/Jackett.Common/Services/CacheService.cs @@ -19,26 +19,29 @@ namespace Jackett.Common.Services { lock (cache) { - var trackerCache = cache.Where(c => c.TrackerId == indexer.ID).FirstOrDefault(); + var trackerCache = cache.FirstOrDefault(c => c.TrackerId == indexer.ID); if (trackerCache == null) { - trackerCache = new TrackerCache(); - trackerCache.TrackerId = indexer.ID; - trackerCache.TrackerName = indexer.DisplayName; + trackerCache = new TrackerCache + { + TrackerId = indexer.ID, + TrackerName = indexer.DisplayName + }; cache.Add(trackerCache); } foreach (var release in releases.OrderByDescending(i => i.PublishDate)) { - var existingItem = trackerCache.Results.Where(i => i.Result.Guid == release.Guid).FirstOrDefault(); + var existingItem = trackerCache.Results.FirstOrDefault(i => i.Result.Guid == release.Guid); if (existingItem == null) { - existingItem = new CachedResult(); - existingItem.Created = DateTime.Now; + existingItem = new CachedResult + { + Created = DateTime.Now + }; trackerCache.Results.Add(existingItem); } - existingItem.Result = release; } // Prune cache @@ -54,12 +57,12 @@ namespace Jackett.Common.Services lock (cache) { var newItemCount = 0; - var trackerCache = cache.Where(c => c.TrackerId == indexer.ID).FirstOrDefault(); + var trackerCache = cache.FirstOrDefault(c => c.TrackerId == indexer.ID); if (trackerCache != null) { foreach (var release in releases) { - if (trackerCache.Results.Where(i => i.Result.Guid == release.Guid).Count() == 0) + if (trackerCache.Results.Count(i => i.Result.Guid == release.Guid) == 0) { newItemCount++; } diff --git a/src/Jackett.Common/Services/ImdbResolver.cs b/src/Jackett.Common/Services/ImdbResolver.cs index 90d6a1eee..0c9daf0ba 100644 --- a/src/Jackett.Common/Services/ImdbResolver.cs +++ b/src/Jackett.Common/Services/ImdbResolver.cs @@ -34,8 +34,10 @@ namespace Jackett.Common.Services if (string.IsNullOrWhiteSpace(url)) url = "http://omdbapi.com"; - var request = new WebRequest(url + "/?apikey=" + apiKey + "&i=" + imdbId); - request.Encoding = Encoding.UTF8; + var request = new WebRequest(url + "/?apikey=" + apiKey + "&i=" + imdbId) + { + Encoding = Encoding.UTF8 + }; var result = await WebClient.GetString(request); var movie = JsonConvert.DeserializeObject(result.Content); diff --git a/src/Jackett.Common/Services/IndexerManagerService.cs b/src/Jackett.Common/Services/IndexerManagerService.cs index 25860bcf5..7ee3de9b1 100644 --- a/src/Jackett.Common/Services/IndexerManagerService.cs +++ b/src/Jackett.Common/Services/IndexerManagerService.cs @@ -172,8 +172,10 @@ namespace Jackett.Common.Services } logger.Info("Adding aggregate indexer"); - aggregateIndexer = new AggregateIndexer(fallbackStrategyProvider, resultFilterProvider, configService, webClient, logger, protectionService); - aggregateIndexer.Indexers = indexers.Values; + aggregateIndexer = new AggregateIndexer(fallbackStrategyProvider, resultFilterProvider, configService, webClient, logger, protectionService) + { + Indexers = indexers.Values + }; } public IIndexer GetIndexer(string name) @@ -213,10 +215,12 @@ namespace Jackett.Common.Services public async Task TestIndexer(string name) { var indexer = GetIndexer(name); - var browseQuery = new TorznabQuery(); - browseQuery.QueryType = "search"; - browseQuery.SearchTerm = ""; - browseQuery.IsTest = true; + var browseQuery = new TorznabQuery + { + QueryType = "search", + SearchTerm = "", + IsTest = true + }; var result = await indexer.ResultsForQuery(browseQuery); logger.Info(string.Format("Found {0} releases from {1}", result.Releases.Count(), indexer.DisplayName)); if (result.Releases.Count() == 0) diff --git a/src/Jackett.Common/Services/UpdateService.cs b/src/Jackett.Common/Services/UpdateService.cs index 83131e897..4459628bc 100644 --- a/src/Jackett.Common/Services/UpdateService.cs +++ b/src/Jackett.Common/Services/UpdateService.cs @@ -335,9 +335,11 @@ namespace Jackett.Common.Services var exe = Path.GetFileName(ExePath()); var args = string.Join(" ", Environment.GetCommandLineArgs().Skip(1).Select(a => a.Contains(" ") ? "\"" + a + "\"" : a)).Replace("\"", "\\\""); - var startInfo = new ProcessStartInfo(); - startInfo.UseShellExecute = false; - startInfo.CreateNoWindow = true; + var startInfo = new ProcessStartInfo + { + UseShellExecute = false, + CreateNoWindow = true + }; // Note: add a leading space to the --Args argument to avoid parsing as arguments if (variant == Variants.JackettVariant.Mono) diff --git a/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs b/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs index 053b374d1..bd63379b9 100644 --- a/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs +++ b/src/Jackett.Common/Utils/Clients/HttpWebClient2.cs @@ -118,8 +118,10 @@ namespace Jackett.Common.Utils.Clients public void CreateClient() { - clearanceHandlr = new ClearanceHandler(BrowserUtil.ChromeUserAgent); - clearanceHandlr.MaxTries = 30; + clearanceHandlr = new ClearanceHandler(BrowserUtil.ChromeUserAgent) + { + MaxTries = 30 + }; clientHandlr = new HttpClientHandler { CookieContainer = cookies, @@ -240,8 +242,10 @@ namespace Jackett.Common.Utils.Clients response = await client.SendAsync(request); - var result = new WebClientByteResult(); - result.Content = await response.Content.ReadAsByteArrayAsync(); + var result = new WebClientByteResult + { + Content = await response.Content.ReadAsByteArrayAsync() + }; foreach (var header in response.Headers) { diff --git a/src/Jackett.Common/Utils/Clients/HttpWebClient2NetCore.cs b/src/Jackett.Common/Utils/Clients/HttpWebClient2NetCore.cs index 9796082ec..5fbd5e989 100644 --- a/src/Jackett.Common/Utils/Clients/HttpWebClient2NetCore.cs +++ b/src/Jackett.Common/Utils/Clients/HttpWebClient2NetCore.cs @@ -114,8 +114,10 @@ namespace Jackett.Common.Utils.Clients public void CreateClient() { - clearanceHandlr = new ClearanceHandler(BrowserUtil.ChromeUserAgent); - clearanceHandlr.MaxTries = 30; + clearanceHandlr = new ClearanceHandler(BrowserUtil.ChromeUserAgent) + { + MaxTries = 30 + }; clientHandlr = new HttpClientHandler { CookieContainer = cookies, @@ -236,8 +238,10 @@ namespace Jackett.Common.Utils.Clients response = await client.SendAsync(request); - var result = new WebClientByteResult(); - result.Content = await response.Content.ReadAsByteArrayAsync(); + var result = new WebClientByteResult + { + Content = await response.Content.ReadAsByteArrayAsync() + }; foreach (var header in response.Headers) { diff --git a/src/Jackett.Common/Utils/JsonContent.cs b/src/Jackett.Common/Utils/JsonContent.cs index 95c1bafff..8866aea5c 100644 --- a/src/Jackett.Common/Utils/JsonContent.cs +++ b/src/Jackett.Common/Utils/JsonContent.cs @@ -13,7 +13,7 @@ namespace Jackett.Common.Utils public JsonContent(object value, Encoding encoding) : base( JsonConvert.SerializeObject( - value, Formatting.Indented, new JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}), + value, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }), encoding, "application/json") { } diff --git a/src/Jackett.Common/Utils/LoggingSetup.cs b/src/Jackett.Common/Utils/LoggingSetup.cs index 369a5bee3..b4143a777 100644 --- a/src/Jackett.Common/Utils/LoggingSetup.cs +++ b/src/Jackett.Common/Utils/LoggingSetup.cs @@ -21,24 +21,30 @@ namespace Jackett.Common.Utils var logConfig = new LoggingConfiguration(); - var logFile = new FileTarget(); - logFile.Layout = "${longdate} ${level} ${message} ${exception:format=ToString}"; - logFile.FileName = Path.Combine(settings.DataFolder, logFileName); - logFile.ArchiveFileName = Path.Combine(settings.DataFolder, logFileName + ".{#####}.txt"); - logFile.ArchiveAboveSize = 2097152; // 2 MB - logFile.MaxArchiveFiles = 5; - logFile.KeepFileOpen = false; - logFile.ArchiveNumbering = ArchiveNumberingMode.DateAndSequence; + var logFile = new FileTarget + { + Layout = "${longdate} ${level} ${message} ${exception:format=ToString}", + FileName = Path.Combine(settings.DataFolder, logFileName), + ArchiveFileName = Path.Combine(settings.DataFolder, logFileName + ".{#####}.txt"), + ArchiveAboveSize = 2097152, // 2 MB + MaxArchiveFiles = 5, + KeepFileOpen = false, + ArchiveNumbering = ArchiveNumberingMode.DateAndSequence + }; logConfig.AddTarget("file", logFile); - var microsoftRule = new LoggingRule(); - microsoftRule.LoggerNamePattern = "Microsoft.*"; + var microsoftRule = new LoggingRule + { + LoggerNamePattern = "Microsoft.*", + Final = true + }; microsoftRule.SetLoggingLevels(LogLevel.Warn, LogLevel.Fatal); - microsoftRule.Final = true; microsoftRule.Targets.Add(logFile); - var microsoftDebugRule = new LoggingRule(); - microsoftDebugRule.LoggerNamePattern = "Microsoft.*"; + var microsoftDebugRule = new LoggingRule + { + LoggerNamePattern = "Microsoft.*" + }; microsoftDebugRule.SetLoggingLevels(LogLevel.Debug, LogLevel.Info); microsoftDebugRule.Final = true; if (settings.TracingEnabled) @@ -52,8 +58,10 @@ namespace Jackett.Common.Utils if (!fileOnly) { - var logConsole = new ColoredConsoleTarget(); - logConsole.Layout = "${simpledatetime} ${level} ${message} ${exception:format=ToString}"; + var logConsole = new ColoredConsoleTarget + { + Layout = "${simpledatetime} ${level} ${message} ${exception:format=ToString}" + }; logConfig.AddTarget("console", logConsole); var logConsoleRule = new LoggingRule("*", logLevel, logConsole);