From a26e07210f0b7db1bffcda397523e713bc5aea16 Mon Sep 17 00:00:00 2001 From: kaso17 Date: Tue, 20 Sep 2016 18:41:39 +0200 Subject: [PATCH] Add House-of-Torrents, Best Friends New Real World trackers and fix HeBits encoding (#519) * Add House-of-Torrents tracker * Add Best Friends tracker * Fix Hebits encoding * Add New Real World tracker --- README.md | 3 + src/Jackett/Content/logos/bestfriends.png | Bin 0 -> 15180 bytes src/Jackett/Content/logos/houseoftorrents.png | Bin 0 -> 9742 bytes src/Jackett/Content/logos/newrealworld.png | Bin 0 -> 7457 bytes src/Jackett/Indexers/BestFriends.cs | 211 ++++++++++++++++++ src/Jackett/Indexers/Hebits.cs | 10 +- src/Jackett/Indexers/HouseOfTorrents.cs | 210 +++++++++++++++++ src/Jackett/Indexers/NewRealWorld.cs | 210 +++++++++++++++++ src/Jackett/Jackett.csproj | 12 + 9 files changed, 652 insertions(+), 4 deletions(-) create mode 100644 src/Jackett/Content/logos/bestfriends.png create mode 100644 src/Jackett/Content/logos/houseoftorrents.png create mode 100644 src/Jackett/Content/logos/newrealworld.png create mode 100644 src/Jackett/Indexers/BestFriends.cs create mode 100644 src/Jackett/Indexers/HouseOfTorrents.cs create mode 100644 src/Jackett/Indexers/NewRealWorld.cs diff --git a/README.md b/README.md index b932e0a81..bf7f52c89 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * Avistaz * BakaBT * bB + * Best Friends * BeyondHD * Bit-City Reloaded * BIT-HDTV @@ -38,7 +39,9 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * HD-Space * HD-Torrents * Hebits + * New Real World * Hounddawgs + * House-of-Torrents * ILoveTorrents * Immortalseed * IPTorrents diff --git a/src/Jackett/Content/logos/bestfriends.png b/src/Jackett/Content/logos/bestfriends.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5edcb459685a37686fd4957be481e58db4c98f GIT binary patch literal 15180 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 E0Hga%TL1t6 literal 0 HcmV?d00001 diff --git a/src/Jackett/Indexers/BestFriends.cs b/src/Jackett/Indexers/BestFriends.cs new file mode 100644 index 000000000..599e6ed89 --- /dev/null +++ b/src/Jackett/Indexers/BestFriends.cs @@ -0,0 +1,211 @@ +using Jackett.Utils.Clients; +using NLog; +using Jackett.Services; +using Jackett.Utils; +using Jackett.Models; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using CsQuery; +using System; +using System.Globalization; +using Jackett.Models.IndexerConfig; +using System.Collections.Specialized; + +namespace Jackett.Indexers +{ + public class BestFriends : BaseIndexer, IIndexer + { + string LoginUrl { get { return SiteLink + "login.php"; } } + string TakeLoginUrl { get { return SiteLink + "takelogin.php"; } } + string BrowseUrl { get { return SiteLink + "browse.php"; } } + + new ConfigurationDataCaptchaLogin configData + { + get { return (ConfigurationDataCaptchaLogin)base.configData; } + set { base.configData = value; } + } + + public BestFriends(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps) + : base(name: "Best Friends", + description: "A German general tracker.", + link: "http://bf.mine.nu/", + caps: TorznabUtil.CreateDefaultTorznabTVCaps(), + manager: i, + client: wc, + logger: l, + p: ps, + configData: new ConfigurationDataCaptchaLogin()) + { + AddCategoryMapping(18, TorznabCatType.TVAnime); // Anime + AddCategoryMapping(8, TorznabCatType.PCMac); // Appz MAC + AddCategoryMapping(9, TorznabCatType.PC); // Appz other + AddCategoryMapping(7, TorznabCatType.PC); // Appz Windows + AddCategoryMapping(23, TorznabCatType.TVDocumentary); // Dokumentationen + AddCategoryMapping(32, TorznabCatType.Movies3D); // DVD 3D + AddCategoryMapping(15, TorznabCatType.Books); // eBooks + AddCategoryMapping(12, TorznabCatType.PCGames); // Games PC + AddCategoryMapping(37, TorznabCatType.PCPhoneOther); // Handy_Mobile + AddCategoryMapping(24, TorznabCatType.TVHD); // HDTV + AddCategoryMapping(22, TorznabCatType.AudioAudiobook); // Hörbücher + AddCategoryMapping(1, TorznabCatType.MoviesHD); // Movies 1080p/1080i + AddCategoryMapping(31, TorznabCatType.Movies3D); // Movies 3D + AddCategoryMapping(2, TorznabCatType.MoviesHD); // Movies 720p/720i + AddCategoryMapping(21, TorznabCatType.MoviesBluRay); // Movies BluRay + AddCategoryMapping(5, TorznabCatType.MoviesDVD); // Movies DVD/HDDVD + AddCategoryMapping(6, TorznabCatType.MoviesSD); // Movies M/SVCD/Other + AddCategoryMapping(4, TorznabCatType.MoviesSD); // Movies XVID/DIVX/h.264 + AddCategoryMapping(10, TorznabCatType.Audio); // Music + AddCategoryMapping(25, TorznabCatType.AudioVideo); // Musikvideo + AddCategoryMapping(29, TorznabCatType.ConsoleNDS); // Nintendo DS + AddCategoryMapping(16, TorznabCatType.Other); // other + AddCategoryMapping(13, TorznabCatType.ConsolePS4); // Playstation + AddCategoryMapping(28, TorznabCatType.TVHD); // Serien HD + AddCategoryMapping(11, TorznabCatType.TVSD); // Serien XviD + AddCategoryMapping(33, TorznabCatType.Other); // Specials + AddCategoryMapping(30, TorznabCatType.TVSport); // Sport + AddCategoryMapping(19, TorznabCatType.TVOTHER); // TVRip + AddCategoryMapping(38, TorznabCatType.TVDocumentary); // US Dokus + AddCategoryMapping(20, TorznabCatType.MoviesForeign); // US Movies + AddCategoryMapping(14, TorznabCatType.TVFOREIGN); // US Serien + AddCategoryMapping(36, TorznabCatType.Other); // Wallpaper + AddCategoryMapping(26, TorznabCatType.ConsoleWii); // Wii + AddCategoryMapping(27, TorznabCatType.ConsoleXbox360); // Xbox 360 + AddCategoryMapping(3, TorznabCatType.XXX); // XXX + } + + public override async Task GetConfigurationForSetup() + { + var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty); + CQ dom = loginPage.Content; + CQ qCaptchaImg = dom.Find("td.tablea > img").First(); + + var CaptchaUrl = SiteLink + qCaptchaImg.Attr("src"); + var captchaImage = await RequestBytesWithCookies(CaptchaUrl, loginPage.Cookies); + configData.CaptchaImage.Value = captchaImage.Content; + configData.CaptchaCookie.Value = loginPage.Cookies; + return configData; + } + + public async Task ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + + var pairs1 = new Dictionary + { + { "proofcode", configData.CaptchaText.Value } + }; + var cookies = configData.CaptchaCookie.Value; + var result1 = await RequestLoginAndFollowRedirect(LoginUrl, pairs1, cookies, true, null, LoginUrl, true); + if(result1.Content == null || !result1.Content.Contains("takelogin.php")) + { + CQ dom = result1.Content; + var errorMessage = dom["#login_error"].Text().Trim(); + errorMessage = result1.Content; + throw new ExceptionWithConfigData(errorMessage, configData); + } + + var pairs2 = new Dictionary + { + { "username", configData.Username.Value }, + { "password", configData.Password.Value } + }; + + var result = await RequestLoginAndFollowRedirect(TakeLoginUrl, pairs2, result1.Cookies, true, null, LoginUrl, true); + await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () => + { + CQ dom = result.Content; + var errorMessage = dom["#login_error"].Text().Trim(); + errorMessage = result.Content; + throw new ExceptionWithConfigData(errorMessage, configData); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 3, 5, DayOfWeek.Sunday); + TimeZoneInfo.TransitionTime endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 4, 0, 0), 10, 5, DayOfWeek.Sunday); + TimeSpan delta = new TimeSpan(1, 0, 0); + TimeZoneInfo.AdjustmentRule adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1999, 10, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition); + TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment }; + TimeZoneInfo germanyTz = TimeZoneInfo.CreateCustomTimeZone("W. Europe Standard Time", new TimeSpan(1, 0, 0), "(GMT+01:00) W. Europe Standard Time", "W. Europe Standard Time", "W. Europe DST Time", adjustments); + + var releases = new List(); + + var searchString = query.GetQueryString(); + var searchUrl = BrowseUrl; + var queryCollection = new NameValueCollection(); + queryCollection.Add("showsearch", "1"); + queryCollection.Add("incldead", "1"); + queryCollection.Add("blah", "0"); + queryCollection.Add("orderby", "added"); + queryCollection.Add("sort", "desc"); + + if (!string.IsNullOrWhiteSpace(searchString)) + { + queryCollection.Add("search", searchString); + } + + foreach (var cat in MapTorznabCapsToTrackers(query)) + { + queryCollection.Add("c" + cat, "1"); + } + searchUrl += "?" + queryCollection.GetQueryString(); + + var response = await RequestStringWithCookiesAndRetry(searchUrl, null, BrowseUrl); + var results = response.Content; + try + { + CQ dom = results; + var rows = dom["table.tableinborder > tbody > tr:has(td.tableb)"]; + + foreach (var row in rows) + { + var release = new ReleaseInfo(); + release.MinimumRatio = 0.75; + release.MinimumSeedTime = 0; + var qRow = row.Cq(); + + var qDetailsLink = qRow.Find("a[href^=details.php?id=]").First(); + release.Title = qDetailsLink.Attr("title"); + + var qCatLink = qRow.Find("a[href^=browse.php?cat=]").First(); + var qSeeders = qRow.Find("td:eq(7)"); + var qLeechers = qRow.Find("td:eq(8)"); + var qDateStr = qRow.Find("td:eq(4)"); + var qSize = qRow.Find("td:eq(5)"); + + var torrentId = qDetailsLink.Attr("href").Replace("&hit=1", "").Split('=')[1]; + + var catStr = qCatLink.Attr("href").Split('=')[1]; + release.Category = MapTrackerCatToNewznab(catStr); + + release.Link = new Uri(SiteLink + "download.php?torrent="+torrentId); + release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href")); + release.Guid = release.Link; + + var sizeStr = qSize.Text(); + release.Size = ReleaseInfo.GetBytes(sizeStr.Replace(",", ".")); + + release.Seeders = ParseUtil.CoerceInt(qSeeders.Text()); + release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders; + + var dateStr = qDateStr.Text(); + var dateGerman = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dd.MM.yyyyHH:mm:ss", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); + DateTime pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateGerman, germanyTz); + release.PublishDate = pubDateUtc; + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results, ex); + } + + return releases; + } + } +} + diff --git a/src/Jackett/Indexers/Hebits.cs b/src/Jackett/Indexers/Hebits.cs index ecd595f08..57bc91b5f 100644 --- a/src/Jackett/Indexers/Hebits.cs +++ b/src/Jackett/Indexers/Hebits.cs @@ -12,7 +12,8 @@ using System.Threading.Tasks; using System.Web; using Jackett.Models.IndexerConfig; using System.Text.RegularExpressions; - +using System.Text; + namespace Jackett.Indexers { public class Hebits : BaseIndexer, IIndexer @@ -94,10 +95,11 @@ namespace Jackett.Indexers } } - var results = await RequestStringWithCookiesAndRetry(searchUrl); + var response = await RequestBytesWithCookies(searchUrl); + var results = Encoding.GetEncoding("windows-1255").GetString(response.Content); try { - CQ dom = results.Content; + CQ dom = results; CQ qRows = dom[".browse > div > div"]; @@ -140,7 +142,7 @@ namespace Jackett.Indexers catch (Exception ex) { - OnParseError(results.Content, ex); + OnParseError(results, ex); } return releases; diff --git a/src/Jackett/Indexers/HouseOfTorrents.cs b/src/Jackett/Indexers/HouseOfTorrents.cs new file mode 100644 index 000000000..7a2f9fb49 --- /dev/null +++ b/src/Jackett/Indexers/HouseOfTorrents.cs @@ -0,0 +1,210 @@ +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.Globalization; +using System.Text.RegularExpressions; + +namespace Jackett.Indexers +{ + public class HouseOfTorrents : BaseIndexer, IIndexer + { + private string SearchUrl { get { return SiteLink + "browse.php"; } } + private string LoginUrl { get { return SiteLink + "takelogin.php"; } } + private string CaptchaUrl { get { return SiteLink + "simpleCaptcha.php?numImages=1"; } } + + new ConfigurationDataBasicLoginWithRSSAndDisplay configData + { + get { return (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData; } + set { base.configData = value; } + } + + public HouseOfTorrents(IIndexerManagerService i, Logger l, IWebClient w, IProtectionService ps) + : base(name: "House-of-Torrents", + description: "A general tracker", + link: "https://houseoftorrents.me/", + caps: new TorznabCapabilities(), + manager: i, + client: w, + logger: l, + p: ps, + configData: new ConfigurationDataBasicLoginWithRSSAndDisplay()) + { + AddCategoryMapping(42, TorznabCatType.PCMac); // Applications/Mac + AddCategoryMapping(34, TorznabCatType.PC); // Applications/PC + AddCategoryMapping(66, TorznabCatType.MoviesForeign); // Foreign + AddCategoryMapping(38, TorznabCatType.MoviesForeign); // Foreign/French + AddCategoryMapping(39, TorznabCatType.MoviesForeign); // Foreign/German + AddCategoryMapping(40, TorznabCatType.MoviesForeign); // Foreign/Spanish + AddCategoryMapping(41, TorznabCatType.MoviesForeign); // Foreign/Swedish + AddCategoryMapping(67, TorznabCatType.ConsoleNDS); // Games/Nintendo + AddCategoryMapping(9 , TorznabCatType.PCGames); // Games/PC + AddCategoryMapping(8, TorznabCatType.ConsolePS3); // Games/PS3 + AddCategoryMapping(30, TorznabCatType.ConsolePS4); // Games/PS4 + AddCategoryMapping(7, TorznabCatType.ConsolePSP); // Games/PSP + AddCategoryMapping(29, TorznabCatType.ConsoleWii); // Games/Wii + AddCategoryMapping(31, TorznabCatType.ConsoleXbox360); // Games/XBOX360 + AddCategoryMapping(32, TorznabCatType.ConsoleXboxOne); // Games/XBOXONE + AddCategoryMapping(71, TorznabCatType.PCPhoneAndroid); // Mobile/Android + AddCategoryMapping(72, TorznabCatType.PCPhoneIOS); // Mobile/iOS + AddCategoryMapping(47, TorznabCatType.Movies3D); // Movies/3D + AddCategoryMapping(43, TorznabCatType.MoviesBluRay); // Movies/Bluray + AddCategoryMapping(84, TorznabCatType.MoviesSD); // Movies/Cam + AddCategoryMapping(44, TorznabCatType.MoviesDVD); // Movies/DVD-R + AddCategoryMapping(45, TorznabCatType.Movies); // Movies/MP4 + AddCategoryMapping(69, TorznabCatType.Movies); // Movies/Packs + AddCategoryMapping(46, TorznabCatType.MoviesSD); // Movies/SD + AddCategoryMapping(11, TorznabCatType.MoviesHD); // Movies/x264 + AddCategoryMapping(83, TorznabCatType.MoviesHD); // Movies/x265 + AddCategoryMapping(10, TorznabCatType.MoviesOther); // Movies/XviD + AddCategoryMapping(36, TorznabCatType.AudioLossless); // Music/FLAC + AddCategoryMapping(12, TorznabCatType.AudioMP3); // Music/MP3 + AddCategoryMapping(79, TorznabCatType.Audio); // Music/Pack + AddCategoryMapping(28, TorznabCatType.AudioVideo); // Music/Video + AddCategoryMapping(49, TorznabCatType.TVAnime); // Others/Anime + AddCategoryMapping(80, TorznabCatType.AudioAudiobook); // Others/AudioBook + AddCategoryMapping(60, TorznabCatType.Other); // Others/Boxsets + AddCategoryMapping(65, TorznabCatType.TVDocumentary); // Others/Documentary + AddCategoryMapping(61, TorznabCatType.Books); // Others/E-Book + AddCategoryMapping(51, TorznabCatType.Other); // Others/RARFIX + AddCategoryMapping(74, TorznabCatType.TVSport); // Sports + AddCategoryMapping(75, TorznabCatType.TVSport); // Sports/Boxing + AddCategoryMapping(76, TorznabCatType.TVSport); // Sports/Racing + AddCategoryMapping(77, TorznabCatType.TVSport); // Sports/UFC + AddCategoryMapping(78, TorznabCatType.TVSport); // Sports/WWE + AddCategoryMapping(68, TorznabCatType.TV); // TV/Packs + AddCategoryMapping(53, TorznabCatType.TVSD); // TV/SD + AddCategoryMapping(54, TorznabCatType.TVHD); // TV/x264 + AddCategoryMapping(82, TorznabCatType.TVHD); // TV/x265 + AddCategoryMapping(55, TorznabCatType.TVOTHER); // Tv/XviD + AddCategoryMapping(63, TorznabCatType.XXX); // XXX + AddCategoryMapping(57, TorznabCatType.XXX); // XXX/0-DAY + AddCategoryMapping(58, TorznabCatType.XXXImageset); // XXX/IMAGESET + AddCategoryMapping(81, TorznabCatType.XXXPacks); // XXX/Pack + } + + public async Task ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + + var result1 = await RequestStringWithCookies(CaptchaUrl); + var json1 = JObject.Parse(result1.Content); + var captchaSelection = json1["images"][0]["hash"]; + + var pairs = new Dictionary { + { "username", configData.Username.Value }, + { "password", configData.Password.Value }, + { "captchaSelection", (string)captchaSelection }, + { "submitme", "X" } + }; + + var result2 = await RequestLoginAndFollowRedirect(LoginUrl, pairs, result1.Cookies, true, null, null, true); + + await ConfigureIfOK(result2.Cookies, result2.Content.Contains("logout.php"), () => + { + var errorMessage = result2.Content; + throw new ExceptionWithConfigData(errorMessage, configData); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + List releases = new List(); + + var searchString = query.GetQueryString(); + var searchUrl = SearchUrl; + var queryCollection = new NameValueCollection(); + queryCollection.Add("searchin", "title"); + queryCollection.Add("incldead", "1"); + if (!string.IsNullOrWhiteSpace(searchString)) + { + // use AND+wildcard operator to avoid getting to many useless results + var searchStringArray = Regex.Split(searchString.Trim(), "[ _.-]+", RegexOptions.Compiled).ToList(); + searchStringArray = searchStringArray.Where(x => x.Length >= 3).ToList(); // remove words with less than 3 characters + searchStringArray = searchStringArray.Select(x => "+" + x).ToList(); // add AND operators+wildcards + var searchStringFinal = String.Join("", searchStringArray); + queryCollection.Add("search", searchStringFinal); + } + + foreach (var cat in MapTorznabCapsToTrackers(query)) + { + queryCollection.Add("c" + cat, "1"); + } + + searchUrl += "?" + queryCollection.GetQueryString(); + + var results = await RequestStringWithCookiesAndRetry(searchUrl); + try + { + CQ dom = results.Content; + var rows = dom["table.tt > tbody > tr"]; + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + release.MinimumRatio = 1; + release.MinimumSeedTime = 72 * 60 * 60; + + var qRow = row.Cq(); + + var qDetailsLink = qRow.Find("a[href^=details.php?id=]").First(); + release.Title = qDetailsLink.Text().Trim(); + + // HoT search returns should support AND search but it simply doesn't work, so we AND filter it manualy + if (!query.MatchQueryStringAND(release.Title)) + continue; + + var qCatLink = qRow.Find("a[href^=browse.php?cat=]").First(); + var qSeeders = qRow.Find("td:eq(8)"); + var qLeechers = qRow.Find("td:eq(9)"); + var qDownloadLink = qRow.Find("a[href^=download.php]").First(); + var qTimeAgo = qRow.Find("td:eq(5)"); + var qSize = qRow.Find("td:eq(6)"); + + var catStr = qCatLink.Attr("href").Split('=')[1]; + release.Category = MapTrackerCatToNewznab(catStr); + + release.Link = new Uri(SiteLink + qDownloadLink.Attr("href")); + release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href")); + release.Guid = release.Link; + + var sizeStr = qSize.Text(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + release.Seeders = ParseUtil.CoerceInt(qSeeders.Text()); + release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders; + + var dateStr = qTimeAgo.Text(); + DateTime pubDateUtc; + var Timeparts = dateStr.Split(new char[] { ' ' }, 2)[1]; + if (dateStr.StartsWith("Today ")) + pubDateUtc = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + DateTime.ParseExact(dateStr.Split(new char[] { ' ' }, 2)[1], "hh:mm tt", System.Globalization.CultureInfo.InvariantCulture).TimeOfDay; + else if (dateStr.StartsWith("Yesterday ")) + pubDateUtc = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + + DateTime.ParseExact(dateStr.Split(new char[] { ' ' }, 2)[1], "hh:mm tt", System.Globalization.CultureInfo.InvariantCulture).TimeOfDay - TimeSpan.FromDays(1); + else + pubDateUtc = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "MMM d yyyy hh:mm tt", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); + + release.PublishDate = pubDateUtc.ToLocalTime(); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + + return releases; + } + } +} diff --git a/src/Jackett/Indexers/NewRealWorld.cs b/src/Jackett/Indexers/NewRealWorld.cs new file mode 100644 index 000000000..74dbfd2f0 --- /dev/null +++ b/src/Jackett/Indexers/NewRealWorld.cs @@ -0,0 +1,210 @@ +using Jackett.Utils.Clients; +using NLog; +using Jackett.Services; +using Jackett.Utils; +using Jackett.Models; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using System.Collections.Generic; +using CsQuery; +using System; +using System.Globalization; +using Jackett.Models.IndexerConfig; +using System.Collections.Specialized; +using System.Text; + +namespace Jackett.Indexers +{ + public class NewRealWorld : BaseIndexer, IIndexer + { + string LoginUrl { get { return SiteLink + "login.php"; } } + string BrowseUrl { get { return SiteLink + "browse.php"; } } + + new ConfigurationDataBasicLoginWithRSSAndDisplay configData + { + get { return (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData; } + set { base.configData = value; } + } + + public NewRealWorld(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps) + : base(name: "New Real World", + description: "A German general tracker.", + link: "http://nrw-tracker.eu/", + caps: TorznabUtil.CreateDefaultTorznabTVCaps(), + manager: i, + client: wc, + logger: l, + p: ps, + configData: new ConfigurationDataBasicLoginWithRSSAndDisplay()) + { + AddCategoryMapping(39, TorznabCatType.TVAnime); // Anime: HD|1080p + AddCategoryMapping(38, TorznabCatType.TVAnime); // Anime: HD|720p + AddCategoryMapping(1, TorznabCatType.TVAnime); // Anime: SD + AddCategoryMapping(7, TorznabCatType.PCPhoneOther); // Appz: Handy-PDA + AddCategoryMapping(36, TorznabCatType.PCMac); // Appz: Mac + AddCategoryMapping(18, TorznabCatType.PC); // Appz: Sonstiges + AddCategoryMapping(17, TorznabCatType.PC); // Appz: Win + AddCategoryMapping(15, TorznabCatType.Audio); // Audio: DVD-R + AddCategoryMapping(49, TorznabCatType.AudioLossless); // Audio: Flac + AddCategoryMapping(30, TorznabCatType.AudioAudiobook); // Audio: Hörspiele + AddCategoryMapping(14, TorznabCatType.AudioMP3); // Audio: MP3 + AddCategoryMapping(22, TorznabCatType.AudioVideo); // Audio: Videoclip + AddCategoryMapping(19, TorznabCatType.Other); // Diverses: Sonstiges + AddCategoryMapping(43, TorznabCatType.TVDocumentary); // Dokus: HD + AddCategoryMapping(2, TorznabCatType.TVDocumentary); // Dokus: SD + AddCategoryMapping(3, TorznabCatType.Books); // Ebooks: Bücher + AddCategoryMapping(52, TorznabCatType.BooksComics); // Ebooks: Comics + AddCategoryMapping(53, TorznabCatType.BooksMagazines); // Ebooks: Magazine + AddCategoryMapping(55, TorznabCatType.BooksOther); // Ebooks: XXX + AddCategoryMapping(54, TorznabCatType.BooksOther); // Ebooks: Zeitungen + AddCategoryMapping(47, TorznabCatType.PCPhoneOther); // Games: Andere + AddCategoryMapping(32, TorznabCatType.PCMac); // Games: Mac + AddCategoryMapping(41, TorznabCatType.ConsoleNDS); // Games: NDS/3DS + AddCategoryMapping(4, TorznabCatType.PCGames); // Games: PC + AddCategoryMapping(5, TorznabCatType.ConsolePS3); // Games: PS2 + AddCategoryMapping(9, TorznabCatType.ConsolePS3); // Games: PS3 + AddCategoryMapping(6, TorznabCatType.ConsolePSP); // Games: PSP + AddCategoryMapping(28, TorznabCatType.ConsoleWii); // Games: Wii + AddCategoryMapping(31, TorznabCatType.ConsoleXbox); // Games: XboX + AddCategoryMapping(51, TorznabCatType.Movies3D); // Movies: 3D + AddCategoryMapping(37, TorznabCatType.MoviesBluRay); // Movies: BluRay + AddCategoryMapping(25, TorznabCatType.MoviesHD); // Movies: HD|1080p + AddCategoryMapping(29, TorznabCatType.MoviesHD); // Movies: HD|720p + AddCategoryMapping(11, TorznabCatType.MoviesDVD); // Movies: SD|DVD-R + AddCategoryMapping(8, TorznabCatType.MoviesSD); // Movies: SD|x264 + AddCategoryMapping(13, TorznabCatType.MoviesSD); // Movies: SD|XviD + AddCategoryMapping(40, TorznabCatType.MoviesForeign); // Movies: US Movies + AddCategoryMapping(33, TorznabCatType.TV); // Serien: DVD-R + AddCategoryMapping(34, TorznabCatType.TVHD); // Serien: HD + AddCategoryMapping(56, TorznabCatType.TVHD); // Serien: Packs|HD + AddCategoryMapping(44, TorznabCatType.TVSD); // Serien: Packs|SD + AddCategoryMapping(16, TorznabCatType.TVSD); // Serien: SD + AddCategoryMapping(10, TorznabCatType.TVOTHER); // Serien: TV/Shows + AddCategoryMapping(21, TorznabCatType.TVFOREIGN); // Serien: US TV + AddCategoryMapping(24, TorznabCatType.TVSport); // Sport: Diverses + AddCategoryMapping(23, TorznabCatType.TVSport); // Sport: Wrestling + AddCategoryMapping(57, TorznabCatType.Movies); // Tracker - Crew: pmHD + AddCategoryMapping(58, TorznabCatType.MoviesHD); // Ultra-HD: 4K + AddCategoryMapping(46, TorznabCatType.XXXOther); // XXX: Diverses + AddCategoryMapping(50, TorznabCatType.XXX); // XXX: HD + AddCategoryMapping(45, TorznabCatType.XXXPacks); // XXX: Packs + AddCategoryMapping(27, TorznabCatType.XXX); // XXX: SD + } + + public async Task ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + + var pairs = new Dictionary + { + { "username", configData.Username.Value }, + { "password", configData.Password.Value }, + { "submit", "Log+in!" } + }; + + var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl, true); + await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () => + { + CQ dom = result.Content; + var errorMessage = dom["table.tableinborder"].Html(); + throw new ExceptionWithConfigData(errorMessage, configData); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + TimeZoneInfo.TransitionTime startTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 3, 0, 0), 3, 5, DayOfWeek.Sunday); + TimeZoneInfo.TransitionTime endTransition = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 4, 0, 0), 10, 5, DayOfWeek.Sunday); + TimeSpan delta = new TimeSpan(1, 0, 0); + TimeZoneInfo.AdjustmentRule adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1999, 10, 1), DateTime.MaxValue.Date, delta, startTransition, endTransition); + TimeZoneInfo.AdjustmentRule[] adjustments = { adjustment }; + TimeZoneInfo germanyTz = TimeZoneInfo.CreateCustomTimeZone("W. Europe Standard Time", new TimeSpan(1, 0, 0), "(GMT+01:00) W. Europe Standard Time", "W. Europe Standard Time", "W. Europe DST Time", adjustments); + + var releases = new List(); + + 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"); + + if (!string.IsNullOrWhiteSpace(searchString)) + { + queryCollection.Add("search", searchString); + } + + var cats = MapTorznabCapsToTrackers(query); + string cat = "0"; + if (cats.Count == 1) + { + cat = cats[0]; + } + queryCollection.Add("cat", cat); + + searchUrl += "?" + queryCollection.GetQueryString(); + + var response = await RequestBytesWithCookies(searchUrl); + var results = Encoding.GetEncoding("iso-8859-1").GetString(response.Content); + try + { + CQ dom = results; + var rows = dom["table.testtable> tbody > tr:has(td.tableb)"]; + + foreach (var row in rows) + { + var release = new ReleaseInfo(); + release.MinimumRatio = 0.75; + release.MinimumSeedTime = 0; + var qRow = row.Cq(); + + var qDetailsLink = qRow.Find("a[href^=details.php?id=]").First(); + release.Title = qDetailsLink.Text(); + + var qCatLink = qRow.Find("a[href^=browse.php?cat=]").First(); + var qSeeders = qRow.Find("td > table.testtable > tbody > tr > td > strong:eq(3)"); + var qLeechers = qRow.Find("td > table.testtable > tbody > tr > td > strong:eq(4)"); + var qDateStr = qRow.Find("td > table.testtable > tbody > tr > td:eq(6)"); + var qSize = qRow.Find("td > table.testtable > tbody > tr > td > strong:eq(1)"); + var qDownloadLink = qRow.Find("a[href*=download]").First(); + + var catStr = qCatLink.Attr("href").Split('=')[1]; + release.Category = MapTrackerCatToNewznab(catStr); + + var dlLink = qDownloadLink.Attr("href"); + if(dlLink.Contains("javascript")) // depending on the user agent the DL link is a javascript call + { + var dlLinkParts = dlLink.Split(new char[] { '\'', ',' }); + dlLink = SiteLink + "download/" + dlLinkParts[3] + "/" + dlLinkParts[5]; + } + release.Link = new Uri(dlLink); + release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href")); + release.Guid = release.Link; + + var sizeStr = qSize.Text(); + logger.Error(sizeStr); + release.Size = ReleaseInfo.GetBytes(sizeStr.Replace(".", "").Replace(",", ".")); + + release.Seeders = ParseUtil.CoerceInt(qSeeders.Text()); + release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders; + + var dateStr = qDateStr.Text().Replace('\xA0', ' '); + var dateGerman = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm:ss", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); + DateTime pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateGerman, germanyTz); + release.PublishDate = pubDateUtc; + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results, ex); + } + + return releases; + } + } +} + diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 97c76434b..34df40230 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -156,6 +156,8 @@ + + @@ -163,6 +165,7 @@ + @@ -424,15 +427,24 @@ PreserveNewest + + PreserveNewest + PreserveNewest PreserveNewest + + PreserveNewest + PreserveNewest + + PreserveNewest + PreserveNewest