From d514463eddd7804beeafc5cf5a8495f874c65841 Mon Sep 17 00:00:00 2001 From: Hualiang <78242797+hualiong@users.noreply.github.com> Date: Mon, 11 Aug 2025 10:49:33 +0800 Subject: [PATCH] Add Xgmn Source (#10067) * init * complete * complete * fix * apply commit * move to all --- src/all/xgmn/build.gradle | 8 + src/all/xgmn/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2271 bytes src/all/xgmn/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1336 bytes src/all/xgmn/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3165 bytes .../xgmn/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5261 bytes .../xgmn/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7145 bytes .../tachiyomi/extension/all/xgmn/Filters.kt | 86 ++++++++++ .../tachiyomi/extension/all/xgmn/XGMN.kt | 149 ++++++++++++++++++ 8 files changed, 243 insertions(+) create mode 100644 src/all/xgmn/build.gradle create mode 100644 src/all/xgmn/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/xgmn/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/xgmn/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/xgmn/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/xgmn/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/Filters.kt create mode 100644 src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/XGMN.kt diff --git a/src/all/xgmn/build.gradle b/src/all/xgmn/build.gradle new file mode 100644 index 000000000..46d43b2af --- /dev/null +++ b/src/all/xgmn/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'XGMN' + extClass = '.XGMN' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/xgmn/res/mipmap-hdpi/ic_launcher.png b/src/all/xgmn/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1e6518a264c353fad426e99848a84bf37dcbf3dd GIT binary patch literal 2271 zcmV<52q5=~P)Px-nMp)JRCr$PoNG)JR}{z3F3ZEELdrwf4UeTlqe)4>^$TLO(N7dbr5fTR4G+<_ ziOC`cY#V7sP1;J*1Qe_hN-#BzjYR7s8Y_`%LPMLhjYc$$xLf2QC_+nxEj!H_cgES> znLBs(&hjuj3CZqq?!D*!?*E*7=gz|bp@T@k5aL575CWv4kPx5{AhskDQjm@cLYOZL zP!0g_PxYYbu(7MF>(%V+?6(aD!x8|9P_1EAj#J2$Uf zxw0Psrj>jk0W!9>wk8x66`eMjOu1MAO~*-{RdZgcel6u_U<>uRT&~Vjr%n}a+qP|3 zNl7F?;ZCP>qt$9XVl*0K)SRSoY_8e3-R?1`)A_#5X8R5RTyp*?0m9#-hKGmu#>dC+ zlL$G57cP*CZt+RY>8mI>{QQYJ(u> zA1QPP2L}&ZES66J;2*g#BLRBl;lqdfEEbDh%_%MaX9cXKEje4?_WS$$>#SBQ0{VN# z0FfYQ1*FwpZiXe*!3-!lIoYn1f8=tIuQN0=Q?PAFN@4~?3Nh>$9wdOQArb8IK?gLS z;UIiwKp0{)DhVW4kY+TRuv1ePO&!dD^q$3}oeBi18WgSnpVNS}b|x71%z%_aj5PW+ z`}V=F-QD7T!aMo-P+U?1;o;$8ALZmf`s4`|6%~nlD$!;$?6TWo*|KGRY|foM3&)z8 zz%@0+w-Xl^2hA-l5Vc@|CXUR20tvBA@4gFHFJBfNEiEsH&uVKSB7(eA^61ec$h6r+ zKrt~fP=E9&tSKn)>-5*hjzM*0B|LkEX9xgE77P4->lQ>uN6!O5g@thS$`x5aB;_HX z#WtI`pRzC}1{wkcM0-lZtRT`XrqtO@50Ir&JIEGI-WkF|n~cp!~IK#kH2u zCMu|^vJxge3R;w$41e6d%`1pz_7ZHE0r`d)&CDYJ5*CuIfRsY4YWHrKoSfv9Dg~q^ z#&icn)A&YIkTeIWC`f=VgqW{_H>&naVI@5D=#a9pRQl$ zi{bB^w{C?!RaIWoyqxn0=(Y58?o=L^8E=4+`zzqz8hw0ou^Tlk_`_iEzN78*wEC( z=O8Vr(BcELf&y7dYjIF&i-0oH(!6re5eXoz_0kL`Ga$9?4yBpQcb|w99zw^ZfP@?* z2Z(l+JR^X#EEH)RBB?+CB+WrA3ZhXQvw~;X-lV15yJZ9Zfmg z?@ynGU%I<_Go1N2w_DtajEaha4TXj9Ms~KWDD+r3>aHLyK(t7Gwrq6=q|^~DXZ(S{ z2-d&^6_E4{K9Ek+l#y$LG)rj(8B{*MoFWKNwk4;=!R%LN%38PL+!23D(8Q=f2qqq3p` zE?>IDm)pE$3w%;j1Cf!DR0&+EF2Sc_ z>T1BfAMk{aZ#`b$JzwyOslB2Ca+fa;l!a`$pof^2`xm9*Lvv@E8g#Y)(~#5!kXo(@ zL`hm<(R4Nt8(jd=G_1#H3i(D&U3#^J?FAK(nxlaxawTH^63s)iaATF2&! zT~HOol6ziyKs0hEg%|=-yLLvKlUQIgD@g6CMzB;gQ=!ZZh<4MSWfW(#EEAyn_wQGy zr>E~R7!2Zbs?r%oE=*_@C8rRYu+QIwODbJ%1u z;lsSddv2tio2l?%h2?U&#&6!dS+Qcpif;h`Z)oy+0-E$dU1VNfo~^#VzQtyFn!3Js~9 zhmk^X7NNRbF4u(9>AYjN+jpHmfBr52jCmgF^?TU>@v(4xuoofa`9Sr8 t6SWYV#b}rtO@{!fj6(=e2oPJS{tplLWuwql(fI%X002ovPDHLkV1hci7jggq literal 0 HcmV?d00001 diff --git a/src/all/xgmn/res/mipmap-mdpi/ic_launcher.png b/src/all/xgmn/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b0316c25ab1ce919ac263b758606735561738de8 GIT binary patch literal 1336 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 DZXe>G literal 0 HcmV?d00001 diff --git a/src/all/xgmn/res/mipmap-xxhdpi/ic_launcher.png b/src/all/xgmn/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6409e18c7ec5c5c6509e4c21f1b94dc796e43d GIT binary patch literal 5261 zcmV;86msi{P)Px}M@d9MRCr$PoqLQ_)g8xwv+OP_uSCnT3!<1*|1ojPV^J}!Z<9(a4>64z!8A0L z#kKL#*qZp4$}TpMMpzr)e^@m>SYJdyv8JUa(10!&MH{iY0_y^6O;li*WoDY+WzKr` z%sKb`&N=tay|a5JnJmnl=kI*(@B90m`;du&I9b30Nz{vt0ASd(r%5eb{ zSG#`2+$>OZt6p9^%7tcaiGQOWvv1GN0tgQeP$V!#1yD_CPS_s4@&6tqyM>Or76S$U z7D^EDpE-f#3J?P(bN1P1*FOF9)2E$#?ztCCoH+5iy1Ke~nM`Izu~-~~7Rh9WcU3H& z9Cs3*i+$oaa6GP`Q`-nDr?QE|*z$!!p*NSyZ98)0$oic-cmBJ*z5RcC_wGHx!DJ1Q z3qZW5solSS|CLQmO}Ew7)?NYtV|9m-%806Z)WwOqUtN2Z_}(;GTopsh(Px0`uBgWKKMIvZ0~jO1?Lp%hi2P z8hL_+;u?Qk?Wzu_Y&QGOQ%^nh+xGVMgMud_Ti4VBv7osY0P1(`+BLtWrR8s#Os1aP zqc4~m3lxjRTu)EWvN?0+ya@og5=2H)W&;prRR~Z+e}DgDO-)U|<_QlwicBR<7dY#_ zXDekRJ*H9;L-sTTnrxopXSz9x)H10%bm-7a&CSiX06^Bp3z-6h(uDw_$2ldN&F&mK zcI=F>n1gb-#p${!{l`_N8s>HU`0?I`hK5!EI9BpPEHfjS#ReesKA5JDFBXgYOF)r2 z^Mz7rfqW*DnGOI)0pK_Quz;F0SQCI)>W%=Nf&di?1q3K~$y~lHE6~XbB^aklm)Mug zjhjl9Yx%GZRK9JUB*`R9C8IidEdg|-Bx8I=riI89AQt~1Kog3^;#b-pEDJ>G{!M|i z9C9qxT&gH85RLP4I?Vrx;r)|K1VqYg3d_FdyP$~;B|KompxGIkb744^`x@FjECI++NQHC<++t7{@% zVSSlOmuY!hiJ?kAwSCcRCJvAt_dnLEqzq89lBgGqkBz93|0Tp40)vlTHbEDMwORnJ{;4T8|>5CemY*MOM1~R0CvpO!!)r zv_R?rs^sK-U+xx23?Q2<%=X;b_U+r@y{%gzpU;=w`-CPe6bf+D(xq_5nP*DB=QA(r zxwFHE4#8uOJq9(U+p_s zF8^SSG&eWH4L9Bh<0niozAVJ%GLpmrq8SjAoOfAXU`4*YHVyYYS*@K>Hre6Fq{}=^DxXqt$q06ArB-o z6auty^JbVQ0Vr%EPPQ?~+DCxSpF20Wk4b!Co3#kg>ea&lqGXgjK)mM(4vZ2&ufG1e z)B{o4=f_GZpE`g{j|7Ue1rm1u{egt308)7%O8c@lZ2+RoodS@`15tpWjDasx^#D;O ztOcl8giUX~6}g0&dLYVNL2_*gYynbv1j-nw0GS5SI)G+k z7Peu-=nbMNZrrqt3?SYkh#ttaeQFHE_bCgaDgAnY0LZuX@CK(`d8qOXJV2t9;G*#W zg?SfU5Xyfac%ar+7$a=-F-QV{Iy+&-%9TdXSG;!7qOyG;Ue<#&p7TI)Nf(<()kzrT zC>6^vfO5z2{{Qlqs|S*S#Y>nBS{D!W*2axxKNrdRkO5?JQr6VIqXwXk`|eYw@vZ=c zNtkLQF=~JUPg*R(EWrbr0%2M{F@RVWM$M|k42W}~(mC^)6z)WKNcMqPnLMWPZ@(S= zMq+EL^i)Q$kyuv;t8gcpJC&i5Y|5=`Y5b<=po4A zsf^Mk5d20Q0`$_$FT?p4ToBkSEOVh;Qi5%K`pGB210>1~#y}!Kx-1XdU3$|^@a{YB z1RhBCi1_nbTHx8|o`auEo^13ae;YZ&@z&JTjQpo_eDTE>@Y!ddL9u|Sl)umr2+wJ! zoklt6NM%sMWFCmYDFPI>eZY6PbH@%ieE6_(43j2Jg4VfnVeHuQ2mVw0AWg7TD0Lpl zWbj616_-^EwITc-hf&*-!ZLt(4=M9N)MJXeJ!an#50K6U$Mrn}C~PCqCJT#eyteJ84j|VojFKfWkECwV;hOQ2Qus;6~z++NX)`?fv(J5he?cBo(uYq2iDs zRVYA_^%3QPqIAua<3hGU$m)eFqZZfLzB`srrclROu`%$_+*qh;HAu4Q{;Q1{gSWXlT9I(LAQ6 z2J(3JUv~di>59aT)vF=OjYOH$s$@va3To&SC0uP0Le{-TACx7E$351yDpb@y!@mplSe$a)U7}yRyl2bena$ zj7cZcI@uEEL&;L3@@7>7kikLWTr?`T_s)hoc{648olK2l;=YY&ERYI- zbXgcR$aTrW4jecD$Fte8O+CDOqN%w#cvt~14Z8cb!j68OXTpakeD~dVC!YZ%-0P0N zfiXeyLn^9_FYcrvH2~@20Lt;ATbQsmmRx%+?0WzGvLcO5P4M`WPeMye3uOqAT(JJf zyYGeQ`fAcx#6odMS}FjtvPQ&}F1ze9*s*O}*~2TROq~kdue<{I z{N+l$+S=OS=_j5jyQ>u+PP6`%SKwC*7F22|+J34Aps2GjF>~Po;`?fBZVmv#hgYgz z6wgO3gVHDh#Kwcqa_oNfRVhG}OpqE1XsO`}R1H8TlL}jCl@Vng2p6Sk+B8_--5m;0 z)MJwYgngg~QUPQ$=P1TKssIWzm)tKh$%e_r-=eSJNgciwq0anht87nAZBIo%`m z6c5S70sQCFPoeL?fge+NuB}_!+k9 z0Lh+=T2_ftE~HFHXD2LMwk+stnD;CeVQfP~a8qJhUR487+*ugEAbelA!H7R_^3m?y z$~6-uLspPl2BBHo)djb-wMqL+gKY5wt15ulz$r0J*dkJoURqF6{`>FYr59g>L)-%t zsQpku2E`S2k)%p)5>m)aH9-6X zqR{v#+MpO!muZ;*@7iD7^{WP;xDDakx3fTE0EJ~?x+63!h<3fFj2ejZGD^8Rv6Qit z4V@x?X_GB}5{Us6M-ZI`iHcfwlT6VmK50Y&M47NJ6RibO4G<*@qsX0W7N&c?qUd#0 za>dF~%6YpDk)N+a4xoJ}3Or5Ii-seVnzo@#(hC*#Xk-U5jMB>Txro$J?` zMqu4(99Y>wgLW-vhug02l;- ze8^3=!gnlOJ9FmDMMMC7u@qWh_wL=V&73*&_Z&d@n-8&hpqkRJHX}gepLyn)`Ae28 z=^8g~T)m5JTs8?^vno+usps8X=9`wfM~@!Ob$55SFI%>3BLEx$fNV*^@YXicBLqw& z4CjsU4!#kfar5WTpT1_zn!lWL&N)A?sX?~fUar#NTHkH-)m1y6&%@rmd*8eL_S^5= zym|9J0Ki`zMu5=!;G6U^1qdm@$4Ugh9pBKQpmP9#5?20*6UC@)0AeyW7ULj%uUofn!8O-h^QY5KKmAnp z*b-Id#l~SO6)rMonuVoeg<~4T;NT$i_4R$bVZ(;ix7~Kz>m}*J0Qxv5U$Fs%z#%{= zV+c?X3*oz?qvPT$uDD|9j2Sap$B!RhhtFiLt3yW>&C4{C5@RF$zbUlQj6C^P@VC&i z*(@A6a%8Z#w|D23EnA+w_uhN|S%QbfJ_ry>7die3Y-%w*KAp$l8B_Xk_4W1RX3d(_ zxNzaZS+i%)zH0L1$t?{H4b7QM#yU9SQ+Ixx6cAkMTG%ADRf@%8A)C$i4-5=^_`wGs zY}zFYueo{PbOu;3fL5yFFi5iEQoM9j090X-UgD4Gx^b&$1(ukBuN!JpR z(j}#I=eytk;r-#6xt{CHoadamp1J2f_k?MvDN&aX zIkAJdX)4NsVgk!50L(ecPabP~nfx>MElkkyG<|!zWdfrUq@tKF%2w(BD4H(v#b{_n z!sy;n)|FiAToNHOk(4)zikRVx=Mzk-3cXK|Ch|FY1%ebZ*`4z17=uvOR=tWS$hY4| z{4seQUNw`y3Kzz!(*8~R7M&jvre-A57Gc#h0flu3Cq**`cALBDR~H|>fIcV;dP-R$ zEg)?NguvHp-@d_wfPv5H?z}MgO7;K!)=mO2$d}WrJ2qLrm7X(OMXsTuQmfv5?{N#U zLyKPgY|{9~5x%V&NSQ$QK=Ei~@mhF4jxf746BbAhd(BBj)1F9WdS-gToM7+~E^lvu z5H5yU-fj;pcqCzHj^_D!q@Ba2C%)tI(DSc^!^z$%y@$JdkAt1vsre_(<6ztU%O>M5 zex~@ZsL@W7iJFrW`##n6wi!%dnu*ae-NN&Q5mda@BMX9Ik!}M60ug|O(j4A?#IxnU>md+_&#cMr0C5(?hJ(G;-9_d!Qnj7fv_neX97o%MW6m^kUP z6mpvvRDUO`Hrtfrxu%TBgW#l+;#(u?_JCr+>2mLvx}Hjk(2}l>kRR@x`a_eY&VR_y2 z9rG`@iPq>K)krJM*K7;-a1MWr7oURqE0ZSF>EULe&(GIa9+BaKuTuOc`#~S%wVv6W zrHMJ5#D`GQ*C!k6kD%?T>?f+b=4J zKBA9yx&<<&b~#GaxF)^nlD5Zssr)sIoA`9$6c-U+?!1(*%_qDD`a>QQswv5E zW&ncQ9=6?wzT|a%TL{U8@g+Q^0e)J2P(j8-#>NyfKS&l=W5rPe0bHtj`_COaASSr2 zms{%bwTjx2D!p>jpW6<-3B3ugR92q_n0(Q`(13spYTqO|3=}ZV`g0|_ zl@~%@{x6doYasTM&#l8uJ|-I}|` zkc{`@7uBG!s5sqJ32aiU8kn+ zj#RbAPI*)eu0EJalz)M?ar9jR=8D`%CiA zk$L=zvn}uOV+qWsT4mCA)yFfn)(`i$WEQw+a6Mq$j{Zx~AQTtQs*1?$qN!fcjMQq8 z;6MzvSn{v)*aom!=j=TzD%b-&gAW(W(oCVBh+}Q|#IRAvOSWW()Yq44ES6w0NPevJ zdqnpMN*KNSuzu|pk-oBDp&=51(L&-<=Sy9-sJ*5P;nBCn% zNHlRJahsC3FkYU@ECP+^#^jaDi=A#kKiZiOmVq<_AKqO{7I#9hh+`Cn4(U={gD=nL zDaX!^7W#EBFQ9gRA3Cz&UH+s9y8Y>C{`*C<_4M#C8Ft23;J#6{pw0B%2>RwX`|DAry}WT|_{F_x69%sp zj$|FLoVy*|<;Pj6~(2?#}fpPnT)zENb8hPzAEnTZAxCTq4D z8_`rCcM``u(Y}_60-6}&K6bhT6AS{7((SVL+4kiO=3lQE+hqaX<4=kx7{i4@Sq6s5 z&Y3{<)qE24hCnwv*qW82X)0?+tV^ky|9eIQen|q`NZ+*h-4`Zh&Zh>MCUskBiKF9xt3@YYiBq2aZ4Xn9Q z2&!S?d7lAyHRy?>840dHMirj5#wCn1E?=vC9JNU%)Y_w6_aZ%G{l##=O=!mgCsc!j zwtd0%kveSz#E3wzX$k0$g`pDPQI@!d7Zu^~Am_0;TROzVw=W+gK`S6}mKVZBGYUh! zgwQ>1phBu?`{s_dh3^gEzV8GN(gw~cZ}Z=DsPOEN8`E{%%)J7Pyawdo>XaL;uj#|i zsS+Q5+O+C-*jK7BC?GMvUU)A!-)96_d6fP|YH63a&meGiF)eb?zKT!PveFpu2)6(? zW`&@nLb&+5N>Me4q%^}kxLJX03PYprhxx7oOsEEIcIbTA-`NTm^p_;t`x!ohfDL6q-Jlj_ zXZyaA=(lj^w#k})HM|Dq5sIRAx&9Qr2)H7$^R+7qXa|)`c|8@uo&|LlFe|hOzwzBsnzT z>fBvf3!!qnl2@pEA+mB=4C~a4x4i)cY|Hp#v6{NKKfYT#MiEvDK_A!~!Dd@ZwWD!; z7-FDYNz&z4ftIKmRZ!mA^_O)lb;YAGJx|+WeA#NG8wue%dS^r z4`+WEjE9biuKO`-7l(Hsl#|Ymz5I~%zv&-cR9O$_55zo4MIjE_W1h?}Ll$G6d~d1e zVzkuhT3BUhypwqqB;CtMI7QHGBR>HTcoXf#yh$Bw+qHF(^Cpm3j!Uh z!J-?FP116TZ7{>1F0M!;6$U&4^H1Un&^Lvi9!<6ZTN{Q5$kV*s<|k?ykQPG@_wYY0 z2j7hzvqosC_IqnOK8k+%$rb9&nmY*~f>l*X{`4!;r<)~HWZ8@5OPslrjUTa&9?Da< z!@u}1DIvfYogmEvuUuLsZZ~V(=C{E;pdn38XE=e1>DBt~gEIEz&q@A$ECfUaT4_0S z7!$^M-Uv#v)4z#bw($WU|CV98i2zZ|a=$N$F-w^Ny*y`Z;n%gGWili3XsOf4BH)-h z-oXe(-pJCp#NXfARdDT#{_nRnJg^V0@Uk-xtAqd**RR_Qv=LA*HfV{O8*&e zkXXT#&X_G!mI41u@bx@ZP2tP7#r{GMCc@icn2QzU#hXC@e|*?vh*YPjw*w!SUV$v$ zMFkr!QKMyzi}S)pClg^UtSaw+j_?p!nx94mBHBG_t%YJV4#F1nH1<38T(JJ$dr6Na zGX~{l)Os8Tb13Crw_IHB{xgxqvT5)}jA&24VhKBPRD8xpB0A54GYokr%{#0}pXMf= z`pTXZy@{7p!v?h|a!M}Wdhb^`+1gsJ1;38T=mA#FtIJ|5>*gx{=ILR;yki-{Cz` z5D+v1g1+1RYkHcRNOT8D&y>h@o$mMt@Z2O~d1>9ohZ`Y4iA|IP;S_3UZMj*vC2tiu`!ifa(;Y$|&_}4v(s}*}3 zv=xok-u%Ki-oouGL3zQY)&rTZSUaI;8S>DjIS-@=)_x{GuJg9m?o~{~!f3;r!0K%U z4CBp-3asbPt)}1+p}g3foC3-XquN{i)myR-gb!T3Tu!~c-qmpB*1buW>PA%r_%QmR zCS0j*%FwC)ic`aRrLhX?ZgD0_n!YR?S7P7dZk8$R0iN5 z3V+AHwzyJp@-r+&au^Z)WAcW6k|)v?%5R&B07mkQo<&3g3qdar3`3P38}=PHY8k6NvP&tF{_gfw~t)%cI#REc~OefZ!VKX=mPKkR;E zu8W)-=~ELu^_5>4-8_|^d|KmsOL2A@CocXODBw!h;qlDPm!3*Q8rUQ2)Qf3_6}Q4F zB#}RS2#;HLSfs04)+)EFRl3vrTE{#b(ufIP?K)30gsPGQwSDn+dgkA-W+gtdtRKo;{qP5q1pMOZmEc9^K4176~(XJ$%$dYSayJMTta50mcG(KFsp|NEv& zCF}2~aiH|EE#1LuOuwKvSRp_pbSU+VT?=juRrAR`&@Tlhej7Cdn*%zhY$Uh}yV0NX zpPqGYvWhKn7OOng33)=d`X3qP?0D1T1*)NIpc*?RbyUzA!CMh2L^rG4YUbO zo#wKKy+aMFK;wP3U%Mz0r*yyrjtI;-nPHIEf5kvca>F&u9U4Gz&`8hrE1=LOG_vYN z3I|^J>C!0);$8*Vnq(%YSzILrx7fH`Rp#=lJe9Zi%r;0T~8^9C7JWMvY?6g2ZbgLhQKxm z`XOKma@vC7wu?D5^4{i>F6kPoEUcUem{vww0=+%~VNk)vnnw%NrT5<>N#`@vohNEK z7|I>2aml~;SR$anG}v?dWQXM@KqaLbRV_l$Q!pLTr>(O?)GZdYNo#R%U>gv9rp>Iz z@QDP++`Ya?Gj$_rzq*nLHN_mU1tgj_>O_2YTxO_zAQGQx1uHOaJZ{hQBKaerufeSF?Q^Bj zezNHe)jk%BivD=H`Cvw6`Fp4Zbn-$$r$GBbFCd z;f?B&EBFxd&-mk5qHu;XBEN)J(Rr17Bxij=N=95T$ zDA48u-8sV)1m!|O6< z>yeCGh;E9kg@4jSQT^_FRv59|&xF38Y8gyySc1^5eTazOmZy8uEmJHR?xgmv^2P2a zJ8!V1lVB*810%{lnfbAsjNrhoMG|MHqa>=bkv48bfTj){t@{u%DeOjid)KpxO9Ks^ z$jbHc{F@)8Y*pqO((ht1MdxbH_&c&|g3}u;@@aTS6~N<&1@M$4sN(!N4h*U1t{c*~ zvLG35x1U%)Bhthah=d@)!B4c`70hZ!$ue*aVb)z)lf0xw6t_e_em$_01n)g^zD~B< zu&a|W@McBT0%cCaY4iT<_u2Ol z$PIPFL4hDCXa=|$BhlOvg(qOhB&PmlU&g<9F4a_g#>v+wR-=v6b-srx8K`4Lutf#V zWR$^=(~VkY>)zD;&+>Y9MgFOB1X83>I5oA2 zu+#L9dl4FFM0tg1sa1Dk?a9fBqb|S+v^jcFynYxoLme!j)P^$!S*O44O3nv{^-Sx$ ziArq9-&@?d*e^fxWZ&q9SRfTRy6$afogVxPHgv49no|{@`o;k<>_kfcKhD*4&!I)=Cb)VBaoO2*4StD6IQuRVC}MLJCFwq2~xxp$zBK9mQhx1 zL&K$judi=OikJh_%>;(p0Id?_>HQwKYv~>%!!d<;!;Tl3+*xF$1M^gZ(0ue%i1F<2-ZyG>RvP~ z62LU@Tr_JtaI1-2z+w7FO#|`MkJdZ+b^W#!83J!^vO$5=t=N<-7*0yq-NdDpuDnlb zz0fUJCB@YMi^ZzHeEAYtF=+iY`j&ooe}8{Hl$_dcYy4$q-S*%!0qMZQDeR@*RCms2 z`Zp!Q7wnsCHvlIa?Uk~;s~pS}3XL;!G$f=GVQ!=YRb-V?0?!9=M^ClhHD)6*vJqhq ze7w%CDa4>@b=d50bJr70qkQx)=wCfse9b_`9A(53dqt39Aqm2crlpL0ml*%{6%J+z zLN#*%4g?AMkU}rijQnqZ8a zZqq{mGMAcy0(PwUtrOT7<3o>32~bOn9+fFf^=1*>lE+euuA1j?i#T)Odx!h~*ljuQ zLm!hVx-STXLs}g3+8+4&F?z`dm44G5u=ub0L!|9qUbrmWRCJKjqgdE;ctw~Zd@{(r zU3bBY4lcXHvt6%76(#aRfsn9~__DK_iKl193extQr`;!D!+O!P)h>$zR#GrU-|!73 zH-gS)>Oe>gM0Hw-DnJ=Q)PP&Y-RD%6;LdmCi^4V=c4!vThfsbeKM0O{BF+^t%s{k> zDD-(JJ`s(D#ICeimNDfJZEY)(eQ|lj3$W``$@g_JB3prRmGkb&UvBvl@9u!IyxNmu IS+oEC4{)4kwEzGB literal 0 HcmV?d00001 diff --git a/src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/Filters.kt b/src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/Filters.kt new file mode 100644 index 000000000..b7def7009 --- /dev/null +++ b/src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/Filters.kt @@ -0,0 +1,86 @@ +package eu.kanade.tachiyomi.extension.all.xgmn + +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList + +fun buildFilterList(): FilterList { + return FilterList( + CategoryFilter(), + ) +} + +class CategoryFilter : Filter.Select( + "分类(搜索时无效)", + arrayOf( + "秀人网", "美媛馆", "尤物馆", "爱蜜社", "蜜桃社", "优星馆", "嗲囡囡", + "魅妍社", "兔几盟", "影私荟", "星乐园", "顽味生活", "模范学院", + "花の颜", "御女郎", "网红馆", "尤蜜荟", "薄荷叶", "瑞丝馆", "模特联盟", + "花漾", "星颜社", "画语界", "推女郎", "尤果网", "青豆客", "头条女神", + "果团网", "喵糖映画", "爱尤物", "波萝社", "猎女神", "尤蜜", "潘多拉", + "Artgravia", "DJAWA", "丝袜美腿", "美腿宝贝", "蜜丝", "妖精社", + "性感尤物", "国产美女", "港台美女", "日韩美女", "欧美美女", "丝袜美腿", + "内衣尤物", "Cosplay", + ), +) { + override fun toString() = arrayOf( + "Xiuren/", "MyGirl/", "YouWu/", "IMiss/", "MiiTao/", "Uxing/", "FeiLin/", + "MiStar/", "Tukmo/", "WingS/", "LeYuan/", "Taste/", "MFStar/", "Huayan/", + "DKGirl/", "Candy/", "YouMi/", "MintYe/", "Micat/", "Mtmeng/", "HuaYang/", + "XingYan/", "XiaoYu/", "Tuigirl/", "Ugirls/", "Tgod/", "TouTiao/", "Girlt/", + "Mtcos/", "Aiyouwu/", "BoLoli/", "Slady/", "YouMei/", "Pdl/", "Artgravia/", + "DJAWA/", "Siwameitui/", "LEGBABY/", "MissLeg/", "YaoJingShe/", "Xgyw/", + "Guochanmeinv/", "Gangtaimeinv/", "Rihanmeinv/", "Oumeimeinv/", + "Siwameitui/", "Neiyiyouwu/", "Cosplay/", + )[state] +} + +// class XiurenFilter : Filter.Select( +// "秀人系列", +// arrayOf( +// "秀人网", "美媛馆", "尤物馆", "爱蜜社", "蜜桃社", "优星馆", "嗲囡囡", +// "魅妍社", "兔几盟", "影私荟", "星乐园", "顽味生活", "模范学院", +// "花の颜", "御女郎", "网红馆", "尤蜜荟", "薄荷叶", "瑞丝馆", "模特联盟", +// "花漾", "星颜社", "画语界", +// ), +// ) { +// val value +// get() = arrayOf( +// "Xiuren", "MyGirl", "YouWu", "IMiss", "MiiTao", "Uxing", "FeiLin", +// "MiStar", "Tukmo", "WingS", "LeYuan", "Taste", "MFStar", "Huayan", +// "DKGirl", "Candy", "YouMi", "MintYe", "Micat", "Mtmeng", "HuaYang", +// "XingYan", "XiaoYu", +// )[state] +// } +// +// class MingzhanFilter : Filter.Select( +// "名站系列", +// arrayOf( +// "推女郎", "尤果网", "青豆客", "头条女神", "果团网", "喵糖映画", +// "爱尤物", "波萝社", "猎女神", "尤蜜", "潘多拉", "Artgravia", "DJAWA", +// ), +// ) { +// val value +// get() = arrayOf( +// "Tuigirl", "Ugirls", "Tgod", "TouTiao", "Girlt", "Mtcos", "Aiyouwu", +// "BoLoli", "Slady", "YouMei", "Pdl", "Artgravia", "DJAWA", +// )[state] +// } +// +// class SiwameituiFilter : +// Filter.Select("丝袜美腿", arrayOf("丝袜美腿", "美腿宝贝", "蜜丝", "妖精社")) { +// val value get() = arrayOf("siwametui", "LEGBABY", "MissLeg", "YaoJingShe")[state] +// } +// +// class JingpinFilter : Filter.Select( +// "精品散图", +// arrayOf( +// "性感尤物", "国产美女", "港台美女", "日韩美女", +// "欧美美女", "丝袜美腿", "内衣尤物", "Cosplay", +// ), +// ) { +// val value +// get() = arrayOf( +// "Xgyw", "Guochanmeinv", "Gangtaimeinv", "Rihanmeinv", +// "Oumeimeinv", "Siwameitui", "Neiyiyouwu", "Cosplay", +// )[state] +// } diff --git a/src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/XGMN.kt b/src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/XGMN.kt new file mode 100644 index 000000000..82b2dd331 --- /dev/null +++ b/src/all/xgmn/src/eu/kanade/tachiyomi/extension/all/xgmn/XGMN.kt @@ -0,0 +1,149 @@ +package eu.kanade.tachiyomi.extension.all.xgmn + +import eu.kanade.tachiyomi.network.GET +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.model.UpdateStrategy +import eu.kanade.tachiyomi.source.online.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import keiyoushi.utils.tryParse +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import java.text.SimpleDateFormat +import java.util.Locale + +class XGMN : HttpSource() { + override val baseUrl get() = redirectUrl ?: "http://xgmn8.vip" + override val lang = "all" + override val name = "性感美女" + override val supportsLatest = true + private var redirectUrl: String? = null + + companion object { + val ID_REGEX = Regex("\\d+(?=\\.html)") + val PAGE_SIZE_REGEX = Regex("\\d+(?=P)") + val DATE_FORMAT = SimpleDateFormat("yyyy.MM.dd", Locale.CHINA) + } + + private fun getUrlWithoutDomain(url: String): String { + val prefix = listOf("http://", "https://").firstOrNull(url::startsWith) + return url.substringAfter(prefix ?: "").substringAfter('/') + } + + // Popular Page + + override fun popularMangaRequest(page: Int) = GET("$baseUrl/top.html", headers) + + override fun popularMangaParse(response: Response) = response.asJsoup().let { doc -> + redirectUrl = redirectUrl ?: doc.location().toHttpUrl().let { "${it.scheme}://${it.host}" } + MangasPage( + doc.select(".related_box").map { + SManga.create().apply { + thumbnail_url = it.selectFirst("img")?.absUrl("src") + it.selectFirst("a")!!.let { + title = it.attr("title") + setUrlWithoutDomain(it.absUrl("href")) + } + } + }, + false, + ) + } + + // Latest Page + + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/new.html", headers) + + override fun latestUpdatesParse(response: Response) = popularMangaParse(response) + + // Search Page + + override fun getFilterList() = buildFilterList() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = baseUrl.toHttpUrl().newBuilder() + if (query.isNotBlank()) { + url.addPathSegments("/plus/search/index.asp") + .addQueryParameter("keyword", query) + .addQueryParameter("p", page.toString()) + } else { + url.addPathSegments(filters.first().toString()) + if (page > 1) url.addPathSegment("page_$page.html") + } + return GET(url.build()) + } + + override fun searchMangaParse(response: Response) = + if (response.request.url.pathSegments.contains("search")) { + val doc = response.asJsoup() + redirectUrl = redirectUrl ?: doc.location().toHttpUrl().let { "${it.scheme}://${it.host}" } + val current = doc.selectFirst(".current")!!.text().toInt() + MangasPage( + doc.select(".node > p > a").map { + SManga.create().apply { + title = it.text() + setUrlWithoutDomain(it.absUrl("href")) + thumbnail_url = "$baseUrl/uploadfile/pic/${ID_REGEX.find(url)?.value}.jpg" + } + }, + current < doc.select(".list .pagination a").size, + ) + } else { + popularMangaParse(response) + } + + // Manga Detail Page + + override fun mangaDetailsParse(response: Response) = response.asJsoup().let { doc -> + redirectUrl = redirectUrl ?: doc.location().toHttpUrl().let { "${it.scheme}://${it.host}" } + SManga.create().apply { + author = doc.selectFirst(".item-2")?.text()?.substringAfter("模特:") + update_strategy = UpdateStrategy.ONLY_FETCH_ONCE + status = SManga.COMPLETED + } + } + + // Manga Detail Page / Chapters Page (Separate) + + override fun chapterListParse(response: Response) = response.asJsoup().let { doc -> + redirectUrl = redirectUrl ?: doc.location().toHttpUrl().let { "${it.scheme}://${it.host}" } + listOf( + SChapter.create().apply { + setUrlWithoutDomain(doc.selectFirst(".current")!!.absUrl("href")) + name = doc.selectFirst(".article-title")!!.text() + chapter_number = 1F + date_upload = DATE_FORMAT.tryParse( + doc.selectFirst(".item-1")?.text()?.substringAfter("更新:"), + ) + }, + ) + } + + // Manga View Page + + override fun pageListParse(response: Response) = response.asJsoup().let { doc -> + val prefix = doc.selectFirst(".current")!!.absUrl("href").substringBeforeLast(".html") + val total = PAGE_SIZE_REGEX.find(doc.selectFirst(".article-title")!!.text())!!.value + val size = doc.select(".article-content > p[style] > img").size + List(total.toInt()) { + Page( + it, + prefix + (it / size).let { v -> if (v == 0) "" else "_$v" } + ".html#${it % size + 1}", + ) + } + } + + // Image + + override fun imageUrlParse(response: Response): String { + val seq = response.request.url.fragment!! + val url = response.asJsoup() + .selectXpath("//*[contains(@class,'article-content')]/p[@*[contains(.,'center')]]/img[position()=$seq]") + .first() ?: throw Exception("没找到图片") + return "$baseUrl/${getUrlWithoutDomain(url.absUrl("src"))}" + } +}