From adc06388e264fd208f0c956634ee3f980b61fc27 Mon Sep 17 00:00:00 2001 From: conihorse Date: Mon, 18 May 2015 17:00:19 -0600 Subject: [PATCH] Added AlphaRation Provider & Resource. Based on existing morethan provider. --- src/Jackett/Indexers/AlphaRatio.cs | 232 ++++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + src/Jackett/WebContent/logos/alpharatio.png | Bin 0 -> 5450 bytes 3 files changed, 236 insertions(+) create mode 100644 src/Jackett/Indexers/AlphaRatio.cs create mode 100644 src/Jackett/WebContent/logos/alpharatio.png diff --git a/src/Jackett/Indexers/AlphaRatio.cs b/src/Jackett/Indexers/AlphaRatio.cs new file mode 100644 index 000000000..85c000ef8 --- /dev/null +++ b/src/Jackett/Indexers/AlphaRatio.cs @@ -0,0 +1,232 @@ +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; +using System.Web; + +namespace Jackett.Indexers +{ + public class AlphaRatio : IndexerInterface + { + public string DisplayName + { + get { return "AlphaRatio"; } + } + + public string DisplayDescription + { + get { return "Legendary"; } + } + + public Uri SiteLink + { + get { return new Uri(BaseUrl); } + } + + + public event Action OnSaveConfigurationRequested; + public event Action OnResultParsingError; + + public bool IsConfigured { get; private set; } + + static string BaseUrl = "https://alpharatio.cc"; + + static string LoginUrl = BaseUrl + "/login.php"; + + static string SearchUrl = BaseUrl + "/ajax.php?action=browse&searchstr="; + + static string DownloadUrl = BaseUrl + "/torrents.php?action=download&id="; + + static string GuidUrl = BaseUrl + "/torrents.php?torrentid="; + + CookieContainer cookies; + HttpClientHandler handler; + HttpClient client; + + string cookieHeader; + + public AlphaRatio() + { + 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 }, + { "login", "Log in" }, + { "keeplogged", "1" } + }; + + var content = new FormUrlEncodedContent(pairs); + + string responseContent; + JArray cookieJArray; + + if (Program.IsWindows) + { + // If Windows use .net http + var response = await client.PostAsync(LoginUrl, content); + responseContent = await response.Content.ReadAsStringAsync(); + cookieJArray = cookies.ToJson(SiteLink); + } + else + { + // If UNIX system use curl + var response = await CurlHelper.PostAsync(LoginUrl, pairs); + responseContent = Encoding.UTF8.GetString(response.Content); + cookieHeader = response.CookieHeader; + cookieJArray = new JArray(response.CookiesFlat); + } + + if (!responseContent.Contains("logout.php?")) + { + CQ dom = responseContent; + dom["#loginform > table"].Remove(); + var errorMessage = dom["#loginform"].Text().Trim().Replace("\n\t", " "); + throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)config); + + } + else + { + + var configSaveData = new JObject(); + configSaveData["cookies"] = cookieJArray; + if (OnSaveConfigurationRequested != null) + OnSaveConfigurationRequested(this, configSaveData); + + IsConfigured = true; + } + } + + public void LoadFromSavedConfiguration(JToken jsonConfig) + { + cookies.FillFromJson(SiteLink, (JArray)jsonConfig["cookies"]); + cookieHeader = cookies.GetCookieHeader(SiteLink); + IsConfigured = true; + } + + void FillReleaseInfoFromJson(ReleaseInfo release, JObject r) + { + var id = r["torrentId"]; + release.Size = (long)r["size"]; + release.Seeders = (int)r["seeders"]; + release.Peers = (int)r["leechers"] + release.Seeders; + release.Guid = new Uri(GuidUrl + id); + release.Comments = release.Guid; + release.Link = new Uri(DownloadUrl + id); + } + + 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 = SearchUrl + HttpUtility.UrlEncode(searchString); + + string results; + if (Program.IsWindows) + { + results = await client.GetStringAsync(episodeSearchUrl); + } + else + { + var response = await CurlHelper.GetAsync(episodeSearchUrl, cookieHeader); + results = Encoding.UTF8.GetString(response.Content); + } + try + { + + var json = JObject.Parse(results); + foreach (JObject r in json["response"]["results"]) + { + DateTime pubDate = DateTime.MinValue; + double dateNum; + if (double.TryParse((string)r["groupTime"], out dateNum)) + pubDate = UnixTimestampToDateTime(dateNum); + + var groupName = (string)r["groupName"]; + + if (r["torrents"] is JArray) + { + foreach (JObject t in r["torrents"]) + { + var release = new ReleaseInfo(); + release.PublishDate = pubDate; + release.Title = groupName; + release.Description = groupName; + FillReleaseInfoFromJson(release, t); + releases.Add(release); + } + } + else + { + var release = new ReleaseInfo(); + release.PublishDate = pubDate; + release.Title = groupName; + release.Description = groupName; + FillReleaseInfoFromJson(release, r); + releases.Add(release); + } + + } + } + catch (Exception ex) + { + OnResultParsingError(this, results, ex); + throw ex; + } + } + + return releases.ToArray(); + } + + static DateTime UnixTimestampToDateTime(double unixTime) + { + DateTime unixStart = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc); + long unixTimeStampInTicks = (long)(unixTime * TimeSpan.TicksPerSecond); + return new DateTime(unixStart.Ticks + unixTimeStampInTicks); + } + + public async Task Download(Uri link) + { + if (Program.IsWindows) + { + return await client.GetByteArrayAsync(link); + } + else + { + var response = await CurlHelper.GetAsync(link.ToString(), cookieHeader); + return response.Content; + } + + } + + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 2f71054f6..dcd16fd34 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -122,6 +122,7 @@ + @@ -220,6 +221,9 @@ PreserveNewest + + PreserveNewest + diff --git a/src/Jackett/WebContent/logos/alpharatio.png b/src/Jackett/WebContent/logos/alpharatio.png new file mode 100644 index 0000000000000000000000000000000000000000..1ff6bcdddd2ab4ef70bf999c4290b7c468b06184 GIT binary patch literal 5450 zcmb_g_cvVa_w|Y(dh}j{C=uNVqxarRM065eCRz*=q6~j)KjI=4qSjh+o2q<-RG|Yf&1@KiQB?f*E z+YbH!7b1w7t_3OZfs(q$6A&=`qpP865t6f;6Z+c1GOu6x3~6nt>sIqMy7xf=k3ga- zpFtdbyy!hIYJHK1DZ?-OeLbE%jVn$ungciP4j62M8VepJHmI_&rfYp-Ed3}U`96q* z-`mMSZF)%06NVe(ic~SRlphR31>G1->n1}ZbEecF|v;MCKnM+cc zE2E_&E!scJ(Z&?<)YTA9;gf%!*>ekHXmogZ> zGfhZX(SauSh!w5x1%L1;yFT<8d)(>t;hOS@cC&(5WzOwmjkxp4c>22%8Y`bZ9}NzV z@jVhrj*24mw|Bk$_<X%fa%ggjBkUfKLyCwA1!wibG~@^(49LdJ=gO8?%Ymrcc6eVX0gbGx_hmV99 z3-Oz=GRFp7o^^0JkZR_+h-0@wwsz`G4$jOUntMPuK~SYns&^f% z=`=*KO}iaU$v+(_rE+W zs4UP?iLwCs&p(Y`gkvLUA@&Rjak5T_4Lll)y4Leo`m_5;uT15a(q|*>X&Ut^!<;GQ zjbyKJ){8Xvhxqe*?TGuuT{_R?{r3rqYdA)0K7r9}HK<6CGq>xD`?l=gZQ$O$`xpKx zZFj%{;)!2AM(?8fhCx4LiHH!_c^_+=>i`UD|VMHu}e~!hsy|9L-KhUl;o!7 zZnM!Jv`wFc8u0<-E!O1?=V40-r(U6G zl}Ym z{U=C#|1wjdE+NzNGYh;}s!~VP)>aV&Lv7kh?KpwznFwb#^y?9<1IaA;>0rZ|=3TJj zqMPStaVzyDMa|il?~C+ibe~^cbU$m{SY$>nsn+>OJRH@2gZ6N9GqtgapW7womX~LF zySC;|#i^*{<>iH1YfCf8zu!<)6m_-NiiJDy!{SvD3H7E&HeVD9DRo0gWAsGW()NnJxjN}AT0 z?b6cHn3R^`6Pgy|z+*xHjr6q-hk*BApsW-j- z{fOLLLmwX>j67;gpvVzH3McY!)RH zA{smq0eyTUXyyqbnJ3Ddo|OBS`~LOTd09iJ;t`x0<5mGZ9FG&doq??_DEsuix`cXp zi6kc{vnxR}ITV5jzWL0_QgJ-#K^QCP1_sLD+K!C!1OKkBj$^T`KV$i{-mA<6zP6_h ztD=blPKm{0b#!zbF$Jmw=hqP_oZ!S6wj9joQTJC6h_115zkB^S2Gfy1CsNqR*OBo12>n=B{w4e7E6GJkg}Du;LVwl9D0UCo?}*KiTbHT{~U3{)uI?Y4&#- z&?#bJRiK_SQEH8{frz3mPavS+yTR4|IolsC3^KEodwibErAddTM>oP%qyFq^c^-hJ zNKi~X$q|&Oyl~65Z{9Moi~WH|xOEK(n}GGkScn*|{Yp&GIL~$K=fC0De=CRXP%Em0 zhK6q> z_aP&LiN<2gv1u;!a8U5aDb{N|FxRC&B`rI9m=CVlb%a*_kA8QqN!QP#@6p*b`EnSQ zBY>qoJ$6W$+@z@61~^w%77Iko)5}X8OVH5NRPVQ_ByG5IeYUvX5qXDTXAzaZo)<y@$+ZT!Aif7u<-Ig8lS4$k9ptIo!NIq5C2O$5aO6t%C)iF;rRP}&G^IN z*?JG-4*984Gh18Ti}Y8XK{HDS&Es_ZLoxX<>cg)(mfh%YE5n=b<;&4u$Oa9EH}$^r z<;G#^-QN;?Um3fq+!i5O)2xQ$WF{bSYf21xwQTvJW(12SzZD@Hdr zH&=J}Lx9w$V;<&aX6Kv6u%SQQabZ5dpMlX)w}a(gWdFp(#K6!H;Tx@1WY}3zr7#IK zCj}Y%(K@={x9RAY3mm{DHVoRI!hydzL#?-8?G@M6eTd_V$TU{EC|SQzm-hj;V2z{*N!<80Yv!)#eV?sQB|O>qZnYik4n zvBiKsWMyS7pt`|L5-xrFOYf);d+3ab;*TiAGLkft7)|Z$hRuz^QzDnCgvi4ok-1u&DVm#sX6Het9BnNn9?kAvbV{3_JzsJqWaS{f}vC#gPIKtc$xXtrax@5 z_n&gV)aP$3W}^vja8u#nIDs~7QokUhAIU*ag>Hh_)Yk8;JJ;GUD~5=Fv8p2T;)`|! zXdwE$Efb4<8nOS5>v*_4Npn(quVq`T(QnZR0)f~lbc=_aOj)xihWO)tK5!MWw6HL- zw2Z0VejOB47r1TJ2j_y1x|7>A(_CjC=Nmga^Qy;EIPGG;s}jygCwFyqr7B-sT!gz< zSbh0eS0{OM-mhF2dgT7$!v|)CAaBPDqmTT?kISllFu-TjH#5y7$)&D#TR|%|M6Skv zKdKe_oGU&RP*m661_HtPPKSbk(w5T?_~|K;GJylLCNry~(I-*CVE2R#8<|#n6k; zw+7?NkjUILKJC-5^7($L>FGV05-vb)MzUnc3E=(jM%`VyqVKg`pU&}+w`Y=8J|wHH zt#x&E^~WL4>Yx{|8hz(kT|I!hNPe{v5kLrea{%1g!G0%inj4M0Lvjw(=}cu< zgo>6(8bynz_|@sOWLw4CFE#C1lwNY&VXt<`7vjnU`AQjjW`9(qKG}3=e}Ay*M?;AB zWar4R#DsVAiF5x0zkQWcTO1$YhqI2e`knipHK#*D5PE!Ib*L{;hiW9-gxvjQn5X!; zr$^(dogJVgyaEETbH1%r=sLfaO@ZlZd-4uIoYCO3-`!tr>qB2F>$)eA0jO@08Mr98%Rz7ZlbNm<$0^mTRb z5g3C{=yP*(d3IY`TSG5aGt~3yXT5<8JpL=MX$r)Vn1qVG;Oke4w?G0UU^mcMYOb*b zWLOwf%fGTc>53D@l`-54!*7#ku8jJBCe*&#^R9F#S2(Fr%_!I3QYDQ{)F}06Dca1f zAhG(xBFlN(!ImaC`kMcmAn8hqD13%zSxQ&*T;yhTrbcqL>@I#@ojmmHW3TEmkqs&W zY^;1OjX^9ao&ARV4x006JD$+z86F!Naz5S|_x|;*uqhcJbS5}V*024-ePFc^MPDA)rOtZ@(w~fUG$i)}7k66X9c%Q{K-y9_vhUhsf_xWMLBKk;Kk;ae@}a&TF=JV!xih zdB#fD?_hjgjn*-vRC@r9!Fvy6WWF~g z1N$}b_4UQojazF18!|LBq-SDsz{mpNc>kWF^2?VrGh#An35m4jW#>kpImXw2xNi1I zo{3rGzQL4Wo9xHijsX6>=NglThV-nep7vH+ehJyGYWgq02ti}2jlnK*1yqF-IuD#4 z4ik-|;^+z-is58Z%Fbv}g>11?$h6A6VhuOA7fsVM6`ly1BDkZ{huvrl=VEb3ado^7 zW$}ax3)-~|a496KpK!3>?9fHa;XhzmD7qbi0<-h0_MHQMnTdi~oO`LQ*V$<(T}afn zuB0jazrBz@Zc_p5QN0KHMlat@U!NSPBEazw+1YdDJ^=v|obWhmrE>z%V_o6LkIR9Q zTvk?AKn}Rp*&h(W$udK7`Ls`Fu?9~s*``s#0C!jV;U3+wl&b4i)z5T2J%tehhEKvU zZyT7|fV(c2Ih%OjRh+o($lrMo#Y?gje>1(`6R{$@R?(Kc#;~_SmXQ2ALGKqLLvdR1 zcj`J2GE9$!3bpexT?H19GmXg9VC@AtMuKpq%ZIYr$sT#3 z0*>H@f&u~|H_ToZdfnw@YbyQIrw<6a_G(l#zy2o-VAasDo1?depCPq2qQAq><^c(B z4!&-+E&xO}+pqoee~|y%Yo<5-)mGizU4WcXl=KBn_Gm0klxeY6T6%i)lqWwAPvpde zS#`@+C4qwBWIP;>TB4lwmZhbo?K=Gncou0x@+|_u4%<{sr`lzQo$ajxFO_Oqc;kf& zB#d-{kq^V_b6Q%SxQ}He_@pM+O-PPh)H0VV%gZ`HnD=D2mqeV7kVq^O^Ti1j5SlG> zfwHK!O`c4>hUOS9P!QRB3Ul1EcGf8^@0C(D9w>7eSZNSaKiF7Oj&JuzUwu$lp$V`PNF^9!Az(Kr7;YFa7mgY{@7ec+Upm6Co7ib}Wm zqg35t1zg)Z04AMLcPl)X*sK#05?*96S~+46G`6CQ&d$z+DO}1CIb65r{Uv2(b+0$g zwBVeEYHEZS1cIJ{q4vc%?{t-2Kbv3Mcv$X#^8r^QBdW=AV?iOI1fcauVV9q1E%p~v z%7^3eP@sJ{xVmm=XmFJL3=}m{zy$)GEg3m^?cDCK-JqeNA)8v~yTILs2I-w31wbW8 zd4SULPuTuC;4%9FrxyTXXO2|`%I#Za_j;Drc_VLc(O4(IFz8rYGtE4MP_C}70_%T+ ztdFJQh&Ee|tCDumG&?Q++)=jHOE#8;Zvv_r(|`CMpCv(E|} zaN5$lz5bgaRlTIecfX8dRva!(CbUPFhkdy2LwW=8Q<>WrA>9I5urvBtk#9&*Msh&i z`GKwwP|xAjqT*t{f+`?RU4YOJqS56gCDF&nuMdxoEokmN)Kq|{Cp%%^q05nPEZ(b?76wQd56>sUtf2?!0QNo zeiA4g)S3%`SWiz6FrUt=Lm$0o>-Y-{{u?qG3YeqS>SvM$UDakzQm-lq1Q7oQcP^|S zoj}*PHENJW50S&lu}(`z7jN^x4w|O>7tqX6@cosMA0~l1LO?!kL>Zw<4sVs!NJreI zIN>CQlP2_cfwRqe_pKilJ|t6%PYpZvs0J@8gEgH|p`zwxMxEOyheJs<;^EV;r}68o zPa9=DPDng0+U)(@X1@&dCuDWNc>xec##>u43zH#?7F5G)e65tVXPrORU|e!fQu z_EQQMI1gC7B17ANPp!@V8|1^psIr%;J`7v!*AdEzMN4N_>H?lwWhYu_sny(D1AGJw z(>HX1{w4nY8&0>PQV)O*@YJgxU7kFbvj;CrgvSku@5ShXvRgijd+`1U{n2*p_t?p% zv(7>Fy#3~ZiSB^wukIQrDRL#dOZ~658IY}{vsC-e(9Y5h{#&hUmS{1|Z{e{lv1O76 z03hQBU3tNeD65R1e9J_b2{ArCp|tS%sK13X%XsJszlc$M1cDwI#qrNZP451k9JO?0 zJZA+zyz$d25Ge3P8##yjLaWW2;kyLjf(`I3$bfmV>#~{#?2z<) z8QO#*InSao<2FLyq8I|yEON>d##H|wW`*hTYp{O=#nT+(pExH0!%+fVO(TtJHOHv` E0lXZ?VgLXD literal 0 HcmV?d00001