From 4eec52c931fcb776fae7c8874a997cb8f90136d4 Mon Sep 17 00:00:00 2001 From: Maxim Molochkov <48491463+klaseca@users.noreply.github.com> Date: Mon, 19 Oct 2020 15:10:52 +0400 Subject: [PATCH] Add new source. AllHentai (#4626) --- src/ru/allhentai/build.gradle | 17 + .../allhentai/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1050 bytes .../allhentai/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 818 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 1526 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 2348 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 3339 bytes src/ru/allhentai/res/web_hi_res_512.png | Bin 0 -> 11234 bytes .../extension/ru/allhentai/AllHentai.kt | 403 ++++++++++++++++++ 8 files changed, 420 insertions(+) create mode 100644 src/ru/allhentai/build.gradle create mode 100644 src/ru/allhentai/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/ru/allhentai/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/ru/allhentai/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/ru/allhentai/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/ru/allhentai/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/ru/allhentai/res/web_hi_res_512.png create mode 100644 src/ru/allhentai/src/eu/kanade/tachiyomi/extension/ru/allhentai/AllHentai.kt diff --git a/src/ru/allhentai/build.gradle b/src/ru/allhentai/build.gradle new file mode 100644 index 000000000..4fcfee0eb --- /dev/null +++ b/src/ru/allhentai/build.gradle @@ -0,0 +1,17 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'AllHentai' + pkgNameSuffix = 'ru.allhentai' + extClass = '.AllHentai' + extVersionCode = 1 + libVersion = '1.2' + containsNsfw = true +} + +dependencies { + implementation project(':lib-ratelimit') +} + +apply from: "$rootDir/common.gradle" diff --git a/src/ru/allhentai/res/mipmap-hdpi/ic_launcher.png b/src/ru/allhentai/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..359610927b2ef02d923e34efc8efc3ac90ad1941 GIT binary patch literal 1050 zcmV+#1m*jQP)-6IBqGL!-Cdnkb(B$O&;eVIs@I1eq=b1An>;hI+R#sL^ zuhRDR_PR+1P&zF*Yp1o)0_w!I^%oFA>~PKx7-Pqr^Fz-0(USQv%l$wIv2z-b)&L-m z;|f|CKFx&oC2X?C$|M#b;7B#2|#YH~{BCf8(d^dyFv( zg5c6%&9eY1F~+_%9njX+)(^n_r}V6V)`B4T(R4t*@Bac|Z5}}DK@j}30)T!6us$!K zpH~3TZzlnCa|HnXZUI?97LWyG0WF>_APZ=j0VP6EN6Nn2QWlDnT3km;iiMaO_k%FuzO)VhKIbCTqasl;}qNk#0wE-nU(2X&0dP>n=y}sIjcH(#_(F1K3ebs7_ zoG`472lR2XIh5#2aXd1xFHC4NqXD(0q~mtGpX9Mp)RvOo(jNI&8jaNi^jeY(CHYCS zNt|PZDjLf2OyCM(JJYG0JPiwp6 zSSe}`?2^k`n_V4qCNdU~4&YM_z_}cNot*bGBLPK1(AQcEy{aWBbK30noFei7z1L{a zi*Y>BM~e*Txms;>u-5Cen@$ncX=fti05yf6!xPMk zceOK-ae#KUSBqKwO{+C@A!Zz)&$PL+pQaNJba_CZuhq;1^khykm!>3^_cZ%3J8>Ha z=uPd_qNfyf3*0@wqum!BDMhWU&5Qvgg`h9A_WHcQjUngxH;%7l1sMaV8%1=r*&Oo4 z0)=qSNpemfX|b2Hi?pVcBkOJt%&2kJ*Lz`lF7|gZ3&;YpfGnT|wgqGXSwI$$1+>7n zfGnT|0A&AG!|tGy?V#^X2UM+AZ_W+K_x-m`1{8)NZEkM94`999?Vc?R2tWzI830}o z1phF`{)c3Yv-Y|RU@NP2=6^JB27v20&IRB1?}lMWj4>k|h9UXB|F7dX&jN4(6mKt0 z4*{qG=u|3|eb4i5d7k&D=Xtk1&--J^d^^kiR;5ze2hhoCdw5jIc*C>K@95L;PUSuKVB10)(7 UO53J1P5=M^07*qoM6N<$f{~N(^#A|> literal 0 HcmV?d00001 diff --git a/src/ru/allhentai/res/mipmap-mdpi/ic_launcher.png b/src/ru/allhentai/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c23a8e98d9969121e75401620eb062461f42ec35 GIT binary patch literal 818 zcmV-21I_%2P)RTQKZ56!Iz z{s$fe{i}-F+8%o-&qJrnq}h~MY<2=W@I5SimwBHz^WIJ}0Lid>q-JMl2jdg~q)rp~ zfR-)epW+FPj^j)SAzUftr8p#na2>~)h>GpR;2C4XobydY+(N|dn6&0S!07xO|eXT}KrD)v%cvLR;2f(djF`RIzRH9W~3+qae zcdVGL1bAAhgcDwqlJ1vE;q!v$bp-fWtI@pgx9Op=9nTz~EChYhlfBUyZ5RdpyjtxD z(2dRKUT^8;)&abzR>R5WJdf&9Qe8?~F}8vEO)vr0l%hb&Hr?q} z4P2IzHoC~-s!^;~74cF;@9(5({Y|h2KnOwabnkB}MT@>qw>_^#j}5>T{Y|h2;HJ_0 z-*z}QnB8biDJlwK55Ntk ze%YoAj_t9rF`;9P1OPa^zR5U_^ObWRcjiNJ&WSPh4FHCqi#xJZI-L$2$NBEM?hfaC zuTUuLa?ba9siQev*WF=^{Yah%^9< w0KkQqHKJoV)y4Z@qtQ4Yr{IKwO@k literal 0 HcmV?d00001 diff --git a/src/ru/allhentai/res/mipmap-xhdpi/ic_launcher.png b/src/ru/allhentai/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6b6ce16c82ab7dac0df909ee1aad7fb04e604035 GIT binary patch literal 1526 zcmV z-)|IE6vw~qw!*fhOZEr5uroVz?#%9XcV`x4!6NhlrJ?b~s0~6=BauWOj6{ryi3BQy z#6BqPo6kP!UqgJ*2QWMtd?8{W)CbCs>jSg8wD)#r+bOinImst&`s2=?^O?PK&ZOx8 z92^`R92^`R92{FJ`T-;uB!XHzw`d=f!xXXoi&Rh5&&QrMw*Cj1P6LRL=TDR5krrHT09^kY1{Vig+d|M zS-VIC5Yd&O_)A3eWD}fin~f(#v}D`1G)?ons08!_fa|*3i0GHV@S{zT?53n$n^LLt zYc7`?>8#;eBLM)GWsz;$e+376{Gt=x#5@iJ+$j_a_0AfuM?habpZAF9J_`sfU@?=) z90br8g@FEiKJT-Do&?;_WHPVe|GNe25|G%nYu8>D(3610bUJ+q5lqJ{fCX$RSO5!% zH!Oe!#2XgC0^$t|U;*)l1+aj4!va`9NGd|eH_GJ|?01~V)|znLp4K_&y2^FD@ULm> z2zaYfkqf@Rf-mazp4ZyzILfuoHyS;y^Kq@FTxYUee)$BPtJjsu&NrKKZ;$T+7O;jh zcD~tECcEJK@`_-zp_zS)-FM6I7La>015Fmt*v!1uAfCb-|M|!w`vVb0# zaNVxOU+{f-W^9ZFY=nR_V`HHN%z2)yhTMi&Ku9V=$T>xVpJ@`G3YjUiNPAayh`DRl#L(Bv$AOybS$g7IvW`c|D0ZkFZ%mgeT z1k;+{f4rmJRBc1EjfQl(T#R)B<~&b+QmcjLlBPZ0@&beq@`56{SxTOWCdjAFAm+w}q za>8|$TvlALSDOjA4b`CQ{nv_aCSU;?-s^JTzgI3c8p`Vi3(%nIXx7VN#Z15g6pV+w z@82tDYBd%R=EZ!d>HWW~*X8M2tt%gmjmde%@6Y-EikW}~EW;s^S2XukRKu5!uQVOh z@ntgs3s}aRn%-YGeCg2Lz&pEaCSU=}_*9d~OpkwVvQJaktG+M&j&~9Z=%68l{9bbb zRdq1k&}~E09Wq%!2k&UMjY~alKW%ig#D$LaSU?9;m5Mx7t*+o$_#~dea~$P*r>a$1 z3k1}JP=5dI9=E(><+5^}1L5DfFJ3^*VF4^4-mm}`5N}uj3y3!?fCa=G7Qh1H4GUla z@rDJkfOx|KSU|k_@1J)^Dj=83?PCEw30O?0)2~M+pin5(ZQH)X0zwP;JDbh6q7cvz zATcsBlCy35HzIz7$!fG~V;IJbWHMQdLI3~^0!W#r`GalSlK3G$y5c_}q9x0+WT8;_ z5kM-a-MV8Cz{t?h&;ipl|LBnLke<$2ZQ3wEl0RUM5?(p#NWImt&$uNwY zrfJ?aP4geqG#7)9aiX2`J;N|==JWZVhlhuc18@Q4f|^AZeE_x%4GrxH4$w>{lSfji z)b!}+=&4jHbux|wxlbpP$q4{W0B%sDZHVyfZ%03X?Evxs2tXM?4M08S)Ph=2P@C=8 zz~>A1;ps(r7(fO<0l;nmdt%D&paz+sCWF|3GhY?$2b2v22aPiWK`ow3;W;=sI5;>s cI9`tU7dv4lAljNeUH||907*qoM6N<$f*c^p6#xJL literal 0 HcmV?d00001 diff --git a/src/ru/allhentai/res/mipmap-xxhdpi/ic_launcher.png b/src/ru/allhentai/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ecbb34fd275a28ed51e2a9a04881b236690f6f4d GIT binary patch literal 2348 zcma)83pCW-79W2mGZW=89yKP$b39Ucgg!LJ+sIoUpJ%Aat5O={8#3kdO5Tr88Ach; z8VnLj@-C*CgsCJo5{9UVP<-RwweDT(-gVcyXYI51I(z@lIeYK3&ORsA$-!C_wjTxp zfkbU>EL`|9Yo|kY@%fAu_W=k5S+=z>bBihdT)cEn&KlWQ+8Ebyk=N6(^m9IvW6&5@ z$|AJLR9dmiZNuy=es@v=<6Uf0Yapn!8mt@o>abAxRr8ux8r!(u!H$^|{?gSoX_$K> zYfVxYia+!+`#f^nDVy1kC?ARCtaeY`cS~x^lv}s-I}eL=|0mhE*b2xB9JWh(mO}qi z$~Gc0GNa7stg6?(7tOX6_OVd}rNn`aj->)S74^T$%H1?_g4Om}<+C7pRSI`RPD{7}r*PTG++TQi3Ur zO<|6`5!Jl|dQW`UTL4`QT`kWe*eJdVtHya&;_m6En|yFVC%y_V8o6h>O~~409aN`D zV9}iD#}nRzhPgn(jT<+b^1jLE^&gA0RUaK59!}1fvTqvGD@c?V#?gjDOv)x?uMl-) zFXL!A8gN)0U=tA@ULGU~*+_7Ld^LatA8f}$+_j`91rI05u3^I^*wk|`8_#n@qrS}4Tr<|4>6g@?kx}b zHIpDvpR}}eXw>6qXNAojGkt#XQ&j7@*|t8$-u;4EC8ec%KW?cVf(6SHz&DGEjLN1{ zEvb45LkkNF$H0u6?Z62~$K!hx1Otp6$QiB*wP&Sf;b6s+&^#Ju?4lD@3#yQZtD znce#q3Vfdspkv{)0urHmMxlPLXEoVbZ8_e*e*348R z#Cta#dSJ~H_^PS6Vm|IV_!t7!KN{;xEUAo_`6|ARl|O@p51bre9`|D<@^cLMrhB??dDdMCaZe2mD&&lz+1-k4#!PjKV%jQ~ zY~Cer0U?+`Mnd;Sqyt`Pc8kd3FXPKp6{G<^h{Y=~z?1JIM4R2~)|i)j4B-P=g-Xxk z>0_bK+WSK#M*CvD)a`}RcEf@(qiae_zkI@%ksfY{@kqUq*uotrb;!@HZ0aS2coqog zSln@j=tK5&kr$nP%*LJtuxIPybO%vvJyynBoWo^*F#wul2Wr2Z;}7C~0Vy-%1lJbY`wA?_LZ z&2c}Rm-FFS;Ba5bQDaH2*=-fzmmYWFj2dJlQ&Z}@eXHD4q98dw(DM>3n2d3s%zU_} zi;vtz4wY>>vZG;rCq^`Tlo%LF-o{8nRy4ak3WS;Z*Z#o5(I0>!(n3e6v3NsK1qLcJ zi_KgjiKbQQqF{LeWD?8Oqn#8&Wc$={+*{2NcQ8=t*`_CtN)cw%c>lV!p@Jv4RMw>! zLOP)0NgdqvS(DdZhkm}V82XEG4FpG*0r@6}zR@}<0oz#nA z{A$p~ga=%;Uug1NK1QFgJ|&KikKYmp zwPMS@AW%YJh8U_Rf)nkoT{sS8-J(z^={PDpK_p?$UbT_Y)U@J=O3c|rgyxVg|0!1E zgeK{jns)38*w2(MNW)QAK6EE9gWi%%w{ev8u~t#-9RP;L#LZtJA22v7)!PM`Ml0R)(SMc^#K z_kvZ-p&=i2>FcEr=(U${N>D7M%!lLNd+O`Uxw$!xz{sV~QEdec3s<_z**@P?1++j_ zAc(4}s>8>qR)VyQ%;X_BtkfuDnKotEa=n+U&3_b;{p$>V5ceNE_z|yNxH;d`(_;%F z(_deu2Zn#H)mOqtR%8Nb9@Eo=;!s!la?ZN(^@1zE&1A|MeN)mguBfQc4sLv1IXt&w zb&TRC?8Ir-;JpbETjoisg5#>H)LcOI#-^rz!fX(mt&@$C95d&f_TuoW=o9Fq`i;c1 z`LmD&FFk`XiB63KeNeQH+Zg+;7S8vUmv3#^prmRZUak|Rr&cIIl&X>JSRE4|E9_KmCZe?cHyO9u-&HsI>thT$j} literal 0 HcmV?d00001 diff --git a/src/ru/allhentai/res/mipmap-xxxhdpi/ic_launcher.png b/src/ru/allhentai/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d45ddd771514ec2dee79cece751f68a9e165441c GIT binary patch literal 3339 zcmb_fXH-+m7Cs3jxe=v<5V}$YglhmbNDa~iLK6rev4GM91QAh81VNDUxJp1mOK1w@ zQVj?SgeF(IbV3y_O{9rPhj(DTzi+L#-nwVanR8~(%${$5v-h5JqOj(M#}UE^0052~ z8)2-#C*$yjvxBwOh!+e1IJ%87x;8*5BAKvGwmbXNn^#Ae~|VikE*mO=p%DU z)z)bJdI8_j1Az3|QK_8AF7Q>D{B*Nb%Ym`{S+MY&syv;uYh$wIXV1I*DE)!yhwUM6 z2haQ23C-CF;wJL^lAoASH{qG{CoR68-;v(#eHa<7xo*IGRNM;qqi$B9DoQE8A8(Fk_q0!1U6ql z-brGCrOQ!{Pr<5%U=U_r7kBDW7->aoLL0^@ma6Z|Z)AZ4Io^iY=UB}P%TM3_La{EM z`fChtV3KE&(|vpE@xB{ym5v*&?YUo@=&Q2VbYnG=BYheByZzVUc~Qe(>`6HZEqU1)fL)|nh_zdqLGd2eFhS@{zHuO; zAso3TL|+vcBD~(x7-Fj{(r87}7p=DF}LattgLdtOE!h{|w-EJ0QH5b-ba zun3)(GNaIEVN~F>Jelo1l7UrDLh6~Y&PB2QHM^!^3~Ik!4J2cUHX|$;=q)+G7>>}1 ziGXrtQGv!ga)7GvKiTAxeSXQ}k}7(b`(N!H`QOxIJuPoKS+sTJqjTR_pGzF(6*22hqQZ4e zgboDAb|Nm{Y1^xPyLzCNs&k}^=Ct_mTm9~1L)gld>cYbHk8zxvL#+L*ppB6vn3`C~ zd7<<#wRQ#fcOTq+@z9J2#S#Zsob1y2U+>gvDbB!9*-<+bYXHH8G*o*r532ZBoK~5O zvlYC!`$#)~;AV)$(Uc&on@a~@?sHaF7k*(M6`J}`3^LJJ|85~)+~b|LVZWKXR`%*h zSF~!4>>(qHA_M1xe0n`voCiM5wXs*v?s%x?sz-v0+Xorn)H?V>eQj&J?@rhxj<<_{ zVj5?rWML*)6X2Ad+6?zE`Mq*dmj&|keGjV4<-&y(b0U&{nlb73}Ro7pUMs`q4O2yuv1oYwRN~=n- zl?UhOOy;B=S^zan`B3p*<`D3}l@Em%i~Ja3i@q~6uCYTDyYkKSLq*R1DKq{D8iAV< zDdx!Dl@R*7@Qp)q=g6}tW=5G==e}3OUF18G56lukbn(~B<~>k5(f^8Uu>InbSC{+o z%EOId8&#ivJCj=7k!jzsyg#g41^tLC$eZfviCTf%g`zv+j#1VI>r>XNexMFQMh!}Q z9t^RsI!GWW?cD8|4?ng}_B!yPU5W}EKqn~IC(5F^!z6@)rezjYaS(G zM^MzKh1xUF!J5>JbKP5`PeEUYp^w6IF#bZPwU1}HxFPShL(e0W9n~@9X&e*_C@pm> zR{7J(zp^^hCO;JZ(i?Gep@LT6^#iV9eKu>h-AZ8w3%oJM$L%cc{w@ZZ%gkIG-H*&> zW<-K&vN{JAJlw*LJh5Ce|H1~LFj}KFVAa`f!K?&a-ccjy$lnufobA$jQg;SIR;wKY zhD&GF<@i8dxO>qvb$2#LYhM?(R+BYmmbYujK4nKVnWp!B9MYWKiK@`%9&Ka4H0b6X z3KDi!b+!sOzU#jES?LK~|AFQAfRyEzRsdo}dTD8r-fXV@=%k=*)yb(6fur2Q)s6Tk z^X&hb!NGi)p}|RxKWS6}#7%KP|KdZ0XIZsaq`=IKI55!1>W3$ej*RAfu08;;01>4_ zUe55<e04(WvzZ2>8hc z;uCF}q%1AZCVejpWA}6qDAX&)TS8St z@3w`yIz%VBiY_fIpkIEzwInVibb-|FmLVo2B+32~d=WYnfE~-=fEy0|*IP>k8gLFe zzB6aT=>fL(j(M6phEe^j>|BK$rv`}%M6#=c-E$rcK}@Exs#Hb*(pyiCdOAC;_ literal 0 HcmV?d00001 diff --git a/src/ru/allhentai/res/web_hi_res_512.png b/src/ru/allhentai/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb4c600fe46022dd5211b3acd15f8502e1965b1 GIT binary patch literal 11234 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 literal 0 HcmV?d00001 diff --git a/src/ru/allhentai/src/eu/kanade/tachiyomi/extension/ru/allhentai/AllHentai.kt b/src/ru/allhentai/src/eu/kanade/tachiyomi/extension/ru/allhentai/AllHentai.kt new file mode 100644 index 000000000..b85af6d28 --- /dev/null +++ b/src/ru/allhentai/src/eu/kanade/tachiyomi/extension/ru/allhentai/AllHentai.kt @@ -0,0 +1,403 @@ +package eu.kanade.tachiyomi.extension.ru.allhentai + +import eu.kanade.tachiyomi.lib.ratelimit.RateLimitInterceptor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import eu.kanade.tachiyomi.source.model.Page +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Headers +import okhttp3.HttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.regex.Pattern + +class AllHentai : ParsedHttpSource() { + + override val name = "AllHentai" + + override val baseUrl = "http://allhentai.ru" + + override val lang = "ru" + + override val supportsLatest = true + + private val rateLimitInterceptor = RateLimitInterceptor(2) + + override val client: OkHttpClient = network.client.newBuilder() + .addNetworkInterceptor(rateLimitInterceptor).build() + + override fun popularMangaSelector() = "div.tile" + + override fun latestUpdatesSelector() = "div.tile" + + override fun popularMangaRequest(page: Int): Request = + GET("$baseUrl/list?sortType=rate&offset=${70 * (page - 1)}&max=70", headers) + + override fun latestUpdatesRequest(page: Int): Request = + GET("$baseUrl/list?sortType=updated&offset=${70 * (page - 1)}&max=70", headers) + + override fun popularMangaFromElement(element: Element): SManga { + val manga = SManga.create() + manga.thumbnail_url = element.select("img.lazy").first()?.attr("data-original") + element.select("h3 > a").first().let { + manga.setUrlWithoutDomain(it.attr("href")) + manga.title = it.attr("title") + } + return manga + } + + override fun latestUpdatesFromElement(element: Element): SManga = + popularMangaFromElement(element) + + override fun popularMangaNextPageSelector() = "a.nextLink" + + override fun latestUpdatesNextPageSelector() = "a.nextLink" + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = HttpUrl.parse("$baseUrl/search/advanced")!!.newBuilder() + (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> + when (filter) { + is GenreList -> filter.state.forEach { genre -> + if (genre.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) + } + } + } + } + if (query.isNotEmpty()) { + url.addQueryParameter("q", query) + } + return GET(url.toString().replace("=%3D", "="), headers) + } + + override fun searchMangaSelector() = popularMangaSelector() + + override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) + + // max 200 results + override fun searchMangaNextPageSelector(): Nothing? = null + + override fun mangaDetailsParse(document: Document): SManga { + val infoElement = document.select("div.leftContent").first() + val rawCategory = infoElement.select("span.elem_category").text() + val category = if (rawCategory.isNotEmpty()) { + rawCategory.toLowerCase() + } else { + "манга" + } + + val manga = SManga.create() + manga.author = infoElement.select("span.elem_author").first()?.text() + manga.artist = infoElement.select("span.elem_illustrator").first()?.text() + manga.genre = infoElement.select("span.elem_genre").text().split(",").plusElement(category).joinToString { it.trim() } + manga.description = infoElement.select("div.manga-description").text() + manga.status = parseStatus(infoElement.html()) + manga.thumbnail_url = infoElement.select("img").attr("data-full") + return manga + } + + private fun parseStatus(element: String): Int = when { + element.contains("Запрещена публикация произведения по копирайту") -> SManga.LICENSED + element.contains("

Сингл") || element.contains("Перевод: завершен") -> SManga.COMPLETED + element.contains("Перевод: продолжается") -> SManga.ONGOING + else -> SManga.UNKNOWN + } + + override fun fetchChapterList(manga: SManga): Observable> { + return if (manga.status != SManga.LICENSED) { + client.newCall(chapterListRequest(manga)) + .asObservableSuccess() + .map { response -> + chapterListParse(response, manga) + } + } else { + Observable.error(java.lang.Exception("Licensed - No chapters to show")) + } + } + + private fun chapterListParse(response: Response, manga: SManga): List { + val document = response.asJsoup() + return document.select(chapterListSelector()).map { chapterFromElement(it, manga) } + } + + override fun chapterListSelector() = "div.chapters-link > table > tbody > tr:has(td > a)" + + private fun chapterFromElement(element: Element, manga: SManga): SChapter { + val urlElement = element.select("a").first() + val urlText = urlElement.text() + + val chapter = SChapter.create() + chapter.setUrlWithoutDomain(urlElement.attr("href") + "?mtr=1") + + chapter.name = urlText.removeSuffix(" новое").trim() + if (manga.title.length > 25) { + for (word in manga.title.split(' ')) { + chapter.name = chapter.name.removePrefix(word).trim() + } + } + val dots = chapter.name.indexOf("…") + val numbers = chapter.name.findAnyOf(IntRange(0, 9).map { it.toString() })?.first ?: 0 + + if (dots in 0 until numbers) { + chapter.name = chapter.name.substringAfter("…").trim() + } + + chapter.date_upload = element.select("td.hidden-xxs").last()?.text()?.let { + try { + SimpleDateFormat("dd.MM.yy", Locale.US).parse(it).time + } catch (e: ParseException) { + SimpleDateFormat("dd/MM/yy", Locale.US).parse(it).time + } + } ?: 0 + return chapter + } + + override fun chapterFromElement(element: Element): SChapter { + throw Exception("Not used") + } + + override fun prepareNewChapter(chapter: SChapter, manga: SManga) { + val basic = Regex("""\s*([0-9]+)(\s-\s)([0-9]+)\s*""") + val extra = Regex("""\s*([0-9]+\sЭкстра)\s*""") + val single = Regex("""\s*Сингл\s*""") + when { + basic.containsMatchIn(chapter.name) -> { + basic.find(chapter.name)?.let { + val number = it.groups[3]?.value!! + chapter.chapter_number = number.toFloat() + } + } + extra.containsMatchIn(chapter.name) -> // Extra chapters doesn't contain chapter number + chapter.chapter_number = -2f + single.containsMatchIn(chapter.name) -> // Oneshoots, doujinshi and other mangas with one chapter + chapter.chapter_number = 1f + } + } + + override fun pageListParse(response: Response): List { + val html = response.body()!!.string() + val beginIndex = html.indexOf("rm_h.init( [") + val endIndex = html.indexOf(");", beginIndex) + val trimmedHtml = html.substring(beginIndex, endIndex) + + val p = Pattern.compile("'.*?','.*?',\".*?\"") + val m = p.matcher(trimmedHtml) + + val pages = mutableListOf() + + var i = 0 + while (m.find()) { + val urlParts = m.group().replace("[\"\']+".toRegex(), "").split(',') + val url = if (urlParts[1].isEmpty() && urlParts[2].startsWith("/static/")) { + baseUrl + urlParts[2] + } else { + if (urlParts[1].endsWith("/manga/")) { + urlParts[0] + urlParts[2] + } else { + urlParts[1] + urlParts[0] + urlParts[2] + } + } + pages.add(Page(i++, "", url)) + } + return pages + } + + override fun pageListParse(document: Document): List { + throw Exception("Not used") + } + + override fun imageUrlParse(document: Document) = "" + + override fun imageRequest(page: Page): Request { + val imgHeader = Headers.Builder().apply { + add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64)") + add("Referer", baseUrl) + }.build() + return GET(page.imageUrl!!, imgHeader) + } + + private class Genre(name: String, val id: String) : Filter.TriState(name) + private class GenreList(genres: List) : Filter.Group("Genres", genres) + + /* [...document.querySelectorAll("tr.advanced_option:nth-child(1) > td:nth-child(3) span.js-link")] + * .map(el => `Genre("${el.textContent.trim()}", $"{el.getAttribute('onclick') + * .substr(31,el.getAttribute('onclick').length-33)"})`).join(',\n') + * on https://readmanga.me/search/advanced + */ + override fun getFilterList() = FilterList( + GenreList(getGenreList()) + ) + + private fun getGenreList() = listOf( + Genre("3D", "el_626"), + Genre("ahegao", "el_855"), + Genre("footfuck", "el_912"), + Genre("gender bender", "el_89"), + Genre("handjob", "el_1254"), + Genre("megane", "el_962"), + Genre("Mind break", "el_705"), + Genre("netori", "el_1356"), + Genre("paizuri (titsfuck)", "el_1027"), + Genre("scat", "el_1221"), + Genre("tomboy", "el_881"), + Genre("x-ray", "el_1992"), + Genre("алкоголь", "el_1000"), + Genre("анал", "el_828"), + Genre("андроид", "el_1752"), + Genre("анилингус", "el_1037"), + Genre("арт", "el_1190"), + Genre("бдсм", "el_78"), + Genre("Без текста", "el_3157"), + Genre("без трусиков", "el_993"), + Genre("без цензуры", "el_888"), + Genre("беременность", "el_922"), + Genre("бикини", "el_1126"), + Genre("близнецы", "el_1092"), + Genre("боди-арт", "el_1130"), + Genre("Больница", "el_289"), + Genre("большая грудь", "el_837"), + Genre("Большая попка", "el_3156"), + Genre("борьба", "el_72"), + Genre("буккакэ", "el_82"), + Genre("в бассейне", "el_3599"), + Genre("в ванной", "el_878"), + Genre("в государственном учреждении", "el_86"), + Genre("в общественном месте", "el_866"), + Genre("в первый раз", "el_811"), + Genre("в транспорте", "el_3246"), + Genre("в цвете", "el_290"), + Genre("вампиры", "el_1250"), + Genre("веб", "el_1104"), + Genre("вибратор", "el_867"), + Genre("втроем", "el_3711"), + Genre("гарем", "el_87"), + Genre("гипноз", "el_1423"), + Genre("глубокий минет", "el_3555"), + Genre("горячий источник", "el_1209"), + Genre("групповой секс", "el_88"), + Genre("гяру и гангуро", "el_844"), + Genre("двойное проникновение", "el_911"), + Genre("Девочки волшебницы", "el_292"), + Genre("девчонки", "el_875"), + Genre("демоны", "el_1139"), + Genre("дилдо", "el_868"), + Genre("додзинси", "el_92"), + Genre("Домохозяйка", "el_300"), + Genre("драма", "el_95"), + Genre("дыра в стене", "el_1420"), + Genre("жестокость", "el_883"), + Genre("золотой дождь", "el_1007"), + Genre("зомби", "el_1099"), + Genre("зрелые женщины", "el_1441"), + Genre("Измена", "el_291"), + Genre("изнасилование", "el_124"), + Genre("инопланетяне", "el_990"), + Genre("инцест", "el_85"), + Genre("исполнение желаний", "el_909"), + Genre("исторический", "el_93"), + Genre("камера", "el_869"), + Genre("колготки", "el_849"), + Genre("комикс", "el_1003"), + Genre("косплей", "el_1024"), + Genre("кремпай", "el_3709"), + Genre("куннилингус", "el_5383"), + Genre("купальники", "el_845"), + Genre("латекс и кожа", "el_1047"), + Genre("магия", "el_1128"), + Genre("маленькая грудь", "el_870"), + Genre("мастурбация", "el_882"), + Genre("медсестра", "el_5688"), + Genre("мейдочки", "el_994"), + Genre("Мерзкий дядька", "el_2145"), + Genre("милф", "el_5679"), + Genre("много девушек", "el_860"), + Genre("много спермы", "el_1020"), + Genre("молоко", "el_1029"), + Genre("монстрдевушки", "el_1022"), + Genre("монстры", "el_917"), + Genre("мочеиспускание", "el_1193"), + Genre("мужчина крепкого телосложения", "el_5715"), + Genre("на природе", "el_842"), + Genre("наблюдение", "el_928"), + Genre("научная фантастика", "el_76"), + Genre("не бритая киска", "el_4237"), + Genre("не бритые подмышки", "el_4238"), + Genre("Нетораре", "el_303"), + Genre("обмен телами", "el_5120"), + Genre("обычный секс", "el_1012"), + Genre("огромная грудь", "el_1207"), + Genre("огромный член", "el_884"), + Genre("омораси", "el_81"), + Genre("оральный секс", "el_853"), + Genre("орки", "el_3247"), + Genre("парень пассив", "el_861"), + Genre("парни", "el_874"), + Genre("переодевание", "el_1026"), + Genre("пляж", "el_846"), + Genre("повседневность", "el_90"), + Genre("подглядывание", "el_978"), + Genre("подчинение", "el_885"), + Genre("похищение", "el_1183"), + Genre("превозмогание", "el_71"), + Genre("принуждение", "el_929"), + Genre("прозрачная одежда", "el_924"), + Genre("проституция", "el_3563"), + Genre("психические отклонения", "el_886"), + Genre("публично", "el_1045"), + Genre("пьяные", "el_2055"), + Genre("рабыни", "el_1433"), + Genre("романтика", "el_74"), + Genre("сверхъестественное", "el_634"), + Genre("секс игрушки", "el_871"), + Genre("сексуально возбужденная", "el_925"), + Genre("сибари", "el_80"), + Genre("сильный", "el_913"), + Genre("слабая", "el_455"), + Genre("спортивная форма", "el_891"), + Genre("спящие", "el_972"), + Genre("страпон", "el_872"), + Genre("Суккуб", "el_677"), + Genre("темнокожие", "el_611"), + Genre("тентакли", "el_69"), + Genre("толстушки", "el_1036"), + Genre("трагедия", "el_1321"), + Genre("трап", "el_859"), + Genre("ужасы", "el_75"), + Genre("униформа", "el_1008"), + Genre("ушастые", "el_991"), + Genre("фантазии", "el_1124"), + Genre("фемдом", "el_873"), + Genre("Фестиваль", "el_1269"), + Genre("фетиш", "el_1137"), + Genre("фистинг", "el_821"), + Genre("фурри", "el_91"), + Genre("футанари", "el_77"), + Genre("футанари имеет парня", "el_1426"), + Genre("фэнтези", "el_70"), + Genre("цельный купальник", "el_1257"), + Genre("цундере", "el_850"), + Genre("чикан", "el_1059"), + Genre("чулки", "el_889"), + Genre("шлюха", "el_763"), + Genre("эксгибиционизм", "el_813"), + Genre("Эльфы", "el_286"), + Genre("эччи", "el_798"), + Genre("юмор", "el_73"), + Genre("юные", "el_1162"), + Genre("юри", "el_84"), + Genre("яндере", "el_823"), + Genre("яой", "el_83") + ) +}