From 3dbe5774d70d905301b412849ee70e16cb9bed91 Mon Sep 17 00:00:00 2001 From: Jason Light Date: Mon, 31 Oct 2016 04:24:49 +1300 Subject: [PATCH] Re-added AnimeTorrents (#600) * Fixed cookies not ending in ";" being ignored. * Re-add AnimeTorrents tracker * Forgot Project File ~_~ * Updated README.md --- README.md | 5 +- src/Jackett/Content/logos/animetorrents.png | Bin 0 -> 8409 bytes src/Jackett/Indexers/AnimeTorrents.cs | 176 ++++++++++++++++++++ src/Jackett/Jackett.csproj | 1 + src/Jackett/Utils/Clients/HttpWebClient.cs | 2 +- 5 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 src/Jackett/Content/logos/animetorrents.png create mode 100644 src/Jackett/Indexers/AnimeTorrents.cs diff --git a/README.md b/README.md index f955e9e44..83ba1a42a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This project is a new fork and is recruiting development help. If you are able to help out please contact us. -Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps. +Jackett works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps. Developer note: The software implements the [Torznab](https://github.com/Sonarr/Sonarr/wiki/Implementing-a-Torznab-indexer) (with [nZEDb](https://github.com/nZEDb/nZEDb/blob/dev/docs/newznab_api_specification.txt) category numbering) and [TorrentPotato](https://github.com/RuudBurger/CouchPotatoServer/wiki/Couchpotato-torrent-provider) APIs. @@ -18,6 +18,7 @@ Developer note: The software implements the [Torznab](https://github.com/Sonarr/ * AlphaRatio * Andraste * AnimeBytes + * AnimeTorrents * Avistaz * BakaBT * bB @@ -90,7 +91,7 @@ Jackett can also be run from the command line using JackettConsole.exe if you wo * Redhat/Fedora: yum install libcurl-devel * For other distros see the [Curl docs](http://curl.haxx.se/dlwiz/?type=devel). 3. Download and extract the latest `Jackett.Binaries.Mono.tar.gz` release from the [releases page](https://github.com/Jackett/Jackett/releases) and run Jackett using mono with the command `mono JackettConsole.exe`. - + Detailed instructions for [Ubuntu 14.x](http://www.htpcguides.com/install-jackett-on-ubuntu-14-x-for-custom-torrents-in-sonarr/) and [Ubuntu 15.x](http://www.htpcguides.com/install-jackett-ubuntu-15-x-for-custom-torrents-in-sonarr/) #### Installation on Synology diff --git a/src/Jackett/Content/logos/animetorrents.png b/src/Jackett/Content/logos/animetorrents.png new file mode 100644 index 0000000000000000000000000000000000000000..24c836e4b073bd8d0af47a33b90dc5d8a822e2ab GIT binary patch literal 8409 zcmbVSRZ|>HuwC3W=;CgRLvYss!6mqR2#W;>u(-RsemDdVfhEB`u(-Ph2<|L)xexab z+^Op6s;-&pdFY-#r)Q!y)s=8CftUaQ0Oy0Uy!M-}d=qhW#J4$M-LCab(ON5Oe*^%& zF#!NUp#Z?c>zh6V0K9krfFlb4Kr{;gAazYKA5eT-ivd`2>w?P0&UEb-;89Q z3ZFc6T`4IacFQe;Yc4CC4tNS5Sv0+3+ zH6t&lw#Yhfj@N!xOKFI*n^IAMmxH|sv81R{IfW6CK1CmtmTG%73$SxEF`|GwKv_s$aUVA*4B-uvyCXF7LE19!}Na!ctW?c zlT&p~O|$t+nqngL_p-79h$X>%ld%b0^7?ns!sO)S{JdS)6AI!v@@EbX4z8m>q-Unh z^z`(y($cUO8G3s9>FH^9cJ|{fsid5ooU$^e$Gv)j47J?%#~HkZ!~7{gLVSEpZEY*=do%>uum8C5X$yHQd!HVz zKB}oLnwr30u3a|w_Vy6i3&Uy`_3ayTZA*kyIOVEAp*5g0y-%p=#;B57w_JpsDID9Q z_^oSVR*dnPnVCpkjg5^73Am20A_$jNIu&*1UDTaaiwx7vXl>Weht8W@-AW0RAKnoN zc}1r|P1TD}$BAy(i_!GKnm@0()31k#+w+)?bJ&jaihVf^R$v(CSXfx0eIY1V=rvMw z(g_@$)#_|Jh8-BfP*;84ceoPpb?VjViwFyYY0=^-gidQ} z3sg69UogaFOnrZL==prtThytU1lA<6ySZX|X-&xTP9VNN@>U%Shz&O->xCWml1|UA z@drcO4O$;=K>QjJ{bAwY$Il6`DsVV_<)>?x&&9R@7ghc3?d>rs*RyFqDm68A=Q)rbEv}i}Jhk@uQ0)}xNoA?&9D^mXVZ$SPA}-zJ9&dwk6S!1R<(ail&Y)>0r!)_UDQWz2>g*Dkv!2f5pOzb%pfGRn*jQ02?rz zo&V85?q%fULb2&6y8k6gy+m1^O*{v;w?Dx0#q7tjdLXYMo?c#-;P>y}Z#;+88&fP{o0OlxavVMsRJ|BmKrMr*(F&(=`akHkjRetPkVN@QAmkY6Zv0US4DX_{Qe&QJT5M7 zGPSJaTc$T7?7Y3J>$Ka|aJ1U7x1`FS;lf5)`S!;TPP1QRhkuuv?K`r@NLe%<9v^qS zE_X*h<#Ms#j@_NMx~yoXk7e^$)YqTMsjJ852V}$;L9>wW-**3wkCk%U?(YnE1blV2 z&^)YNA{$T2_&}PeMw%H^NmDpaKh)CF0%B!7aQO@ZzRE!>g$ZcA7^V81H9m53at`c8 zj5TyU-ksqEz^|W%r#^e(oR8@0R{=W=gZ1t`(q9n-QC{ywianS_?+(y<+yy!#{7>~Np-mD$H)k{Yw1& z1pP>~)0SxWwQ|;N%Io))R#lDZc)_Oeq7+XDPj@fqfbrx^x1HIYOt8C)M~2=w;n82{?Ir5Rz`2nHeR{7 zaQQtlK+*B>=@}V=u1k3$Hoojquhx(kGyx-?c#?}54IaT&7~;Ekd@9WHGxrP*E%-pr z*WD50pI^2@I&m?As~-N0>PLkCSeVyGLzB|i>D%>0=*e(ia2s$-+TGo)OG)|6RAvKt z!G{F15~ur+$VIdX&&E$8;awbW_IO$*e>&!3^D@`u3D2R`6!qqUEiNo$GU1aGg2BK* zR`u$V5IH)A2sfgoMGM*3Oanzl)CW{d@0-J!3T(FvCF}2Qq2$xkHX>U={IUiJ0!H3C zGsjEK9PI4NsVRJWd#U#iXIsZW;D`XEWs8`Ih)6ila%*dk6yFlXOS^f*cb{U-&i-t8 zM-6|9yVS{#hqkexGdM3Vuc&Bp-$g8+P=$$-p)66VbhSfO9P4IrilrotvNuvP5VkNA zz{;3K$2be5@Y@|GU}9nt_61v@V`wF29aNMv+uPd z8Hpr)r)##Y##oRO(Pj|N9jn=SLqaU)=MABviA+p9VY%0rd#bdU!Yl9I@iXEz_-cRrNawLfFj_NrvK;+2 zsFh^-Es@UFfB*Bp1u4jf(Se?PEjD#L_}juA9QS?OtPvwOC&0*`GnqIQTv*trvvVnc zz?djhgD_57;|t!Q;zXLAaAbzC@DdWvey+xua!VIKKR;`01}iIleSIYrOaV$pwyBFJ zkuenAFZQHAY%mhI>FIkPnqdFk_F+?PXp7X#x+RLI{Elt2!|brB^xMyBk{qF{R5e!~ z98B{latN!2&gaMR-B?=&t@ewoPqOJBX$rrd(!S&)v|_$cTsL=>q=r;1P8FUX)!<4f%?IZ6xE@uV2pdwTE1` zDSP91^k2``amFwY70C&$J|&Da#Ep%O(euv?l@Q5>p>{ywE6b9C?{R;f6`7%-6{8>P zN!shDl!z}|Sy@>m#NPNiu$t>I7->^_B(YlPNJ>h|$jI2>H6TR@|KPTM5$73Mn3jLk z)7J-s8^XenGy43e3YoYvEF3QyOXyW)#btDnYbFzwF>B(ZqaA+-VAU-DQ9%#~O1Q3T zUOvBw$)c*!5X!1gr!sKIV)!(b^-uZkkC8KW9YjtaovtAbqTec0O@>lo-JK}RM&{xB zOqD1+yRNts?NUc!?g)eIUQ65Bgg;5K#O`XDpWT=F33cg|{!3@^$PSL>I!*&^r+o&e z^PVcgDl`HZ?tKhd&&kNhad2@J_zPbCC&_iEUz87_;OIVExTL&%adGW10P)vGUA0eGH`DB2a?Q(9RWZJ*irWbz0yLwAS? zvU2iZRsz~)sJVQBW)WY#b#_WWqy|Cb;>I#Kjlt^$E%+|iBIC$OH=8a zl?$c@kKq;rMP)SV;^e1Z0@l~p5fKsbk+PLe%5jK<$VU)y^u!guEf16rmc9GTZa3l3 zzPxjaRiPCIOD<;bBqH@0HUA+4Vv9k3nikJugKJ{jj5fH{6$oaSkA3cNX>p z)R=`u(rYm0gC^PFCqFktJ(_rdWsFMqMQeHnXdZ9CKm!7i{Kjsl9-Evlua1-m_m4D% z<`HG>3^J6^{RKMs>6DgH^FE+C?YFSW%Zf+4rwEnxBSP|?cI&ufc@@HsRFe4!&yj_x z_ATfRxyhIw6AVL^iOn#bWHge?okn_|0R>OK*tb&|_%s|W*&vqm0i(yc)DdmcCMLCg zE#ttr+0TrXsVezb4{Nijjm&u>Zre7951C;qci&`-ryB9$*$$~QTFe#n3^D)Mbkl6N zG~Q4o1!>`=&#`iHb+5ENOG`ATYKv}&p`Uj;FIJjuY}%faLH$8hm0~Uc&sgzr)l}Q0 zRJMwYmSdP4zjZ5iM*_wmo&#(kuFHCvI0l+Q}0YqT6f zFc_@U^KcsK^^cbGlgwvf`>-qcZ!z*^C(6w&bs*jew|2&N@j%?VbpNlrNwKkiB4>%> zB7jHp3k#u~%QTnnQwO7ed>cKC*-V9$&8q8b{=M;*h zQH&PWK7GvG++6y{rk+b^6nJcilJS96^X_yFOWtxr88`}xn_-C?n5;11?mjoZo3F}TuI40w?|FoEdDr=RqEav-@IYex(<(}d)g}UWH~$t6Kyx~HdMPs6 zsB>Kjaja9CHcqVb-#=;B77rsp=Bo96&*>e|9G}SaL=4CKB{tpMcqLK_j*hWOidL&} z?(s?7r05LcUqSi!dAhDXkVgP-&qj4B%IRu?Dg}TzW(5A4hdm=mUfppH3;x%dJq}Ez zsZl)#2rc#X<|wJt(bmN|+^^0U(>_G2KU%M11c;=(Jc~fc9!}-ugb=!vt{f{5edb;B zE{H_y)#c^46Swf3qO!ORWa9SWhi0hx&y38>z65(%p2+={1l-U3XNh}gxC~&|bANxo zwY8O%D45bSOTY-jkP|Z=Hl1SSg)&zEb4C8UQ$V;6UcGt{H~*|!;gyb$k1zr?q=o^G zz$jxBL(LQUJ=DY2cJFbBck*_Hk2&UufI(5STeZru`30K8>@S(_A4M#cTj|C&H!MMw z4$bz<8A&H19%|S~24Um;c613?S~Up|*)r|eEww$Wp~At10}I>gy#+vJ)nyW(HZ`Ta z!<@bEF#CTQV^utJoHP1^SMo}G)_N$&3L0@xL|G6ZqHLj1%5*fRdsaW9jrD0Tj@;w= zVCrSw;J`mWC5#6n)y2hS!1c!FUq3H%8+h2(EMMxQaG;O=PsbT%6_n-CGAZqZ>mNf* z!$E_4e=^?@5-N{M+;{#LX-G*zqA2N#aG$Xg8T%tGc}V7P67if2K8wZMa4Tm;`Gov1 z76-z6zpP`V{iTS&(h*xuh8}TW<9ap<@I&=4-dAn&n5UE`DfSO?1l@gVTFG7U@oaPY^w?sf zSzzqS@95{mo+mzJ=IXdyys+@;E_cxHZ_CJ)SY?yj1F^~ew1hIfqi*{IIxN!IWH=#I zpYz?9LrABSN7>9_Jm+IJfe`zEC_xWZJqc14u<-Q0yZ@K3x55;;AXMv%5(SEddOU3O zBtwY2!wFO0e{|P7cLr-}!3T5m*O&o<;(PFFY^uGeshGI6+Z!#sb0f(JxTcQ8yzoaQ z@}D%f=zkNn|5iOS&%d$Dx4u_!i$&3mUZ4kqsCli))8`8i=&&vjVa|ZeN%z602TvoL z4+Yv6=1IkL-XG4z$r&K}9O)h)_^TCdZ9vmcSz5^l{IC7p1PKf|5)(-f9f^2nQS*Pt zilC5k_yd@~Z374dRvs9wnsk>=J6u0TCX>kqBfCMH$v4j@bxHLR&0}iG6gXRxf+9whqb|Ir#in<2M#UlanGE)vx8CPfw_KD%A?bW zu=uYOqN&@<;`Oujrdn5_zGaPe!F8BvfX@Xhu#qXP;GLfI@UGw*2e1c%T}`Al7jr6ZTI<^)zs9T1WeO`Qi8-M_<3W!8S=g=_(f;?c;r>NvSap4T~yNJ562o^`XRgjM9m zU%j6gEa!Ds9e3v{)bo$x5MLa_;1sc_m zM`cWC03xR(3nK2#gha(6MB*~v&=sHcMOrOjk#~VOzj`SA2H3x}*C#Si`(EPAQpfW< zkNgRSf;r4U`LWH`oFKxOl9|J|B-aqCXXDXyR*5ricW1I90TC~KIgyX$n^$8T5GGy4 zu;HMzAKi*;7H{JF0{as@)yEnv7>6Oww#mlL>o+d-0vm)LoI1K!SffzVD*gmJlqE8_0=3jWTNPCx4ajlpuSx2K&Ni+F}}0VbTtngoxqBO!|_qJSSQ+xJXyQ%m7@q6%>Bl{MRJ%N zyb-J-a|ni^7N+#A@Jd*RP38@|T z*w|QWW-|I3Z!fQK;|RM({I|A{`WrtU40dA#cjI)MSs+rix3{mgx$UgBd!WDigj*xO z!&eeRUst}=@|KQ17?RB(BI>D5QtzdpTMM-#VA%Sc9B2tta?Z%epb+{J#w25b?1dg= zj*i+(k_9;CMUX+L0T9;WDAB$H8#b;^O7luR9L-j3;=w2bWQp6@C+Yk{i;L+VT9IBTADQJ5G!z~UYYx9S_6}Jg zQwG729(M3VXsnp^{E@jrPhCvEs0Ur$2tX)8mmzd1-#9rVz-y+;qd z3N89biQ$Eu5GLYaO&3g#EbL~)npTPW4$MP_DU7dR!3S}(;0a?a_1VLxWGJ`9!ggb% z3p)woC9x7gPw95*LIxlQW7w-pk-6(?WLeV<>7U1HU8iC!5~aMu;Kc!N-#19{Wm{J* zW-?F!4_IcD@z6WuP(du^(&+p>G)fGj$nWCZ@4-=s1#mP{MA9`n?afJ~8~((~u4dEH zm+cZi(VRg0pzUH!_@Od<1np_%i|Wa_;8$!xNkTQ_zlZsggUi6I0p9g-tv^~4}imkueJdaRo?l$@t~3%;OQU$;_qA+<8n@4 zNpaHU+_qrw`Nv9>!r!28N=j%UI7f}AZwQt~vVU-}_iyU&w(G9o#qQ9}eB?6X1K4p_ zT~1zXvJ{cZ$|*}LM-YS$QIO*K)BSL~kORf9c&d=C^>|#A%ja#_&(V*8_4QMo9g2Qu zWGC$(H%|Kcl;r%Gd>E9zS5`_7(``h?V`E*#pQjK_cZyn6BU;4=S8 z&>-y-o1ny_FI=BlRU0_F*kRGg6Sg0WiwN-T=Dj<8hPvB2eiO~I>F@tl^PLGXwEJDxTzmVymxPDiWf+D&2}z=y+y%UQ z!gZ-c!4`YaP)W&&J=Tbw{hZ<*Q5Z60Bm~7MCr8lN7iDB57xJ90R>=YC=Qd0M5~JYM znzp;w=jR7^N~(MQ=|j3QSX{QcHq;{cvH3VD6^uqlK*mO=q*(Ev<1Iu$%sgNS zOmbv-e$KGqr*)c7JR1+eN?O_-=-B4lh*3rMLh{pS!(jxyJpn#EJg{;QEQkP+PZob= z3&5x)mY;T`yD}Fd=4x^a#4$R(u<{inA~GimyhH+kU6YdEs8Lb3?>5TSdYmCv^l^Z4 zz?>#XSMTiMUf0I<$K0&&@fudMbYghBh^IZj-B?SN4ksrF_hkKfXLsb$`*?E^GfDkd zAkEjH+qCF+mN-InCKnx$eE&rRZ28_XrNqi5&`y?=-+R$mZEYwJXrXu@Ai$&C7D$sT ziHjB5(tSAE?x9@8gPbK)XNdIhA0pDDS?6l2B@#T|@Rfm1Qao?FvO1?Qt;OMVb-tRt zWr9YEnjF8uavT_^UMNZ|!GcEvi%uNkpe)@9M%wD^tW|iuy5{Z zS)mGc@je*pJ4~`}Pd ze}-BOaC&>sd+OPJ6HOx~B`FvACLoRgI>rbMetGQdY%7{6S3CUj`TFKMj4^n9{Vyez zM1Fp=m38q)zl`*(+#ILouzpUoKpjyD5kA5@>H@o)%e`6DS}}uy^qZ1ORtZrfbB+4f zJylQjd;yGkfJTGU;WX#J`R~R*V#ttL|6S~C&(6YAQv8HmWvl7t3riEJgp+cU03I?F zBp=|G{eT~gg2d&&9LIs!1O{%NuP-&E+`S?a=Xa4M7J3Iy)YpRNw7c;^nwlSsEykJ3 z0)lnfBa2S)<0z?R^3O=|`jB1}AD`oHAGS-bIK8(D+Y>e92{G84=DE-AXrfK9WOr)6 zk8lvle3J%yACtt6z1+Nh=rw7GdG4k6F`e%2G{*@Z)7H7t_wW2HGxaXzS5nC zX|k25A-C{^)T5`fx+AK)jF!C`Ul#%<%3kaHQ6O1_r1zF8CYzCLZoxF=|3Aa0l ApplyConfiguration(JToken configJson) + { + configData.LoadValuesFromJson(configJson); + var pairs = new Dictionary { + { "username", configData.Username.Value }, + { "password", configData.Password.Value }, + { "form", "login" }, + { "rememberme[]", "1" } + }; + + var loginPage = await RequestStringWithCookiesAndRetry(LoginUrl, null, null); + + var result = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true); + await ConfigureIfOK(result.Cookies, result.Content != null && result.Content.Contains("logout.php"), () => + { + CQ dom = result.Content; + var errorMessage = dom[".ui-state-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 = SearchUrl; + var queryCollection = new NameValueCollection(); + + queryCollection.Add("total", "146"); // Not sure what this is about but its required! + + var cat = "0"; + var queryCats = MapTorznabCapsToTrackers(query); + if (queryCats.Count == 1) + { + cat = queryCats.First().ToString(); + } + + queryCollection.Add("cat", cat); + queryCollection.Add("searchin", "filename"); + queryCollection.Add("search", searchString); + queryCollection.Add("page", "1"); + searchUrl += "?" + queryCollection.GetQueryString(); + + var extraHeaders = new Dictionary() + { + { "X-Requested-With", "XMLHttpRequest" } + }; + + var response = await RequestStringWithCookiesAndRetry(searchUrl, null, SearchUrlReferer, extraHeaders); + + var results = response.Content; + try + { + CQ dom = results; + + var rows = dom["tr"]; + foreach (var row in rows.Skip(1)) + { + var release = new ReleaseInfo(); + var qRow = row.Cq(); + var qTitleLink = qRow.Find("td:eq(1) a:eq(0)").First(); + release.Title = qTitleLink.Find("strong").Text().Trim(); + + // If we search an get no results, we still get a table just with no info. + if (string.IsNullOrWhiteSpace(release.Title)) + { + break; + } + + release.Description = release.Title; + release.Guid = new Uri(qTitleLink.Attr("href")); + release.Comments = release.Guid; + + var dateString = qRow.Find("td:eq(4)").Text(); + release.PublishDate = DateTime.ParseExact(dateString, "dd MMM yy", CultureInfo.InvariantCulture); + + var qLink = qRow.Find("td:eq(2) a"); + release.Link = new Uri(qLink.Attr("href")); + + var sizeStr = qRow.Find("td:eq(5)").Text(); + release.Size = ReleaseInfo.GetBytes(sizeStr); + + var connections = qRow.Find("td:eq(7)").Text().Trim().Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); + + release.Seeders = ParseUtil.CoerceInt(connections[0].Trim()); + release.Peers = ParseUtil.CoerceInt(connections[1].Trim()) + release.Seeders; + + var rCat = row.Cq().Find("td:eq(0) a").First().Attr("href"); + var rCatIdx = rCat.IndexOf("cat="); + if (rCatIdx > -1) + { + rCat = rCat.Substring(rCatIdx + 4); + } + + release.Category = MapTrackerCatToNewznab(rCat); + + releases.Add(release); + } + } + catch (Exception ex) + { + OnParseError(results, ex); + } + + return releases; + } + } +} diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index cbdcdcf4f..5a9436492 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -164,6 +164,7 @@ + diff --git a/src/Jackett/Utils/Clients/HttpWebClient.cs b/src/Jackett/Utils/Clients/HttpWebClient.cs index c3b4a2124..3de1db66b 100644 --- a/src/Jackett/Utils/Clients/HttpWebClient.cs +++ b/src/Jackett/Utils/Clients/HttpWebClient.cs @@ -183,7 +183,7 @@ namespace Jackett.Utils.Clients var nameSplit = value.IndexOf('='); if (nameSplit > -1) { - responseCookies.Add(new Tuple(value.Substring(0, nameSplit), value.Substring(0, value.IndexOf(';') + 1))); + responseCookies.Add(new Tuple(value.Substring(0, nameSplit), value.Substring(0, value.IndexOf(';') == -1 ? value.Length : (value.IndexOf(';') + 1)))); } }