From 102b91f9590dd6eb203d0905b03daeaad0e19d8f Mon Sep 17 00:00:00 2001 From: KenjieDec <65448230+KenjieDec@users.noreply.github.com> Date: Sat, 6 Jul 2024 18:06:17 +0700 Subject: [PATCH] Add ColoredManga (#3843) * Add ColoredManga - Weird site, very hard to fetch * Remove unused dependecy * Apply suggestions, Better chapter name - Apply AwkwardPeak's suggestions - Remove genre list * Appy suggestions, thumbnail fix, chapter name fix - Apply AwkwardPeak's suggestions - Thumbnail url might change ( Example: Kuroko's Basketball ) - Chapter name removing all zeros before number fix ( Example: Chapter 001 -> Chapter 1, but Chapter 106 -> Chapter 16 ) * Update build.gradle Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> * Increase versionId --------- Co-authored-by: AwkwardPeak7 <48650614+AwkwardPeak7@users.noreply.github.com> --- src/en/coloredmanga/build.gradle | 8 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3732 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1956 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5207 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10081 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 14332 bytes .../extension/en/coloredmanga/ColoredManga.kt | 419 ++++++++++++++++++ .../en/coloredmanga/ColoredMangaDto.kt | 43 ++ .../en/coloredmanga/ColoredMangaFilters.kt | 62 +++ 9 files changed, 532 insertions(+) create mode 100644 src/en/coloredmanga/build.gradle create mode 100644 src/en/coloredmanga/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/coloredmanga/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/coloredmanga/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/coloredmanga/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/coloredmanga/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredManga.kt create mode 100644 src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaDto.kt create mode 100644 src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaFilters.kt diff --git a/src/en/coloredmanga/build.gradle b/src/en/coloredmanga/build.gradle new file mode 100644 index 000000000..a7fd11843 --- /dev/null +++ b/src/en/coloredmanga/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'ColoredManga' + extClass = '.ColoredManga' + extVersionCode = 3 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/coloredmanga/res/mipmap-hdpi/ic_launcher.png b/src/en/coloredmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..6cceaf4f9a388043dceccc8b3ca4ea8b8dd4afe4 GIT binary patch literal 3732 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 WSv+Zp-@nYv0m|~~a^*5+0sjZgq6Jp~ literal 0 HcmV?d00001 diff --git a/src/en/coloredmanga/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/coloredmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b21c662feea40b68ec42c362e4a00e5634af04ce GIT binary patch literal 14332 zcmb7LV|QHN+nxy~wrw=F8r!xTCyi~}Nt4D-W2>=kH8vVIwx0Q||0j4}%$&8(UT5>> zwXZu$Sy2iJ9v>b603gXoi>rd4z5o4SLEwMY4OO&8o7bO_zqL*Efm?tyg#$r%tUka7f)id`npfR!P$&7d38Oum%>D-kEX*9&G zgGsq6U=u2&k;o`ln;0MSwxgA0E zuJiIg9xoQ*3a0=I#T^w*Nyh<4cQ;ZrB<6v%NZAXxk!-!ZU2k(^Qh21YkVhP#LPSSJ z<^b0l6;R}SFK=8BEoAn>1WArB_;Zf`$LCa20IE$R*DyH}P)ahPvkYo+kDzSfcJiQU z6Z08MzGYw?yBH6g3X0zA?@Nb5#%$9%d!53>{xDzwRPFoJJ$%!tkVx*;ga^7rr%K~_IhSt6#BVcHc z0X`@NqPDlXd>#?dF)&7Ou(2Pe$HztO?U` zizzXl*n%;WU@Fb1Ag$cHWS`znHai|EbaZr-2>D!(9ZXTt!eX1~#`p@aqq`?!HK6wO z-waC?iHb`~6!p8j?-2~CXW4`O9Z=aQwEFIySqR zFvplF808w`rEkV#C7=e*AEj|aR(YYmD=F-_@-c6=*sWU#$s3T@k=561*N?MCPUdEDglJu+l< z@ViqdSptO?X#VZRFxy|c@@Y8@(07c!h(w{%QC!G2#9MV1Ub2~D^}#-Zr(kMhLzkSK zT(bfmf5wn{$3IZ0q*GLrCD7t!5Eyy6)=bacRb;-ZVsUN88DcAtBp!`9Ml$Ub$)Vob zGXXCp;I~+*b$Mvy|9prC2-CC%HX`N|xt5op1ct^iwOf6YlpK~I?|+~YU43D@m#v7$ zdXF@Y?3N04#g3ah_ppoCsMOr7GaZRP17aS_lWm8v>8w^RA*2F*r%2d@`2z>Rv$FT# zAxxDhLX}BZegGxq17oFI9A!Nz_ED_|rJr-Nvwin^gCH4!2WL%zAHKrk?v}pX6Mz8r z001SY!`2(~99*qRmXYN67*i_)L(*b$kQzFRxL;(q9xI9piKgFC)O8YtlnvzQEgOJ) zaBWpsdW)1DG2bgdF-yoSutXv2<0JveoXVdz*@&_Lyajks3=@HDgT@wwL!`RxG*8Yb3w88~C2k7q{sO1TSSiW^iS6o? z9ZNL~=s5rq;J}-^Ka-pGAg=BYqA*gOk~n}3UsTe0l&K}jn>>o06UbzZO9&048_(1a>w2fNPp9l!*O@GU!1_F47)hiU?kLoGX4H z!EU56z&;RT4B(AKYI=H1RTOKMmRg)t0*s9vsRF^4hW>UYE{J8{!^^i`DDjDtzEUo3 zi#1C!pryDs`%6_p0UnC0caz&A3f&^zf_bT-qbLPhH!74-ePWvOyYfR2ory6S|iZIPn{ z0^_ZLy8}gXwgpEZgTL8d3jEUJjts99Z&0EEEPJMCQ>5ewDdbEvpJp#D+iXL2dknj~71m7;)LA!KygXi%S=#{w++L~}fH%^*~T>Da|IiMk~3hW*rX zONpF$2#W0eSWl4EMyr!FO`jxH<=hK79JZn-c^r6+m2gwNXuDE(2AXw|>0);Rdw9Z^ zAS?yRCgZ;DSN0sU(~0=8ac{OdaX0a8^K<76zCwTT?SW0HL3RLVAR^hgY^<>lREED9 z_T*@;1k_AqF~>eq(oo*&b@X3~7kjg8wkKK_#C#f)Ig^Y{iqZbGavC)$N&NA}q?3tg zJ}TgVEs1$J(2Po|l{0Y8DH2;5JGU(NxC3pBj*ZitvUaj_U^O8;fo%ZLfPf2IUI+~* z(Kydp28k6i2Y)Cd} z$(1e~?`NgZF~6qoFO^g^pVo$2(?cE+USP=DN*sYcIq>Df zjH(9@$>fh`Y%f~e^5`Sm2taf7m2Hr=;W>jWKe;f!ay?E&kw$l9go64D9IX~|WCBe3 z_1eCQgR$j`?aJP@an5?&p*?pxqRb#-gDHcZV-;>KLoB$PhGfc(t%7L4mOIbv)(OdI#Q{}goSMMQs#I7S^QX!*JC~tCXr2fbzju;>Mmj--Euz)n;lP*5= zQPNbuz&$_XF1B-CJs%CVbO$9P@5o)Q^9N0X~VTD5qyc z39+#`nv9|jp084zi&@zJs*cCnzYjyZMx3qtCMI?S_}~##*E1?1+ID(5S^T2@bf=cD z$4&Mvv%Jn?3jeNi7nBkcBW7Y!Xahec>#Ea7M$WeSA$~8u9T&SCYZ2)Q+7U^&Qi(;? zD64~LevKFjQQF@NH0TJ#?LMc|N)I*cc4w8(#aUFrG~>1kya@~2L7*YWBC+CN^NcL! z+r^g~WDit9Lam6aP2*{x8Ebm)nHm!*LLvyHRyd#~>9v$7?NI`hfdWzfY%y-4A1kYW zUUfZ^TkMK9r=rQw70ro$~G7k=B`-0D@40>{=Gr23rPs9dwp`!U;fR^pT%8yPrzjx+3nC3Cdb@~x(rKt)pnI##lZjhw4cuH zKz#0=EO>Qzm{tUdvX%TpNsK2cH7th2ANM;9vUsx`^H9@31nYB>l=17k2V!L0(1goT zzh*75Fm5zN>3Uo#HiPh#$5!8HZMW*@urd;M!bBL3X3b#j59-~8=I=2*UIFmYCRxOr zop{V1=TEfHQoNMdf1$>qw2aeseX%)1MIQ{c{`o_;{K7QixHu9Z+@b$wdw)G&H zeTNa`_?k!-X*3y-qhof(2zIVDthqfOazv2nsZZU~iK&#{QKIEDYyxCJ0ihRIs|C=G zq_%hyp!@LylP71iMi(pY!o8~f!@GDY6IxatR-P;uXA)Eww|AkDz4u{V(qjAMX>j@vPLvSxB05GFn{xE_xNK;k8XiuwH3{a zUW?pF<*IQid^mwWmjU@%DdD<1fU zRu_3CzAYgQzbHsW1x*1$8SYYl&-n_2;z}Ql=!ezIZO_fcpba?c4^#d-BlUc9I9IL5 z&Cg{5RpELX8r>Is*m(p^0A$c_1f8gr^maK@8CGheg`f}yqGN^ z&>MQayTuX+>cL<%{F}rClQRz2zZCq z8;SQM?5)tOu6u}KUUYy|${oBr%9C0{VBSFie70V2d3HZRw4~z_`o7u?BH;!~Y%Ci2 zaeicf#d#P{b;1aQp2{TSWWQ}{E5V`GtctUG5B5s{2OP8cLFPvQHp4_?{C=ZXo9JK? znWoprO2l5NI3oJ7?hQhU8m6!H*iFJ8w zLrW$MQ(@7Yz@aRhyX)&V>HO0?==1h|b#FySpY>ShVzAvJ1gob8z}|WtTde1kShmf% z^=;Xx-ey~H<>g*&pt-V2I|x!o$8#@9ipAl>SA#&{uj}6WTJ!ZlUkKfT+w}Bs0;f%W zp@*SGqz1eBWYLO*NE z&$6fG+68VSP$F(IUP1tDz3174`mC1mS1cFE0AFr*9J{xiuSpBt0`7{Lp?pPB`+5Me zTyOZ-OwN#tB|VKF<||b?W&F0dxY~XTtxk1Q=|Lh$_}LHo%?u2KJ+*Bh0j=u(fEZkl z`4R=sTDx`jSufb$+2`B(RymxN3U%IhKing)2}Vz+2U}7ypg{tW*wIoo>+>wxy?*gE z_x6reo?u1E0#3$#Q(-);D8jxaa_hKVbSRGcD?iYWG?TlE;SM?{UC&Cx4>}wCZ~EfE-8M%Uz$Wy>S+Y2u>-6 z95SKsGqu7Mgx&R4S5lq7fML%L#Ks%rDs&n6IJG-{dDq@vx3vu^uRWM_Ltnk`U)FKs zT_`GP%eZZEw~F5#8h1fU(n=%47wfEtC#6nD4)7raz4;E7l-241Sd% zQj_hMiW>h*Lvh5|<6_HUmmPq!ZVOcPyB7w{-uzrqNWU?`+T(uAPSqo5>#f?l|6gSih!9-48zR?G_j{Jx3b!eqb_{dY&`Bk0EGu_D5q97xe9g@M*Q z>ES1YhliJxgF~y1Asq^fSAhgo)IAl>d4C3J28a@cu%8^U+72L@o)HYO901XJ-GQ@I zd=6nzRdoJ|Gzun0B&<%T>Ftz^rY?5Cy|~u>s>4=nu*{F0=L>FH7-VBxRrFjw=Yv=t z%C%b~#hmB}FpP4?J$;l5mNrg7;;5<2ce{g70kdtv&L2rY*W*A|d+v6yT_nCeqKMef zW&w8W?x$$emLg%YEJ_l%cOm@LNGUC}P3KWs1`=K*{T+ryq%BB++Np+;L>2k__sBP9xvU zvhr_Ymx+WY8(aSQR`th&?Y5z>;SM8fbg;y>Z%74>Q58BKTt?Nsv?8)M3T|L!_ZvEw zVJ}QwD!~H?Ap_iINYgd?6n*HkPC2!X8zj>c$grhF8WI*F(t*7ukc5}#Q1pdgoIRS zc8)wQzdkvkR0!zG%AL#9$^8<<#-6lTPjTaFiI7Y5HBnm|RwBxkLMv;)cD_bNIMH>Dr zF0wCVB1CzJhUQ0%kaFr$uf*4g%02#mYDa+XyD#+C5ObXCGvhNOoN_+_`~VD0d)*T{ zH!N)Otbbw&QumR^++p~zY<=Zwr8`S9o<<$%?>~;=D43Z3aeS*M&XDT4Iu8lBWx0VlH_P~mgS*Qp#+q6^9@BYsRpU5F{+H+j_>-D!8u@xPxdMiYhK& zfEFt+U`JQ@Va{2WA3Tr$a=wzAl}%u%)r1p5~&Ie&(| zB9db`N0BDi>rQ1S2&TA~UHHX|P5AvqSutDr^2S-Mj0V*RPJo#i1xMhGrI!I?63|x{ zyw)5PjRlM-;%O$oxVUpYc)x~OIyl%VZ~lILlou;b$MoXGLUU5<hwlMHfN3}UmPVX02x`Ptf?A>t?(+y$c(bg{_n8;Ox&Py`_&7j z*4buB-5@JAYWMFSqh0Ow_DyZ|-%NE$ta;91ZQ?XDnPHpXmxOhiPh%w?u`rD{cKU3j zgKeGY;B~=a=>{JAB0G#<(ong4SEE7cB3s~}WTABNCFTztUfyG2BS8vk=rH7|_LSV` z=h5A$s=`3B#g~cmZYW2)q&D`mmUTq5vmuTMVqetpBns&(wm@Q`%7(_d*a-KF^_Xzq zm#-*2ne$EUd+>vo#wkJ}1~FaI4gKV(KPLKf)ZHK58ODUHU{o zy2TS~41`G>(gKDx_|ljpJ_3O@ZUMxkenyk@FS7?@0MjQb1f}TpSp2ZN40a6+ITBCF z+oPTh?pc2H4bEAQ$25=g)i`{z-9fk$W3K*01B49k-5LzALe&~})#X5rO5+Ns4BpIp z=I}-C=V(XuFDO%YPZ98ZU~90_xmWZ!b#r>qTYtg#|Kjf2l zkQrq#**KcCuK)u+>SqD-=V98fcH_ELVQ&|kC5G;9tHyG~d?QLD;Z9-p%Lo$Xn9?Q? z<%2I^hDke6C;~}MfdNSg%a)5lzY|yCZSV;uYY;|)Ri-F`Sc1zm7gJ)iweRmiElGwO zLlhs{3_#NwkmMm1UWmu|JX=`{(FtHy!43J8H6(7R&_M8pI7g_Ew4uYcv?%235)y$g zV$RTuv{yD%*~J?w<8`@uUMzPc*~wwdN2+D|Ngq)V0#o$Qv=i{fh|r#U?eQY!y;6&U ziiydXoC!|>{|}(=n)r&amkxAwVJO-D)bh+v1Cx`^bU^Z%SV+G0_QJ-Fu^OAAp0Z#O z`XCvRD=b&%KSvKdsmHfxtX`HEzp9PnbDuR*^Pj8Hs0C5xE7zZL8xj|T}u?sh0!V8_*27 zIHe(^va_Sj#Lm~(8@rai)Cm8Q1;A;|Bet84V=|O!$Wak4m*$awbX?Z0UPx}bogtzL zW+Zz@WO;-ecKmjb>Kj0z_?5ro!1^vp=}l<^Yxg`3h9GPlqG2<)xepKW(M>PkZ9#tP zE=SV{N7FMxQn}nVDGvbw5`C3#pSS$P2&zv_=*&r;7)DXUBe&tH3nc}{=h~@oo zFMp~-HBRw*>7r`UBuPCHMV=TLkq*m%l<@E3uD*Xa-Egue2`}ye0zdN-0t6njQ?h;p zxpqQx1>qcp+{u*taW<+8-D7Srcb5^jxJ^$Ec6MAMXI8~nsPpDBG+sgR2$5t+#qac; zEL@YJyt=NIei=H^ndcW#LD~rr3GM{oq}VX5LypQ)z~O6FT3xNJU1)orRrfZ|$Z{SY zK1yLi>!i{{ZaG32`g>6@qjZ5YxpDKf@@0xPCn_KYP?v@E7c0t~r~TI-9)U5oH+wv) zpJ6_6riwJ0u|zTbV2xKhJbUug?~l~DG%#8)X@Eh0 zHr5~QiKP77ezPtQa&)CE;cHH77F;3I-?qwDe(eR#{p&#hI|1ZG0ZIaJ|2Idu04J~kT!P25k~#NqAxTa$5dC69|V?=kwM}z zn2DCSI>~2+J7dt~I=#@7S2dR7nJvxX5P?SuGW-~*a6<$+;}vPttf#kE|IZO zWrIWtsrbQ0e-703yUk{V%A;wCzJswHb|M5X9jTjMMIo{VMDE^r`kKI_*Gr9I^X=|5 z1GDAcac|B3`M-o<>xYgnEI!AfR037`}srueLD^_Ndkl+A!==|Ds!OBC!}1 z)d#XcrS3(?l-+A-v^2e3cNlnIP_ns5GxUa|kYsrt%lH*hXuSDDssHw7BK>>gZu>8} zm<3LJ27bNcf9@19_{Fpx?3~ElmoF2%eZrEQfg+(kl`tES+Eaj+-6%?Umy7K^=khV5 zywcwXwLQVz&y{@^u!D!LLGeTgM|USXC-z4-hphQ^sLL#s5MnvdVKt-f{5#G(vtE<9 zi?v21kJ|yCcz8>&;q{p_m_(k8UgxapUWZuc+o{kO~&!Qd~}>7ny(95!RLk@wLzaDWM-TKC)H4v-O-4@&o0P>3{W zlAbEc5G^cK?>b`&B-jUpUBW2C-;yI?XefMjgI^vVETc|wH(LIEVgPusUkOy0`1!5Z zW#$_;^>lt;vvaELu$?eZ;W^8Y*wqqBQ&=_?14 zAQP!Jc3Yc68zt^y$O=Z4y#Wul3X(=3kCLfIZ^MQ@Q&kHF4e@2fmr22>J76>2rl;U=B4wf@F8%omgsfPBi*E}QSg(Tv@U zX9Neosaj}Mq74wON0W^E8JU&xEC23>54g}%e;30*3d%Q4!6Vc)R`*)Gz3%3 zW245*b}L0L@N}`fahaQ%ruYxitaOv*&bvWwAocKw>HA83-S!|22?P#xN`s|E|E_DH z$LGhB-?reLyrSfV%n#-LzgbQR##gQde{nW``+ z?<*1V2J6*yVY^T(h+=r>A(BTQAyfKvA2*z?JIu89RKZw^ixSL@lK)M-&~iWhpP3-1 z98=tiq@-ZI=-fw6*|%dH+v9Ubd=>n_RrqZyvIL1jTCYIB>8eA&aeRZR^_ul_iDlq0 zc)u5@?!i;{5{$5@Y`N;ZuseXu??PQ;PHGT&XcqxlB=m;*aJ`>I`utFTo|#?k9i$9~ z`-PEE_xN7ysFR=iUS8_mzAqLBY!>!&&~W(pPPA|P54=-I?HLJp8;^^j$lMRF>+w4m z9c}+}E(jh>RWRzkBe;(6$?P|uK=pXNu))U;kkCZWtM*ovHZAigwv1@W1VS*DAoiDF zV;2g!*t5Cv%7^LhY=ONy4ZT+3{ZXE&@#n|!NclT|^xC?u9)zOOneJ7!rmcFbZL z+OM-Evdf3{0?z?jah>z&pWQM9WqJnqC! z62kK!xGjN_A?8QjzKo*3!*98MuZ|k2bf>^{=c*?GFFt@L{P`td8kX4nOxHlk!Ves@ zL;ZM?>_h=hK}zuYp;z?zxZIfOd(e;&HPo32nZ_zR_@dJwRFw18B z#-wg*P@H%sX@37}oN-jTSaW2#D4KBN3oBxlMoYrqG>zJ^exI`1fvx6wJ50vA6ppPDE`y0CO&;?O66ozu>+Rn1|3}P7i(1hCZj&3!Wn!V|DW0LPfn>E^bD2Fj1blb6*8Dy1k4vENsG04@?Tk`lY zGEr&a5KTA^iyZA>%a>h01{>?>{f>HWZ7T6J1(S1e?-C^r|3pSV?Hi#S4wJZHkAKBy zk3=e+=i`=70ZUxbRQOT%JGPO-N??FSbu>W)l9;4Qe6e1MeBam2_5$}TuJkT1_9bS+ z*k$i~QPGk3(=&GXZ7Rn$mb(FzddnGN*IH%Z{>Odop3ii2ut=ljJ^&K&J;hPRce@6h zX+n4fnf(g)Jb_$Bz5kXFC34GZI%~a1%W@O$bf@c`%q|aexo$N1^qk6VA$@;I2M;gw zfg6TF-8(SyuQQBb=5Qjd2+XxOZ5|D{mXIQvb-mnvnrBh7d8K!?cAuV-kO=2^ZNsT@ z5PLi+!7&mCl1#=#^=-7fISowblwMK_$so_AQ)|~We|q!a+LewX|4i_RY1b;oqnAOCf7w!c@^FU zTdFdkXpVlJyQX){&3aSNQ8)qWdNX};CWngO)#T^oK@_DT6Y~H*E=MUoS6G;%!z#pb zGS%rXFF}Q3W?!DmA4-BE9qx#cO#VhY1jC28;!sKvJ=#6Q+|BlJ>Uj|rej=<9Cs86H ziz6Kiwp@gM`$#Kpmq7w2*E^{;e;m(uBa)7hjx3ZPi)fSzRfnQ+bMq2TVz9{`h6(Ch zX}ezWr)5-n)!AU|TY(q1H+8$WGv5{@7TKyNUSw01r)P#f%RpD%D5y*z9x+jb}Z+hRb3Yal4&--_aIPk>#45qTorWL;!Hd=Dv4SEKo~reuCdSi7qVHTey;J2Uq|0dd ziQh_{&20@@ukIuW!UJv_1dW;q+ui6bu0Oy`pjI|+obO=J*{^@fb_IpgHj)Mm9`SNz z(GebtAq)f7vhktQT#gw*V>owofAQ5mjNJBhf(Ll)`3!rVB|AVOsWFV)=C(w(eSZz1 zo*u1YSX5BZz#}d4^O4`~)bT41H=S#OC%H6i_T?RRI|Eq^61yIw{?w?gu}ORsAole= ztA2|135h3Sojn;GL0q8q{=P~Ac^qML&-Yvu2gZFfi~m$kI*KRYCmr{tD~E`|J<-64 z{Jy?lj<1crHcNMi!~4P!;K?_63q8m9H>SgFKxxYZ`bDEMybT7W-@LIvL3YR6Jt5J z`2C0X?(J6TZ5&28omWrgO6+hvU>!0AYVPb>`xH-D+*UGDvZV$qX3(Q&={ERX(_$A< z-yV1svJlmU&a8S`Fzfn_>wBgm`J=U-L|@J8zmVH0?(5C_<^96vTaDYY?Wb#PK`Yd~ znXgKJ0Dh7Qk|SD18Yr8B_(H@O)C#Ip&wdgFZ!q9H)`hJu4Hui)!?gXKy`e}2#bM6q z;8lm7I9;&_6PdZNyvLEa0YYjJLNDO01M4Z(U;=D^b(?L%?g@KsrpSEI$5*n#Eh@=(1T ziS8ZafPFCbEaR~mrX#_;*{NLwa%W*-p@M#ghi9?8w;9B-E6j7`yH=aZ)b@U=Yk%%B zeRZEyln{=*$(#nI z3b+Mc_kXPJk%$VM!v^JGY}6$B_(hxzywj{=j+$)3>J@3IFIIwlJBae;=u2piO@CAT zvRdGqyBKbr%0gT3769=Q(rT5XTV(S=Q&O9(gd=&zeAyx36b&B70fMDj(1 zT+aIYZ{v!a=^T{>;bi)?-Lz{&<41c}Yf)@?eG8V)vXPMUo5SlN1CN5UChMJY@uMV) z0^bL`2XJnbg3Wj(s{wFoADxgzY8E33T?Ni!a2^U$yQ z*yb<$^D~dIlDcekh0L2*QhLx{*ZZrA^&qVL)3YTeGJbKc08gocnC|mUq>`MNMV_FI zcF4`e@5qxSB&HIVysuha#Jb7_5c-vx1#fu){i{7f8-i`pcx!0Om1#DrZI;vG(3wJC zzBt~Um1YV&fFVgHK|vb`Xm8rD>Y%!tVl5@x26V&0Sp00L1emV~2uZyWzrCJwUm-Tx zW%08sahQioz~lolpNE|}WFqmMKbP_uE9od3Ui>SX%{H@LfT-?;#+kj^FobWn-Awz= zZR-7IR-s#Q69FBY_V-y2dsJr)bu~i6%WI9qpViQ7^-SM#s-34Zg~?9{$Ad#58ue9} z^0#vo2d@t}g~_})=%e3x1uYO8jyd-zywSs8bbO0V{~XU*F?ue?E|Yq(O$-{;$Kd1v zH%B-6HMC5|!z;mtv`$tOroUL{sry22WN7y+2r@)4U1Vv;MM?(8Fwy{vPMW>fM}pVC zbx4rI1`|EFSbbMNBl^8KKRsIBs5AO0RrxeZF46|Ib z*Pomj<%r37SDN_f?I~&JAGQ zb^|uTLv4E9_>Glq#PJVjJCo!onB=!urPC-r4df`sOSK|5i=o_ljSl|)@w%OlbK#Xf zo53s zHz7Z6Pl_V|?W6x4Os^wdp68c<&k64UA)+f$jXO01WTejSFh$lyK+BGZfA8J0F!{g_&e@dV|A zSlC5W^or1@WIf$ZU}$#P(=1hxRSb#0(E>3JPDxBI`a+vg1VYyk#XNU_y;;B6XSJIE zd`BIZdkNnLlm*$<(wA~({0Z@RP{Uk~K%FR)AF;BoMfVa<%`dOKU~~o5=2r?lD25Dv z0Gw@k2)#0#H`{!}fIPUlojV+aqokx6$oN_Ea^R&S_uW!bW26iK19{$$oN z$oley{}ahDc4ti5K&401pZONixHZcbAat0~32xu;6R`W*oiCPIZ7P3C9M77T zuq)kEE>ik@a^k6J1C36K+t{4qS+AH=wdwe3%WSaKjq^i7iHY(QtCq2N;kriGa{{A5 zX*f$6RcV8HG7Hqwb89TWQSfNKe$}h!{!joj&Dhj^M^S6R=qMrN(+^?IEtERl{*zr5 z)zZ?^N<-X_4x2v}r;LqN3>Ht!O!$y>M78+Dx779U)CHWuC2-=}Yt_xd{{HrX_cYCt zS2UGhsz?p#jsFvO%R=oS+9Wfs^$6-OenzHuVR9ymmNsfrqniEg@t(q+W8uzbdcc+nF}`%V2otfBd&wKdv+xM9a|maQ8Dd>2WjCRN(BJx|8a& z9W+4H;NccDF_v=`a()@R{4eRWTR2m|H@b|~88b+}5KBEMXrY%WHf`ls)XFgS0$$*sN-d$YBY?%*mBsswW;2S0a~hS&>o(@u8pz;g^Dp?5*-k^ndCCYi?4|0#~X z0t~Ja<)O^QVi5~dnZF

Xk61y+w57>JlYCfLW`{T6Gbp>SnD<^8zJ`NR=hm7aM2c z8I{?I+0lgjkgibsiwkD{``6t9*b!`(9=O&7)#JWd#3wDbOtK1-9{dayZ)`weuM@Q+ zu<4K{w<R_jLPLPFhkWL@uR|6-j46NT~nX+=_7{#zrP{cIyyTh+e>hEC=6 zh_#v~H1GUt$^R(HDU=OUvMa{a>3Em%srbc|*LWv>5_rNUVf|!O)q&Qa@QfC8T6#_m z@Uf(5)+XvGU^d?$de%*{2NL2}#r#EdZKe7eZ+t%~Yu9*Doi0|~2j=T4>r!>6a&=>Y zS5YsU+F#hx&HJ#x z3b=*BVQZwjjqqA1sVLWs!wf({8*h5_qe@2X4IMe8)2exMk(ZbMC7pQQZ3-I^%89UG z>yt4=NAJc@tR!h+L2X2M5R(0jHU&VxIZ!H2f89y&Ni=qYteq$NNM)BC-AI~qC}WA!H@eSHWM{Oawm& z;RPm~St0gLF=zBTvNpmk;RebJBRQ^NsJA(T@4*F^OP{&OgXHF!?NbL^;Ny3(_+jup z)dnADCMP$lOab13qX0@@1xVas$uh*=cn&30PT{I8#6s>e-{+g(RFstb)B{j`=>u1> zqPE7rQd-b8BNx7~Pf5QqrJb#2XJ@0h4c2A|xdu6-2qPJcY}a3E8Fk;C6O)-nz;Z$h@fK4iIhmtTqO8 z;fXT}vrDfdl*J}yXTQyW3udH7p#6I;si@K z5s|*Eu&}TmFYXQwuP3pw+SQMejl8w0$#dWxekfuui4CxeS{bjm5^ryRZ*N*jUcQr! zn!2RAkoMk=OHY?)j(};5kg0WdP$G0-S{?H+aAbc~U0b`g|HSp*6*^y(0fq0>`R=e5 zLIAAS?RQSdV{nm$e_*EYD;dVD+8_xV>{;TsCU*-w*8XK~K7JwGS$S+bNI8=dbsDE1 zqt9ZX+2U@ChbMbqF*d&{6F?U>DcY+I#FRhz&~U zF5QUO(t8mxXak(JwEEv!cD|24v4t$fm{Ti}x(sEWK!u~n_7)A2*q=)Y`UXG|a}_en zAfdwEs}v^q7BZZm{e5J|&I ztbR2_gG<>`{-nlD%fW+N6GhdURCR{HRdM5|(yudTRZn+`@nxyeE=B=Me!O@ = "" to ""): MangasPage { + var sort = sortBy + val mangas = getMangas(response.asJsoup()).filter { + val genreIncluded: MutableList = mutableListOf() + val genreExcluded: MutableList = mutableListOf() + + val typeIncluded: MutableList = mutableListOf() + val typeExcluded: MutableList = mutableListOf() + + val colorIncluded: MutableList = mutableListOf() + val colorExcluded: MutableList = mutableListOf() + + val statusIncluded: MutableList = mutableListOf() + val statusExcluded: MutableList = mutableListOf() + + filters?.forEach { filter -> + when (filter) { + is SortFilter -> { + sort = filter.getValue() to if (filter.state!!.ascending) "asc" else "desc" + } + is GenreFilter -> { + if (filter.state.isNotEmpty()) { + filter.state.split(",").filter(String::isNotBlank).map { tag -> + val trimmed = tag.trim().lowercase() + if (trimmed.startsWith("-")) { + genreExcluded.add(trimmed) + } else { + genreIncluded.add(trimmed) + } + } + } + } + + is TypeFilter -> { + filter.state.filter { state -> state.isIncluded() }.forEach { tri -> + typeIncluded.add(tri.value) + } + + filter.state.filter { state -> state.isExcluded() }.forEach { tri -> + typeExcluded.add(tri.value) + } + } + is ColorFilter -> { + filter.state.filter { state -> state.isIncluded() }.forEach { tri -> + colorIncluded.add(tri.value) + } + + filter.state.filter { state -> state.isExcluded() }.forEach { tri -> + colorExcluded.add(tri.value) + } + } + is StatusFilter -> { + filter.state.filter { state -> state.isIncluded() }.forEach { tri -> + statusIncluded.add(tri.value) + } + + filter.state.filter { state -> state.isExcluded() }.forEach { tri -> + statusExcluded.add(tri.value) + } + } + else -> {} + } + } + + val includeGenre = genreIncluded.isEmpty() || it.tags.map { genre -> genre.lowercase() }.containsAll(genreIncluded) + val excludeGenre = genreExcluded.isNotEmpty() && it.tags.map { genre -> genre.lowercase() }.containsAll(genreExcluded) + + val includeType = typeIncluded.isEmpty() || typeIncluded.contains(it.type.lowercase()) + val excludeType = typeExcluded.isNotEmpty() && typeExcluded.contains(it.type) + + val includeColor = colorIncluded.isEmpty() || colorIncluded.contains(it.version) + val excludeColor = colorExcluded.isNotEmpty() && colorExcluded.contains(it.version) + + val regularSearch = it.name.contains(title) || it.synopsis.contains(title) + includeGenre && !excludeGenre && + includeType && !excludeType && + includeColor && !excludeColor && + regularSearch + } + + val sorted = when (sort.first) { + "pop" -> { + if (sort.second == "desc") { + mangas.sortedByDescending { it.totalViews } + } else { + mangas.sortedBy { it.totalViews } + } + } + "tit" -> { + if (sort.second == "desc") { + mangas.sortedByDescending { it.name } + } else { + mangas.sortedBy { it.name } + } + } + else -> { + if (sort.second == "desc") { + mangas.sortedByDescending { + try { + dateFormat.parse(it.date)!!.time + } catch (e: Exception) { + 0L + } + } + } else { + mangas.sortedBy { + try { + dateFormat.parse(it.date)!!.time + } catch (e: Exception) { + 0L + } + } + } + } + } + + val final = sorted.map(::popularManga) + return MangasPage(final, false) + } + + private fun getMangas(doc: Document): List { + val mangasRaw = doc.selectFirst("script:containsData(\\\"cover)")!!.data() + val mangasJson = mangasRaw + .replace(Regex("""\\([\\"])"""), "$1") + .replaceBefore("\"data\":[", "{") + .removeSuffix("]}]\\n\"])") + + return mangasJson.parseAs().data + } + + private fun getManga(url: String): Request { + val formData = MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("id", url.substringAfter("manga/")) + .build() + + val request = Request.Builder() + .url("$baseUrl/api/selectedManga") + .put(formData) + .addHeader("Cache-Control", "no-store") + .build() + + return request + } + + private fun getImage(manga_name: String, volume_name: String? = "", chapter: Chapter, index: String): String { + val chapterNumber = index.padStart(4, '0') + val chapterName = listOf(chapter.number, chapter.title) + .joinToString(" - ") + .trim() + .replace(nameRegex, "") + + val formData = MultipartBody.Builder().setType(MultipartBody.FORM) + .addFormDataPart("path", "/images/content/$manga_name/$volume_name$chapterName") + .addFormDataPart("number", chapterNumber) + .build() + + val request = Request.Builder() + .url("$baseUrl/api/dynamicImages") + .put(formData) + .addHeader("Cache-Control", "no-store") + .build() + + val response = client.newCall(request).execute().body.string() + + val responseJson = JSONObject(response) + val image = responseJson.getString("image") + + return image + } + + private fun popularManga(manga: Mangas): SManga { + return SManga.create().apply { + title = manga.name + setUrlWithoutDomain("$baseUrl/manga/${manga.id}") + thumbnail_url = "$baseUrl${manga.cover}" + } + } + + // Latest + override fun latestUpdatesRequest(page: Int): Request = popularMangaRequest(page) + + override fun latestUpdatesParse(response: Response): MangasPage = searchMangas(response, sortBy = "lat" to "desc") + + // Search + + override fun fetchSearchManga( + page: Int, + query: String, + filters: FilterList, + ): Observable { + val response = client.newCall(GET(searchUrl, headers)).execute() + + return Observable.just( + searchMangas(response, query, filters), + ) + } + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = popularMangaRequest(page) + + override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(response) + + // Details + + override fun mangaDetailsRequest(manga: SManga): Request { + return getManga(manga.url) + } + + override fun getMangaUrl(manga: SManga): String = "$baseUrl${manga.url}" + + override fun mangaDetailsParse(response: Response): SManga { + val manga = response.parseAs() + return SManga.create().apply { + title = manga.name + url = "/manga/${manga.id}" + author = manga.author + artist = manga.artist + genre = manga.tags.joinToString() + description = manga.synopsis + status = when (manga.status.lowercase()) { + "Ongoing" -> SManga.ONGOING + "Cancelled" -> SManga.CANCELLED + "Hiatus" -> SManga.ON_HIATUS + else -> COMPLETED + } + thumbnail_url = "$baseUrl${manga.cover}" + initialized = true + } + } + + // Chapters + + override fun chapterListRequest(manga: SManga): Request = mangaDetailsRequest(manga) + override fun chapterListParse(response: Response): List { + val manga = response.parseAs() + + val listMangas = if (manga.chapters.isNotEmpty()) { + manga.chapters.map { chapter -> + SChapter.create().apply { + name = listOf(chapter.number, chapter.title) + .joinToString(" - ") + .trim() + .replace(nameRegex, "") + .replace(chapterNameRegex, " $1") + + url = "/manga/${manga.id}/${chapter.number}" + date_upload = try { + chapterDateFormat.parse(chapter.date)!!.time + } catch (e: Exception) { + 0L + } + } + } + } else { + manga.volume.flatMap { volume -> + volume.chapters.map { chapter -> + SChapter.create().apply { + name = "${volume.number} | ${chapter.number} - ${chapter.title}".replace(nameRegex, "").replace(chapterNameRegex, " $1") + url = "/manga/${manga.id}/${chapter.number}" + date_upload = try { + chapterDateFormat.parse(chapter.date)!!.time + } catch (e: Exception) { + 0L + } + } + } + } + } + + return listMangas.reversed() + } + + override fun getFilterList(): FilterList = getFilters() + + // Pages + + override fun pageListRequest(chapter: SChapter): Request { + return getManga(chapter.url.substringBeforeLast("/")) + } + + override fun fetchPageList(chapter: SChapter): Observable> { + val response = client.newCall(pageListRequest(chapter)).execute() + val manga = response.parseAs() + val volumes = manga.chapters.isEmpty() || manga.volume.isNotEmpty() + chapter.apply { name = chapter.url.substringAfterLast("/") } + + val spChapter = if (volumes) { + manga.volume + .flatMap { it.chapters } + .find { it.number == chapter.name } + } else { + manga.chapters.find { it.number == chapter.name } + } + val chapterJson = spChapter!!.toJson() + + return Observable.just( + List(spChapter.totalImage - 1) { + val url = "https://127.0.0.1/#${it + 1}+${manga.name}" + val volumeInfo = if (volumes) { + manga.volume.find { vol -> vol.chapters.any { chap -> chap.number == chapter.name } } + ?.let { vol -> + listOf(vol.number, vol.title) + .joinToString(" - ") + .trim() + .replace(nameRegex, "") + "/" + } ?: "" + } else { + "" + } + Page(it, url = "$baseUrl${chapter.url}", imageUrl = "$url&volume=$volumeInfo&chapter=$chapterJson") + }, + ) + } + + private val mediaTypePattern = Regex("""(^[^;,]*)[;,]""") + private fun Intercept(chain: Interceptor.Chain): Response { + val yurl = chain.request().url + return if (yurl.toString().startsWith("https://127.0.0.1/#")) { + val index = yurl.fragment!!.substringBefore("+") + val manga_name = yurl.fragment!!.substringAfter("+").substringBefore("&chapter=").substringBefore("&volume=") + val volume_name = yurl.fragment!!.substringAfter("&volume=").substringBefore("&chapter=") + val chapter = (yurl.fragment!!.substringAfter("chapter=")).parseAs() + + val image = getImage(manga_name, volume_name, chapter, index) + + val dataString = image.substringAfter(":") + val byteArray = Base64.decode(dataString.substringAfter("base64,"), Base64.DEFAULT) + val mediaType = mediaTypePattern.find(dataString)!!.value.toMediaTypeOrNull() + Response.Builder().body(byteArray.toResponseBody(mediaType)) + .request(chain.request()) + .protocol(Protocol.HTTP_1_0) + .code(200) + .message("") + .build() + } else { + chain.proceed(chain.request()) + } + } + private inline fun String.parseAs(): T { + return json.decodeFromString(this) + } + + private inline fun Response.parseAs(): T { + return json.decodeFromString(body.string()) + } + + private fun Chapter.toJson(): String { + return json.encodeToString(this) + } + + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() + override fun pageListParse(response: Response): List = throw UnsupportedOperationException() +} diff --git a/src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaDto.kt b/src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaDto.kt new file mode 100644 index 000000000..cf7205d8a --- /dev/null +++ b/src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaDto.kt @@ -0,0 +1,43 @@ +package eu.kanade.tachiyomi.extension.en.coloredmanga + +import kotlinx.serialization.Serializable + +@Serializable +class Mangas( + val id: String, + val name: String, + val date: String, + val tags: List, + val volume: List = listOf(), + val chapters: List = listOf(), + val totalViews: Int, + val synopsis: String, + val author: String, + val artist: String, + val cover: String, + val status: String, + val version: String, + val type: String, +) + +@Serializable +class MangasList( + val data: List, +) + +@Serializable +class Volume( + val id: String, + val title: String = "", + val number: String, + val chapters: List, +) + +@Serializable +class Chapter( + val id: String, + val title: String = "", + val number: String, + val date: String, + val totalImage: Int, +) diff --git a/src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaFilters.kt b/src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaFilters.kt new file mode 100644 index 000000000..7347a31c3 --- /dev/null +++ b/src/en/coloredmanga/src/eu/kanade/tachiyomi/extension/en/coloredmanga/ColoredMangaFilters.kt @@ -0,0 +1,62 @@ +@file:JvmName("ColoredMangaKt") + +package eu.kanade.tachiyomi.extension.en.coloredmanga + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList + +fun getFilters(): FilterList { + return FilterList( + SortFilter("Sort by", Filter.Sort.Selection(0, false), getSortsList), + TypeFilter("Types"), + ColorFilter("Color"), + StatusFilter("Status"), + GenreFilter("Genre"), + ) +} + +internal class ColorFilter(name: String) : + Filter.Group( + name, + listOf( + "B/W", + "Color", + ).map { TriFilter(it, it.lowercase()) }, + ) + +internal class TypeFilter(name: String) : + Filter.Group( + name, + listOf( + "Manga", + "Manhwa", + ).map { TriFilter(it, it.lowercase()) }, + ) + +internal class StatusFilter(name: String) : + Filter.Group( + name, + listOf( + "Ongoing", + "Completed", + "Cancelled", + "Hiatus", + ).map { TriFilter(it, it.lowercase()) }, + ) + +internal class GenreFilter(name: String) : TextFilter(name) + +internal open class TriFilter(name: String, val value: String) : Filter.TriState(name) + +internal open class TextFilter(name: String) : Filter.Text(name) + +internal open class SortFilter(name: String, selection: Selection, private val vals: List>) : + Filter.Sort(name, vals.map { it.first }.toTypedArray(), selection) { + fun getValue() = vals[state!!.index].second +} + +private val getSortsList: List> = listOf( + Pair("Newest", "lat"), + Pair("Popularity", "pop"), + Pair("Title", "tit"), +)