mwoORH<9wOo6(hN0-_+oVbsgZ`kPZShpEL~S`QOZ;HK
zY`w9~)@a|Z@bZ|TL=&yA%`-}-S!EH;CKrTd)Sj)DskwmUt{6|u(7l_?I)>)D>;
z>w*mVqqboQ@IR{Lm^*I3L+WKd6&X8pGAk5$c`_`CH?(_IgDRPTVB5u>bG|ky)ms*w
z=Tc((IJ>Q;y#4QUX5WrQkcVwfOyxe+NVD=`=z3n-xb87*>FWJ$2d1H|jU@lEaG7e+
zLFnrFtVi3}=>mJBj+Kn)tsG#bNVF3fzjD9)s`+N@Rnzlnc=L0%Y}0P#y36qD-T(Hh
z)z?nLS+AY1j9$B38QsCpcjH?br%xchRd3^%0RI7h%+HOa8IM2rjn}=|`Bt52_|}_+
z*XtxYE^dAAZ>TyeE@B!pe(#+Pi!H}AuD82f{i^FWafX9O!=ke{_6tY4CBIscn6??MUanZ0B`ti@Go$?s
z=1>E3Xno;0bSnKT4$^5951>;CpoDwFn8ouFy{Zpr@!AJ2T!Vg<4ZJ3@$Dt^k+AkL!YMvPCp*Qov^j>g
z3&j@-CFL`w<})Vc3t2V&cM+dC+D*9Hi|!N5EQo4;J%DK#aAnVmD9-iaG8nM(;-~(5OaP7m0#kr9N*YEdu|$6s!a&3F@a?S
zpwVyx7EUuDo*ymNjN>?kH*rnc;f5YyLm6O$1kdU`xrQuckoW#1?_KT^El%lVuXiw2
zjve3R^cz%bi*hnHtMiDLUjMK{!OlJ`a*^P@(%N;_Vh*urW^EDnl!+X6ZQ{t0L|OVK
zu!N*1*b9do-aZ5ch5^G_waA?)a7w6=F<$9N5I`j;@cIE~zN5F5Dh4vB2QuDoE5vN8
zRPYto70=HuJo$5eZsaKLC)wLcy?VCexM9fHU;A@VvqHem*SC6+055Ki(o;rZ_zE%i
z0FA`@^{zGM-r;vbtJfq4O3}_)NP)>-(FTBSo%!48WR_Q7&zVpOEFQME;boo|&272@
zCdxjBvH?A6F^L5VHDUrb;M+eweuM7r%F*n9VSkulQj2P#N5?UIbQuq_X;b`Q|N@VK%WmLjANq+$m4J8dR6PY`h>W4xmB
zK$g6~M~ZOvbLL`wR4;(4TRdo3ge988nRqzEe*Qbqe{fPy;=~iEp?t(2b=3fzOGViR
zM!$XWc0i?F-R#LqQ75`43<8ym3Y2jkiB>}#G_^P-gle+
zN;B(3&D(>g-ZF17z*j3L9b@O0$SPhfzFU|J6u;omF
zs5#4%oyhsil}Qc}vmS}{k5H@aR*c?IN+Q|yrqz||@{jo7UyZ*8{VVJslWHqL1>)%&
z#i++SW>8GSVSo2GE3eIU^mwt8E2)@1wSX%rXS{nQ@pue+5`<;nOC~4*W}l#-*?h>*
z!3o^`vLk{WNaY@4pHW%$vMD=FGt8O9vKg~`-X8_s>eH9rgXtm!v~4_9j&*qDc~r1}
z{zFn$D<+yl^3cw%ZI#|W>8G(mGRiaBp0L-%m}wN>Dyi2ZN!9{C2B)DaPZN#s2W0ei
zUni~*DNd8gO_Iq?@2*UXCUxa7IX{m!{w4)l>oMvIfCXW#-C%{z{z)2M#4lU=Gg#P#B
zOs)2xfy@VV`1=Huu19vFw{_0I~g1XNlSFsF_bJ|
z7+AAmPh)@yHFc$AGwuwZGOg)-
z<(_ClEmyf5uDwxkY&}qQ(2fsc9c$Kk7iNUU*{YtQuF86nr~l+oqdg||HZv3HM+NWv
zee)B4BT#kTKJ~@>lUiR5xQY$afXNl-H?l#xjdhQyK|0bp{FSN_CdQ-^CQAiZhjicT
zQlVQAa0~!R>WWHA&L=8gheCh)rLp_%y1ak5+%>#T4%q1#uH5Pw?iiFdzDFf7x{X`z
zBl&9K3ymzg4`%-@n)3p2EN98_JltLG%jvxSmw5*nzJFpc-oN_k7c=gEVe7YPt8;OE
z#XeT%*h2Zgrf?XQxGd@IZ$*7MP)VKG=+KSG){R&@Kx?1G^D(2}+b443+C*F?65Uu@
zrVlM@=E`)86p|Qq_2p<3epNH^0?%jLqRl~9qAi+TRL0nEM9S_R@oR%@ijFpXhj-E5B~E*g
zrnIU(uw;fO{~vE0&;O#_tGaN^y3i>2g{Pn%wOT7$&!6+`i
zG()xQZQPC{Kg%%SxSeiCI}A3-?%4H{i41rs0^=J5T=K7c%Fr&X_l)Yf+&-DN3-I#XciL&Xr{Up@mEl4Nb
z(tEE5=o0*$B4(N(W}Dzl+W4{WkEbvq)|-bCcmj&aCz4-&x}TjV6F8T=?w9xavF$}*
z0oThQ!6h?rZ(fK5yrT3SDt}SNd@%zKa3BX*V5`?e)~|_lg_81onFe=X+<5Ad9@Bv?
zYAteSUj!2aBDkiB(&u>ax<8tH$2IgnVUcJspMV4YbRz)(+BDXM8UZs}xor_>*pLGZ
z@Zt9)U9LTU+x%XG6h9ZG-CfC
zbjj-kdg`BhqHh|b0B#|!ZXuX%s9bKZ6#3mPIR=(Yvf;z>8oGrw;MxY=|G5wO_@3t$
z4%}CM8gVjPk6li|rNQm7n=7afX7o^-+5iN{wh%r}_>?6ye#*jo648QMBG77HPe!`nDb7OmngCpaQ{
zuBmnWpq4FRQ)D;TA)6)VSocLc&?^Y$MeUd`ogMRnFYXluc_XQ+~*nk!U@pSRn`XFKZUS@oH->d7Z00}0Z
zGASQ(>G;qc(>O$cLqW_iR;z-ZK_1Q~@1?ZTz*Ta^jEMz&f@W-DCC+UZYPEa|AG-q@
z!OwS*=bmAgb>S}WV2r6ny?WS75-4-Xm*r$*Q)F^3&}zn7dz*d%dhg8(djykEz$wc_
zKW%!1RsCYBpO1f|cVIha=O8LYks<64X}dE)Rf8dR_T5r>XKm;@igxf$djq=a^DYSKB`Edy$zF{JU54#dWPqGCec_+E^iKvZn>v+UB!gQq
z#BgYP2xq!u$zQr|fsIxCr@Q?BD(e>F;*P`5D$e0pF4jx-P$2Nx=L7_16Ho|+R}l~3
zu0U*_7i3ITK$&jXISr?#*VheaPb?M_2;=))BqS)|=(h`4p$BjQR)*-8V;J!T_WY8M
zCc)EU?$lfjT`B!YcFVUlEEDq260O((xpBuLkvMbEf0CkQBdE1{YydaAm;{B4QfIz#>5#L2#$S*uz=ke~m52{*t*v
z!nka=kcm~hnM?0w4%eaP;r57hyAH%jEma@@m?R@cq{yfD4a&@fkaGUr*d|1h@Fx
z64*MdChY=$ss^pucduuKbke7C6^*MV@bu~}Az9De4!{MMaQ)soS14LYS3{|sY4-=&
zK*u;St41X8E0%anfU7liTaAZHYfvoUMgPHE;HetFy}D)*Z5*EdMT52S{5u=!F@7c9
z9U_7p{V>f*Xt^2`Uh6zfZ1)DQ!RZJk4XN7zutEfeD-p-;n`xO(PSs`wj3B5Z%yM=qNgU2%Frz~Zn1Kxp)dNBX+Qa86zuQTkh^+jHbsZbNm
zfHu^3qCwYX1^%=6$nv&@+JS(*xiW}^3C@qg)hK>v#hv-=a3z4KK745)@f@G|uzvSP
z;cB7Xp&mIvN6ouI2P!1d-_c3>n`~@?`hE4hY6=e$`mN}-6%2Z5JFA>v2>L)@`Y0-pOjPh-&0L+Bfw4~2sDY>A{dj(i
zhYU$@EgZ)_5Q0%o_1$%WlkuW|uVSGmq=ehS=O;dlDsPn4&6>Hi
zx;6Xu%=bTwTQW()Wmf-57eB*uiiL2FoT7}zXEQ4KTxRH609b&ayigH+oo_WLq~AfL
zmG%6aNijjiZHerLitmQ{qnu1}ntF)fZ?y9|eH@&oPq7yQel0_9=!kQv(wlmDT;
z8c&us>MVVu^G7W#_TY&s&+qyCpGj;is>AC&D@?HUYp^x^h*@Y&@!fThXx;3}4K6gV
z7yk!1y{krnr`UU5w+a9zn?K&xUupg7muxU{{q@JAR7%IbFNp!#J^tI0L#yW}+Z5I4
zh7#dH>|W-PZ6Eoa)Vj#kUM15L4}e@7J7nH9fyXvM4Uf8bt3~bWtHRk%f(R*a1k%ME
z{i3WDOcxVNErfzsa}hy^a25>S!!aH&%>oEDsDVCq@woUU9Mp2yS|y9Z8oL_*N!i|h
z@@0w@Y=d9kqX&R02L{hhaCQ%|hz`(*tv&6YE9Vk(2pd4Q3`dqR^g_f}wWKGvKwzjPMtj%UD(Ra>SICU6yhcJg$!8dA
zIHfz=nr?a}9A4=LRa(Kfgi5)H>{MT~txJ}PTMSs``zLqc3k6_ui+F-Su;0lWUjT|X
zKT!=nwMua`eD;4=MoeTtn`LI9{@2^QAQg08_U5VT72LPsWY`LPaJL%iCR1mo_Pge+
zF@Kz(7_9Q3{istYr(+jVd4RU6rlGe)biS&0{?o+;gdEsllHFj+brp~+_DP3U>CP!L
z&i@v%$etj<7Kc%-J~4SXX4+b}-ze
zu>p9F@_`QJA#+<+N8x;3p{ElUh=v*Gis+iy(<;D4!x>^D;jzz56nyp{1xreb)}`Ce
z))6vZB9*4v{bYe(mi6|rks$kjFdD=~6(MnOGE%WBtRc=Gpahs?L)4v|swX=Q?r1ebw<;o7NWMNVUxz7Nhsj@u$)3w#K1t6F!gij`{564Ykh}
zGn+wfQYbMIK_neZKNhGDN5|Iy{X`82+|v#U%K?lsl9SZYOwIL(8kCh?FCfMi91hB2
zXOS_NFq5>g15&DPM3Ko4Mw|FXru2W>E30HLuS2o!q$1s9Q*v&E=%rie1$fbCENX?JX>l8`-J-Ty(9lTEcR}lC+N%XM7%|ll}EHG0;XqG~NjkJ3Wt?bCze
zL+8q$X^iI??#gqDVR4AIpYG};kT-lXrfB?VgbjELej^hMn=Ypso1!M$eEvq}Q@}9y
zKuYCGa>?CQ1Xw9Sw>At_LR7)t!A
z%Z&5s=Ikn#uW`&aoU0uDi!KGnN#(@=>EgaBwfCi-T}idw$5|JUSk$W~`*D8z*C*9L
zU~<~DVP_C}Mm+XIDfpjTGHd4}J>sF-!1d2!kyHqr=-?BTfZLa4os}QzBx;_61hkc2
z+FU6j=^#3mG&V{54^_fe59Rv_vJr=Q@H{}PVDMMd*{W>z+W8it_tO$;f!}$PhSy%-
z&l35V-9J#ieydN-51-z%=82F46Xo7B7AIJ_Qntftp@ps;RXZumr*wQ@0V+xBrwBYj
zL}nj&uhZYBZ+OaFy2(&&x>ay0l>=F^&GoG6`goo#!KcRz=b;Q=C%Z`5DWWD)hSf_nL$W@5j^+`O8NH%@=@?H
z@Ij~L3!YKiHLcU?EMrT%f#VRNA2br6_3&CxdfwtN609T%z-P;xVEd{9%>EB
zNa-B)-*nnW@vvC&uv_u;{}yXhjdCh^t|YSkOGp2oe2sPmEZz7w@_z5ihN~;B1%|KI
zn9k3_&LuGcao4O9E10rkqzwH;i)gBYP{ULk^yr@-EO8jkLgs)xa++jtN;HXkuiGgo
z`xo9?tm@Zn@*NCaUs?qnQ0Y`5xZ%|mPu`i!EXDkXX%h!Glr~UOG05cTtT7yZ-_bR3
zQm6;TmG{i4s3XlD_Zp{BMrC`kqnAwMj}3<&J6I^G(3~IcM*ALmW4Bw@SBAgz<=e2b
zSx>1XSCKyqS@2y*k6v`Kck=0iY!JHgnz<&*JM*YEa{@%TLr!cWKqwko-BNv9jC?D9
zI>P-)9XUezQhF(dr~d;?BWx|Ntqc*cfJO>fC6m#>?U9B?NcFMo5==Hn?0VDZE=3(TO?mEcZ>>Q?qTFWvvN?I)0kJC8<
zcfks1`$KiFWe#G#97gRP;8^_Y5hek~MjU6N*{FipvVyop@+d_%GfVQsGV{6Oc~6j)
z?4M&dxlbgSWyQJNkTZYxS{IaJ6~k+lCis-cb|Psl+f`e?xR!NciPWX*CCZUniBN1$
zt30nt8NlBcL?fIC&lP7KM#eCVJYtrpl7~2%`Py7O-*8wq(s-u)H}+S*1l<3YqsenQ
zYW>nKV`9dgDzaJDv>S}JaJ}n|bNO4%xEZr|KpHzuH8e%=evZ<@0j;-OPb?l{&t&gK
zD>L8}Jhq8!)cfh7N8ss#4kne*J%iSp#)$}*;V!ykS@e?*MSnC*GAFdxRXXSrOO`(<{A
zL?H-7MD!+2EnR7v>*;9halr{XSxyxxV55*Q1`p-M*Jk?A_bx2w5?0U9aD?tP{GNJ-
z1zsZI^Z51GvDc1GSrn(=_SO5*-|*@xqv=UVY|GWSC3qVCMF~=z&^IXbjawMTF;D8w
zGt#Fy9EcU>7pvD`J&M2ZNYivwb&1(Hv73b5x!XeL;#lFg8G2~^R77e8U4``zZ5AGh
zqc9DlFBPv>pOd;44Nl%}h7$uRg(uZgOcm8Ux`9q#=WujO)wwi?>@u=9!^Jvd>6M{O
z16e+(`^FDMup7qCorHnxjo-i9`)97X;oQB}a6d6`ipaMr%ZYr%sSobaNhmcoUx~Hq
zeg&5cGJH1lknfNyyVY7GDm0Ro!(6UZuV(|ZXf-%wZ1jmehZ>xLyJjALHwv%{MFZE_p
zu9nv-0ovMuYFg;oD*i?yv7
zVjdXS_64nRkTemOE9vYg7(!jMVvO7?HKyL?%Ms)hB=ry{Mhud{E{AM|&(8~1{FbwX
zuX+@8dkR4qZ}#mRvhE!5f!5&vCce_7JgS0isD|_3)KB%uAn~+Cb(V-J41=^Yqh}pC
zy)rc$AU8S}b6Mc8BwZ4Lc##p&h?n~4_{?y}yf#%WGl_CyXFU0)gL~IU#>|$L;u-6-PbpIxle1aWv7D8e8NiP
zlMhS#k}S-Z8z!gS3qWgnK_MqIyLHuem
zdqk@`WLh~RT_pI+#nFg=J^Mx`c7TQ>a!RNyvhO$6c`RS~H1-C(t!Z1D&yeM~KFJ(xxooaF#WL
zDc1DIXd8^vHJqS(I6>Dygf4%OL~fKLK5_~_`Ngkz*g-6*dGDcgdKzq2(ZK1sLeQ_B!*Q|99p9>aDjh{M(UPSY`*qGKpd+d!1|fe2mxLE`BgXMX&XJp0@WRI62_v}pvuLVdC;QwspA
zM6)6qF&11r{S{QSpWl5@*;MF(Y=GVWu
zn=gL#N{;;KnWW15;SFWz7>Lp1R8#91N;w5&jZWVg%GT;@&W+i31-UU=b18O19^CuZ
z4y9=uPSFv}&=JhgKAfU$FhToJg0=lo`odYt`yb93pShSTzxxC3d-yS?rYlq|Q9HNS
zHI=>>g&$e~cxOm!$ND2{Ni~vc`M$$N7Li
z#@fLo9f34mp&Wg&B7=znk-|8c@%`ERgU4{vCqB!?m;V#r|HVx_@c2`_@bas?HCe&Z
zU`wzhj{jl#^LpP4w95lvxsd>}BHQy7DS6`102|=b|rh`Z=HHgflLytX)LytX)LykGo@X;sm
z!K04l@S~39!^eDtqd#&I$De#Ur<{2fXMOs!eD1<8a_Ltu=iA@?9zXx(4cvX#T|E8t
z)4ch{8%$46)he{r1=|!8Htb}^H3YD|*U97Y?6s=^;NLhO{&x-l{+q|+*=u5AVq#}^
z(rS=Nshph;tDPcTjk9TEdBD0?n3@;XlA0M?vaM2O^VBq(CMFGUn`G0(1aEDfVAGZf
zHf@_^%j7f@GZm(*HdR|;Ymizaw08UuntH0I6VN8-XK2;;HR?S*+s`G-vKj&K4?7D0
zE(jI^zz1G??X_oic1Nu?&0P_I1q5H!oKR9qtpC5g^9hOTh~xOD)|xcBN;FzxvMNpd
z6Vt>ROR=#BDZTbo@KSp7Al^OnAf?`WDD)smy=XlP;>oV3MJ(7T3W6dCOECzFu%Wc?
z?c1Fmelyv(>w0KQ^VZ$p2fl~B&Ak2oX1;G`-g`mDctOVemGO<2$=FzxHJM!21jZhb
z$jT>QJ^N&uAIJf`KmEXXSy{jLf~vb;+!Iyy39G;zvh(vtpR-=*{if~#^UIrd#g8Ed1*T4AVmkQwZ&8S^r%4Y3b)^ed!oZ&Al2A4+j;*q_Y3?Js=;=+uN
zkADWlt=D4Kd$my)zzv`tXaVj457*Y#mZQF4O63p)f!WyDNC4fyee1Ob>%B+|;BBA|
zSqi<4T?!o;85uq}IEebXDHX!e(NTJ8YU)d558y7c1X^#s_r~+TD}eA`fLjS_1v-G<
znVFgKR4NtqwNtJ+r>Cc8Zf@>dpbyFaZAku)Yy~J>0O1(a05k*bzysj%!otG$Iuj`W
zh9C&c@$s=)US9qg_`rJV9{KnaS^jsFia||Cg~pM*_GEf`dSZ8X*Hr6`vGUJJr_*L{
zZ|~LY?Cf{IQ=kV)7HvrUxkWzyL|Oo)R)d<6dx0*X7kD~0HulBJ%F62Y_O?l-QYM{F
z8_)BizRpS+5CnnoJkO-lX>)RNV)pm<&HDQKZ3^fKOBD|DFC=U
z3%E_O7No&lND({%h6V=*KcAnU{~?h`yhtXKFSoX~jH~+
zn3(t)7(zz=K4j;&9a;Kx*+25p-%&gZxG2NuWcn*vJpQ@@x
zBUaB54-6xo7y>>-ywZbs$CguzG-gFglz
z%xXwg@p=~0AmV`mBqj7CiQ#=D^WPJ*0#8ktD0EIJw+a$YzbfO-q<|bq*s~L$%cdS}f
zRVDYow;*1)jd&x5c;#9dKTL5ExY@uJ!Y!nO4M=AjRaLDR;)Qy|8_xK3uml`16XiyA7x_{F?cLNzK?NTobd
z5#}%Es*b8uilQirq9}@@D2k#eilQirq9}@@D2nnQ`5RYU;S5?u4)Op1002ovPDHLk
FV1jjpL|Xs=
diff --git a/src/en/mangamiso/src/eu/kanade/tachiyomi/extension/en/mangamiso/MangaMiso.kt b/src/en/mangamiso/src/eu/kanade/tachiyomi/extension/en/mangamiso/MangaMiso.kt
deleted file mode 100644
index 278f80751..000000000
--- a/src/en/mangamiso/src/eu/kanade/tachiyomi/extension/en/mangamiso/MangaMiso.kt
+++ /dev/null
@@ -1,415 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangamiso
-
-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.MangasPage
-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.HttpSource
-import kotlinx.serialization.decodeFromString
-import kotlinx.serialization.json.Json
-import kotlinx.serialization.json.decodeFromJsonElement
-import kotlinx.serialization.json.jsonObject
-import okhttp3.HttpUrl
-import okhttp3.Request
-import okhttp3.Response
-import rx.Observable
-import uy.kohesive.injekt.injectLazy
-import java.lang.Exception
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaMiso : HttpSource() {
-
- companion object {
- const val MANGA_PER_PAGE = 20
- val DATE_FORMAT = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US)
- const val PREFIX_ID_SEARCH = "id:"
- }
-
- override val name = "MangaMiso"
-
- override val baseUrl = "https://mangamiso.net"
-
- override val lang = "en"
-
- override val supportsLatest = true
-
- override val client = network.cloudflareClient
-
- private val json: Json by injectLazy()
-
- override fun popularMangaRequest(page: Int): Request {
- val url = getBaseURLBuilder()
- .addPathSegment("mangas-get")
- .addPathSegment("get-new-mangas")
- .addQueryParameter("perPage", MANGA_PER_PAGE.toString())
- .addQueryParameter("page", page.toString())
- .toString()
-
- return GET(url, headers)
- }
-
- override fun popularMangaParse(response: Response): MangasPage {
- val mangaList = json.decodeFromString(response.body.string())
- val page = response.request.url.queryParameter("page")!!.toInt()
- val totalViewedManga = page * MANGA_PER_PAGE
- return MangasPage(mangaList.newManga.map(::toSManga), mangaList.total > totalViewedManga)
- }
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val builder = getBaseURLBuilder()
- .addQueryParameter("perPage", MANGA_PER_PAGE.toString())
- .addQueryParameter("page", page.toString())
-
- return when {
- query.startsWith(PREFIX_ID_SEARCH) -> {
- val id = query.removePrefix(PREFIX_ID_SEARCH)
- val url = "$baseUrl/mangas/$id"
- return GET(url, headers)
- }
- query.isNotBlank() -> throw UnsupportedOperationException("Text search currently not supported")
- else -> {
- val url = builder.addPathSegment("genres")
-
- var tagCount = 0
- filters.forEach { filter ->
- when (filter) {
- is MangaStatusFilter -> {
- val statusSlug = filter.toUriPart()
- url.addQueryParameter("status", statusSlug)
- }
- is UriPartFilter -> {
- if (filter.toUriPart() != "") {
- val genreSlug = filter.toUriPart()
- url.addPathSegment(genreSlug)
- tagCount++
- if (tagCount > 1) {
- throw UnsupportedOperationException("Too many categories selected")
- }
- }
- }
- else -> {}
- }
- }
-
- // If no filters selected, default to "all"
- if (tagCount == 0) { url.addPathSegment("all") }
- GET(url.build(), headers)
- }
- }
- }
-
- override fun searchMangaParse(response: Response): MangasPage {
- // This search was for a specific manga id
- return if (response.request.url.pathSegments[0] == "mangas") {
- val manga = mangaDetailsParse(response)
- MangasPage(listOf(manga), false)
- } else {
- val mangaList = json.decodeFromString(response.body.string())
- val page = response.request.url.queryParameter("page")!!.toInt()
- val totalViewedManga = page * MANGA_PER_PAGE
- MangasPage(mangaList.foundList.map(::toSManga), mangaList.total > totalViewedManga)
- }
- }
-
- override fun latestUpdatesRequest(page: Int): Request {
- val url = getBaseURLBuilder()
- .addPathSegment("mangas-get")
- .addPathSegment("get-latestUpdate-mangas")
- .addQueryParameter("perPage", MANGA_PER_PAGE.toString())
- .addQueryParameter("page", page.toString())
-
- return GET(url.build(), headers)
- }
-
- override fun latestUpdatesParse(response: Response): MangasPage {
- val mangaList = json.decodeFromString(response.body.string())
- val page = response.request.url.queryParameter("page")!!.toInt()
- val totalViewedManga = page * MANGA_PER_PAGE
- return MangasPage(mangaList.newManga.map(::toSManga), mangaList.total > totalViewedManga)
- }
-
- // Since mangaDetailsRequest is what drives the webview,
- // we are using this solely to provide that URL
- override fun mangaDetailsRequest(manga: SManga): Request {
- return GET(manga.url, headers)
- }
-
- // This is what actually gets the manga details
- override fun fetchMangaDetails(manga: SManga): Observable {
- val jsonURL = manga.url.replace("/manga/", "/mangas/")
- return client.newCall(
- GET(jsonURL, headers),
- ).asObservableSuccess()
- .map { response ->
- mangaDetailsParse(response)
- }
- }
-
- override fun mangaDetailsParse(response: Response): SManga {
- val mangaRoot = json.parseToJsonElement(response.body.string())
- val mangaObj = mangaRoot.jsonObject["manga"]!!
-
- return toSManga(json.decodeFromJsonElement(mangaObj))
- }
-
- private fun cleanDescription(mangaDesc: String): String {
- // Remove the link to the manga on other sites
- var description = "Link:.*
".toRegex(RegexOption.IGNORE_CASE).replace(mangaDesc, "")
-
- // Convert any breaks
to newlines
- description = description.replace("
", "\n", true)
-
- // Convert any paragraphs to double newlines
- description = description.replace("", "\n\n", true)
-
- // Replace any other tags with nothing
- description = "<.*?>".toRegex().replace(description, "")
-
- return description.trim()
- }
-
- private fun mapStatus(status: String) =
- when (status) {
- "ongoing", "hiatus" -> SManga.ONGOING
- "completed", "cancelled" -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
-
- override fun chapterListRequest(manga: SManga): Request {
- val url = "${manga.url.replace("/manga/", "/mangas/")}/get-manga-chapters-12345?page=1&perPage=9999&sort=-1"
- return GET(url, headers)
- }
-
- override fun chapterListParse(response: Response): List {
- val chapterRoot = json.parseToJsonElement(response.body.string())
-
- val chapterBase = chapterRoot.jsonObject["chapters"]!!
-
- val chapterList = json.decodeFromJsonElement(chapterBase)
-
- val path = response.request.url.pathSegments[1] // this is the pathName of the manga
-
- return chapterList.chapters.map { toSChapter(it, "$baseUrl/manga/$path") }
- }
-
- override fun pageListRequest(chapter: SChapter): Request {
- return GET(chapter.url.replace("/manga/", "/mangas/"), headers)
- }
-
- override fun pageListParse(response: Response): List {
- val chapterRoot = json.parseToJsonElement(response.body.string())
-
- val chapterBase = chapterRoot.jsonObject["chapter"]!!
-
- val pageList = json.decodeFromJsonElement(chapterBase)
-
- return pageList.pages.mapIndexed { index, misoPage ->
- val imgURL = "$baseUrl${misoPage.path}"
- Page(
- index,
- imgURL,
- imgURL,
- )
- }
- }
-
- override fun imageUrlParse(response: Response) = throw UnsupportedOperationException()
-
- //region Filter Classes
- private open class UriPartFilter(displayName: String, val vals: Array>) :
- Filter.Select