From dfd68d16aa750a2903192a3fa594e8821bdb7881 Mon Sep 17 00:00:00 2001 From: zone117x Date: Sat, 25 Apr 2015 20:32:03 -0600 Subject: [PATCH] Added TorrentLeech --- src/Jackett/Indexers/TorrentLeech.cs | 164 ++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + src/Jackett/WebContent/logos/torrentleech.png | Bin 0 -> 24303 bytes 3 files changed, 168 insertions(+) create mode 100644 src/Jackett/Indexers/TorrentLeech.cs create mode 100644 src/Jackett/WebContent/logos/torrentleech.png diff --git a/src/Jackett/Indexers/TorrentLeech.cs b/src/Jackett/Indexers/TorrentLeech.cs new file mode 100644 index 000000000..eb15fa918 --- /dev/null +++ b/src/Jackett/Indexers/TorrentLeech.cs @@ -0,0 +1,164 @@ +using CsQuery; +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 +{ + public class TorrentLeech : IndexerInterface + { + + public event Action OnSaveConfigurationRequested; + + public string DisplayName + { + get { return "TorrentLeech"; } + } + + public string DisplayDescription + { + get { return "This is what happens when you seed"; } + } + + public Uri SiteLink + { + get { return new Uri(BaseUrl); } + } + + const string BaseUrl = "http://www.torrentleech.org"; + const string LoginUrl = BaseUrl + "/user/account/login/"; + const string SearchUrl = BaseUrl + "/torrents/browse/index/query/{0}/categories/2%2C26%2C27%2C32/orderby/added?"; + + public bool IsConfigured { get; private set; } + + + CookieContainer cookies; + HttpClientHandler handler; + HttpClient client; + + public TorrentLeech() + { + IsConfigured = false; + cookies = new CookieContainer(); + handler = new HttpClientHandler + { + CookieContainer = cookies, + AllowAutoRedirect = true, + UseCookies = true, + }; + client = new HttpClient(handler); + } + + public Task GetConfigurationForSetup() + { + var config = new ConfigurationDataBasicLogin(); + return Task.FromResult(config); + } + + public async Task ApplyConfiguration(JToken configJson) + { + var config = new ConfigurationDataBasicLogin(); + config.LoadValuesFromJson(configJson); + + var pairs = new Dictionary { + { "username", config.Username.Value }, + { "password", config.Password.Value }, + { "remember_me", "on" }, + { "login", "submit" } + }; + + var content = new FormUrlEncodedContent(pairs); + + var response = await client.PostAsync(LoginUrl, content); + var responseContent = await response.Content.ReadAsStringAsync(); + + if (!responseContent.Contains("/user/account/logout")) + { + CQ dom = responseContent; + var messageEl = dom[".ui-state-error"].Last(); + 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) + { + cookies.FillFromJson(new Uri(BaseUrl), (JArray)jsonConfig["cookies"]); + IsConfigured = true; + } + + public async Task PerformQuery(TorznabQuery query) + { + List releases = new List(); + + + foreach (var title in query.ShowTitles ?? new string[] { string.Empty }) + { + var searchString = title + " " + query.GetEpisodeSearchString(); + var episodeSearchUrl = string.Format(SearchUrl, HttpUtility.UrlEncode(searchString)); + var results = await client.GetStringAsync(episodeSearchUrl); + CQ dom = results; + + CQ qRows = dom["#torrenttable > tbody > tr"]; + + foreach (var row in qRows) + { + var release = new ReleaseInfo(); + + var qRow = row.Cq(); + + var debug = qRow.Html(); + + release.MinimumRatio = 1; + release.MinimumSeedTime = 172800; + + CQ qLink = qRow.Find(".title > a").First(); + release.Guid = new Uri(BaseUrl + qLink.Attr("href")); + release.Comments = release.Guid; + release.Title = qLink.Text(); + release.Description = release.Title; + + release.Link = new Uri(BaseUrl + qRow.Find(".quickdownload > a").Attr("href")); + + var dateString = qRow.Find(".name").First()[0].ChildNodes[4].NodeValue.Replace(" on", "").Trim(); + //"2015-04-25 23:38:12" + //"yyyy-MMM-dd hh:mm:ss" + release.PublishDate = DateTime.ParseExact(dateString, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + + var sizeStringParts = qRow.Children().ElementAt(4).InnerText.Split(' '); + release.Size = ReleaseInfo.GetBytes(sizeStringParts[1], float.Parse(sizeStringParts[0])); + + release.Seeders = int.Parse(qRow.Find(".seeders").Text()); + release.Peers = int.Parse(qRow.Find(".leechers").Text()); + + releases.Add(release); + } + + } + + return releases.ToArray(); + } + + public Task Download(Uri link) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index bfd48e2df..8e1b8343f 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -96,6 +96,7 @@ + Form @@ -202,6 +203,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/Jackett/WebContent/logos/torrentleech.png b/src/Jackett/WebContent/logos/torrentleech.png new file mode 100644 index 0000000000000000000000000000000000000000..49dda625b3ca1217f1516e94f85ca3b1e0b0ee91 GIT binary patch literal 24303 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 z zh&ByTR8JKStSl}qT_AIsS9Sg7YAcZQIh^mak;mRr%X7Ffh29R89&A#aqC8H)>R6bM z?-4Q$rhDz`iSGZ_lyuj28~qBJABW=$ju-APGHMvdj;$GFGQQH%D=rG{*Hg5Y;Ha0! zN|4K6qgfjV#j9zNiWAVLr^(}g+*^Li2#ZU%X$hvFZvwcKhiS1HoApFKyu~3xTZbQ0 z`iejjA4i~n5%&}BkXhMNS}rg>EL$0Wk`8&KmBE|@Y3z#%r5(ed=MQ@O-t9@*J99r8pBDvpo9!HQi>G4|jh=F}B@GoHKunG6wFL>$fprL?<4qZ02-bWe zrw{Qok_2c{G{<$-u~B==t|Bx=KM*T67 z*Zr-3J)Wb}Y+J`cwI=M@!fW_s3Xeu_IA7UDw`3Y zqM{Nqwn50f4K-WgRwx{q4~QRyhGH24$v!zG_4lg}7wI*nBMC;k9hm7&QuwSGCk(G&DZMIM{v%AqDE=yWGtX^>U~&V!vCLq*q}9 zd8w~vplNeEg*ODb>2p{eG!NUOeD+vqX?7wX z9IN5s7rjqmoyS~gtG7b%wHDvcq4(or&?C(R*ZpN_)T2NK8vmz#8VdRBHZI+$-f46< z<28&ZOipS)8;WpY2N|?%ltvC=zhJcNE!EH>oH^1)G=x;pL|*;s8>?b+-y zQ`AW(mfB?G;`1(=!1?K2^RPq~Dm&-Oz_!^>QyxCjP$-|9+pH=vgEn0rGwa>bpa@EV z&G$S?ZZ2)L*M;2Utp;+;D#l|1335YH)UlM=pvXr8wqxZ1#z)KdZ25%@Ds34>MACHb zx;=XF;su_<*2jlDOXF1_yr4K-%Bh)HB_Q;3$0OZhDza_+iG4BTPA)@eqb_W!-lJ{P zi&n)+p!TC#TjagDcLaxXyQbnNzE5*u<+cYtoF2PRzO8=BU@$xh8^}0avr1|s_)8YgH>;d{48s+*ui+B_VAG6m=T+)EW283AwStL@T%EQ!WMKQhpHeNNg2PS5ckTAQj+v98l6`X0ta-N|--;O=OlLQ!42LuU z=|G^U5F)1gZa$t%{m;U$3&!4?ZRN6`cm*_QmI@Muv_(=8labL82h`M9Bcy2QyYyL7 zMsISPWAea6F(tWehS>v++^?35jd1aNnWWUFY~% zQ@HhNE6AnU?QTeTD?h>2gTyzU&7mZn?KRA4)9haST$JXohpc8+{AnV{1#2&DJrg7{ zrlci3kz9~aPI~pg^59UuVk=?owYF)EE77!N5^(B|C%eeUlW(OBH6wk+4CUnaP-049 z;op4Zkq>k|iD(^(*+Ws4wy|xTMMfh+%Yjo(;WNsH@~Q4q0U0@$`C{aAu(73<7j}$P zs2Xn%o}daXV*AMK_|>`&_@%sZKqDbb-#&Hp