From 5826738e1ce319d87755eeabab777bebef392a6a Mon Sep 17 00:00:00 2001 From: Dark25 Date: Tue, 29 Oct 2024 20:54:07 +0100 Subject: [PATCH] Feat(src/zh): Add new source Hanime1 --- src/zh/hanime1/build.gradle | 8 + .../hanime1/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2679 bytes .../hanime1/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1471 bytes .../hanime1/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2669 bytes .../hanime1/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6551 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 7028 bytes .../animeextension/zh/hanime1/Filters.kt | 49 +++ .../animeextension/zh/hanime1/Hanime1.kt | 281 ++++++++++++++++++ 8 files changed, 338 insertions(+) create mode 100644 src/zh/hanime1/build.gradle create mode 100644 src/zh/hanime1/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/zh/hanime1/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/zh/hanime1/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/zh/hanime1/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/zh/hanime1/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Filters.kt create mode 100644 src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt diff --git a/src/zh/hanime1/build.gradle b/src/zh/hanime1/build.gradle new file mode 100644 index 0000000000..9f76db85ac --- /dev/null +++ b/src/zh/hanime1/build.gradle @@ -0,0 +1,8 @@ +ext { + extName = 'Hanime1' + extClass = '.Hanime1' + extVersionCode = 1 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/zh/hanime1/res/mipmap-hdpi/ic_launcher.png b/src/zh/hanime1/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..23ff9b30b3b2fec5163a616070f3ada7ccd7b3c5 GIT binary patch literal 2679 zcmV--3W)WIP)^@RCt{2Tg^`!%^CmA>|$eV40cLMAf?Cx3`rw}Ds7@1h*C9& zd&!}Q2<4btrAW;og+xK&5Ro@=(?ZjH5J(D1geuawu`yt5 z)}HABubEx%+PgNJK;Ar(wZHwCXJ?+B-}5o+B>-e>3&W03-M(JL^H#8vqTYw*_IDMF zJL=7-fX$AH1Gj>y!`Lw)C~pRRZ$veOIJKBQ1iXyMBuF8~B5JD{7 zK$d07IcJP9NRm_%%d$)vV~leSNs>xpS(YsuR8bTb3Zdrfl2{a8~|GvCzI^v}M&zJ*)2Zn3GU zDR9mWsVwVsSi0Z_)6Pf?Wi<>lpe&iT`G=gxhYo}O06POxJSVw5NX06lr~q$?he z|5Qg0ex zRl89PB`9VZ#WWo%%Rv`U5=EZaO$IgB?A)r-1oJaRG0t}=A>v9z)I*4EW7~;h4pOX; zR*q1N^SrKoMzLHu{3$4ALr=LBGmKmSsJ`R?EIx70bAij~DZ=(s7w@4tUOB~ziWqJ6 zi}Db$m1Qj8D+VoEWB z-^z!vVS^hI2o4fgfgY#DXwhDj3MjVYki}W0;vW+)gs~Q4u0}!OIH1*|t{{tdwKTh} z8@Jf2TvM?Y#njG=k;n#Cy)PGz6N77XPI})^Of4kMC}xVe4kH(>avq<+;Ccte(I}Q1 zt6>x~#n9oLakeL?K}Ig54BNW)NfgWHJBCq=F zSuj9evb`R201P}=#O`F~oO3YF9gAh^n^jeIjbaQOulXkanvE8m;{g5#t?27_2wSir)<0y;W6P+wmUuh)y}>S|0(OyJF%H;62lB9TCQdpqXl<}foegSNId96fpzE|&|_)60>9r6zuyl@k|4`6rlzKF z{rYvRt*v2vd>l7!+&~}@!0FSc(bLm|>gsAJih`Dw7Wn;ss9)$*66QY(#d>>tQCC-o zNF<`UKAX*gF=qJ0)bpHkFvc|3ef;HSXo)oIO|e<+EWy}fB!zt zoH>K)>T2A*dl!p~iy(v`kw_qsNFWl4U}@0L{aa^MA@xG zaW}ACTIsPQNsLlzx_V(6#cFG7GcK1aK?u>*W5C|4#mbFhk|brkUT?zfc4y3Vn^Mf< z@oWWy!GF74t~l^zQq1G=BpMnTmN@6BVg@p#ST>v83Wvkb0)fE7mrAjwrl!|jU0p9z zsZ`R;K$2jb?Zw`lp0%|#_RTln#M;~2UoS5&AIWC3Ue0;`dbM-==|?F=RaI4{wzhV? zt*vctXlUr$=H})Hw{PEGd-m*^p-(VP6rVnQN?*Ntwcgp;`S%MKF8tx$yLUf}#bTj! zI$iSHd2u?6$BONX?VJ)yDf4(d@rH(mH=$5y*6;U!7mvpilarICPTDLFVgP7kVIor!MN#~m^OCQI_M%WqnIuU`0P$2R6`z@zNls2qvX?Jk+BT57pO@Cw zR&;iDLY8F!ppqmNeAnRf`RLZx76Sm6%SG4M*I6JCKr9wRAP_)0orc@(#>U150Kn_@ z=8vh@#A30^Eny&P`2qlQb8}c+G|USNguud!LY)|X^ic%wYbi=GlQv((z^#gzvn@3P lzBjYzE5%C4SBjO8{{uDU2x1K%hK2wD002ovPDHLkV1fvc^ilu- literal 0 HcmV?d00001 diff --git a/src/zh/hanime1/res/mipmap-mdpi/ic_launcher.png b/src/zh/hanime1/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b073f635fabd3b36e0133fe337dba1aa47225ace GIT binary patch literal 1471 zcmV;w1wi_VP)-*DA;4l1ijfQ9=|)wTLWg2gfn)Zg#!XL+tff8a-ELCkwFoLz*lwfG&l)Za68;pfI7-yLAiGQ z?7(mmps`pCi;IhBHk;>lUC%Ja6hern0A)|=_8=Y(sF!28M2IFvs6o^Xt1bqs0 z1HvZ5r7JrZyZQ#P9q#38XW7FN*du>Z?w=E)I1lvJLj3Bm-_Z~a_ky@r$8Q1Gxxuan z2kEHj5}*!iBa{N@*&hTIRsPv_*l%bYGCQfuxc>)T6pmN{f**w$SiB^x|3-lkBsxzh z-}0GJAV~z2KH5eBgQLW=XZEp!p{Q$K$xq&s04V7X&&e^0EUl&E{0bC z!3ywfM;QZMjDIFZ|7&Gb46Oh|GzC~Ez!~Y*WhdmvtpEdXz)WmdjlTah1aD?FSR0#G z6Cb*7WUP$}Gsmw00Q`v-elkkF*S!>Y2MxcNW&0lI4nU%rg#>1k-1 zhWGE^qgt(^TCL*x_3OBM_b!sjB=Y$@_V)JBYPEd({h|t_QYjdQf$i;Wl*?sQDixTf z3Bxe3wY7y>t%h>BjH9C?P)Z@oG7b(7u)e+y0NC8zgs$r-l}b1~JnZW)iUOVl!YJ_g z@nhd>L3sW8bzk}E)2F`uhEZVTS!fW1$wHmqu6fEuAdyHkMNw=5gDFpx|p(Q36INs{Nf zi63?6xo#9#mW5WUg;J>mUDv%ydJynz3;rkVUlqOza5(Mp`KlzmoTH8p;667P>>S|> Z;6Hi{IO+^8=ZydW002ovPDHLkV1iWVpUeON literal 0 HcmV?d00001 diff --git a/src/zh/hanime1/res/mipmap-xhdpi/ic_launcher.png b/src/zh/hanime1/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..293906dfab5ebc6648020f41915bb9be874fe4bb GIT binary patch literal 2669 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 bFq!`YqnK1^D>8e200000NkvXXu0mjf^i<=} literal 0 HcmV?d00001 diff --git a/src/zh/hanime1/res/mipmap-xxhdpi/ic_launcher.png b/src/zh/hanime1/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8a563b36d64a44e379c5ed9c044f7b3a153309e8 GIT binary patch literal 6551 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%0Dsa4t$zLgKTYi5G!CHf-WxoK9Gyw#eUi1QGmn zT7_f|bcM0{h0mD!Gh;`b?Z1CJr^^kgqE)a7>G-G8|CSf4Y_q*MLR{{FA}p+xG^GJ}rnm}x`D z9!kGMJiECX0=-I;p1E2pVHuh4l!|j@*woCM*zp0Ba;vq*G)x9-MHUzHe5kE$`&el$ z8kzgv#)c$OtEeQ>PQtLtpCcY1^icNv~#^#o3IAdcJ03uYzgTK zqokj-5@94GBhv@RCIwzP+k4Hl6TS-VmKJ?fT~R@i%MH<_b#rsWPKtZWEzh!As!$WV z(7oym{O@luk-Za68^5XYw0QUoYVaxLFW81N<)U(O*s(cM_O6~J%jbxgQ&nWo%0u={ z<=EkuDbt`QJ7#WPbW5JvlwShDE11OGZ;43;{Mt0tyPA7&RlPXlQ7%6W3bKm%Fsz$Pqw* z>Y1{sv7vW|VG4h+MlrCmz7R>p&!_z#K3=f;hF}3@^=!d0j19=Z$k-7WWN>LT=j`u?O)fjAzPcZr4S<(mQ1yCe5Dly%$q%eFtB zgR6RH8}x<0e!csQ2AD3MFrF+Z$)@Rc~yc@F_% z@!2Sfhe7iblT~1oTJLIg2q#EG;L*=hAzN-9;C~a`+};M{!9>LP<#pCnVg+ z*qEH=TffYeG@JLfa(> z1Nl8!-mpCHKV$59Yx?^2P>Oo&y5tR5Es`J`?r$P(XDC~dm7eDCYv*q=zhR7|nAiy( zLkg$r-D#!2y>sYgIAGW>`C`d)Mfqt`uI)@kzOJsWiK{ZHXDVTf%ZSq37MHT=`n2_A z?ZMz#%v%p>EUT$)J6$Gy-;PJw++^Mp*}#*3Pm6E%5gRXm>t{@UG*`MtbxeJM0yK1W zUl&ejal|ud>gu+jGe6yVZuTdk35kgGvZP(NhChhRNk~Y%l@t}F`D$s9J;*6`7D2Wu zh_9rftf{k(K@{ZYKVBLeb8f_Pn>V@2QNxonGv_!LI-rmNzi`VO?ll)S zpzYxS&?JtRhQujBep>>%z6~{tU_EjIkGj70Uud7!Z)CC61ob1uz1r**`>T$z(RY7~j~)la-JtkiXumEvO}T z7urM|DSF@RSt&gC^=;A6)_w&2p(%{EhpH79k!!DN=z_O5!(p5pXfm}ScrBx9!lc6e z<%pE~-$ZZBn(~Ofwddqc;SgU#c11%2y}P^nM>{(xCv``6H-7FI_ZsFWnj(yw!XQ~# zSU3>Mful)_<^Lka#x$D`J4s{Y4Ut`#Av^;7O0Kq?i_3AGh7}`zx)^2DJK73Dl`6L=P8Y>E!v9&xo>XL z&mXp*GIvJaSFA&s*I~Oy?VTNF+U literal 0 HcmV?d00001 diff --git a/src/zh/hanime1/res/mipmap-xxxhdpi/ic_launcher.png b/src/zh/hanime1/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fc67b6241beadabdd5561d0770a5bff5210155 GIT binary patch literal 7028 zcmch6bzD<#*!~y;M+jpeEeu2&=@>Z>DT78)q*IZQ8qJXIm`IFJQa~jPx{3aTR(Bg^D;F^diwM5=$#JZRwJw6q3#20y$ zfucy1PS*#x)(pJK6Atx+%Sn}I?)fOlx#7>O>Q~41)}DKM+I9Fg^gnBq11@g<%yJ9J zRuDHO2DMieZH(FbuJ~5_RCX@R$IiLG^3q~mSWCw4$6^n5mQPhw;;?-`@#Zf&g*-`9 zDPOh-K1#`2VQWG!+VO4XZ@kgAxp!bfX|_gWR7@mT7ppj(CNUiqBG$c6rSnlykwx^L zK>_g|6K4hk{AFog`J(&v;i$fp$6vR8OxbVKRA{!RmPcoHg@oJ_&@b%onUVOVs51Or z^qz^6Y5$AC9p8dizo>#OrM^4G@U>AuUM4`mWUpUCz{uNi%E2#p3=Vo5-)jF-W60X} z#uh6(y|I$LlXm=*B{YP)QqRs&`sfFO=Vy@3vcBk@Mtxa`n0}g$C$c~v`@W}6SHoT` zDn?;d&cAP@@l`W|Bq$|?-lWQfXrNHL5a$MiQ}D2V3M8G8Wp~y_^3#!vX7_~8&RXCU z{h2{9O42>7uDf&$hI^BehLV&93ekD^FdT(I)td_2#OQV~lAy>q61e!DBUO^s z(+h||j8?r8u}6N2p0h0^+?sHf>(_10&d$(V%~vp-+TYa%;sdaBdFCP-8R_XW2Pf}4 z=M$kEa1PaBiTeSY^#=ue2L~he>D;s`y!mt?FpQZE0*{ngjDfY(nSK&;o~pyNM>9~< zsL}^V(3oeVcgi zw=**DS;jJUKa>FsWElkP@ z=&M!;%;R`>`O}BTUskF!oEwf9Ijl8wvCu`6>iIZ1Ts%t7b1lci!$SfFg*?cVH9Yt! z-gBxQ7r7%WT=p(?i!YhK1k- zCf|aHtE9n%K4s9B-|2w1(*0XCOPnhNG??cBF7;?oUwfUIk+CY%?G}wnl96KRF34m( z6CR!{Z&muPuy8RfE{>|gajc?;jDvj9WFGhY+3mFh>Yn z#X7!Ie?#3kyqrrkvMf zPY%JUvDlCM6@F|ziYJ24o;~9YYI5sQ_*T={80cS@a`>G-;GLI>x?9B+R6HwkdwP9+ z{f!I$Ig{0P43qe-VD?5_D6X#W11vJC5`9)~kYYoQvW*#H103hnk;ZVWSfgb6c_Wa>>PoC^_juRLsOPn zbR5TGMMKfGt6tF;r#n5)Brb^s4u-k8x!ZN#J9D+8@u*7MUtp_ymN6u8YzoKO8i};F zG=)Aq=3y*;T=4h)C+pvYZ-fkLByn8<6ERbg67e8(3=OZ5AOHjW{rxY9u%0O{wQFo4 zPK4{%uiqsae2G7cde@6|`-|f7h4C^{>NQSNaSbAj|HJU6Y7!wE@yc zA3uI<2R)Nntms)xZkZJ^mj-*+o2qiskfRg>&;4FVFlUC*jVZXvjQx(KciN76XFyam zhdV(ox_4puf+nGZ{rzCgBwmo_z-N@-o;pHjqrw+f(_T`%0(gq3%_ZabEa2oJrlz)b zo=8tcV=l`UgR1rhT#+2FmV53Z!wN!(b`-ti1%@&(HYPJpX+{=e^;$EI*Rzngwag%T zCqj&<=70nl$R>t^j-1Hz1`O1yWJ?3Z{#)=ih<6dEm81%Asozt4DvH9Q{3M)xi5Y$!?6*TV)!5xiCg(Mvf3ie0~F#08Kmo}C$)<75oHAf zM(-w!SK8U@%xT+!3-R;1?Fk85U;9oTuQ~>qA-v)C)5<7~tIUzI zHTrt~Z0V+TN2p@N!6RSBlr&+maUazZ-us zZ2EJ>8E;@snptBkm{v*WiXXB|d4hA3^_t%U+*qlJ^-8ykTAZ-z1`6@+HnVuc7GtS; zPAa=L#QPX4H5RJ?#sK9D!v78eHlEA8fk7R4V^EjZYf-`|o&68Qp;vto{iOzXPUW-#?p!82k#5hmB7PAvNqupV3Hxgz0TIFhizlCUO`!{RqtQg7y z_B#>3Dx_>v_#pj(S9+BSous#qt+*k@>YTa$rHXvEaV$ODfBiW`^K3;0V7zg-0(R2H zPCmuhm&+v%^@=z1w(HN48QLuN?;mJ!@C@XzFRW2SzLhafTJ29J+f-~n;gFoy7ww4H z8E}9jbTswc94s}gCmu=vwGxoCts5#QgNTi){|89=LzVdG7t)&)k;;gKn*hd*{v$*1 zC2~c92WS89?-*IXRe7?k3YjxrNxuipyLh2B){v7G&x18_O-Tb z!IQuZ)xK0S@=5buJftNwOI$4NNM=l7P#TWF+wg}OjUiweF+o55B|nT@h#0LPM7l`T zvTVr>l%P?wdwYN88&&952Ok_#=Hl;DHn|XqKFYjl_JkGr|oSKQj7(F!M9Sr+Snt{6hhjE$C~}yA&~D4qI>}G0$!dFEVSm7J`@B>fZArr+Wfx?p`{y-LUd{& z5;7LB_x_M(12CFc%1rQ|m>bYQ07KJ2|2zV?P>D;5oS3Nu@(wU@Mf?*#W*~jt0Z7AI z5)3OUbq>E3mY$K}I&fcFc|c-qx{PM(e!A8+I}` zQ7JZc$15d=M?Ha5_Xk)LncP$n2sg9)tKIv;Em5;2B_*O(9WiaI#+9}lFsKX_rp{FO zR_&Tt>633%)93r&`bI}nWeW8R?zukMA3kWUt4ARyJhuO6%J25xu3G>4y9wEurQq8; zIhjdF)w2`$G!m`gyKnw0U2@B(Uek5-dIkzXtN5kCF-wnJix0|S9)l508M#8EG_~}o zgE1@c+`De8g(7mK8oNwD!%we2^vfPRuCPf)8!zwkgqQ=ZE-;RH% z*>u{9V!#MkgkDs%a08=&QEAg$dvxE#L=4c4;pDui!l~Ii8vIY-;*uN?3<|V5@~IQc zrw;;U2ORTF`EDwd8ds7^Pq+{>Gc)%N4TYYa9LzUih$G|fLYuF9O<)`b0I>lyF@!gb zrzC*;r|P^P)p`o?=Fi~fe@RcbZEcA(9Mo@Gj8)id9r+#3yrM4i+BC(SwkRJI<{RFr?~aqqh9nP;s7>w9`byWUbeHqB@%< zw$@|SNYJ#7F$7k(gO|IU-@vfFC6t2DZFUZ?5WGDgAt5O_oASg-*~-d_6Ym_blQCLm zLHyNuI_|~quNFt!3!00r^Bu8=lbZqIW@jr8bqufJ+zgD2=FU$xI{`JLV{Du@xDm@D zJqNhEeSiJ8>(-323;t~}|3=N~N7a1?dwY;h1Jrxl?nhf#EOjLQMn~aim+K+u6q2t`ugj|#lbM39o?E|zmO?k zNq)YD)pH#GOvV;}TyACaiJ6pmYs3e?VX(PQS`Ue5Uw18 z0}YdtlT`;(zU40$v?c)Qf!^&?CsbyiQU3n=;y)aW*Sa5 zT8j-!Tw1S6n{Q6lM?Sa?g_K$UNW%3fn*i$MQN53(Q^S$1<3ttB?c28_i5@e6OD>?aW3m_$VkWj8xF1N<>tk!_G}14m6)Rw>8^}UjH(Z zQ_K$lV5;7?+@dwCt=#SJ&$M2Q*j3UFMpN`GiMxjf#w`xWFVjnFYi-gEgsU$2zJY;P zmo&GwhJdyfl`fd3&o;a`y2YT8Pd|e#ztdf00cxmsY%CIxx}XRlkNv&9xB2-bSUnT} zy`jT(=fDhlp{{Ef?lXQE$RyxsVYIFI3@y7vbVntJc*4)+Jee0_Xik*aW; zj!)S1*i5&$O1mEJF1whUWl?T%JBvLx;7k`kKDx+I8XC^-93_oQ0+0cfD;pXbhCZ$J zyqTGN*hRI-3eYl{2?Hu8xAyB_SzRsnJ#aF4`Qs)i$f`4L79dq~BrOjB*+@WLa{GHr zsN|T~y)~hUa8tC16l<6)dU3okIQVk@L?9{{kAKj5jT7M+%lTvtzyhii%(R;R{G;;o z=K?{D+^1XNN~*rTa-f;wl8;)Y87%&X)$UP#RnzvqHSMq5`x^r{CaT+>8yc1a1Y}k4 zkyv+4tFW%-?9DSH>7R~5Xu|*YWXE@PX7sM(eMAxC8vvs1}Z~V0|sN&+eK6Uo?R%#_& z)p|`q0ckY7kP6_*zxYgwJG#A7Q$W2Ev+eV%D1Q2{cGEnzPY=6HV$OjlEFbIlAK%NA zy#_E5eK6_ex-o&QJ3n3pmNJ9O1+oXuZTH~7YO=;7!G;NxG`vJK1I*I~1Un5qIWqFb zd~I)aq;)a+Yy{&X6QjWe#v`Zv51wAaGt%uPKmgUWL=A}7l((Iwx0|~=U2E%nV}IbE z?=+<*)nesZLjwcE2&q&xHMK1utIX%WF>UG3zguqK#|Z%wg|u1#oSDsyS8PcWx69#; zvPfB5U2WYPF{9RUc=zG>iJacSw}HaMM0zRcF;R|B{nX*K%4jqSpeVuDVRUV* zG8~LSvAe?oN%oz8XmF6y6@LxH50diS8#jf>`tAz?BU{Dr=@&k@YWVPBHc4A}M#;af zDkCGK7NiO)!s>M(r9%~boPY4^08raO%ku|qO;o!n^=GhF>W8>Dk?yoBD_yYNePUkmX-$mfE=S$DSNrlMNP(04$RXe^>VU0R-~1G(UGd(+ zLA^^$MPi=6tNGUYe6_XwrN3O<_Iw~Fc85X@q%p5PmdOb8&9_fuzLL?BhpWG=`^R!6}Zy~M%jKC)P8Y!xvTy9 z_!oBP(X!d~hWwZme-`kq+im7D1mb7l@}@(v( z92iDOve~^PuFDzYJ86|2_e3Bw@Ly|${KbSCwT^r1}PI{8SkxL z_M0!9oC=b-G-E{5MCm~~?Z{6=I+FWav?|syXR@K+K{hv}!UFjhFm7E&U86R zQcd|4zFV(rrSp>vIJpe&G5snSG_Ormk5klVGD7qGL>Qq95z5s^T>1XFpx2*?ZoQs- z^=YD>?{yxW?vy;MHw?^yYlyJ=lzEpis5{__|{oSit?_yykBGUTiCe& zp6fM~?3%t>C7S$->W TfdY7q2GYFqK=q@FdGP-LFu5fp literal 0 HcmV?d00001 diff --git a/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Filters.kt b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Filters.kt new file mode 100644 index 0000000000..5b3765f3e6 --- /dev/null +++ b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Filters.kt @@ -0,0 +1,49 @@ +package eu.kanade.tachiyomi.animeextension.zh.hanime1 + +import eu.kanade.tachiyomi.animesource.model.AnimeFilter + +open class QueryFilter(name: String, val key: String, values: Array) : + AnimeFilter.Select(name, values) { + val selected: String + get() = if (state == 0) { + "" + } else { + values[state] + } +} + +open class TagFilter(val key: String, name: String, state: Boolean = false) : + AnimeFilter.CheckBox(name, state) + +class GenreFilter(values: Array) : + QueryFilter( + "影片類型", + "genre", + values.ifEmpty { arrayOf("全部", "裏番", "泡面番", "Motion Anime") }, + ) + +class SortFilter(values: Array) : + QueryFilter( + "排序方式", + "sort", + values.ifEmpty { arrayOf("最新上市", "最新上傳", "本日排行", "本週排行", "本月排行") }, + ) + +object HotFilter : TagFilter("sort", "本周排行", true) + +class YearFilter(values: Array) : + QueryFilter("發佈年份", "year", values.ifEmpty { arrayOf("全部年份") }) + +class MonthFilter(values: Array) : + QueryFilter("發佈月份", "month", values.ifEmpty { arrayOf("全部月份") }) + +class DateFilter(yearFilter: YearFilter, monthFilter: MonthFilter) : + AnimeFilter.Group("發佈日期", listOf(yearFilter, monthFilter)) + +class CategoryFilter(name: String, filters: List) : + AnimeFilter.Group(name, filters) + +class BroadMatchFilter : TagFilter("broad", "廣泛配對") + +class TagsFilter(filters: List>) : + AnimeFilter.Group>("標籤", filters) diff --git a/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt new file mode 100644 index 0000000000..473b29e7fb --- /dev/null +++ b/src/zh/hanime1/src/eu/kanade/tachiyomi/animeextension/zh/hanime1/Hanime1.kt @@ -0,0 +1,281 @@ +package eu.kanade.tachiyomi.animeextension.zh.hanime1 + +import android.app.Application +import android.content.SharedPreferences +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource +import eu.kanade.tachiyomi.animesource.model.AnimeFilter +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage +import eu.kanade.tachiyomi.animesource.model.SAnime +import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.awaitSuccess +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.coroutines.CoroutineExceptionHandler +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.jsonPrimitive +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Interceptor +import okhttp3.Request +import okhttp3.Response +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy +import java.text.SimpleDateFormat +import java.util.Locale + +enum class FilterUpdateState { + NONE, + UPDATING, + COMPLETED, + FAILED, +} + +class Hanime1 : AnimeHttpSource(), ConfigurableAnimeSource { + override val baseUrl: String + get() = "https://hanime1.me" + override val lang: String + get() = "zh" + override val name: String + get() = "Hanime1.me" + override val supportsLatest: Boolean + get() = true + + override val client = + network.client.newBuilder().addInterceptor(::checkFiltersInterceptor).build() + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + private val json by injectLazy() + private var filterUpdateState = FilterUpdateState.NONE + private val uploadDateFormat: SimpleDateFormat by lazy { + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault()) + } + + override fun animeDetailsParse(response: Response): SAnime { + val jsoup = response.asJsoup() + return SAnime.create().apply { + genre = jsoup.select(".single-video-tag").not("[data-toggle]").eachText().joinToString() + author = jsoup.select("#video-artist-name").text() + jsoup.select("script[type=application/ld+json]").first()?.data()?.let { + val info = json.decodeFromString(it).jsonObject + title = info["name"]!!.jsonPrimitive.content + description = info["description"]!!.jsonPrimitive.content + } + } + } + + override fun episodeListParse(response: Response): List { + val jsoup = response.asJsoup() + val nodes = jsoup.select("#playlist-scroll").first()!!.select(">div") + return nodes.mapIndexed { index, element -> + SEpisode.create().apply { + val href = element.select("a.overlay").attr("href") + setUrlWithoutDomain(href) + episode_number = (nodes.size - index).toFloat() + name = element.select("div.card-mobile-title").text() + if (href == response.request.url.toString()) { + // current video + jsoup.select("script[type=application/ld+json]").first()?.data()?.let { + val info = json.decodeFromString(it).jsonObject + info["uploadDate"]?.jsonPrimitive?.content?.let { date -> + date_upload = + runCatching { uploadDateFormat.parse(date)?.time }.getOrNull() ?: 0L + } + } + } + } + } + } + + override fun videoListParse(response: Response): List