From 25bd39e8834f14c0515bf30e1fcde356f3836189 Mon Sep 17 00:00:00 2001 From: ThomasAmpen Date: Sat, 11 Jul 2015 21:27:57 +0200 Subject: [PATCH 1/2] HdTorrents --- src/Jackett/Indexers/HDTorrents.cs | 144 ++++++++++++++++++++ src/Jackett/Jackett.csproj | 1 + src/Jackett/WebContent/logos/hdtorrents.png | Bin 0 -> 9574 bytes 3 files changed, 145 insertions(+) create mode 100644 src/Jackett/Indexers/HDTorrents.cs create mode 100644 src/Jackett/WebContent/logos/hdtorrents.png diff --git a/src/Jackett/Indexers/HDTorrents.cs b/src/Jackett/Indexers/HDTorrents.cs new file mode 100644 index 000000000..a831bd75a --- /dev/null +++ b/src/Jackett/Indexers/HDTorrents.cs @@ -0,0 +1,144 @@ +using CsQuery; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; + +namespace Jackett.Indexers +{ + public class HDTorrents : IndexerInterface + { + public event Action OnSaveConfigurationRequested; + + public event Action OnResultParsingError; + + const string DefaultUrl = "https://hd-torrents.org"; + string BaseUrl; + static string ChromeUserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"; + private string Search_url = "https://hd-torrents.org/torrents.php?search={0}&active=1&options=0&category%5B%5D=59&category%5B%5D=60&category%5B%5D=30&category%5B%5D=38&page={0}"; + private static string LoginUrl = DefaultUrl + "/login.php"; + private static string LoginPostUrl = DefaultUrl + "/index.php"; + CookieContainer cookies; + HttpClientHandler handler; + HttpClient client; + + public HDTorrents() + { + IsConfigured = false; + cookies = new CookieContainer(); + handler = new HttpClientHandler + { + CookieContainer = cookies, + AllowAutoRedirect = true, + UseCookies = true, + }; + client = new HttpClient(handler); + } + + public string DisplayName + { + get { return "HD-Torrents"; } + } + + public string DisplayDescription + { + get { return "HD-Torrents is a private torrent website with HD torrents and strict rules on their content."; } + } + + public Uri SiteLink + { + get { return new Uri(DefaultUrl); } + } + + public bool IsConfigured + { + get; + private set; + } + + public async Task GetConfigurationForSetup() + { + var request = CreateHttpRequest(new Uri(LoginUrl)); + + var response = await client.SendAsync(request); + await response.Content.ReadAsStreamAsync(); + var config = new ConfigurationDataBasicLogin(); + return config; + } + + HttpRequestMessage CreateHttpRequest(Uri uri) + { + var message = new HttpRequestMessage(); + message.Method = HttpMethod.Get; + message.RequestUri = uri; + message.Headers.UserAgent.ParseAdd(ChromeUserAgent); + return message; + } + + public async Task ApplyConfiguration(JToken configJson) + { + var config = new ConfigurationDataBasicLogin(); + config.LoadValuesFromJson(configJson); + + var pairs = new Dictionary { + { "uid", config.Username.Value }, + { "pwd", config.Password.Value } + }; + + var content = new FormUrlEncodedContent(pairs); + var message = CreateHttpRequest(new Uri(LoginPostUrl)); + message.Method = HttpMethod.Post; + message.Content = content; + message.Headers.Referrer = new Uri(LoginPostUrl); + + var response = await client.SendAsync(message); + var responseContent = await response.Content.ReadAsStringAsync(); + + if (!responseContent.Contains("/logout.php")) + { + CQ dom = responseContent; + var messageEl = dom[".error_text"]; + var errorMessage = messageEl.Text().Trim(); + throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)config); + } + else + { + var configSaveData = new JObject(); + configSaveData["cookies"] = cookies.ToJson(SiteLink); + + if (OnSaveConfigurationRequested != null) + OnSaveConfigurationRequested(this, configSaveData); + + IsConfigured = true; + } + } + + public void LoadFromSavedConfiguration(JToken jsonConfig) + { + BaseUrl = (string)jsonConfig["base_url"]; + IsConfigured = true; + } + + async Task PerformQuery(TorznabQuery query, string baseUrl) + { + List releases = new List(); + + + return releases.ToArray(); + } + + public async Task PerformQuery(TorznabQuery query) + { + return await PerformQuery(query, BaseUrl); + } + + public Task Download(Uri link) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 351f9cd33..b70d9a276 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -97,6 +97,7 @@ + diff --git a/src/Jackett/WebContent/logos/hdtorrents.png b/src/Jackett/WebContent/logos/hdtorrents.png new file mode 100644 index 0000000000000000000000000000000000000000..31254c372bc24c4691e84fe4b47fc0c24f0bedcf GIT binary patch literal 9574 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 Date: Sun, 12 Jul 2015 17:48:37 +0200 Subject: [PATCH 2/2] HDTorrents --- src/Jackett/Indexers/HDTorrents.cs | 128 ++++++++++++++++++++++++----- 1 file changed, 108 insertions(+), 20 deletions(-) diff --git a/src/Jackett/Indexers/HDTorrents.cs b/src/Jackett/Indexers/HDTorrents.cs index a831bd75a..8a96354e6 100644 --- a/src/Jackett/Indexers/HDTorrents.cs +++ b/src/Jackett/Indexers/HDTorrents.cs @@ -2,11 +2,13 @@ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; +using System.Web; namespace Jackett.Indexers { @@ -19,9 +21,11 @@ namespace Jackett.Indexers const string DefaultUrl = "https://hd-torrents.org"; string BaseUrl; static string ChromeUserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"; - private string Search_url = "https://hd-torrents.org/torrents.php?search={0}&active=1&options=0&category%5B%5D=59&category%5B%5D=60&category%5B%5D=30&category%5B%5D=38&page={0}"; + private string SearchUrl = "https://hd-torrents.org/torrents.php?search={0}&active=1&options=0&category%5B%5D=59&category%5B%5D=60&category%5B%5D=30&category%5B%5D=38&page={1}"; private static string LoginUrl = DefaultUrl + "/login.php"; - private static string LoginPostUrl = DefaultUrl + "/index.php"; + private static string LoginPostUrl = DefaultUrl + "/login.php?returnto=index.php"; + private const int MAXPAGES = 3; + CookieContainer cookies; HttpClientHandler handler; HttpClient client; @@ -60,21 +64,17 @@ namespace Jackett.Indexers private set; } - public async Task GetConfigurationForSetup() + public Task GetConfigurationForSetup() { - var request = CreateHttpRequest(new Uri(LoginUrl)); - - var response = await client.SendAsync(request); - await response.Content.ReadAsStreamAsync(); var config = new ConfigurationDataBasicLogin(); - return config; + return Task.FromResult(config); } - HttpRequestMessage CreateHttpRequest(Uri uri) + HttpRequestMessage CreateHttpRequest(string url) { var message = new HttpRequestMessage(); message.Method = HttpMethod.Get; - message.RequestUri = uri; + message.RequestUri = new Uri(url); message.Headers.UserAgent.ParseAdd(ChromeUserAgent); return message; } @@ -84,25 +84,27 @@ namespace Jackett.Indexers var config = new ConfigurationDataBasicLogin(); config.LoadValuesFromJson(configJson); + var startMessage = CreateHttpRequest(LoginUrl); + var results = await (await client.SendAsync(startMessage)).Content.ReadAsStringAsync(); + + var pairs = new Dictionary { { "uid", config.Username.Value }, { "pwd", config.Password.Value } }; - var content = new FormUrlEncodedContent(pairs); - var message = CreateHttpRequest(new Uri(LoginPostUrl)); - message.Method = HttpMethod.Post; - message.Content = content; - message.Headers.Referrer = new Uri(LoginPostUrl); + var loginRequest = CreateHttpRequest(LoginUrl); + loginRequest.Method = HttpMethod.Post; + loginRequest.Content = content; + loginRequest.Headers.Referrer = new Uri("https://hd-torrents.org/torrents.php"); - var response = await client.SendAsync(message); + var response = await client.SendAsync(loginRequest); var responseContent = await response.Content.ReadAsStringAsync(); - if (!responseContent.Contains("/logout.php")) + if (!responseContent.Contains("If your browser doesn't have javascript enabled")) { CQ dom = responseContent; - var messageEl = dom[".error_text"]; - var errorMessage = messageEl.Text().Trim(); + var errorMessage = "Couldn't login"; throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)config); } else @@ -119,13 +121,99 @@ namespace Jackett.Indexers public void LoadFromSavedConfiguration(JToken jsonConfig) { - BaseUrl = (string)jsonConfig["base_url"]; + cookies.FillFromJson(new Uri(DefaultUrl), (JArray)jsonConfig["cookies"]); IsConfigured = true; } async Task PerformQuery(TorznabQuery query, string baseUrl) { List releases = new List(); + List searchurls = new List(); + + foreach (var title in query.ShowTitles ?? new string[] { string.Empty }) + { + var searchString = title + " " + query.GetEpisodeSearchString(); + for (int page = 0; page < MAXPAGES; page++) + searchurls.Add(string.Format(SearchUrl, HttpUtility.UrlEncode(searchString.Trim()), page)); + } + + foreach (string SearchUrl in searchurls) + { + var results = await client.GetStringAsync(SearchUrl); + try + { + CQ dom = results; + ReleaseInfo release; + + int rowCount = 0; + var rows = dom[".mainblockcontenttt > tbody > tr"]; + foreach (var row in rows) + { + CQ qRow = row.Cq(); + if (rowCount < 2 || qRow.Children().Count() != 12) //skip 2 rows because there's an empty row & a title/sort row + { + rowCount++; + continue; + } + + release = new ReleaseInfo(); + long imdbid; + long? size; + int seeders, peers; + + release.Title = qRow.Find("td.mainblockcontent b a").Text(); + release.Description = release.Title; + + if (0 != qRow.Find("td.mainblockcontent u").Length && long.TryParse(qRow.Find("td.mainblockcontent u").Parent().First().Attr("href").Replace("http://www.imdb.com/title/tt", "").Replace("/", ""), out imdbid)) + release.Imdb = imdbid; + + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + + release.MagnetUri = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent").Get(3).FirstChild.GetAttribute("href")); + + if (int.TryParse(qRow.Find("td").Get(9).FirstChild.FirstChild.InnerText, out seeders)) + release.Seeders = seeders; + if (int.TryParse(qRow.Find("td").Get(10).FirstChild.FirstChild.InnerText, out peers)) + release.Peers = peers; + + string fullSize = qRow.Find("td.mainblockcontent").Get(6).InnerText; + string[] sizeSplit = fullSize.Split(' '); + switch (sizeSplit[1].ToLower()) + { + case "kb": + size = ReleaseInfo.BytesFromKB(float.Parse(sizeSplit[0], CultureInfo.InvariantCulture)); + break; + case "mb": + size = ReleaseInfo.BytesFromMB(float.Parse(sizeSplit[0], CultureInfo.InvariantCulture)); + break; + case "gb": + size = ReleaseInfo.BytesFromGB(float.Parse(sizeSplit[0], CultureInfo.InvariantCulture)); + break; + default: + size = null; + break; + } + release.Size = size; + + release.Link = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent b a").Attr("href")); + release.Guid = release.Link; + + string[] dateSplit = qRow.Find("td.mainblockcontent").Get(5).InnerHTML.Split(','); + string dateString = dateSplit[1].Substring(0, dateSplit[1].IndexOf('>')); + release.PublishDate = DateTime.Parse(dateString, CultureInfo.InvariantCulture); + + release.Comments = new Uri(DefaultUrl + "/" + qRow.Find("td.mainblockcontent").Get(2).FirstChild.GetAttribute("href")); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnResultParsingError(this, results, ex); + throw ex; + } + } return releases.ToArray();