From 210441d05f3c78888d878166c9a9bcbae60fef07 Mon Sep 17 00:00:00 2001 From: kasperskier <95685115+kasperskier@users.noreply.github.com> Date: Fri, 3 Jun 2022 19:15:42 +0800 Subject: [PATCH] Add Roumanwu (#12050) --- src/zh/roumanwu/AndroidManifest.xml | 2 + src/zh/roumanwu/build.gradle | 13 ++ .../roumanwu/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4008 bytes .../roumanwu/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2091 bytes .../roumanwu/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4847 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 9515 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 11725 bytes src/zh/roumanwu/res/web_hi_res_512.png | Bin 0 -> 25998 bytes .../extension/zh/roumanwu/Roumanwu.kt | 130 ++++++++++++++++++ .../extension/zh/roumanwu/RoumanwuDto.kt | 94 +++++++++++++ .../zh/roumanwu/ScrambledImageInterceptor.kt | 55 ++++++++ 11 files changed, 294 insertions(+) create mode 100644 src/zh/roumanwu/AndroidManifest.xml create mode 100644 src/zh/roumanwu/build.gradle create mode 100644 src/zh/roumanwu/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/zh/roumanwu/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/zh/roumanwu/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/zh/roumanwu/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/zh/roumanwu/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/zh/roumanwu/res/web_hi_res_512.png create mode 100644 src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/Roumanwu.kt create mode 100644 src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/RoumanwuDto.kt create mode 100644 src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/ScrambledImageInterceptor.kt diff --git a/src/zh/roumanwu/AndroidManifest.xml b/src/zh/roumanwu/AndroidManifest.xml new file mode 100644 index 000000000..30deb7f79 --- /dev/null +++ b/src/zh/roumanwu/AndroidManifest.xml @@ -0,0 +1,2 @@ + + diff --git a/src/zh/roumanwu/build.gradle b/src/zh/roumanwu/build.gradle new file mode 100644 index 000000000..6244ab8cc --- /dev/null +++ b/src/zh/roumanwu/build.gradle @@ -0,0 +1,13 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlinx-serialization' + +ext { + extName = 'Roumanwu' + pkgNameSuffix = 'zh.roumanwu' + extClass = '.Roumanwu' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/zh/roumanwu/res/mipmap-hdpi/ic_launcher.png b/src/zh/roumanwu/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9fa8c768d29cef8ad90a5b5f65ea08fb66c40ae5 GIT binary patch literal 4008 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 V(vc)Sy@db(002ovPDHLkV1gL^{TToN literal 0 HcmV?d00001 diff --git a/src/zh/roumanwu/res/mipmap-xhdpi/ic_launcher.png b/src/zh/roumanwu/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2a9e663bd1ce38dbb79928dcf716659d442a2ae6 GIT binary patch literal 4847 zcmVvtzleKQ!`bwwg0&0pWUfi&p3etc`)8_+1P*y%2G?MR=0A_ zIg@0PF(4b;*f7`_8)Jl#2og~!O9X>Z1c7q+w$6F)R&~GX*FkDwg}zl^36J`zrSJFM zbI-l6r=BFahkLk(d$@;txQBbVhkLk(dpI^8a!aiTWxOOkEJ@NMk|aGQNz&tzB>lrI z*W-#8k0{(M@Q=? z(?l|$ukkv%%P*q++f(Q+zkvQ5xA}j!bxqs;?@%9Egy#I+XfD_zgqEUG^fukF`JMx< zo#;4HftKuDs1Gkdtsz?o*NRFV{nbI6Ba_!pCH{^0FSTrDa^U1&a9 z3in#*X6a!Jb=|dkUB}lIs59oGF?E}T`OW!z7|7L4`!G5e6n&eh^-;a&^Fg=&Md z`Db<>J?+%rKpv4-%1n6373NcI`^Wb7_LxaEzpV?6iCfrw20-amLAX}(DF!>bEv~y) z-GsWZd^W2obB84W0U>`k?wqX_mtf#l2U@Z}Ky644Y7IGTc%3O1*9!Ka>-)2~U)zGA z?jD=7&ekBW$TP*ei2~s1^e?@=y_X&R1;&O)Fw)nL(f&bBn!Q1OIQ}#|Z z0M_*#2Qbn%Ag8T=5KSpt**u;B8QWFH%jT0hzB?n{jmwQNzbW~BbbeETk^6nF$`Z&c z@=WpWp^4W1pGlJR?~W|E-DT%ES@jVGTuVs}F&lB?{r%|px}1||ZS-GnmCY9bLi14{ zv%x9=Qrnj&_`1$-Ps!#h02&fDYs~<3mQ{+k<5Jf4#WCC|zkspPF}Qk=SLB)E-GtTx znnF)VlJp;rym3?NR$;tas8haP-?R^XEjKN$BO`?ILUo~eXo%Y+FQmf!!o6rN+=J%a z4{`rW6EC`CyilDf4^7!0SQsxB<$+u6540mA&lK+-nJ9pNk|b%4BX3HJTIJ2-!ekKLWmV!bbbWWmBK-mYE4%=W$t7q?-;Tz#ZJcs4x<0DN zBK<;iZDaa&#e5lpm@#tQ8bjaJTimjCov6a?1K;D;r{ALO&!0-&anwG!cMbPbmOm&|=q9c?BcA{T3aNwGw0- zf^`7qYEF3{LtQ;+KXd~15ry)?8*vSD+XYQ+09xbb?k}A)Uc>xa zF$+w&==#1A%^5p{@j_@!-Ku505U(>`Kb)T}0KhY%C1;m|<;UI($mIpPKC)14zDD`6 z4x**FRBokb8UX71`&(|J`-k(qSl_9*h~9>482GV`YqYuf)gjq9r%%TfV~#_{%QGOy zs_{Zi89N-B0i>Sub<+g^FmkUK-6yKhcJMe_OAqtc(E-ctL;vkgv=r`9cRjMg^0}2Y z2XHnp73Bd*IHOCpEI)SYzbya_iCgTYUjRVYiF4Bf0JWeEF~!_w%90JeU)>~Lg2C>) zxDZpQ)pA-bJr{yAP#%zoa{okJGGyAT{WgskyWhHq0>xhI8}O(t*@yFFqP6sE)qYbRPU(^uz-jYYpp|^1Jpi&Al1l8AAT;Id;?{Xu z02mt@#+_4__(ap%pkDlxAsv@OvYqYu6d_VzXW>_cz-}` zDINYb<$S;$60H%nrd(Xj+dWg-P~iUcRt8Y1Pj}RKi>`+kV^M~*YJW%$E(d3_`6qqj zQSK`M2;+0CpZzQ6|FW`J^gGdwpqT=Ica^6@vrw)}LN&FNS_`iRfb;rvF$-+g{tEv@ zk$#4uuKkVxpml7#rDsa-1DZeniUFJoOqTn4d+8SdOu4uclFjKqrz%0_egC<@G@SHJ zU|kGK*D5<2#%J^9?beyQ20&xDw;xS=58;$PjX?+z5UTT+L$Yjc zwzRsQOZrSD{qZ)_PuF%FDOcYkwq7hu-r_s1ZfB+dz{v10t~b@Ax#kj@YcAtRcoM!gC9n?LlQG_&(0Hy2%~vkr zW=kW#*JO`r1>n+|3T#Y_L~eKxHYbFu6lPuVvNj3Dhgw&htc`IdA?(OZKuy&dHvk&d zm8Xys7KH53Kx~LJO%?!biZihU1o~d>`O4W1U~pgno06iD9jZfKg#LjTZ?2tLi5MCj zn5_VSQ{Nroowj@TNzxV!Z0{|R5_!*l|+87t=Dgd1RSl_h_A=4OO4*)jC z8gcUQf!PJ%e$QRxM}@HY`4Pct?oy}U0ziu12XX%Ed3|se0I4WCgs*1^K5J1JWl%$~06;qW+1}X!priE`_xqgw z$Y6D;L2kGnaenI&>$e_RCY__*j=JARL8M**um-7mAFIhHZBRt-(bd*E(*Xc~-?Kxc zpA9rOpMX$u2|$9*Q#RGn#5M`PE zq8KCM{XG!tw~irD85ytfS_`f@fDLNJ$Y0xT-k7NXfPE!JY<{*$mHzlJqy%|$@<|0z z24|CRv)9*3zZwKVIIv^$%mi??p_bE6b-gg!U}1hiWH2Y6l%>FNwC2;bw5B*}yw&8h zLWFRmseYyb0QMB;u(|5mPXIEhcUMZ!MqB2q0Bndg@pZJ=W{WznRetOw-yFcFC51B! zKx6eqUJyx~ev7s;jL(6{{0yVNv)v970zA0Yq|H};M38gF$66Y1u9lkWnE_yQWCYu@ zli7UgMnqq)h9FKT9R(n2etx7LvA*lL-6ROKfpZRkbqITlGBG+jGTi|Hm(Ns)^o!2M zVsT9}1R&hs8(HD{@t$h(8bAO@nIZo6Oh<+(5TQOENC@(^YJRcuwf5YZ=?!3HWCSH? z@pAgZ0xc3B=I4#q7QT+>UtS`FWy}7CRAb<{I-Pjh`TDHkU9?v6lMMk_vSc})eQ|*h z=DoTEMz8f&A?(Uc;Tb$#0id$%m`Fd0VnT$eF!^{1)A9Vvi-qv~yv3OJ>Qbbef*eY| zdA-jH4d8Wz&wkYDk2NASM28n&USwgu(6cYjhrwf=FkX=X#nA>_C_g?u0Sxr_p*TLA z&Cd-BvPktS3zo6@3l=X&l+Kq85B6G*7hYb1=jJWOx_4JO3&38Vk2NdaVYC18(n18T zUyBrjKO+3R@XBjT@$3up8IA>jXc@q^v{(%G_fIzfK*iC+$T9}7ibeVrty{Sgi2HpBmnQd{SG4hJS}RzdGgIg$JK)a z{nG^iaP;#}kY)6j)6XZ3THQ@3mMr~0E;~N&y*Js$3&C^MO8oB&^RaN@GGV-y`9e5x zX#ey8(9_+8yog{1kQW|gucybN#mgCh*XjoaAOs#O-(>()dK?8nyY_o`x~Dn-;G54% zk!kd2@i}{3s8tC=SH1lXo}0G_VSZlrPBI;>`C6MRA(*^97{EJkz9rZE7=umog^nNm zbZP_WYP-!{Po{bLqkpF>9s zLiAarqG(6WmqpigceG7a0KgX?yf4zvW~meJP>InhHHxubt5@UCFD(?ppI=%a>%|4| zTD3~-Vzp#hax~1(4-Z0Nq~7ZHzAD{0H38hZewFXxlKJ@&dUevBGhYKhh?j>j9&_g{ zM*N#zhP{Ixe2z^n6@+DX3cGLvJH0gw`P9&(vd z>EH)jrWSx}jrDv8Mv~L-Y5+#08FixMVB2bgFkc8;R~y7E;67gqfFrd&F<`xbfaE|= ztFQU7xnXJm7#kbIhXq;44DsXiJ8QTweS@90GB(hc%_oBocti=~Q4=KV!1_oTzzg#c ztMhR-`4*zmLpSpU1p3?5ulZziKL71MH2}WZBB$SvZx1?aKDCTVfu4MtS)|lhYXGvt z^#TC$-U+ZUpOm}8pAXdtKz3NrxRP(K!l+1Hi}qfFXz%y9b=5k{Ay9u^D%bfJ=PtrWYr};3_-Jh?UU+FC_x4MdEO)5WaYXdH ziCIvf?uw!fC@sqRX#re3U5<&0oVafK#glAjXIUy&s;NyO1GJ z+qv}B*IAT$GXF0xE#N&u@pzN3o&{0Ci1S;EIN!BaJ0em|)#;xG!0^x@wxq@~0NQ-1 zji$wzx(N08ybynKO-VjYb-J}^@6!sT=m2lNi6TrFn)}LP{@z4W@2u#i&G69Bg9ZSc zFE3;BNt6_I$|=#&K5LK|;As^=N{|w6dT6oXLI_6v9e+GA**Pmv}A_{SUt0$kCDXkN67u{8E$V! z>ulj1U!w&{Pe{U}eqK*7V??|{4_&s+)MSMBZXR}O!?Tcn>CR{?-vi1dqgQW)=20F%^8%6IPqUGlSzef}{$ zL*|O|{D6r*z=0pXK@X$(S+gq^FgnTD#(EYLGWCV6IS_kY31pS}G;b6UH?wu98ROmEzfB zu6UN1c#;wk{p~NGdg@PaFMOpyzxu8E2+x(nqKg=>BFyDMS~;y0?(yz$(8@RK$rJL1 zJW{;+nX8_r_mJ{bxF?iHGyO)Ar2mp6>5q~m{kJ4Zf10h5B5c=YIGJXKXZ*6?xVO@6LCEsoywUuUVF zR6O{(;>qKRN0aq@Vewd7`O&t@A~W0dsG>=Ip0E}Sw;q(??%^Kp;U4bc9`51V@&AzH VJv44PJdywa002ovPDHLkV1n>?Z>sVWhFD*H*6g8qrav)+{D(bAPjU zA-wq5kVi7C-Nyy1i8g03CH=ow7kA(OpKCU8XacKmuak_se|s8*zE>b1y8|VkFh!n6 z=P|AlUso98O>c^TX|JV&E|*pI zug6KtKht|Fb}J<-N2@riYB$O~weja1EPfH8;Dv(161{W2{b9a?m_RS5CQ_8g$KxkY>`T0yfA@-RnF4WoMikvw zl}5SF^XQ1AW^!T{Da04Hp6O(&+?&|q_`Im=@M}5G;^JOPza3)$Xzfni)%D^qFfb6l zw)FvReAxws|AxG;;pY19{{0c6`B;s|eklTOfbR5cf`aDdW$R#qO`IrNwWJ==|jHw7p`AKp+TsYYI!)SA&MT_CqGFrrj4O=BM^Y^nT9T zEV|Cjn+jc@I!@h7pnY>oo_mt`U$C3x|HpJcC8#g}q>DXysUR%B}kqbRF89@MJ-t$DMT5%B$ zHntlc!|ewMAAe|&)`C?6QEk*UQa$PK z3=h*Bt%DE;KPYws(H}|Ta_1N+Wc6UI38|7{!*B0faB~h8a4whj{{ovk%F$7LA6NXE z2C&?zME!gOj|%71jJ&Cz)>a7@?)2s5hhd#h42(_%#9>Qq41vY^Bmf60a7?-YE7;5( z^<*xI<4X7HvzDe`_`eh~UVN3l=~jo9;4uClVC5exC>Zm#Fb=NBrh7^^>-7@mEj@L1 z+Fzv+Or3?7ZxL`~p=MnN#M>08=>+AZA#Mn9!b(_B)pIW6(CSxrcY|vXqL5|%xJe$- zaPkVhzB1b{W=82c&%WPp>0zDmII}`p%k}-ePzwo%mgd-Rp|WD2ryF3ph-KsVv^S-% zo#Yt{Y z`A-9b6l?b0ERiGIfGh&3(rm`ab1bEO@DChTs}i5MRrgDWb`qnahF}-{Je)C|Z_I@m zEf;{<;wwZ$| znB$>GUU6Mp!T%a?5Js-3ZH+>$Z^y9Z?*5ZKbRVyTr+(we9|WM`b9-Gh_rE-fTRZ4;wGDlqp1M;Voe=@>EsaVylRi7r%TtL1*`-`$vZ|f;{^_0& zRyIV*CYLa4S0}PU+c08Ie7ZWTyU)ceQ*_N895!4eJPsA)E_Us@o<}@)c8u1r{V$9ph4x@d2t{6xb$wq(y3kdKi$HJa#ru}MQ2v0 zW3E4~<{0n&L!@d`BZ(W#*tqc-&VpfebQuJidAt~q=#|JVUN*=VlSq5{R0Pbw9bYRl zs&rT-qX{#`W!44UXU#9}dVnj~UfMZ5O?7dRdw8Ha^8qF|&4*dnzA~T;xBC~_mRP+3 zT9B7g@e@e`Jo+#KYO5AjRy+t|UI6}>&^XcTOVwRiSxw%s0lmcE`x04$o@igaF~V40 z5FH8LuWajgYO?xAlGcb3D8$~E>(u~Hat1_R=#@p zOb5Nd70VKLv){n|ym&(X4MDMR)alU;>S6K#PGu7Ecot*>(}A~>plnatoN0dOf~ zl;(vA2=l1I$v@?%uwujtW6+WmMAxvGS8U!M-NUQv$07OGl6DyTn6rzCtW!Eh#J1J% zwH&YH@J0XwDx7E1LS#dYufxG-f|Op_bE-UTj~HYhRvK{P8hqY5j(d}bt@JPGdQflx z&KpKlaCTI;KPVLra|e{jz?6#&g^(Gcr3>K=3`U=Uc||{&r8H204Drg3!DWceNha;W z%hXzmbhN{R!>%^R14Nc7^F=ehTF?cI#>bY)jMRnyB4O4>fwo{|eMB82f8h-=a5_SK(m_)(j^IgmszRJU3NhXV`&KDRh0I zb&V-_;@X!PS9YpEjyv2F5l;T*WVbaoqq8o!pbtaRhRVK;0;6sR3Idn$cC_>_UggT* z0RM^`5T^4V{!I-O%ZUz&ep>R)U;gUjdLzQtQK#|l;qWcC)Jb^~R>-|}xY)3398>*Z0b8~&PPk#_f0eD!Vx`RTbm z^7)2HckO4&YS(CXm3SSEsEJkq)(qW++4@or^au$k^`n`k`Uh=%-@LgxIqFhT!!0w9 z>iiQ#-77fJD_}fi9)KHW!J+Ufxn)HrWU%*EhMPyTg3sMxr1g?urrx+eaX;{vFb5fC z%46mIA+OEI`Q9uT%WbCz`gn`7z&^F%DZv?==JG=}r5qoFJ&B3BtLBtN5&x*lZ5n~0 zqG-}og5HF#Vz7p$Z%{YAsIe!53Uu-hchIq3L7*IkjR|D5Z!mRlkKyGHC4EaIDxZ5l z?Np~I{u7@EWNh~8jk)=#mmybd4W03{%aC#kRMzQ|du-`9yZ(vlw$!XU>Vd#hKL29k zk3PI#(>zHA?nj|YP6A*ohJ2W3xnk#6`VU53-Cw(sHefq7XglhXxUnJTYZ>ACmMbzs z0@>QRxW(40-fcVc0rKa`!RFXi8A? ze|joGu0P`WFyVlF3D`+-un34%h7+kBmfFp;kYw>}$+7pGjn9|(XmPWv>tQ<6=>HS!?`$PZrzsA(egKn>2S6_s62JQ2*{E+)7%h7lNmK6^S1Dr+WHV$CNX)&YTqgp zSU1vTB6k}aG#qj;pV8mhP;VWfS1OeK^SgS)`xd-)aeG=XUB}$UN47@j?k$PYQkPw{ z>+A6J4uR;zLGu!m`9Y#03*{-}YRuuTvv6{Uculoc1ySSO{rJ`&LAmL0OHKih(V_2v z>z=pa*H+xXKj&*Z_d;?@>0ff7w(U{VdYlu9Jb03*11(ot69`u-n_2trrge9LA9V!% zgz^Gvi5$)fgjs_+$-Lk!PYT_U^tf=|Hl%hs8~TbWFa*^;szJ>&=LizQG-JwsIe5*5wQSSf#8geB#h| zu>)EgN;X#Kf*gnWezp$Mtd$PvGbvTY+RPo+XUB}B%o7)%)mrWT+(}lhT2Wd1An^F; zQ=sr?p|Tb?cz*y{A77J|wKf3#&KrGkfdeqfo^$hrGG)Ios;KR5Mw?j2q7-Cd8^HKQ zb0gagNxA(9t&B(hP1Q?L@-*t8)rPy8?9F7~R20v+wwC`z6;>ltHf9*}k_>y%sc{2p zc{}Hv@rYp^%u&GtQX4>ru6(L#U>q${ZCd+*2~~PztAFP-p;JJt+BDeC5=SYf3I7Uu za+;grcJh81Dp7;COtn)vp@{+%I{5tCoIHxTCwJV9jY#tX*ydeZIM($!c;_#~3T<@P z+t6zx#y=y@)!E$LsD(PCs4NXjC+|3`^2*)D5n$$cK6u+sQ_W}PMKSiVA=jpD@fP} zL^E1*a}$l?>3C!$Grl<$aS*R{!|aAKe*ZecG{#aSwa1%5fgZ zaRNd~#e8`@zpjDdEUe-x`mZ846t%xovg0sMZn({QMRlLo3sgY<7!*&qvphqaTH)rU zU6Up?EWFZBY1Nf6Pre5W=2j(bzsBYPR;j-(ey=^2Kq5XF+r2`m=b@8ES8nAF0D;eS z(}Vj-#k^93dm(=U>iPIlcVa1|jf|?1#=8x*Y;2X&$i`0Nlj)^P@y&W#u)b3=-T>uX zvA?gpuQW)AEO&1}6T@5l*V<7g@r!VDrI_pEg2sG80JbKa=NC)ehC2@|Z=v`=6Bmp9 zQW9A*pTaVhQbHwD7CAT}7(yZ7;Fam-H~`~e07RtjJ`B>Xh*b3g29l?*{vz=uZOePk z!3z6ulkGSGcQ9o$=~o;GIKbug_n&yMl+)*4fEA=oNwlo}0lOFDI{{@9TP)e6T{%dE zV6gLIeo}%s$ERkVZeF!Ie=Ga$=Eu_W)~728B{DIDM=?bPa})?{vt4*2(mnt$DC|8y zQNYMz$B`fD%zXTq$cm%D^g)5Dy6V?stPq;mr-s;*f0(^zlmCMA?P{PUb*$_4tDB<4LT5k)5#CThSerpFf7VN zi2J#be4{Olt{UWi5p<>7P`G|@-^JqQ;Z6p)HcnuyHdc&QJq3BL(A|1f(+WAPU^`xlue}s#!$>P;XL~KqKUQZ&SsF+&@jsq z{RfLPF)9aBB!B_)kh|T`?HPE8~ zjo#wi_}z1UQp3+jR&Sp(VTT**498+i*bE@UU`hBxNqJ~`p!)fpG6)wftsQm3w{6;w zR+R6%?a@;Un{BNxEd*}oi$59Y`)~o8ee-e3T~rHi)lmtU=8(O8QC;4QeF(*}}|07%uSK;(cVD^UgL73eZvOhll^qh}CI=oJi2( zO4xcP-8Mc3-uppqCXLcIkRH73_bV}R1(M0`cR+qF2($6$0^77ctlq!n_9uAO2D{Ga zuUTWXlp&|_ZoLC@41E@&QMI-8;~^682U1W1*l`%fyw~KuZLS0_*iq@wy-lZFU6`^0 zY$n5`EE(YKb*f$6MQ0+l9I2H3(_hMd44QBn!!A#+(*zS_CXrL-At>V4;M#J(ipWP3JFbYm)|=DT%s~p5 z(fG4|NiV+c&mNyo!Ni$01QS^_aZ(Fyn|c@kY8zh`Izkg;lhyJU zeF0-aST6|dqCQOtrZm_7%*C2!KS94E6;@{Yo*?h<-GV2hxf5v$cfjtm-~G6Vk?i~i z>UdkMkf(=EL~xiX)t-u7plX(#xQYako=$>P!O_w1NEqMrPilLNF z#$&0|WsIpE&Tp8FD%w$+ddQDcXYs_}MSM%!OMWLXwHHsqw~-Zyke)OIr=|JEc3h0|}+ zmgFvh>WRyuwokg9ht#xRNxTQyU%g1Og;@ueb(p9GDg49gs98C9FnavX^=y4^@U~io z@O0<<2CuX~|JO{a5u_(v^Jt*1QBs71<7@~eaR6lX#^+}mH{-!vzt=@dQ6G>^0H3x` zA>r3wb|2P5sXKRqZ;~sJQ6_JfRhUTo+Q(h|?~`HZr+tD$@PSVuBiT_M(KFv@?ZHnx zCglFUewzZ4=(iVE1FF<|$*Ntux~c4Bm2s$Itco$(Y57+o!*28HUg{)$pFK4;oaq(P zBXzhfjju;^QhA_dn6pudr(IErbA(%cl8D8zS}l+nqg8YPBVVSi)R%bCg!qiXWv=2!~?5-*j4rm8y4cPWbGvi!bmji-L3IUyySKC$_Beo(z-de%|#!!dLzhpcmCi2n&;@*`H-t`+d_$@m43;y z|1);prD?OsD2GMWMXupvB?iCW>RPL>!-3<3d$F&qPHRAw?hUdtBy0LHXF%eP%B{F97{OgYxc+ z&d`^wp?8wU?_M8WHL|?E$&Pa-oZ|6ww#xZ!H>`PD!7u2$dHoyC@E#~9+sMLfKL6nh z)&^#EcYAUb38b?w+M}qIE51_n z!QMbEBI}spDj(NM`*4w)Q7QKAY4G{aRQhXYO>Bjj-pf*MIj6M$=&je$rJRGC| z2j=DN_CyfmID5Je@fg6jMlP)E-LFmbt3+?bTy{Ts4UIL(v&pchPwvgZJ;h6R0bh-H@tFUU;@89DeB-W{ErJGv`5Bafnjq1AX z1iR>pB0RgloK-Pqw))Db@r|_GY3B8GA0H7=$=|+N7fjBHdto{D6_2EiF0JMR_jgA@ z&pg2ToTYV5a2PlHkT!Xo_8c49yFMA3)5^x5r@udH6A-Qysn1^vpgPloLQtvs7y+E( zSl@}@;ThT2X2Wj-3RL=d9cS!VJU4KvFb3_04g0nteOrr6lxxQG(eOvJ!I2NC92oH> z{}5corY-3T!t7dq+`aMN2uPi&VAE=Z%f$VN{%%U|Y@SiIcY?edD!d|A%J$>}-a${x^yeY z?*~v1-_Gr5=Z1{zU1xo&NlCt@>Koye)|-Oh(S`; zvxjwv)9Zw5u02_gRP(c&0R3k#4GCHt_UQCq%Pwe;>k8@E9kJAc0g7rz%gxFBWd zq_wS+bZl1mt@YC_3kPWnO5z*-X)0Q2#VNOm;#Mh;6$z9a17Bw{uW8>7k$58H-@1SH zDjaRgTK`j@$bL?1?;pNzT9JX5|4?>DI{jlb&26Tl5`P*y)MLi3&|K8`Iq*owWPvtl zUbWs8Wv)7JJ1_mN*Y2uS3?u-;&4R*BrM*`z`$F^Vmh3wo5lF8Nm!E1bMX=wj7HzOb zxHS6HZ839Vau<&#O@^dxSpIdgD!PrH^x?A&zzs1o>AT&V#4_%)<@RLhe)0Ln+8#(j z=*)S}bJ~f_<%Lqk9H(a#a{KWgVpboa( zj{+3bIV@KaQMdFZ$x%MWfP$31f^qEM;pIz(oiUkJ!GUrFd7fO#$d~uGdxwEMlXOU2 z-_eJDDXay)29|v|5FY|0&nt~oIgd|-M)G!GRtA)nJqEY zs+!kEr)Kvm*6ZIHcvF%sp>Ajtu)ea`#lM=wB-qcN&8AR~fk*n7L55OV`MQjLF*2}K z16a@Jwagd~hjGbV<+_KYA*L73OHf`N-Z@1ju|4S~d^v|?9hz%wI&*aq(^yY{{Q~zY zB>ad44~!#hZM332Rf={uIL`{1Zf(C{j!JFHI^B9HeZi!UhDz~CK$S%-CM1|NR?zy2 z%tO$vT9r!^7slIQN4HYr8MzWu;$l^{=r-HkQ(~N$Zy{ox>A)J0lGhucPC{n zy9t0~N&b%JO)sBBSWO&vz@;JMd|p_XG`Cb6>js4?z`C6w&5k1!d{mkII-ji zt^HJLMD35<;aZ=AKu9elPc3Mhy1#y)@FX`bDX-159zaI&tMI~71xEf2T=&61{icRN z=@7%DYtEa)Y?Q0i3@bZ9Jb^C8;ablGW9CQW#{O;ys*Xx7iRjZ?+>$LsZ?>Cs%^2dW z`qXs!2j%4lNR5+k3V31x)e8RD*_P~jYs=)Lnm^*>*MPp@3A|v zQ_21`btWzAorAv^&WswP02-3ok=#@N4V+NPHd5t~&?+O!8_ex7Ka?~AN~Hs#Pxi7F zhkhOu%|b#{Zv&>(H1_b3Fz}FQl&GfPKl<8~h;}FTFc{rNy$cf#$kV~CY{R>WxO9$d zGv;8(C+4}7y0KNMOZq~cZ+kBU?eFMljnq)o)*dere(#z6LIgn>-DC z<2crBIWPww<>0|NAb>)&;h?|dEVw>V)Ol%CMktciJ0WWQVf-ltbFN zSiq=1suNkbOQhB>=uEnoT6TuiO3&RwEq@w@58=L9Kw}b@G@P1mjpMg-g;M%!ul{@q zRcW6o7UI?g2+v14?Op}5&gZe!iF~6eEw6_G8BoQPs7u{!O~%&~)xosti$J=3&5&y9 zJSCo5UN=4#K%O|gpoT_Qx7h1hYhe*_HldGJRcJu3R_q`O3)N3_8X}`VAzzu^(VUp# zyiufrE!rk{4T|XMj28dG;SX?n>QSlMf&|FjZp7BRNOoV?jL-^?f!*7Cb@iEOw>dI&=rAKOj2zP!8~6u-;!WHRWiJMktp_w{&AKGZ*F4bytrLlP(Fg_lK8sTxgMT;}8O2dL8wQ zX_K|TfKy0WsQ03Ai2{h<=wxo8&Ehwi|AKr?@h9YQ?iVE_Rg#PzcBr0jUjQ8Mo1`P_ zSul9qvLtXXC+=n(Ey!!7B;9HbCyOW3t7yN-R;P7LAtr8$yN26qiStE`KQ}m& z_bYf|riK3<);)u*H!q&fkX#-1kW^WNMc;{KJ#*K;qfrE-8^gYIvvfkRGhJX_s=w{k?zRr8Nx^~4TvgHgN*;AyyDCVaTJMYpcD8tYkk{4pn=J(ObDS3rFKJ~#XM zAv*72(b4}Z>dl7XZCv=B8p9EG25%+Pd1cz8ienqDk?y7*cLSfy0(STINPzWd^wYSG zTE=!8pEJV|&e5Br8 z^hO@;cz&$cnkLYM!5y`u*7s9dX{>199SL=llKr2dBAlB-#%HSB*TQkeyBnWghM)klQlBNOB)$aw E5A7YM%>V!Z literal 0 HcmV?d00001 diff --git a/src/zh/roumanwu/res/mipmap-xxxhdpi/ic_launcher.png b/src/zh/roumanwu/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd5df0f8d5b7d36c906b5b09e0f2ee3f1ff037d GIT binary patch literal 11725 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 literal 0 HcmV?d00001 diff --git a/src/zh/roumanwu/res/web_hi_res_512.png b/src/zh/roumanwu/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..d4ee5b66b6e3f2521fddf1ba357b2f27baaf396f GIT binary patch literal 25998 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.getSharedPreferences("source_$id", 0x0000) + } + + override val baseUrl = MIRRORS[ + max(MIRRORS.size - 1, preferences.getString(MIRROR_PREF, MIRROR_DEFAULT)!!.toInt()) + ] + + override val client = network.client.newBuilder().addInterceptor(ScrambledImageInterceptor()).build() + + private val json: Json by injectLazy() + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/home", headers) + override fun popularMangaParse(response: Response) = response.nextjsData().getPopular().toMangasPage() + + override fun latestUpdatesRequest(page: Int) = popularMangaRequest(page) + override fun latestUpdatesParse(response: Response) = response.nextjsData().recentUpdatedBooks.toMangasPage() + + override fun searchMangaParse(response: Response) = response.nextjsData().toMangasPage() + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = + if (query.isNotBlank()) { + GET("$baseUrl/search?term=$query&page=${page - 1}", headers) + } else { + val parts = filters.filterIsInstance().joinToString("") { it.toUriPart() } + GET("$baseUrl/books?page=${page - 1}$parts", headers) + } + + override fun mangaDetailsParse(response: Response) = response.nextjsData().book.toSManga() + + override fun chapterListParse(response: Response) = response.nextjsData().book.getChapterList().reversed() + + override fun pageListParse(response: Response): List { + val chapter = response.nextjsData() + if (chapter.statusCode != null) throw Exception("服务器错误: ${chapter.statusCode}") + return if (chapter.images != null) { + chapter.getPageList() + } else { + val response = client.newCall(GET(baseUrl + chapter.chapterAPIPath!!, headers)).execute() + if (!response.isSuccessful) throw Exception("服务器错误: ${response.code}") + json.decodeFromString(response.body!!.string()).chapter.getPageList() + } + } + + override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("Not used.") + + override fun getFilterList() = FilterList( + Filter.Header("提示:搜索时筛选无效"), + TagFilter(), + StatusFilter(), + SortFilter(), + ) + + private abstract class UriPartFilter(name: String, values: Array) : Filter.Select(name, values) { + abstract fun toUriPart(): String + } + + private class TagFilter : UriPartFilter("標籤", TAGS) { + override fun toUriPart() = if (state == 0) "" else "&tag=${TAGS[state]}" + } + + private class StatusFilter : UriPartFilter("狀態", arrayOf("全部", "連載中", "已完結")) { + override fun toUriPart() = + when (state) { + 1 -> "&continued=true" + 2 -> "&continued=false" + else -> "" + } + } + + private class SortFilter : UriPartFilter("排序", arrayOf("更新日期", "評分")) { + override fun toUriPart() = if (state == 0) "" else "&sort=rating" + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + val mirrorPref = androidx.preference.ListPreference(screen.context).apply { + key = MIRROR_PREF + title = MIRROR_PREF_TITLE + entries = MIRRORS_DESC + entryValues = MIRRORS.indices.map(Int::toString).toTypedArray() + summary = MIRROR_PREF_SUMMARY + + setDefaultValue(MIRROR_DEFAULT) + setOnPreferenceChangeListener { _, newValue -> + preferences.edit().putString(MIRROR_PREF, newValue as String).commit() + } + } + screen.addPreference(mirrorPref) + } + + companion object { + private const val MIRROR_PREF = "MIRROR" + private const val MIRROR_PREF_TITLE = "使用镜像网址" + private const val MIRROR_PREF_SUMMARY = "使用镜像网址。重启软件生效。" + + // 地址: https://rou.pub/dizhi + private val MIRRORS = arrayOf("https://rouman5.com", "https://rouman01.xyz") + private val MIRRORS_DESC = arrayOf("主站", "镜像") + private const val MIRROR_DEFAULT = 1.toString() // use mirror + + private val TAGS = arrayOf("全部", "正妹", "恋爱", "出版漫画", "肉慾", "浪漫", "大尺度", "巨乳", "有夫之婦", "女大生", "狗血劇", "同居", "好友", "調教", "动作", "後宮", "不倫") + } + + private inline fun Response.nextjsData() = + json.decodeFromString>(this.asJsoup().select("#__NEXT_DATA__").html()).props.pageProps +} diff --git a/src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/RoumanwuDto.kt b/src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/RoumanwuDto.kt new file mode 100644 index 000000000..b309f8998 --- /dev/null +++ b/src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/RoumanwuDto.kt @@ -0,0 +1,94 @@ +package eu.kanade.tachiyomi.extension.zh.roumanwu + +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 kotlinx.serialization.Serializable +import java.util.UUID + +@Serializable +data class NextData(val props: Props) + +@Serializable +data class Props(val pageProps: T) + +@Serializable +data class Book( + val id: String, + val name: String, +// val alias: List, + val description: String, + val coverUrl: String, + val author: String, + val continued: Boolean, + val tags: List, + val updatedAt: String? = null, // TODO: 2022-06-02T00:00:00.000Z + val activeResource: Resource? = null, +) { + fun toSManga() = SManga.create().apply { + url = "/books/$id" + title = name + author = this@Book.author + description = this@Book.description + genre = tags.joinToString(", ") + status = if (continued) SManga.ONGOING else SManga.COMPLETED + thumbnail_url = coverUrl + } + + /** 正序 */ + fun getChapterList() = activeResource!!.chapters.mapIndexed { i, it -> + SChapter.create().apply { + url = "/books/$id/$i" + name = it + } + } + + private val uuid by lazy { UUID.fromString(id) } + override fun hashCode() = uuid.hashCode() + override fun equals(other: Any?) = other is Book && uuid == other.uuid +} + +@Serializable +data class Resource(val chapters: List) + +@Serializable +data class BookList(val books: List, val hasNextPage: Boolean) { + fun toMangasPage() = MangasPage(books.map(Book::toSManga), hasNextPage) +} + +@Serializable +data class HomePage( + val headline: Book, + val best: List, + val hottest: List, + val daily: List, + val recentUpdatedBooks: List, + val endedBooks: List, +) { + fun getPopular() = (listOf(headline) + best + hottest + daily + endedBooks).distinct() +} + +fun List.toMangasPage() = MangasPage(this.map(Book::toSManga), false) + +@Serializable +data class BookDetails(val book: Book) + +@Serializable +data class Chapter( + val statusCode: Int? = null, + val images: List? = null, + val chapterAPIPath: String? = null, +) { + fun getPageList() = images!!.mapIndexed { i, it -> + Page(i, imageUrl = it.src + if (it.scramble) SCRAMBLED_SUFFIX else "") + } +} + +@Serializable +data class ChapterWrapper(val chapter: Chapter) + +@Serializable +data class Image(val src: String, val scramble: Boolean) + +const val SCRAMBLED_SUFFIX = "?scrambled" diff --git a/src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/ScrambledImageInterceptor.kt b/src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/ScrambledImageInterceptor.kt new file mode 100644 index 000000000..a87222682 --- /dev/null +++ b/src/zh/roumanwu/src/eu/kanade/tachiyomi/extension/zh/roumanwu/ScrambledImageInterceptor.kt @@ -0,0 +1,55 @@ +package eu.kanade.tachiyomi.extension.zh.roumanwu + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Canvas +import android.graphics.Rect +import android.util.Base64 +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import java.io.ByteArrayOutputStream +import java.security.MessageDigest + +class ScrambledImageInterceptor : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val response = chain.proceed(request) + val url = request.url.toString() + if (!url.endsWith(SCRAMBLED_SUFFIX)) return response + val image = BitmapFactory.decodeStream(response.body!!.byteStream()) + val width = image.width + val height = image.height + val result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) + val canvas = Canvas(result) + + // https://rouman01.xyz/_next/static/chunks/pages/books/%5Bbookid%5D/%5Bid%5D-6f60a589e82dc8db.js + // Scrambled images are reversed by blocks. Remainder is included in the bottom (scrambled) block. + val blocks = url.removeSuffix(SCRAMBLED_SUFFIX).substringAfterLast('/').removeSuffix(".jpg") + .let { Base64.decode(it, Base64.DEFAULT) } + .let { MessageDigest.getInstance("MD5").digest(it) } // thread-safe + .let { it.last().toPositiveInt() % 10 + 5 } + val blockHeight = height / blocks + var iy = blockHeight * (blocks - 1) + var cy = 0 + for (i in 0 until blocks) { + val h = if (i == 0) height - iy else blockHeight + val src = Rect(0, iy, width, iy + h) + val dst = Rect(0, cy, width, cy + h) + canvas.drawBitmap(image, src, dst, null) + iy -= blockHeight + cy += h + } + + val output = ByteArrayOutputStream() + result.compress(Bitmap.CompressFormat.JPEG, 90, output) + val responseBody = output.toByteArray().toResponseBody(jpegMediaType) + return response.newBuilder().body(responseBody).build() + } + + companion object { + private val jpegMediaType = "image/jpeg".toMediaType() + private fun Byte.toPositiveInt() = toInt() and 0xFF + } +}