From f999e6657b94a371ef9c3606a2f9924782b3f17b Mon Sep 17 00:00:00 2001 From: flightlevel Date: Sun, 8 Nov 2015 12:48:49 +1100 Subject: [PATCH] Add BlueTigers Indexer Adds BlueTigers Indexer. Torznab Category mapping still to come. --- README.md | 1 + src/Jackett/Content/logos/bluetigers.png | Bin 0 -> 7923 bytes src/Jackett/Indexers/BlueTigers.cs | 211 ++++++++++++++++++ src/Jackett/Jackett.csproj | 5 + .../Bespoke/ConfigurationDataBlueTigers.cs | 63 ++++++ 5 files changed, 280 insertions(+) create mode 100644 src/Jackett/Content/logos/bluetigers.png create mode 100644 src/Jackett/Indexers/BlueTigers.cs create mode 100644 src/Jackett/Models/IndexerConfig/Bespoke/ConfigurationDataBlueTigers.cs diff --git a/README.md b/README.md index c7d680265..3bd66075e 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ We were previously focused on TV but are working on extending searches to allow * [BeyondHD](https://beyondhd.me/) * [BIT-HDTV](https://www.bit-hdtv.com) * [BitMeTV](http://www.bitmetv.org/) + * [BlueTigers](https://www.bluetigers.ca/) * [BTN](http://broadcasthe.net) * [Demonoid](http://www.demonoid.pw/) * [EuTorrents](https://eutorrents.to/) diff --git a/src/Jackett/Content/logos/bluetigers.png b/src/Jackett/Content/logos/bluetigers.png new file mode 100644 index 0000000000000000000000000000000000000000..60b131479b0c7754228fa954057428ca029afca4 GIT binary patch literal 7923 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 literal 0 HcmV?d00001 diff --git a/src/Jackett/Indexers/BlueTigers.cs b/src/Jackett/Indexers/BlueTigers.cs new file mode 100644 index 000000000..543781ea8 --- /dev/null +++ b/src/Jackett/Indexers/BlueTigers.cs @@ -0,0 +1,211 @@ +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.Collections.Specialized; +using System.Globalization; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Jackett.Models.IndexerConfig.Bespoke; + +namespace Jackett.Indexers +{ + public class BlueTigers : BaseIndexer, IIndexer + { + private string LoginUrl => SiteLink + "account-login.php"; + private string TorrentSearchUrl => SiteLink + "torrents-search.php"; + private string IndexUrl => SiteLink + "index.php"; + + private ConfigurationDataBlueTigers ConfigData + { + get { return (ConfigurationDataBlueTigers)configData; } + set { base.configData = value; } + } + + public BlueTigers(IIndexerManagerService i, IWebClient wc, Logger l, IProtectionService ps) + : base(name: "BlueTigers", + description: "BlueTigers - No Ratio - Private", + link: "https://www.bluetigers.ca/", + caps: new TorznabCapabilities(), + manager: i, + client: wc, + logger: l, + p: ps, + configData: new ConfigurationDataBlueTigers(@"BlueTigers can search for one or all languages. + If you select 2 languages below, results will contain all 3 languages. +
For best results change the torrents per page setting to 50 in your BlueTigers profile.")) + { + AddCategoryMapping(19, TorznabCatType.TV); + AddCategoryMapping(2, TorznabCatType.TV); + AddCategoryMapping(17, TorznabCatType.TV); + + AddCategoryMapping(52, TorznabCatType.ConsoleXbox); + + AddCategoryMapping(29, TorznabCatType.PCMac); + } + + public async Task ApplyConfiguration(JToken configJson) + { + ConfigData.LoadValuesFromJson(configJson); + + if (ConfigData.French.Value == false && ConfigData.English.Value == false && ConfigData.Spanish.Value == false) + throw new ExceptionWithConfigData("Please select at least one language.", ConfigData); + + await RequestStringWithCookies(LoginUrl, string.Empty); + var pairs = new Dictionary { + { "username", ConfigData.Username.Value }, + { "password", ConfigData.Password.Value }, + { "take_login", "1" } + }; + + var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, IndexUrl, SiteLink); + Regex rgx = new Regex(@"uid=[0-9]{1,10}; pass=[a-z0-9]{1,40};"); + await ConfigureIfOK(result.Cookies, rgx.IsMatch(result.Cookies), () => + { + var errorMessage = "Error while trying to login."; + throw new ExceptionWithConfigData(errorMessage, ConfigData); + }); + + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + List releases = new List(); + + NameValueCollection qParams = new NameValueCollection(); + if (ConfigData.French.Value && !ConfigData.English.Value && !ConfigData.Spanish.Value) + { + qParams.Add("lang", "1"); + } + else + { + if (!ConfigData.French.Value && ConfigData.English.Value && !ConfigData.Spanish.Value) + { + qParams.Add("lang", "2"); + } + else + { + if (!ConfigData.French.Value && !ConfigData.English.Value && ConfigData.Spanish.Value) + { + qParams.Add("lang", "3"); + } + else + { + qParams.Add("lang", "0"); + } + } + + } + + List catList = MapTorznabCapsToTrackers(query); + foreach (string cat in catList) + { + qParams.Add("cat", cat); + } + + if (!string.IsNullOrEmpty(query.SanitizedSearchTerm)) + { + qParams.Add("search", query.GetQueryString()); + } + + string queryStr = qParams.GetQueryString(); + string searchUrl = $"{TorrentSearchUrl}?incldead=0&freeleech=0&sort=id&order=ascdesc&{queryStr}"; + + List torrentRowList = new List(); + + var results = await RequestStringWithCookiesAndRetry(searchUrl); + try + { + CQ fDom = results.Content; + var firstPageRows = fDom["table[class='ttable_headinner'] > tbody > tr:not(:First-child)"]; + torrentRowList.AddRange(firstPageRows.Select(fRow => fRow.Cq())); + + //If a search term is used, follow upto the first 4 pages (initial plus 3 more) + if (!string.IsNullOrWhiteSpace(query.GetQueryString()) && fDom["a[class='boutons']"].Filter("a[href*=&page=]").Length > 0) + { + int pageLinkCount; + int.TryParse(fDom["a[class='boutons']"].Filter("a[href*=&page=]").Last().Attr("href").Split(new[] { "&page=" }, StringSplitOptions.None).LastOrDefault(), out pageLinkCount); + for (int i = 1; i < Math.Min(4, pageLinkCount + 1); i++) + { + var sResults = await RequestStringWithCookiesAndRetry($"{searchUrl}&page={i}"); + CQ sDom = sResults.Content; + var additionalPageRows = sDom["table[class='ttable_headinner'] > tbody > tr:not(:First-child)"]; + torrentRowList.AddRange(additionalPageRows.Select(sRow => sRow.Cq())); + } + } + + foreach (CQ tRow in torrentRowList) + { + long torrentId = 0; + string idTarget = "bookmarks.php?torrent="; + string id = tRow.Find("a[href*=" + idTarget + "]").First().Attr("href").Trim(); + if (!string.IsNullOrEmpty(id) && id.Contains(idTarget)) + { + long.TryParse(id.Substring(id.LastIndexOf(idTarget, StringComparison.Ordinal) + idTarget.Length), out torrentId); + } + + if (torrentId <= 0) continue; + + long category = 0; + string catTarget = "torrents.php?cat="; + string cat = tRow.Find("a[href*=" + catTarget + "]").First().Attr("href").Trim(); + if (!string.IsNullOrEmpty(cat) && cat.Contains(catTarget)) + { + long.TryParse(cat.Substring(cat.LastIndexOf(catTarget, StringComparison.Ordinal) + catTarget.Length), out category); + } + + Uri guid = new Uri($"{SiteLink}torrents-details.php?hit=1&id={torrentId}"); + Uri link = new Uri($"{SiteLink}download.php?hit=1&id={torrentId}"); + Uri comments = new Uri($"{SiteLink}comments.php?type=torrent&id={torrentId}"); + string title = tRow.Find("a[href*=torrents-details.php?id=]").First().Text().Trim(); + string stats = tRow.Find("div[id=kt" + torrentId.ToString() + "]").First().Text(); + string sizeStr = new Regex("Taille:(.*)Vitesse:").Match(stats).Groups[1].ToString().Trim(); + string pubDateStr = new Regex("Ajout.:(.*)Compl.t.s").Match(stats).Groups[1].ToString().Trim(); + DateTime pubDate = DateTime.ParseExact(pubDateStr, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal); + + string statistics = tRow.Find("a[href*=torrents-details.php?id=]").First().RenderSelection().Trim(); + string startTag = " + @@ -203,6 +204,7 @@ + @@ -439,6 +441,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/Jackett/Models/IndexerConfig/Bespoke/ConfigurationDataBlueTigers.cs b/src/Jackett/Models/IndexerConfig/Bespoke/ConfigurationDataBlueTigers.cs new file mode 100644 index 000000000..05cb8a51f --- /dev/null +++ b/src/Jackett/Models/IndexerConfig/Bespoke/ConfigurationDataBlueTigers.cs @@ -0,0 +1,63 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Jackett.Models.IndexerConfig.Bespoke +{ + public class ConfigurationDataBlueTigers : ConfigurationData + { + public StringItem Username { get; private set; } + public StringItem Password { get; private set; } + public DisplayItem Instructions { get; set; } + public BoolItem French { get; set; } + public BoolItem English { get; set; } + public BoolItem Spanish { get; set; } + + public ConfigurationDataBlueTigers(string displayInstructions) + { + Username = new StringItem { Name = "Username", Value = "" }; + Password = new StringItem { Name = "Password", Value = "" }; + Instructions = new DisplayItem(displayInstructions) { Name = "" }; + French = new BoolItem { Name = "French", Value = true }; + English = new BoolItem { Name = "English", Value = true }; + Spanish = new BoolItem { Name = "Spanish", Value = true }; + } + + public ConfigurationDataBlueTigers(JToken json) + { + ConfigurationDataNCore configData = new ConfigurationDataNCore(); + + dynamic configArray = JsonConvert.DeserializeObject(json.ToString()); + foreach (var config in configArray) + { + string propertyName = UppercaseFirst((string)config.id); + switch (propertyName) + { + case "Username": + Username = new StringItem { Name = propertyName, Value = config.value }; + break; + case "Password": + Password = new StringItem { Name = propertyName, Value = config.value }; + break; + case "French": + French = new BoolItem { Name = propertyName, Value = config.value }; + break; + case "English": + English = new BoolItem { Name = propertyName, Value = config.value }; + break; + case "Spanish": + Spanish = new BoolItem { Name = propertyName, Value = config.value }; + break; + default: + break; + } + } + } + + static string UppercaseFirst(string s) + { + if (string.IsNullOrEmpty(s)) + return string.Empty; + return char.ToUpper(s[0]) + s.Substring(1); + } + } +} \ No newline at end of file