From 5991fd62c1c540cecf20be967954462608932668 Mon Sep 17 00:00:00 2001 From: kaso17 Date: Sun, 16 Oct 2016 16:09:49 +0200 Subject: [PATCH] Update CloudFlareUtilities to version 0.3.2-alpha and remove the UnixLibCurlWebClient reflections and add DigitalHive tracker (#553) * Update CloudFlareUtilities to 0.3.2-alpha * Remove CloudFlareUtilities reflections With CloudFlareUtilities version 0.3.2-alpha reflections are no longer needed * Add DigitalHive tracker --- README.md | 1 + src/Jackett/Content/logos/digitalhive.png | Bin 0 -> 9241 bytes src/Jackett/Indexers/DigitalHive.cs | 204 ++++++++++++++++++ src/Jackett/Jackett.csproj | 4 +- .../Utils/Clients/UnixLibCurlWebClient.cs | 48 +---- src/Jackett/packages.config | 2 +- 6 files changed, 218 insertions(+), 41 deletions(-) create mode 100644 src/Jackett/Content/logos/digitalhive.png create mode 100644 src/Jackett/Indexers/DigitalHive.cs diff --git a/README.md b/README.md index e4cbd5ab0..f955e9e44 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * CinemaZ * DanishBits * Demonoid + * DigitalHive * FileList * Freshon * FunFile diff --git a/src/Jackett/Content/logos/digitalhive.png b/src/Jackett/Content/logos/digitalhive.png new file mode 100644 index 0000000000000000000000000000000000000000..13d982e2aee4c54c31ca2bdf1e754c0222aba757 GIT binary patch literal 9241 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 literal 0 HcmV?d00001 diff --git a/src/Jackett/Indexers/DigitalHive.cs b/src/Jackett/Indexers/DigitalHive.cs new file mode 100644 index 000000000..1ee525d95 --- /dev/null +++ b/src/Jackett/Indexers/DigitalHive.cs @@ -0,0 +1,204 @@ +using CsQuery; +using Jackett.Models; +using Jackett.Services; +using Jackett.Utils; +using Jackett.Utils.Clients; +using Newtonsoft.Json.Linq; +using NLog; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Jackett.Models.IndexerConfig; +using System.Collections.Specialized; +using System.Text.RegularExpressions; + +namespace Jackett.Indexers +{ + public class DigitalHive : BaseIndexer, IIndexer + { + private string SearchUrl { get { return SiteLink + "browse.php"; } } + private string LoginUrl { get { return SiteLink + "login.php?returnto=%2F"; } } + private string AjaxLoginUrl { get { return SiteLink + "takelogin.php"; } } + + new ConfigurationDataRecaptchaLogin configData + { + get { return (ConfigurationDataRecaptchaLogin)base.configData; } + set { base.configData = value; } + } + + public DigitalHive(IIndexerManagerService i, Logger l, IWebClient w, IProtectionService ps) + : base(name: "DigitalHive", + description: "DigitalHive is one of the oldest general trackers", + link: "https://www.digitalhive.org/", + caps: new TorznabCapabilities(), + manager: i, + client: w, + logger: l, + p: ps, + configData: new ConfigurationDataRecaptchaLogin()) + { + AddCategoryMapping(0, TorznabCatType.Other); + AddCategoryMapping(48, TorznabCatType.Other); // 0Day + AddCategoryMapping(56, TorznabCatType.XXXImageset); // 0Day-Imagesets + AddCategoryMapping(6, TorznabCatType.Audio); // 0Day-Music + AddCategoryMapping(51, TorznabCatType.XXX); // 0Day-XXX + AddCategoryMapping(2, TorznabCatType.TVAnime); // Anime + AddCategoryMapping(59, TorznabCatType.MoviesBluRay); // BluRay + AddCategoryMapping(40, TorznabCatType.TVDocumentary); // Documentary + AddCategoryMapping(20, TorznabCatType.MoviesDVD); // DVD-R + AddCategoryMapping(25, TorznabCatType.BooksEbook); // Ebooks + AddCategoryMapping(38, TorznabCatType.PCPhoneIOS); // HandHeld + AddCategoryMapping(38, TorznabCatType.PCPhoneAndroid); // HandHeld + AddCategoryMapping(38, TorznabCatType.PCPhoneOther); // HandHeld + AddCategoryMapping(37, TorznabCatType.Other); // Kids Stuff + AddCategoryMapping(23, TorznabCatType.PC); // Linux + AddCategoryMapping(24, TorznabCatType.PCMac); // Mac + AddCategoryMapping(22, TorznabCatType.OtherMisc); // Misc + AddCategoryMapping(35, TorznabCatType.MoviesOther); // Movie Pack + AddCategoryMapping(36, TorznabCatType.MoviesHD); // Movie-HD + AddCategoryMapping(19, TorznabCatType.MoviesSD); // Movie-SD + AddCategoryMapping(50, TorznabCatType.Audio); // Music + AddCategoryMapping(53, TorznabCatType.AudioLossless); // Music-FLAC + AddCategoryMapping(49, TorznabCatType.AudioVideo); // MVID + AddCategoryMapping(1, TorznabCatType.PC); // PC Apps + AddCategoryMapping(4, TorznabCatType.PCGames); // PC Games + AddCategoryMapping(17, TorznabCatType.ConsolePS3); // Playstation + AddCategoryMapping(17, TorznabCatType.ConsolePS4); // Playstation + AddCategoryMapping(17, TorznabCatType.ConsolePSVita); // Playstation + AddCategoryMapping(17, TorznabCatType.ConsolePSP); // Playstation + AddCategoryMapping(28, TorznabCatType.ConsolePSP); // PSP + AddCategoryMapping(34, TorznabCatType.TVOTHER); // TV Pack + AddCategoryMapping(32, TorznabCatType.TVHD); // TV-HD + AddCategoryMapping(55, TorznabCatType.TVOTHER); // TV-HDRip + AddCategoryMapping(7, TorznabCatType.TVSD); // TV-SD + AddCategoryMapping(57, TorznabCatType.TVOTHER); // TV-SDRip + AddCategoryMapping(33, TorznabCatType.ConsoleWii); // WII + AddCategoryMapping(33, TorznabCatType.ConsoleWiiU); // WII + AddCategoryMapping(45, TorznabCatType.ConsoleXbox); // XBox + AddCategoryMapping(45, TorznabCatType.ConsoleXbox360); // XBox + AddCategoryMapping(45, TorznabCatType.ConsoleXBOX360DLC); // XBox + AddCategoryMapping(45, TorznabCatType.ConsoleXboxOne); // XBox + AddCategoryMapping(9, TorznabCatType.XXX); // XXX + AddCategoryMapping(52, TorznabCatType.XXXOther); // XXX-ISO + } + + public override async Task GetConfigurationForSetup() + { + var loginPage = await RequestStringWithCookies(LoginUrl, configData.CookieHeader.Value); + CQ cq = loginPage.Content; + string recaptchaSiteKey = cq.Find(".g-recaptcha").Attr("data-sitekey"); + var result = new ConfigurationDataRecaptchaLogin(); + result.CookieHeader.Value = loginPage.Cookies; + result.Captcha.SiteKey = recaptchaSiteKey; + return result; + } + + public async Task ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + var pairs = new Dictionary { + { "returnto" , "/" }, + { "username", configData.Username.Value }, + { "password", configData.Password.Value }, + { "g-recaptcha-response", configData.Captcha.Value } + }; + + if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie)) + { + // Cookie was manually supplied + CookieHeader = configData.Captcha.Cookie; + try + { + var results = await PerformQuery(new TorznabQuery()); + if (!results.Any()) + { + throw new Exception("Your cookie did not work"); + } + + SaveConfig(); + IsConfigured = true; + return IndexerConfigurationStatus.Completed; + } + catch (Exception e) + { + IsConfigured = false; + throw new Exception("Your cookie did not work: " + e.Message); + } + } + + var result = await RequestLoginAndFollowRedirect(AjaxLoginUrl, pairs, configData.CookieHeader.Value, true, SiteLink, LoginUrl); + + await ConfigureIfOK(result.Cookies, result.Content.Contains("logout.php"), () => + { + var errorMessage = result.Content; + throw new ExceptionWithConfigData(errorMessage, configData); + }); + + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + List releases = new List(); + + var queryCollection = new NameValueCollection(); + var searchString = query.GetQueryString(); + var searchUrl = SearchUrl; + + foreach (var cat in MapTorznabCapsToTrackers(query)) + { + queryCollection.Add("c" + cat, "1"); + } + + if (!string.IsNullOrWhiteSpace(searchString)) + { + queryCollection.Add("search", searchString); + } + + queryCollection.Add("blah", "0"); + + var results = await RequestStringWithCookiesAndRetry(searchUrl + "?" + queryCollection.GetQueryString()); + try + { + releases.AddRange(contentToReleaseInfos(results.Content)); + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + + return releases; + } + + private IEnumerable contentToReleaseInfos(CQ dom) + { + List releases = new List(); + + // Doesn't handle pagination yet... + var rows = dom["div.panel-body > table.table > tbody > tr"]; + foreach (var row in rows) + { + var release = new ReleaseInfo(); + release.MinimumRatio = 1; + release.MinimumSeedTime = 259200; + + var qRow = row.Cq(); + release.Title = qRow.Find("td:nth-child(2) > a").First().Text().Trim(); + release.Description = release.Title; + release.Guid = new Uri(SiteLink + qRow.Find("td:nth-child(2) > a").First().Attr("href")); + release.Comments = release.Guid; + release.Link = new Uri(SiteLink + qRow.Find("td:nth-child(3) > a").First().Attr("href")); + var pubDate = qRow.Find("td:nth-child(2) > span").First().Text().Trim().Replace("Added: ", ""); + release.PublishDate = DateTime.Parse(pubDate).ToLocalTime(); + release.Category = MapTrackerCatToNewznab(qRow.Find("td:nth-child(1) > a").First().Attr("href").Split('=')[1]); + release.Size = ReleaseInfo.GetBytes(qRow.Find("td:nth-child(7)").First().Text()); + release.Seeders = ParseUtil.CoerceInt(qRow.Find("td:nth-child(9)").First().Text()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("td:nth-child(10)").First().Text()) + release.Seeders; + releases.Add(release); + } + + return releases; + } + } +} \ No newline at end of file diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index d3283b07b..5aa81ad43 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -50,8 +50,8 @@ 4 - - ..\packages\CloudFlareUtilities.0.3.1-alpha\lib\portable45-net45+win8+wpa81\CloudFlareUtilities.dll + + ..\packages\CloudFlareUtilities.0.3.2-alpha\lib\portable45-net45+win8+wpa81\CloudFlareUtilities.dll True diff --git a/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs b/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs index da2f38cc8..40ab5b3af 100644 --- a/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs +++ b/src/Jackett/Utils/Clients/UnixLibCurlWebClient.cs @@ -11,39 +11,17 @@ using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; -using System.Reflection; +using CloudFlareUtilities; namespace Jackett.Utils.Clients { public class UnixLibCurlWebClient : IWebClient { private Logger logger; - private static Boolean CloudFlareUtilitiesInit = false; - private static Assembly CloudFlareUtilities = null; - private static MethodInfo ChallengeSolverSolveMethod = null; - private static MethodInfo ChallengeSolutionGetClearanceQueryMethod = null; public UnixLibCurlWebClient(Logger l) { logger = l; - - // try loading CloudFlareUtilities - if (!CloudFlareUtilitiesInit) - { - try - { - // use reflections to get the internal CloudFlareUtilities methods we need - CloudFlareUtilities = Assembly.LoadFile(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "/CloudFlareUtilities.dll"); - ChallengeSolverSolveMethod = CloudFlareUtilities.GetType("CloudFlareUtilities.ChallengeSolver").GetMethod("Solve"); - ChallengeSolutionGetClearanceQueryMethod = CloudFlareUtilities.GetType("CloudFlareUtilities.ChallengeSolution").GetMethod("get_ClearanceQuery"); - } - catch (Exception e) - { - Engine.Logger.Error(e.ToString()); - Engine.Logger.Error(string.Format("UnixLibCurlWebClient: Error while loading CloudFlareUtilities.dll from {0}", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location))); - } - } - CloudFlareUtilitiesInit = true; } public async Task GetBytes(WebRequest request) @@ -64,21 +42,20 @@ namespace Jackett.Utils.Clients private string CloudFlareChallengeSolverSolve(string challengePageContent, Uri uri) { - var solution = ChallengeSolverSolveMethod.Invoke(null, new object[] { challengePageContent, uri.Host }); - string clearanceQuery = (string)ChallengeSolutionGetClearanceQueryMethod.Invoke(solution, new object[] { }); - string clearanceUri = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port + clearanceQuery; + var solution = ChallengeSolver.Solve(challengePageContent, uri.Host); + string clearanceUri = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port + solution.ClearanceQuery; return clearanceUri; - } - + } + public void Init() { try { Engine.Logger.Info("LibCurl init " + Curl.GlobalInit(CurlInitFlag.All).ToString()); - CurlHelper.OnErrorMessage += (msg) => - { - Engine.Logger.Error(msg); - }; + CurlHelper.OnErrorMessage += (msg) => + { + Engine.Logger.Error(msg); + }; } catch (Exception e) { @@ -107,11 +84,6 @@ namespace Jackett.Utils.Clients if (result.Status == HttpStatusCode.ServiceUnavailable && ((request.Cookies != null && request.Cookies.Contains("__cfduid")) || result.Cookies.Contains("__cfduid"))) { logger.Info("UnixLibCurlWebClient: Received a new CloudFlare challenge"); - if(ChallengeSolutionGetClearanceQueryMethod == null) - { - logger.Error("UnixLibCurlWebClient: CloudFlareUtilities not available, can't solve challenge"); - return result; - } // solve the challenge string pageContent = Encoding.UTF8.GetString(result.Content); @@ -156,7 +128,7 @@ namespace Jackett.Utils.Clients logger.Debug("UnixLibCurlWebClient: Posting " + StringUtil.PostDataFromDict(request.PostData)); } - response = await CurlHelper.PostAsync(request.Url, request.PostData, request.Cookies, request.Referer, request.RawBody); + response = await CurlHelper.PostAsync(request.Url, request.PostData, request.Cookies, request.Referer, request.RawBody); } var result = new WebClientByteResult() diff --git a/src/Jackett/packages.config b/src/Jackett/packages.config index 3f38d3cd5..5e9e802c5 100644 --- a/src/Jackett/packages.config +++ b/src/Jackett/packages.config @@ -7,7 +7,7 @@ - +