From 2abf4f0ee63c486f215c8da192d6b3b104f61d3d Mon Sep 17 00:00:00 2001 From: kaso17 Date: Wed, 7 Sep 2016 14:00:25 +0200 Subject: [PATCH 1/4] Add Torrent-Syndikat tracker --- README.md | 1 + src/Jackett/Content/logos/torrentsyndikat.png | Bin 0 -> 3616 bytes src/Jackett/Indexers/TorrentSyndikat.cs | 202 ++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + 4 files changed, 207 insertions(+) create mode 100644 src/Jackett/Content/logos/torrentsyndikat.png create mode 100644 src/Jackett/Indexers/TorrentSyndikat.cs diff --git a/README.md b/README.md index 7cd35eeaa..f7847b7b0 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * TorrentDay * TorrentLeech * TorrentShack + * Torrent-Syndikat * TransmitheNet * TV Chaos UK * World-In-HD diff --git a/src/Jackett/Content/logos/torrentsyndikat.png b/src/Jackett/Content/logos/torrentsyndikat.png new file mode 100644 index 0000000000000000000000000000000000000000..93e9d976b53d2afaa350b7fc738fe5b7359c886d GIT binary patch literal 3616 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 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"); + queryCollection.Add("rel_type", "0"); // Alle + 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.torrent_table > tbody > tr"]; + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + release.MinimumRatio = 1; + release.MinimumSeedTime = 96*60*60; + + var qRow = row.Cq(); + + var catStr = row.ChildElements.ElementAt(0).FirstElementChild.GetAttribute("href").Split('=')[1]; + release.Category = MapTrackerCatToNewznab(catStr); + + var qLink = row.ChildElements.ElementAt(2).FirstElementChild.Cq(); + release.Link = new Uri(SiteLink + qLink.Attr("href")); + var torrentId = qLink.Attr("href").Split('=').Last(); + + var descCol = row.ChildElements.ElementAt(1); + var qCommentLink = descCol.FirstElementChild.Cq(); + var torrentTag = descCol.Cq().Find("span.torrent-tag"); + var torrentTags = torrentTag.Elements.Select(x => x.InnerHTML).ToList(); + release.Title = qCommentLink.Text(); + release.Description = String.Join(", ", torrentTags); + release.Comments = new Uri(SiteLink + "/" + qCommentLink.Attr("href").Replace("&hit=1", "")); + release.Guid = release.Comments; + + var torrent_details = descCol.ChildElements.Last(); + var dateStr = torrent_details.ChildNodes.ElementAt(torrent_details.ChildNodes.Length-3).Cq().Text().Replace(" von ", "").Trim(); + DateTime dateGerman; + if (dateStr.StartsWith("Heute ")) + dateGerman = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + TimeSpan.Parse(dateStr.Split(' ')[1]); + else if (dateStr.StartsWith("Gestern ")) + dateGerman = DateTime.SpecifyKind(DateTime.UtcNow.Date, DateTimeKind.Unspecified) + TimeSpan.Parse(dateStr.Split(' ')[1]) - TimeSpan.FromDays(1); + else + dateGerman = DateTime.SpecifyKind(DateTime.ParseExact(dateStr, "dd.MM.yyyy HH:mm", CultureInfo.InvariantCulture), DateTimeKind.Unspecified); + + DateTime pubDateUtc = TimeZoneInfo.ConvertTimeToUtc(dateGerman, germanyTz); + release.PublishDate = pubDateUtc.ToLocalTime(); + + var sizeStr = row.ChildElements.ElementAt(5).Cq().Text(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(7).Cq().Text()); + release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).Cq().Text()) + release.Seeders; + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + + return releases; + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 5688686d3..34f7d76f2 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -160,6 +160,7 @@ + @@ -428,6 +429,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest From c0bdedbae1498acab101a325b97ecead47b547dc Mon Sep 17 00:00:00 2001 From: kaso17 Date: Wed, 7 Sep 2016 17:29:56 +0200 Subject: [PATCH 2/4] Add Bit-City Reloaded tracker --- README.md | 1 + src/Jackett/Content/logos/bitcityreloaded.png | Bin 0 -> 23339 bytes src/Jackett/Indexers/BitCityReloaded.cs | 179 ++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + 4 files changed, 184 insertions(+) create mode 100644 src/Jackett/Content/logos/bitcityreloaded.png create mode 100644 src/Jackett/Indexers/BitCityReloaded.cs diff --git a/README.md b/README.md index f7847b7b0..d65980cdc 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * BakaBT * bB * BeyondHD + * Bit-City Reloaded * BIT-HDTV * BitMeTV * BitSoup diff --git a/src/Jackett/Content/logos/bitcityreloaded.png b/src/Jackett/Content/logos/bitcityreloaded.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb4ffae5a54dce5f84a1d605cce403719042b97 GIT binary patch literal 23339 zcmV(^K-IsAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!TW^!x88c{4Rz{Vd?k5#S)b2` zY&HwO-w$2$A1LWx-cprk8SvQEj}kEkM7^onOM%+$|YTUef7>0pDTGZl&m)_=l2KgUUh=O zAkyiy-7Edy+ENlNmDSm6%N1AONuU2@C&)}?CerijdHEU2#XsR*NpiO~5U@P`v4A~0 zQ`c^-{glQk$EQa_WxOK2adN!*H@aKpH)Ui9pPE*SOYvep|PP{gUYugBJS#R8L#n7CQW8lo`6G$CC&`G z*Fjy2hD4$6ioTv@F)ot4*Py!&DH(ls%F!1;0bYwow&j=ba}#1hJ6`hgR9C!M+Y@Lj z-@E2RlYvLiqvh(Hp`~*smnT{hw37GCJ1cqjj`z1u(uv8H(>Vu_Ts@_~r#123W{;Q zo*STrKclUD55R5$xE4u=7ly|Y0W?Qgf4a7+YET7pf0|kDi5{{AmUlvTT0qxo#g*^| z)(Jtg*ke%F(lj=}I#f4TKTTTJ4(WSBI1M)5XZUxzL;6>25U>H#Q+WwQ0Jdur8q4Kq zo5-Yjd7sHTeq5bgTLitERIZHrU?(PPlSNckJSbTStEckfS-Bbvm+xrkvG~#1J@fLF ztUi+lP5B-jWm9Wdp7+cvD;~UjX&s$ygvh@rdu1KHTz&GdXRfSk-}=IP6QbHwUH&QG z8!yQ|nM|67wAT5LWU6|4=1o!q67xktZR>F0WDe9A>PFwW)fJUvJEeG@qLW z7295Ng5-Th3<@+-;mT)aF<_l?>Rjb?vc`1Bvu7fdET4xM^aSiBPl%qNWFl181j>BZ z$ul5Q-v9B8VAQ>m?%6wY6>KK@9FQEiSkJ&CaH|dv6Uv!3G>GIl2VyJ6%1+z+eV!%Y zzpSei%+;Hy6J^d$)6<`|;Rb_a!)G~JkZ%*1)e%wsC;E;j_0s^ydoRz*<&u|ox-H(z z#2eca^1ZX;*gC{KXZDqh4#i?tiDhM(tbC59mvo(`40%EMxV~9A7IEcBM9=tVW2tfA z*+6V#rtwq%C-5T?m@M6Mjg88f1siy2_|j24o1hY==$Ob(M>vuTAYcTDvKZGoN1TE^lz?|$ncrb7N5*F zP`YQTAIJ@sPbN4g1M4^2HF@MpN^Y5S4(=qLmLIN5mKC7Hr+Co4lE=H3mp8adD&HmwEsdUQJk_u#XUW$a(@-dg@mw7~P~#?Nl~HnjxERREKi3xnTW)-G zRuVl^M7$6=ab>c#$?e+nc+ib6KN6)iVM)@GGEHj=N8=(Hk*>ANYt_~mNXuGK#C*w9 zyjtSf#xR%cnt9^FE^~PrQ_05FcMpBBP&n%`tOh+o6A3C==T$+Kd3edIYYiBXB`EK? zW|I?^SI(k!H7^EpbW~Rz=EKwFy!MogFP;VHiEX={x#v12@<_#R&zMQFdaeq*WjlT| zyEM~*5Vf^y(-&|&INowR2~^CND5W@psw?fFKrjay>jMwRgG{LSa9Tj@tN*U7lSP`K z^2+Ia8d$l$3Sed;(~c(Ss(5`;&?&l#wpB*_s=o4cEjp5}qvZHaBogMU%9j-2DFN3v zKJzBClH?*S=_VXoVjTktLv4G!8UOrGc2@FBDS$OvP6^rA@lF5? zhr$MW^++_ui}KAqq@azKXsS+OEYIuD>Bf{i=AGaj1K#!DA6~hM$vqQIry+S~c^=3- zF-oXPDkp%udT(z_NhdQa?0~0nl?+_Da>}tz=90C`TeAjiQ6^sXtUhzR2_m3SDY69f zC@ft$u(GTMgb!r4q&Y%?2zgLJXBMqZ0#EXiUpf(_0W+Vux*9m^BYEW^qF&z|Pq~TA zJOiC;mILX6p>Z?+ZX7bUdLeooU|9sw@)I!Bl%bGZB)JX&q*zBF70{9?r||>iPh*fW z?W#D#fnFNl%)iOi^&yZGik^ppVVhj+jopiu`K3&$l&qf1SAFXj56Meyu~XJ}Ylr-# z5^*PIYfJs5#o+)$WeXb>|9hoiY1H#uZJ4HzC6tSvs% zz^GyCs?(sl5ge5*{yC~9J82)g*JQ}`SN&9;ER-T*Vw?bSw6r>sCOrXPZL=o~s+{ap zS8_2;PC(j927^MI=*EI3n;Ro1L-pUuP&9NFZ4Xp#Y#o5@$jM$T%JS$s#5~jJ;*IU9 zwkD2T5hde=bkq(38p}FW?2_xOJL}48$jkTcy=x=HXA|?4-gd1&d#-%1E!NS=@*D`A zDc0fWIn(H#>u`gp|1@wp)672?Fo`Z7vWUQG^hLw?Q$y}vY2w*C0z3ptqr=A`^C3l7 zz9WG_UZfG7rf^!(G&GwEDv%T!=%|S=X)S3oT}$(r?ASN)l1?WPiEyH*9ONy|j8tOoM!^}OWK_V}H6@0B;OQUeM& z0=#?X+BJ>K7QOlwsAwR_gRTRuEF{;!J*^^*^_QAn*$Z;#)zICaIsmRD1b#(~(JyVx;So0Z!l&dNolDs+#CIUNtF{ zKW>wRH}w0dCrz`fKgI{|WreJtmY3tJvbdP8f>Un^0^_2LWosniU!73-GaeO`wMvk`EX?xClJKW9b zdIF?7J6;6B5b3_XU1?AT5Hg9b7^2jWGEXvP^4Y|1$be0HRySmQfj?=0%8WZL?57J5 zmS$A)cq0Ib5%mgbwkc3aF{_>iQmVU$uqkbsDG!w9Zt$7a3n+?|x6C}z;t>|; z2qw`KV0BgCV!S?Gb}gGAVllYiBz2B*(b@5JgdA~mS)Pb9e*T>~#0k?0vvNHI47q@>&$soWcyXHM9Fp8zc^K=tA^te3^e zpXfD~tL`I}l<$k_|{3F);D~Ztb&dNB|89 zBxyv+r`nTyAb*rW0YWUNNLwa(oZvGJBeTe?1WmOjd0GJFvlPvIn!qS5EyEK}J%zHe zQp}w-2Z?whr$L1S*DoCc!nkQoZ_J$xq^0%TNtAWShqSK=ii*fbzd96-AW&J4$>&^- z_~;1w_wB$)=ShqY4^pGXjh-|j3A)M3;LxpRP_{Wfc;m)i*W|;%Dibf>bf43jfGZ6arS{3s&qpj4Lve8tic3mRQCg0If&v4hz>tWKQMluzp|!k# zl@)KXSRUyF&14%`sqF+j<(c_cU#L-CN60Hrru_&k>MepxAl3>&04ZCqq%SGkN**~B z<{LWABL6glG5VPaP7aOZc!Ko_h;f!JDXqk}|NAbSd)@_TsH>-DC2&z7sJ#1NlZjiLGw2%BFVj+P)?KNeNoq!(9TTZsVZBA-G#J1K$lK%wFJT)i*mL#x}N%v+aMY&6)nkZw*G~xt7GT}fN=43h1 z+J?s-dl>63y8=~}H3oLcTgyO_kIES^c$1+IC^<_zQ*s0c0m`vV%RK>ocmgs@zI~LZ zpMhM6S{`{Nh?JBgSveImSDlTHeg;Vg-vGKhkRIqle4x*?Y9=v8Uz=@nB8~HGLSQm0 z#x~WW^GO{)QWz?t!-3RcN(l2^vU;_ya`;w9T*N2SW?)o@be5-@b?a2}UsP5zSF>F- zy+vE66-khJ%F!TMW29#w)Ki`{p$%-xk!`fH+7p;7$2#heCV(1nn=`C5%jL|a`YYh( zf*E_xaxyUqYEPM`2u)IcUV+i;?QO@t{rhpMz1`YVDl02PO-&88W-&TCIxs{{D}YPW z#t8&1q5Pv%Syh8sGiRc*vJ!&>gV?)wFHW|#Iv(dCk1cDFJ^>nvB9K>%0Ii6>q!!_dNhqzWLP1RfE|^|~ z_EA6f9qU9#X9q@GTaf5(MS8HCU>(GGlGch7Hch`&uYR2#;n;-f5>Z)r318Cg zS}{?Q%ih))ZEGF!|ikz`t?LOYQJ z5_MieARzT>O!!l2GtX?0WfVz@q0>OrbJKJ{tX(G$(}%gh)3x8KgBG zK&7b#2qmcmf(oz%Opc#Sy$0E>ED)gYy8JRJ z9Rfy9f7(o=4L${VdZUBjFB8v5SHRP}6ZX`3AwJ-zS)~}1xDn{5^$Ptu-tzU^H%5-*&QvX>l0!NoKi!J(+t)Fe@&-95e_&1RbZ z2@x%T8S42|o%TQ`p^= zPXs|>VIhjBx%!9taI)nXT8E2z=T$Wr3oLs{eRIFDWP9IXcNsgcLYL6jK=YeZ+zbBu3mEiR;)bR zESmf|0bYFB05O?a=b`meU2{Nf-CP(DkJ%_SB>`VGeL98*<7hp40HOFW0$TVb&7f8s zVg;DAVhwt`8F(JpjEvkVX*|+MaqRphrD&SINW+WnmLrIa46?In^iq?4=<0QtH>(ll z`2p;wJ97AqRy_E`Us#kFlHW&MND-L(NWOiazU@O<2~I##KQyB(iCJE2t2f^0IP9@f8>v z8Nim;H{kURFB1f3{7x@b5P;!m2yHDV&^&D>R;^lveS7y{_ntirdPW!wHQ#h zpHZO;k)m(fFnY6HQ|9aHc))Qz|^bO;t`LxU<5GzT`YC*lbmsWt$zkJ4xuf0sOyn}vb zE#@;gs;h5A6=}#{lP|92FS#RQqhs_z>8sK8Da7PWS{uu@GL_yAOdwZ&@3hxzwC;KimWo-+@any6~&=x3mCjri(K+L|;M+ z-14ooX(Afav#|N4fq?6bv}Bm)5Ti0}h){jKVhplwgo7sG2ACJJB?|Y&UXo^IbS!R~ zCLT{Bz|Ph7&p-Dph6V>nCt!oE6b^Hi+k4zB&RM$-)wNXw zSraBto zPN#X(p!JT#1^=BXz01cMT1 zm9%`OKvSDOsG&KCdil`NeiHZJcenAaB=fFGVwzoMl7p`L0;l@yBaK*)V;7{mMOj7} z>}dO7n%AkqA`~=CGnZ-nmQ;V(}S2n|8&hv`u26jsLYSj0@R@M)G372Px2?XQog<3 zwyAyJfBoB+$U6N?4wCsQ9DD^ooG5m$p%iGPb`>CL0Hs0f-7hDnHuP%UOcA>Yftu0Y z@UW&dtjc=*b`v7<+5Qg_j0Ek=2Dqm;J^RIkAF+H8zK5G_TYCyyVp z`d+&E1OE#P7R^Hu&H9s%J&Hg5@ejEtXVSd6^D%wqJlh=c*zX^rk8>sfnchqvi-0Ms zEMi2z&+_UBlvS%%nhz^Y9$`KCtQ$AKPJSGy>*^b*@gKl2U4Y|<56~Yzh+qEl=k{#f zx+_ppQjTe}W+Rp#LuGlTy&&lC@3#PIbY#>5IrU3E>+tX(MhE+`XU|@YjM7h~jJ;If zI2AKy&Y+yMF6=CmG?NCfKDNGmsU8<%Za6RRZV!+lT|7$ zjG?D$KAL7vM;-^PpM7jQaSA1)Z5WJ{qm+Tzsoh%<&#OSyI4Af3V%48U@Er*GWj*g9@tFxOy&=DJux8B+=934)#NsI2nj8fY0zgOHb3NbU7EE2lJb=1dNV+u&PQUr!CFU}BsmF%K;*t@ifE z)&kkLRI~`KhYn%pyv5kRmpqM8LzD&)E2_n$iUO3C6e3*AfvT)VV5AFweQ5)=T`RSh z>+cVK{6CmNzx9pRU&X(FB#^6ia`lLOzDLFzCeKkw*wST)4oxUg@-#dtp%+I6J8OO6bPGM?&35E%f zR}c2%XV=fbH(%+&tk3}3D3>EG9azvDtzyc_3ALI&`lARG?sfGLy{m*T4RC z{P@TB;V3m&ihkNpfBIA0b=Nly@Y2G?r3JX;;>%D~RgHV^z1PuVe@1AUzVNkg;LYJ; zOloMr`t2KV`+MGxM_+ygXV09D0R}3sQLB_^6PQDPY;r{y@4D(n)Qopvgm@Vw&tCe@ z_kW1r{Q6fI85+S2?|cs$8k?|v>t@{lnw5T-G z|4Ul8ZXMl~W!C>seBu*0#7U+@a+jvQ>l=6BrI%i2$t+&yU6eRH<-+6=+sR;FR z7Gm(=eiW7FVMTK_<}_BLrmPI5H1z``N&NS3ev8ELFfu9kLP7ude)_{7GJtYHk(P$s zt`{bDSVQWfb(SSiRYCrf{8?!;&U4OA1xt$H_*?)ZNChgHu+E-N96WfCGiL;g7cIc& zKlfP_6_<)S2f7cx{MD~bn}~*&j4{$B30}L65YiSux&HzBILsID6LDO)?lQC(Z_q&B2<-3<7_%?{3$6QTEobGKY_91 zjm`Mnzx_LA&zgr=UKG1_zKI{)^$qmXmwV`;U*hZk{$I9~RZvjG$uWo(tIoo8H(bvN zRE%tjQm2OZaRR#Fl0gl%rhL~x$W1h9e2qa|a-s(9?CQdozw||W-Fo-;e}K<@{)-F_ zOZa>gANufz@V6IV!rJpMz^6WS2TB-0kB*FB`HIC@a`6pVcf(Ei+W$O`k)wO?l`nlB z4{SV$FI=$%hsPN=U>sWxoI(RNTWwwd{RtmR{0Y2xbO7&MP>VfX<0vl(;BSZ93A}oA z52w*ol*LcCb>aO>CgH7)QAYeMf1nGup4Eio-9wmB7Q?rG{wU@bjA1yh5mOlpv>rRj zfgMCG9op*R0xCA=-c zRr(tVR8|yY+0rHOvs1owl74O%`bM)@vSbN<`|v|3EGn{&zx&luMhU3mc} z)l^{H(M~L0vKYr&TQRwz2C1|k(LkINsS<^eD7qLyAAadsgcH38L<*6|V6m5)@ZkPK zEbHC`U4O-uSbNpG5hGCE+;a%eFi`r~RTtsEzV{sqkOGk)Mk$ZA7hHgkcrI_p>iU*)XcBsxZWU(i9*yGJrvv z`XG-|x=`8iK_tc*Bo{@A32NC`89-j@*IbN_9)fM}4)oHc7#r?k-66y>W9ZFl%~)Fz zW0=C=S3BPdXD&zm;+5#>>&L0#c9f?E5vCchq4uoGE3ok%>gq9zY(bqcDLDQ17r%5m zi&{s^IPwJrlq>;gz-1wOgTiP}I+HlG=K>~6+R_581F6bQ@H1*9KnD8Jdh!%a`&(GB zZ~=b)v!5YKVTiWO^L5ueu)D4C{(J@z9UHP3=<12}NELV_3P^ zEgnbn!o)TGP+}lJ6Ndz~et=eh^b@?-+TT!e95d(6#l7FZo7y*oREBlpBkb{nRL~5} zUyHdn-HztE80x0Xz^g++G;$34zI;6nZGM#zb(Gd*6cu;;0BhD=kEb4f3ZnyE7~Z}S zIKBs4ol+9wo=A;Aey*U*GV z|L}W8&r}-hLz02q?Afyj;zAVAtx8Ze1+>Z}7fuR={ny){OqM=92YQ^o`RrNE`1#Kt z!Zp`lLzko*@$n=lX9DrT0W4au6t4{?Q8;TEYG$uSqW1*ShxX98?7?tPJ7&#pMtjR~ zGS9Y>18AO9kHg&wRLxz5XhSpdW-LWA8^=J$Nt6)yTI$N;gD6km*pG(bt~jr)+KS=V27d=!I212}&4 z7&bF99_Rh$&07?9S#Y5UZSjHy*uQ^2<}O$$&XATc#gKqWng)JzcYWyV?Ze>%hd3}{ zBsnun!X=n_#WmO$o{7Hk0M43KhfOC2P{f%YrHLrfdL$#tIA`RRFTWF^V;f1PkP~AR z!D%azTJtWX+m9pDvKztCA&j(bM~E|eJgc`r1ONwaoQL*g&Yrn|=JW)5y4`Y>mlT}h zoR8zukKT#PE@&3EvF{jcB_Q6_kFov}h#lL8Lr>l3Ca%mCgR|9l-ijk3)oK6y6O2pBYt!z@W#`eaR*H?6w0fLmSZe2j3h0EP`mcRi}2>w?Y2}G zq?Xm5&*jS&5fHsNbod~ALn(|#i;*aw0)OKIWGkBxWprLltsA1O<(>`D)fhQ>kc@8z z4sVBl^c3=<^a`Uu$@?3$)g&#$B{@KW@$^%_MMya-i5eIi3!Kp3JqyNx$ zl=U1$9y#)51`*1upg_{tz4di;jc|6Ke+NGJpLgTx)g0UXDg648=dtV2dx*|I8&4AM z<>#M^y~j?#7o%2Vppm2oS~PnGo_qcUD`Ux54m8h2%_Z-IuVE>grZiGJ)uFhWeJ5!5 z>`LOuo3CML%QG0-{v6UrcF`0A%jmKU({CLe7_`+4tuan%ZbVzp077+3(O0_^Q!cm? z^X4{T<@^|36rgj^_H59t(njZDDwYUJibKdR0V-*MXqoZn7kA>w6AxhYt>=-Uf~l>o z!jW(j^3S;z=Un&tgJcE`^&s!{!}{6`GBui}kf@1d zdZ|gZU$mcQWi(oase7No@yCBifTc0YhAW%rBbZ6x`KN!26<2-`bvJ(o+4||o{`eDQ zteq?bZH+BK!Zo$^cFOhsLTfPXt`PDCMd~bgL2eEm}8=Oc4HMRN}L9lYg zQVen6y1NH4rZq)^Uau4{Ub_bO-~SVf^pzC)71m5cvUxco1Zy45)uP2S(J;A)lY#@< z3GCc;0EZX>&m25JHzJE|)vK`b{7bNOc^)2k^aNh};pfrZ`5LB9u0j9cAda=sM0a=M zLm&NTyurXso0Q{P^Q22~(dC!ofqQ;n?v0lU3Ep*AUP(W#fRj6h`+jyW`3<7zoSQLN zJQ?#YT8GOoUWKY!;28ON@`=}wxBE}1=s$*&yIw;mIL<)~VeUm&V`SP|TygE?2$cJg z&w0Lc?pEmzY$#Y-57-Iws zrP1BG9k-u*4vx_;{PXwj1|Iqs8?-YifREgMJDz^(DSKt7H&a^syYi~basQ9*!8O<2 zh?DK7=;OB9Tdpw%4j0nwX~{|p;rsUNwapge1ozstYiV}Y;|NWkQb|b}0Zpw*vr=AM zPC&+JEJiUDrRplG#z@^lgqmhy#d+&+&cZtSv%ssPWl(nY)mP)`KRiy&e`X&*Wo0!kx$H_5m6qEY zruGUvK>#StZJvtVhmY7bJ!N3#g($k@{kZi*H{u=ih&Ix_d;GcW*uzOavv3eozxX4} zrFMGu#X~sp>hp+i`6H^*y;#~*j^F;_k0_%G9p%J~C$*neJELYWaEVX}FbL&<`#ENV znS7)RN-%!KKVjX?H=vo%=1lS9^LIas;NSiS%PZOUM}LRvIx3wxi*e3{=cBc!4~P0` zbvs*86Aj?aH@4VHgMyo7OPAToO?y`dnr1IR1N&56MT=234UxJTIDB|7I`_WDfRCfDJLsV@40^c$#(qx4%8iw^ar&~oY|_8p)DP#MOb|FRxM!7x&h z2u5NxSb5z?u(9DBeEyDAxH%7afV1^GAN?QTcOQ0RaXR^^4X(zEfBp*!3Jc8T(4NaV zbLP@--HW1v0((8U|G+_li$M+rtXGoS0i_*JJKx$#trWB1uC}(u{ImnCr=*?sS^(CI zi2B+(6jhcYZ0q3E`~>V69s3czk1m^s@REzL`j(q<)|?RHn!GIc=p$RP=d;)1qQ#Bq z>mI?@eLIYJ?~hYsVnn8@;9*r`2d~o`&|elW6Be^3s&1shBc#I-~U>_OF5pthboe+r3G!4}`w42WV&PP@#(lVZ z!v>UO%gJ8|msQu9+$qawO}K7NIiB9offs-C0D^n}g1pfVgku35p-s!smF9$GP!*@&+Gw9woH%g|%U3LC zFtP^`MyMMb%twR>s*fdlqBkL;UEuwdbQbai$i$U)PVU48pAq|Y-5q}c>upsXH! zCAApKZ$!3n4rb1tO<#}#=42nEb=kb_Fit%GB&uU0Xq$2l-g(XWsAqKkqlY)4se21j zFFc4BH*cocf>^wG2{prEd!Zm-TKa1{K{;Xd^62t7oFxX)~;SnKp(^_o44Y9 zANU}idFC0K?|cJbS!oI8OrMHJAAbV3(hDuSWb^&RnA)SaL#lWCy(iF_Q z`h9plIhm7fIp$5PLPZQk--984 z0SZ3$AU^T0*PxU$`=`&7>6aeB{)fJS54`u?c;cyNIKlD}&7+CXl;9*6P^86W`Z$ve zJo;r3?J$>b?hoc6QB=oBdpeRc&PL;+#W;7>3S7CQ6fX>Lf_4MXedb1t?|O-SD?~Co ziW}Z>HSYV#{kU@7#W>V*9D{=?_+y+DY5I1#r5UvyAZQ1#|99NDd@7!LZJ&LDoEgs` zF))J2%;~t~!fUW_W)y`~9znMAsSkb%1zYb$h?Xnt&ts6RZ=J|9u_6CC#EDUQ<0nx> zw=IB@&~%8tE^d7H&-Do;71mD-b_?4_GNfTM3Q01T4 z@)8g29@2vO@IXH!@!TaNw$jNlTk;s5eI=%>y%rxnr)E$eaR z#q&`%K1^Rq-*0OIq-jE?;QQbE2|z#;RaW6$H{VR(N~W9#O&H4PSFuYey_=UgowE?n z(G^@n3=eemW6#lJ$Z~*-`*)(adoQAlJoBgxeCas4=sz7gLNnCc%|Ug8?xm)4u0!zp zFXE<4IRJF>k8yBcdg@u6KeYmx0~@J*PuhaDTqeoFzP;gu$^_`|<`*GaQjKW!WE3?v zql8wbqA`qSYVA7qtAi8ejS~qx_+S5lBhNpLFWh<&j-BkH3C))hwl6gweDK$3Z8>7T z{red#7L`{J@cPvd7X+#;{es9iK~{bJt=N&7gjG`tw8Ktst+mg`tl9Q`hp=J$J|tg# z0_BIE!*y3&goJP)o>|{hRdV~%r0vhIK=eJI#%TE@Ts@8b9^<%D)}6z^h4sKIEwrkv zLYEXFRj2IrlL6ynS^G7<@jx1nZ*Il#-n|HQ>_A!DHWd4`$})=5Ddq4lT!HSXDfGP1 zhFcdl;^46aYD!Ar`|O>cq(agrW37F)o#MwSGyQTC}X~aw?NaWiXatv`F(b zHq0QSx8D}*2mAC@U!T2e)*eG2XP$j_LH{pCAZh!aMJejI;#PfPz{pSQj-v%-=&V?b zz^rpHW64s?rgp5QR+d82ih)+5^kRi9kT%UQU5x^|917|L$~d*Rc1Y>DmR7bO9ma4+ z2L=znNmafJL%aTpKxPapmM%eTsMi97Oo*eA7(>&X)kup78%pUbMDpZI4&(T-qi8vL zg#M*8e{KRZHP_UmeC5UHn0^_`XD`8$Mbl8oV1VFqkA#X*I~cxU*FV(f}&Cjas~(c&CgD;lUk^kyQ25* z6O-18<(^5rdW~AdNf}@u8m($XnC85Vpl)XXiF^vQzmu#a@X-(7%n2DmANxEuM1lJ0 zTxpvnV+-LxD?3tHMxWRDWtDWBI`Q!9hY_rrOa%md;`aCAZyVNQXM4b26RYhQee4hc zSuB)h$FO(_&HMgc$kI9{JG8Mngtn1El+-n#B(Dg06*cIcnTOXoX(}kM(OGmSUpj%2 z)G&N^eC(gI_M1G~1x=M^-=&bSG^o@&OVQwjb28`3AQ^PDMGru z3E}Fg7~v!UXKsG|6l(35nJ>K(3zB|_0bOda3nTh2d!!G(zE%WByOEdbMJ(i}b6Nva~`2^kUIZH7#GK!9lHVh5X$0m3S>F*X6L@1jS zhUm8>`FxDNahmNGg!Q^NfL&C5y#KtY-Mu0`vNwykv@1BPhR`r3f5 zqnvGLHl0XUNzTP|fGcZiP*_B5mCrUQM@{pI`nOpZ)Bo=_Bh6A(atj<(DQRC2g2? zNrAH{Yj4FE{rr9U7SBF9lfFvn%D3C$cNE;SKEzE1_>vEl)&Y+;$Y1!NklW2;z3fsFwx(IehN~Xd-*_* zt&IJ^0s$2yJ-3a|eb=HNDKPhe<|IMiNhT{6)mFMN!m|AoZic{?qrdOKUNkju#wJH? zqll6|xrh~3BbevDA0O`PCO!IlG^P4k8G%EB?dk5Y%_{Eabu{UyC8#a0yy*joRy3gF z)F}>78qwqkw(Z!6n)-UoUAzXFD79DLAo}TpCn!+82RGeKk!Y)*z@cTXc#0N8dp)UH zlB2!!cl`)wIB8jagsu<+WJ}V&Zuni&wM=(WAzdV%?He!lBS;NaMnF|n*3-JA(0bx9 z1_paMVfrydH|w-3HX&)_j(%t&pJ25A+XrW_zE`TKV6ZZE8o?Ar&#B$mvF$Z0f5Qzo zVEy{_oJ3OZ9CMDNUXnN&Nzu#q)XN*SMUHLU!lsx4M5sQkX`V3$2aX=a?zeWKqP7mT z(`KWvW)k{}3aN++5G*alibX3h!k~2LU!TD08Br87!r%GQ^El8x$hJa^3mV|dFF|D_ zjFW4tvE`n}QJ!u@BCiX{y zx09gNG0naN{WrbU5ID6NM4C53TFIQtpnZw?6kL={jkEp;ZS|;3X_~^JP*MbFkc9OX zLA&-tj2cTL1z0$55uW(dZ>hQZF?sG{3=NNw-Z-KJf$V4~kAv%{rlD^-uElx!Gd(@0 z=zMo+jyQ9jOQjS}0SB-{Kw^2N#>vfCyy`p#07dBK1S^cjFxuaZZChTkKxW2*WvHJt z6ZxF!?zfSWHld`&?9~PbHAG1y+4iYZC(zBo=<002@Q~YwT3TE}0G1*^&>>4r%KpnY z&8Jq6L})SMq8H~}axRu$wOaofDUVXy>RTyo(eq%fiJ`Agi%7S)sKmAwCX(ZQok4Ly9v$@zx=wXs-=5vv zdI13&{^Wrn-t~2Ztt>D#FxWJAgt9Y*!tvBnmrqM#1ZfF1VSFTk(cvDmsB+PgJZrLN z{Iph_+@(!ZP+B*M!D$I<=g&nRwb1UJZ{k$TVfc=3NB^G9xb&t=ux-O0^fQ1SOJtBo z8JCn+&|=k~qOJxfTTUU~d6E;l0K+433}-{Q@WRRP-SCbZ^@G8L1HqU~v-1RKihwot zW#$D;EpN*=krpMiq(v!E+vQFiYgcw&c_C&u&Zc_I;^4s}7^SD*KiWYxM$OD{PH)}E zDO{hSngm#Ph;7BvLA12AVCLe*XzLk5Sw)ErQXU7nyr=+w{p}BN)ffH){U;e9w02|B zY?`d1G+um}CQ5?ykq`c52^I}zg1%Ci@YcKhN!o4hPupk3os7(Td2~{{o`L2+NYwmg zUR0M9z<1SE*JL## zqSQ=d*+NdF1Sls0kOQ9Oz-0817DEZn+L5fx2u*f=2&?KRp>BkcI3vqsV+9V zWXAM0UmOMW(exu%5rLoe&CafeLv0UF%%a@al_eXBX8SY9H#bplm2HLwM2f3 zeiXHn{6diL3gPUVu*%gm=m@5 z9n8jO37(_dCxYNnVN zq&6h@nCwG6fs8JT)~-^#6lgQ_arFC0Q9i4PBvDQit*=!38N6thR$t%Sx90u-Ns}9< zV#W;mzYL;!hSMnE;Pwsl5JWz@B9-XvZl?y-H&URFT!bvO6;(2y224X$mY1S$BuE#e z2YIyMDWNd00DcCZi2?fS1l`!s0OFjeG0IabDZFH~oFqoygu>UoTXg%3Ch&Nx`jNber$~r|~n!fQ^2C>#%2quOpYwBbA zuZ0}%Of-uN-!UKamrTZq9aJuZevD9~@A&O{Tz>fyys>3Bipv`?M5_>(R9yVks;Cbg zeO=gc;1~*h71&2%U;Du;u>QGCs0&mwnjOF`AHM;={Q0lY(ba=Z&;Akb`OJIi$i9W) zmI2)N&Cg)o19W2@G=f=d;^1wy63G~f`gm4V@C5dbTNona?4rR`SccC zcizPmU@snd@)tPVdK?Wi7GoyOX@(K)pI&_lyI$Xkvt~`h+3POF&-Wk1e|`0b)EFl) zMv#T@u5+S5yZ)n6nck;&`EQYiI1VJ^%&ZY9YkMGxBX~?UQ=qxXZpg)7^dIc zb9_I#PPCzaXvnnC6#8L{7q7(ZX>-un)QG0WCYq~iPJm+Kq5v@tOhK%`CUUGGYO4_W z1^KiFB`B||LOHeOytxZ7kAdNWCCjPRGIS|8ap*>zJkpA*E?kCVEp0ZzMg~S{a#)S(t+`WQ@y$3oclQU|uK-;BDVD(ruGD=kYK z>x`qby#>K^0)t(B@HNd`p1tcwUq$}-Ab!_2U<^hOe<%^5)jx|m6o&9+5$!%D@ zY&PaLMe(Pn-$cWY9>UWPY{Q|)?!{<4W1qpKX&%aBepENrl8-2QTaF^Yi9`#FsdLM4 z;=l=-Y9GS-D4uCL6;U!$kH#g}VRWDq$6opq`VViVMeF25B@h*8v7C&TlDQ51M=OWU ziO|lfd|HMm-M=K;8Im`FPrPp(b|2k_r(f(qRcVn;nzc8)gAcxOclL!{$FiS!X=C=i z|9xL}(bczR?|9^~EGlZV!IH_@V8t}5tSQ;0E9a3+N!C{~mAbl+zH}rT2oz)^`Ni4% zyuxfnq%!-3t1rsx<&GSQpf8m52P0W}Z~B@(n_p0wEpMDmKe;+vx9s|CsD5^~Xz?Z4 zPkiyevny}^LH6Q*{W3kMV3ziZXsDv2o0p9g)@K7{&Dl_1O}03y|Jeg=147x0ZvS>R zIOBqB-KFogvgh7(OZM50fowNJRuyalrU zNIrS-XN!wN*;_6v$kwusNiTQMJC`+1V+jW!ZU+RoM#`EX*!xuFBqi#W~rv3#+m*zdu_ZkxVFG&LYm|Y+*E%y>wM& zc2apkcJAbg>=$ldoxSt+wb@BU!R)2C{gZ2BLc6nOHfM_|kEYtD?4sFov!$_UHWpUD zY+=dd<)h5K@>NZfv(2m5X3xFzuI%!6-kB|*G%Fj7#K@~H^Bd1zSx;UJ4(+*@PdDZC z^(AZPW?OeQapbPZwzqvQJ7v-QY}taQY}u?S+1btWvc95FAUilNr#QC|Juxworf1I! z9ZU)us44WTxJKSh2&N1^{?*Un;orZ2pLSwf$x_+8Pt+iE`(wvpjxn`8xdgLJV zs~`SYDFdnz+<4{rc=XBV@ZpbKi#>0?iv4X>@P!gIHyx~>Pc4^1Mn`T+yIrnSeM!PExq*Rn-R zP?Xn$f4TiUth<6HXCpPpXbCmdAw2Qeddz5QM$^>EbSDO}d;dvn*xiMV+fU%m>(0Sn zw`|4H&JgCzZ^Y&|+)`ACQR;%`G`1d2;)0uQV*s%Yr(W5P_g-9s-~6o;=gq3d%deh5 zab*}MyOQ`{Hy2^}WR$_mC|#Q<4z`aY!eF7bGmDdSf6M*!4eM!MPxfO$eZKAEEX(tu zJTHrdi)(O*CUF0eI0KIi16#Tv{RMP`I>7i7MeJhlgyAd>0Zj#d9HM(P+?Oy>t+`|+ z+V}V3aBjb>mm;)u2@7l}D<0!My=|f!K>sz)=qJCd9v8glHXJyx6Rq1eAWqY-5A@{o zXZSh*f(RR1?a{9_Yx&YXt;u9Dt$7L#9zH^s4Y=j%AYR)yj!iom3;1X` zb1NObSh$errBY;vbk;P`a)_3bv@WV;5vgb`%G;mH3YhAl6_yzsN8_{^7+@gM*V^h{ z;@GmUqvgGkvek=70I4+Tv;9yW9qQo@I`{M&r%$KJVRYZQpAo87L0Nzkq-k z`+*xVqqYhkx?m3Oy!SWQ{*zx}@OUd(pz5R0_0~o9SZ&&zIh|aN_z>@w*a5v@&^K6Y z94i)-G0JYh#h1PZn_qYwv62dG*}4f8g{8QjE3ivoD;*}eGF?>q3lZ@m}Yj5F@K z<%c-?%m0L>i&kUPOZ#xqie`NGb9dr=x);^uhp}%*5AOZ-KIEr{@x8DA6TbP=*H94~ z#!nu80duA{p|f`oYtC7S0s5Y)f@$_EF+Il#?vW7!E@^u&`smC1Gbw!hBR657rwyBT zcjDy8I4TqLn}gl>!k0dSJO1r^=<6NB^%u{l+Y`Y4);O={Vf~&C2B<;2{OpUk>YD3t z>Bny~a627npySx_Pe8PRwUgpT_mGzcRP#pkn9uEdcqaX(q~CUvXGlv6y3Dfz5?_Gz zGMquAq_56$ttMe$Hq$uH_?pSu21Fk4l^=;!kUfVkMo_3kfZ# zdn$+1G7x25(#U#CLE6HRv5mozyh02P4{#!?ldP52>~`8BLjNtHkAMh#y^~R@t8GLF z9siYcn(^A6!$u>(wm<#;1^C@FZ(%4IL-XWHtlxD47cZ*8U$&pJdNUd);{YRMr4=&@ zD8&>`^^K#1ZC-KHRBV2$8~YE8VcFCojHO4hZ~quh_BkI=zmXISkeAFbgGpe3tT=A8 zSHA#p`-ukf%R|ff721@;z_D-0_2Ufp8e_fY_JpStVxSbEq1M-AS?FiVvy`(XnNG?n zB4e( z?W~7@s5q1X0|6dq-?S)iYn%4e(bEF7t)J%pEZ|}pz2#B^_RgDUjwzZa6{6)NBk{1G z+Qo-%Vy3n{jZ-~-fF#6n%)I`Tnb<&4J+{2L71_485TTY& zGK%eF1T7b5{>+7lxA}0YYd^{wA~@CAg+96x`cXK0*}^`RGZ;yXrBG2>i1zk=)KpiX zy{*$$5X7g}RF%{(sTtXDx9g4aVE=7bhGsaEZ4QzW%E`|CmnbGF}YR z*uN$Oqw6Myu5G4UQxcz&cxQPDO(4nT>9EZ!Dz7{1U#`C0b4cj-=#{1>fXdo043n1r zZ^?2dv~yknH97E4Um@D7Le^DzM^O`igPOax4)gHaN9jof(h+BI6aoA5ST{k9l17jw zO+4s@fsdhQmfBps6~CEa45^}ODl+Z3?u3817m;!4D!tv~B&Ma2j6xxOo0VW6Mo5<` zQeV09&xV8l_+=gJ_gmx4B|mIezm{$Mh*u^z#*$nRLAp{bU=vlFhcfJ!Qh@H2_?Hyy z|C1zHa|{JcDt=U(8#RCuX zoldvN_*7W}OyE{iZp)i%#Y?Uh`3n(jVICZ0jE>M257M}3pTn7C|AScKPtX!&mnQc2 zOmdv+sn-v8rxuk?Ye|8QT2HT(?J-R?8RdmF%G2@{nh`CB%EK4 zSR~K(B#ey`obf^1SDa2T*d>OHwvs?!R#-&2Izfw&*tKUSY{#(6k>K?!a}JbZ)}C=d zbuWFTEojU#T6*p}DrQB`)o~`k<%_UwuHZw{8oX9uq$CY8#Mu<1FBqV(^^-TJwN(y; zO5)S;;(@@KC#8vJ%h&n}+g5+n7o(*rh!xm@2SzvC0(lX0;N3_ zNO%_G?x%N{Cx+EIE2mltf+SogFpr)mTmy~et2gXxPROcj?enmWz5MfpC_#I`umNG7 zex<|8tN-?d|4IX}j{V9s%PU`kx4{!nx%PEdITp9GSaE<5Jx5>fwfTr;939C@E`!x$ zS>wstbal0J%*jQiT{7A{Orz%jW7dX$DsSzv$UkcL_&#u5JC9oJ$B$ z0YWp{6M!+NZkiz25Y4we%lVt8x^ps60PZZpIz-2k>bfgSUb%_M=-VNnIr?YH ziT&Ui4U$WzpR4l}nC>M=>zF(j(c@#?E9u@7ykpG)!>-KdvqqWAKb12Y%2EKw3ym*Z z@aS4S5#qhmu#%H?*ifHQ~8CjGQIiyA0B{v+C+P2PmWA>RDSdH7ch({>dtcw(2Th*Qa^-yR(v3BP3Mu z=lorxlB=iZq``b?3X4jWsd|)?Cs5DraQ$|2R590%la-R%)S+@7A70X>>XCxwPvl$X zRQF1{_hf7|FR4(2=I8z=3Z9TvKtgeY^Y>|@P?TJG z$C#d(dyuQ=F=P2Wd-wK?hx{$iR2pC{Ha1C-uB+qfvaptz)TU`V2RwZtYP3X$k5osz zd3;;>T=Me7rv}b@=J92qIBg2uAm}*Fua!BY$;`Ccb9-ue9xWy1yXQ_;I=s3n=aqG3 zyn4FNwLu=mt5@Djy7uyPw)!lu_q%Q)yQF-tzGTJ>o6z=L4~* z)m6uoa%6Jl|E@1g9xa{q+~Y^rN?tjY@g|i=$Gi5D0IFpC>yu$;()sH9u3m9(;2>$Cek!HQ|`G8 z9=ZIG1G>kPSI4C@0QJr`mKtSKD5BxCy@4}V-+Wvj@V^0@y&`rYBNs9N0000 ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + + var pairs = new Dictionary + { + { "username", configData.Username.Value }, + { "password", configData.Password.Value } + }; + + var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, null, true, null, LoginUrl); + await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () => + { + CQ dom = result.Content; + var errorMessage = dom["#login_error"].Text().Trim(); + throw new ExceptionWithConfigData(errorMessage, configData); + }); + return IndexerConfigurationStatus.RequiresTesting; + } + + public async Task> PerformQuery(TorznabQuery query) + { + var releases = new List(); + + var searchString = query.GetQueryString(); + var searchUrl = BrowseUrl; + var queryCollection = new NameValueCollection(); + queryCollection.Add("showsearch", "0"); + queryCollection.Add("incldead", "1"); + queryCollection.Add("blah", "0"); + queryCollection.Add("team", "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[cellpadding=0] > tbody > tr"]; + + foreach (var row in rows) + { + var release = new ReleaseInfo(); + release.MinimumRatio = 0.7; + release.MinimumSeedTime = 48 * 60 * 60; + var qRow = row.Cq(); + var flagImgs = qRow.Find("table tbody tr: eq(0) td > img"); + List flags = new List(); + flagImgs.Each(flagImg => { + flags.Add(flagImg.GetAttribute("src").Replace("pic/torrent_", "").Replace(".gif", "").ToUpper()); + }); + + var titleLink = qRow.Find("table tbody tr:eq(0) td a:has(b)").First(); + var DLLink = qRow.Find("td.tableb > a:has(img[title=\"Torrent herunterladen\"])").First(); + release.Comments = new Uri(SiteLink + titleLink.Attr("href").Replace("&hit=1", "")); + release.Link = new Uri(SiteLink + DLLink.Attr("href")); + release.Title = titleLink.Text().Trim(); + release.Description = String.Join(", ", flags); + release.Guid = release.Link; + + var dateStr = qRow.Find("table tbody tr:eq(1) td:eq(4)").Html().Replace(" ", " ").Trim(); + 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.ToLocalTime(); + + var sizeStr = qRow.Find("table tbody tr:eq(1) td b").First().Text().Trim(); + release.Size = ReleaseInfo.GetBytes(sizeStr.Replace(",", ".")); + + release.Seeders = ParseUtil.CoerceInt(qRow.Find("table tbody tr:eq(1) td:eq(1) b:eq(0) font").Text().Trim()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("table tbody tr:eq(1) td:eq(1) b:eq(1) font").Text().Trim()) + release.Seeders; + + var catId = qRow.Find("td:eq(0) a").First().Attr("href").Split('=')[1]; + release.Category = MapTrackerCatToNewznab(catId); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results, ex); + } + + return releases; + } + } +} + diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 34f7d76f2..0bb407a9d 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -156,6 +156,7 @@ + @@ -600,6 +601,9 @@ PreserveNewest + + PreserveNewest + TextTemplatingFileGenerator TorznabCatType.generated.cs From c12736716dd12515f20b23d9090ccec82169613b Mon Sep 17 00:00:00 2001 From: kaso17 Date: Wed, 7 Sep 2016 19:46:03 +0200 Subject: [PATCH 3/4] fix AvistaZ tracker --- .../Indexers/Abstract/AvistazTracker.cs | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/Jackett/Indexers/Abstract/AvistazTracker.cs b/src/Jackett/Indexers/Abstract/AvistazTracker.cs index 72ef2a29e..2237bb7e0 100644 --- a/src/Jackett/Indexers/Abstract/AvistazTracker.cs +++ b/src/Jackett/Indexers/Abstract/AvistazTracker.cs @@ -52,13 +52,13 @@ namespace Jackett.Indexers { configData.LoadValuesFromJson(configJson); var loginPage = await RequestStringWithCookies(LoginUrl, string.Empty); - var token = new Regex("Avz.CSRF_TOKEN = '(.*?)';").Match(loginPage.Content).Groups[1].ToString(); + var token = new Regex("").Match(loginPage.Content).Groups[1].ToString(); var pairs = new Dictionary { { "_token", token }, - { "username_email", configData.Username.Value }, + { "email_username", configData.Username.Value }, { "password", configData.Password.Value }, - { "remember", "on" } - }; + { "remember", "1" } + }; var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null, LoginUrl); await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("auth/logout"), () => @@ -100,27 +100,29 @@ namespace Jackett.Indexers release.MinimumRatio = 1; release.MinimumSeedTime = 172800; - var qLink = row.ChildElements.ElementAt(1).FirstElementChild.Cq(); + var qLink = qRow.Find("a.torrent-filename"); ; release.Title = qLink.Text().Trim(); release.Comments = new Uri(qLink.Attr("href")); release.Guid = release.Comments; - var qDownload = row.ChildElements.ElementAt(3).FirstElementChild.Cq(); + var qDownload = qRow.Find("a.torrent-download-icon"); ; release.Link = new Uri(qDownload.Attr("href")); - var dateStr = row.ChildElements.ElementAt(5).Cq().Text().Trim(); + var dateStr = qRow.Find("td:eq(3) > span").Text().Trim(); release.PublishDate = DateTimeUtil.FromTimeAgo(dateStr); - var sizeStr = row.ChildElements.ElementAt(6).Cq().Text(); + var sizeStr = qRow.Find("td:eq(5) > span").Text().Trim(); release.Size = ReleaseInfo.GetBytes(sizeStr); - release.Seeders = ParseUtil.CoerceInt(row.ChildElements.ElementAt(8).Cq().Text()); - release.Peers = ParseUtil.CoerceInt(row.ChildElements.ElementAt(9).Cq().Text()) + release.Seeders; + release.Seeders = ParseUtil.CoerceInt(qRow.Find("td:eq(6)").Text().Trim()); + release.Peers = ParseUtil.CoerceInt(qRow.Find("td:eq(7)").Text().Trim()) + release.Seeders; var cat = row.Cq().Find("td:eq(0) i").First().Attr("class") - .Replace("gi gi-film", "1") - .Replace("gi gi-tv", "2") - .Replace("gi gi-music", "3") + .Replace("torrent-icon", string.Empty) + .Replace("fa fa-", string.Empty) + .Replace("film", "1") + .Replace("tv", "2") + .Replace("music", "3") .Replace("text-pink", string.Empty); release.Category = MapTrackerCatToNewznab(cat.Trim()); releases.Add(release); From ecd2b33dfc618a4e0938023ad2e749b220ffd6af Mon Sep 17 00:00:00 2001 From: kaso17 Date: Thu, 8 Sep 2016 16:52:08 +0200 Subject: [PATCH 4/4] Add PirateTheNet tracker --- README.md | 1 + src/Jackett/Content/logos/piratethenet.png | Bin 0 -> 24168 bytes src/Jackett/Indexers/PirateTheNet.cs | 211 +++++++++++++++++++++ src/Jackett/Jackett.csproj | 4 + 4 files changed, 216 insertions(+) create mode 100644 src/Jackett/Content/logos/piratethenet.png create mode 100644 src/Jackett/Indexers/PirateTheNet.cs diff --git a/README.md b/README.md index d65980cdc..01de7cdb1 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * Immortalseed * IPTorrents * PassThePopcorn + * PirateTheNet * MoreThanTV * MyAnonamouse * NCore diff --git a/src/Jackett/Content/logos/piratethenet.png b/src/Jackett/Content/logos/piratethenet.png new file mode 100644 index 0000000000000000000000000000000000000000..c622a89ebf9c5fe25a8355b5fe6f9accda6efb08 GIT binary patch literal 24168 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

IJkbKqX{_b<1i^tzyA5Rmr)`DVBm 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 DxOse= literal 0 HcmV?d00001 diff --git a/src/Jackett/Indexers/PirateTheNet.cs b/src/Jackett/Indexers/PirateTheNet.cs new file mode 100644 index 000000000..188ec12ad --- /dev/null +++ b/src/Jackett/Indexers/PirateTheNet.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.Linq; +using System.Threading.Tasks; +using Jackett.Models.IndexerConfig; +using System.Collections.Specialized; +using System.Globalization; + +namespace Jackett.Indexers +{ + public class PirateTheNet : BaseIndexer, IIndexer + { + private string SearchUrl { get { return SiteLink + "torrentsutils.php"; } } + private string LoginUrl { get { return SiteLink + "takelogin.php"; } } + private string CaptchaUrl { get { return SiteLink + "simpleCaptcha.php?numImages=1"; } } + TimeZoneInfo germanyTz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time"); + private readonly List categories = new List() { "1080P", "720P", "BDRip", "BluRay", "BRRip", "DVDR", "DVDRip", "FLAC", "MP3", "MP4", "Packs", "R5", "Remux", "TVRip", "WebRip" }; + + new ConfigurationDataBasicLoginWithRSSAndDisplay configData + { + get { return (ConfigurationDataBasicLoginWithRSSAndDisplay)base.configData; } + set { base.configData = value; } + } + + public PirateTheNet(IIndexerManagerService i, Logger l, IWebClient w, IProtectionService ps) + : base(name: "PirateTheNet", + description: "A movie tracker", + link: "http://piratethe.net/", + caps: new TorznabCapabilities(), + manager: i, + client: w, + logger: l, + p: ps, + configData: new ConfigurationDataBasicLoginWithRSSAndDisplay()) + { + this.configData.DisplayText.Value = "Only the results from the first search result page are shown, adjust your profile settings to show the maximum."; + this.configData.DisplayText.Name = "Notice"; + + AddCategoryMapping("1080P", TorznabCatType.MoviesHD); + AddCategoryMapping("720P", TorznabCatType.MoviesHD); + AddCategoryMapping("BDRip", TorznabCatType.MoviesSD); + AddCategoryMapping("BluRay", TorznabCatType.MoviesBluRay); + AddCategoryMapping("BRRip", TorznabCatType.MoviesSD); + AddCategoryMapping("DVDR", TorznabCatType.MoviesDVD); + AddCategoryMapping("DVDRip", TorznabCatType.MoviesSD); + AddCategoryMapping("FLAC", TorznabCatType.AudioLossless); + AddCategoryMapping("MP3", TorznabCatType.AudioMP3); + AddCategoryMapping("MP4", TorznabCatType.AudioOther); + AddCategoryMapping("Packs", TorznabCatType.Movies); + AddCategoryMapping("R5", TorznabCatType.MoviesDVD); + AddCategoryMapping("Remux", TorznabCatType.Movies); + AddCategoryMapping("TVRip", TorznabCatType.MoviesOther); + AddCategoryMapping("WebRip", TorznabCatType.MoviesWEBDL); + } + + 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 } + }; + + var result2 = await RequestLoginAndFollowRedirect(LoginUrl, pairs, result1.Cookies, true, null, null, true); + + await ConfigureIfOK(result2.Cookies, result2.Content.Contains("logout.php"), () => + { + var errorMessage = "Login Failed"; + 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("action", "torrentstable"); + queryCollection.Add("viewtype", "0"); + queryCollection.Add("visiblecategories", "Action,Adventure,Animation,Biography,Comedy,Crime,Documentary,Drama,Eastern,Family,Fantasy,History,Holiday,Horror,Kids,Musical,Mystery,Romance,Sci-Fi,Short,Sports,Thriller,War,Western"); + queryCollection.Add("page", "1"); + queryCollection.Add("visibility", "showall"); + queryCollection.Add("compression", "showall"); + queryCollection.Add("sort", "added"); + queryCollection.Add("order", "DESC"); + queryCollection.Add("titleonly", "true"); + queryCollection.Add("packs", "showall"); + queryCollection.Add("bookmarks", "showall"); + queryCollection.Add("subscriptions", "showall"); + queryCollection.Add("skw", "showall"); + queryCollection.Add("advancedsearchparameters", ""); + + if (!string.IsNullOrWhiteSpace(searchString)) + { + // search keywords use OR by default and it seems like there's no way to change it, expect unwanted results + queryCollection.Add("searchstring", searchString); + } + + var cats = MapTorznabCapsToTrackers(query); + var hiddenqualities = ""; + if (cats.Count > 0) + { + hiddenqualities = String.Join(",", categories.Where(cat => !cats.Contains(cat))); + } + queryCollection.Add("hiddenqualities", hiddenqualities); + + searchUrl += "?" + queryCollection.GetQueryString(); + + var results = await RequestStringWithCookiesAndRetry(searchUrl); + try + { + CQ dom = results.Content; + /* + // parse logic for viewtype=1, unfortunately it's missing the release time so we can't use it + var movieBlocks = dom["table.main"]; + foreach (var movieBlock in movieBlocks) + { + var qMovieBlock = movieBlock.Cq(); + + var movieLink = qMovieBlock.Find("tr > td[class=colhead] > a").First(); + var movieName = movieLink.Text(); + + var qDetailsBlock = qMovieBlock.Find("tr > td.torrentstd > table > tbody > tr"); + var qDetailsHeader = qDetailsBlock.ElementAt(0); + var qDetailsTags = qDetailsBlock.ElementAt(1); + var qTorrents = qDetailsBlock.Find("td.moviestorrentstd > table > tbody > tr:eq(0)"); + + foreach (var torrent in qTorrents) + { + var qTorrent = torrent.Cq(); + var qCatIcon = qTorrent.Find("td:eq(0) > img"); + var qDetailsLink = qTorrent.Find("td:eq(1) > a:eq(0)"); + var qSeeders = qTorrent.Find("td:eq(1) > b > a[alt=\"Number of Seeders\"]"); + var qLeechers = qTorrent.Find("td:eq(1) > span[alt=\"Number of Leechers\"]"); + var qDownloadLink = qTorrent.Find("td:eq(1) > a:has(img[alt=\"Download Torrent\"])"); + } + } + */ + + var rows = dom["table.main > 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 qCatIcon = qRow.Find("td:eq(0) > img"); + var qDetailsLink = qRow.Find("td:eq(1) > a:eq(0)"); // link to the movie, not the actual torrent + var qSeeders = qRow.Find("td:eq(8)"); + var qLeechers = qRow.Find("td:eq(9)"); + var qDownloadLink = qRow.Find("td > a:has(img[alt=\"Download Torrent\"])"); + var qPudDate = qRow.Find("td:eq(5) > nobr"); + var qSize = qRow.Find("td:eq(6)"); + + var catStr = qCatIcon.Attr("alt"); + release.Category = MapTrackerCatToNewznab(catStr); + + release.Link = new Uri(SiteLink + qDownloadLink.Attr("href").Substring(1)); + release.Title = qDetailsLink.Text(); + release.Comments = new Uri(SiteLink + qDetailsLink.Attr("href")); + release.Guid = release.Link; + + var dateStr = qPudDate.Text().Trim(); + 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(); + + var sizeStr = qSize.Text(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + release.Seeders = ParseUtil.CoerceInt(qSeeders.Text()); + release.Peers = ParseUtil.CoerceInt(qLeechers.Text()) + release.Seeders; + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results.Content, ex); + } + + return releases; + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 0bb407a9d..dedd70ba4 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -161,6 +161,7 @@ + @@ -430,6 +431,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest