From c990108f53c7f0c28d63910b092da0608ad49f0e Mon Sep 17 00:00:00 2001 From: Manticore <133025162+manti-X@users.noreply.github.com> Date: Wed, 7 Oct 2026 04:05:48 +0200 Subject: [PATCH] Add Hakusensha --- src/ja/hakusensha/build.gradle.kts | 21 ++ .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 6288 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3401 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 8690 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 14979 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 22301 bytes .../tachiyomi/extension/ja/hakusensha/Dto.kt | 128 ++++++++++++ .../extension/ja/hakusensha/Filters.kt | 67 +++++++ .../extension/ja/hakusensha/Hakusensha.kt | 188 ++++++++++++++++++ 9 files changed, 404 insertions(+) create mode 100644 src/ja/hakusensha/build.gradle.kts create mode 100644 src/ja/hakusensha/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/ja/hakusensha/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/ja/hakusensha/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/ja/hakusensha/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/ja/hakusensha/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Dto.kt create mode 100644 src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Filters.kt create mode 100644 src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Hakusensha.kt diff --git a/src/ja/hakusensha/build.gradle.kts b/src/ja/hakusensha/build.gradle.kts new file mode 100644 index 00000000000..f3efce72998 --- /dev/null +++ b/src/ja/hakusensha/build.gradle.kts @@ -0,0 +1,21 @@ +import io.github.keiyoushi.gradle.api.ContentWarning + +plugins { + alias(kei.plugins.extension) +} + +keiyoushi { + name = "Hakusensha e-net" + versionCode = 0 + contentWarning = ContentWarning.MIXED + libVersion = "1.6" + + source { + lang = "ja" + baseUrl = "https://www.hakusensha-e.net" + } +} + +dependencies { + implementation(project(":lib:clipstudioreader")) +} diff --git a/src/ja/hakusensha/res/mipmap-hdpi/ic_launcher.png b/src/ja/hakusensha/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5a9107d2ab0b7d89eac7fd610ebad3bf5f69beb2 GIT binary patch literal 6288 zcmV;B7;oo^P)1Qbvc5JW{pAW^`C%s38$MvWT9H7@zZm>8pC)QJir z2A4#@1<(YeV*-XnMOgyGfQTr{Cd%H+>$lE#?yY)N^TXrM zj^O{Vq8T`}36i31HA)!n!r?kqqZ}O)B|+qX+H{PZ3fU`@#SR$pT==~^T&FV5{bIxT zCW;IWYy_E(9^xM6xyvAr<;J|I2fczN;EBu}zTwp@jQX4b?rgAZCj1w@;=eXtV!*G#)hO(uUy9l{_mk z4=b{G@#5xnb#)`_>+A0%{Gy?uq0!*i&%LD3c0w_3Y6VhS6?@3 z@#6PdFhMqcB8BdN0-sD!kBj)cdGn6y)vMRc%F4>8Dk>`OE-x>?D;kXw$_QE)2ij!y z{J7^QdRG9isL1NucA^2=@57I~y2?{fy1b(NE*Do?f%M&#<&{tM>eYMZT*k(LO9%z; zK!S3#BF{bdT#J7F`n^z6QqrHYW|>STA|gcfc5B7CU}wDaQcszLLVQ4k_Kt}Nad05h zhs7*TmbpEDhO~uatAtz7A;(WZQHgPx!+##R4RoXJ9gmfufN93S6;!V>(^t) z_U+iUYnRb?3ofo$wsZ-!R^Fyfo3L`l3Pl5;KC_IFyanW3GT444^-Duk$wt8u1cBZV zUhrSJv|r}OH*VU9nJ>SLKR*9Fo}MxVFU^>N=`Xy18Plg>+m~OOjZ=MnzF`9%df)*p zT(AI}8T9gH%kcW^uj989Civaq)!DO*pTE8Jmf^2iy&CT8p+5a|F7B7>Gfbz` z3>BhyKv%hB1V#tx?44)eN($70CqtdjKK&F+mo7!ejvaB?*m3C5vnN`&Zp~4!44+cw zw2wV|c4O_@kFa&i7H~Jic8;FUH++UQYgU^i(v`U@E1RH0hYooA?Rl6tcP2 zW2cu??Axy&c#grK^9E!0u3aXvJey%FM`JA3Kn+#*^j-f(poJ4-Za-C23?jzP^P8uu z4i&7xXzRSQBunjx%3T*qlWlIDF1oI~!l|Y(YvxRR{PD*|W^9@`zn z`SRuXR>w|g-@ZLZ)7M5<6Z*SHAHnja%kaVb?_9gtkI_f&Wo*6X-2Qrf z%`wPHs7i|_NEN^yx{l$ya(NzYdv)ZItr2U8VfwUbn9iL`Yu(j&_CV`4t+SqVp}l}p zMn^?WO^sQruDSL)==$=}nl(mGeU~zMZQHg*J(E23>8J58F3`2LHF$RFRD-LIQ4T3= zk32y!T~Etm`3drQ+aE{PomY13)Ct#Ib1kmC>MFw3xbkX+ALA!CjK{IZ9cL8P|HVJ} z0S2CZ4hEcc7Vi4l&(N(~H?v@myZj2A+N+n*)1q0kX86JA(KzPVV{y|hx8RmrZ^Ny( z{S@PGz8SrG_g0mBFeAbg`LZyMFLqa)pCF$R1H)) zcvX`ssLa?>QAY+Vs9blkk`jCBk4B?#Whzhe$hI?Gh0V1ks4uBTq@o&C)lH3WtCvx= zz*OVnK%R}-ZI6t=9pGCRR&LGMswIn-`lMY2b*P{-+wdJnu3T#?SIh&WtE8i!rO7LV zQ=Flova7d@JI@)oE5vWoWzq2ug$Ct#RNtm=Wj(0buxWlPh z2I}vmmJ$5)J7w5WpTX?4Njyf~JKt`=Rex!~$X8;fp7M_bR)3vFBCU2l$T&EY=wN}- z=JImuq6uZgn(JL;8vhyVJOiqvDD=F(xR1Da+${q;s?e;p`rj@v*tKrh&b1k)k6Y*%k#RUxsw1d0pSip?y{FCNxp(^@nybO>j=+99I{z=+D8#FkFx{cai1PmjzPzlqLdM;%vH?AMZ^_3 zb&#ex`9U5T_7)L{Sg@R6QbfdM2kQ4Wr*Zq-xH*q#VqBqa%`P6O=|=~v&K5tUNHDi% zcXM&w+T%Plt=g8x9v%+;e)QYT>FpwzIHUsIk1WZGM7(~AxOm3ImQ~6knJlJ=`ef9K z?gJb<5x0RHeFmeP*&iiw8~iEzWvh`}2IB})p001uI!vQ!3XWhte+F)b zrDZuvUS(t?8&ZNltV-hEMR9EBwn|HKz1*wbzj(rRbEebqlbsnTZygVFA9G5sBYaHU z(kZN?d|iM}Ti%Wow(^{z_^}exOYGlWf70Br}GEjZNMY%$4#QBdO&yn2r_Om z?t?azS7g{vuM^7O8Oz|#d2u|mBEc8NjIy%e1#VfoVAm(Dj>fCISaa?+R;s0yu@NN< zI2^dGs?RKs%scy*+T+6g398m!bKcNH@&MC*4M{|B^0|ZT;`o4psdE?#;ryHQ_(&Ois zqr!Jk6k$8mZ|v<$kl&C!Q4fBW(gYF9)B&QWW8Inbq&kTQxx4$9<5ye@9y`ARFO8_g z?*>=m((Yx@*8)9{sLdRHzgfy-09~0|`D3V~_Lp-lIXp1sj0$vV>B2MA?R<-W;lfJX z!*)*Rj#c9H1rSW(XO6qxj$=LF>cQ)~CzRqI9u$w_qD}IEZ(o9(r1)Iq?94%L#Qicc4j_&ha&GnJ3MKMz-V!)RmLk9{Gt87wdQD{J_WJpI)ukV}6ECMAo zIP2I_T+=IxCpp@h@)Rv15RrhDh~P+0w*j0!=QHtLTb7v9u&X2@F3RIX2KO$E^G!d& zcRJvRCK257?K0eOT3Mc7Yh*fX(Xi5pO_7!Q667_Ul{$!DB4Vl5RS_KLyc_Aa99t|Lb_{A`Z&-iIo_0-l6 zB89rAyH^GxR<4V@?waG@iet$Zdt5k!pHLp;j@FfnxZmgg;+aqbflZKYAC0+0JY`)+ zZalpVzv27OX-AcCXoHs^#lCOhCsO?gKkdT=9^_ZUTmKfvm_NlZdR9Gtxv&AR@^k1{ ze3#PE5#BkNhaqCy(=(2~=iNE4!F*_ALm0|q#Uq0&pu41_sFiIL000O%NklMzhD@)+T@3m)ChQ}AVbpi5z0}pwB4RtEuQD(GD}i6|P^us3^{c=b z9u4%tw50#s&T7AMc?U|{5#+b_C(F+#p4+g9WQRY+s3-;Bs3W+7+w8MU*mRzSbgTYZ zzbJm(s|@EHTY@h93}N2C)PS&#FQhZL(B8=Zfw=Icdgwa#Qzq=;#c@pK>&uhN;<$sf z{y$g^51RTw)YlChxqAMhi@aMz@^}Zz$WKs+CpR%7#T!;V5l=_ov-)uAjp|&6pY(~E zPZ5*(t!DP9O6Uo9beGcXPN>c5q4PujC*YgwQ<%6ciTgP&w_WRLjVt+4xwjJA|3DQO#JyVIe-7#cnA+m2BH4N7h zl<-?~`(_byrWwwUVEWO$eES+qe|{=<@7|5vE0s!N*|Mcr=lpUlS6-M7$wr8B(FBQv zhvE9s1S)Vtc3FX1WywSW>2w+i*82M&t(6~8B%yqjt3F9{yLuY@oIm{uJ9q9he1B21 zcdz*+?K4wIH7kK!$51Aj9tIn5Ow_??b z70{pYz44bf@ZWE~q3kTgnIQeWQI{@VEic%0%WG`ubltCBAVGc=2M;mMjuvJ^Bt(Ix zs&m%Bfw2mL#!TS$6bz57hjBPultFz%@4~J>D9Y8 z{`0cS(5h7{Onh=Oo|yEcva_({gAbs;#cp=^;g%QP4J*SwvKJyQnjkj_w>I;}X-X@R z{N8xFs$t=XBbp-`Erb4gtVxq5Oh^MnXv+>QTDXvO46|p=#DoX#$D~OUp?{k2#TTDj zV}D6~5!(59`lIx&-A;!3^|1?}LE8dK0d^okh0H}Y z9-8nVwrtsKrY;WQWqW2F+64J~Zu!|##IFw1VT4@TVP%VW`jwTHxPJV2^zDBpMSOLL zMsfZHL-Av0AtuwT9XH-|Gj6;64s`C^1t*?(A}--HYtf>GiVgJW*%J>v{0P2x;YH}% zx1Zq&#QfdH;PZz-L=5jx75;SC1Qqbi!&{tzr^CeLn-S&?JdylP>h^olMI+FuV<+Q6 z>F(XT#^91mFEziW*B_QUV)Lg5nxv838n4yS3L;&6>aES;q1S<|Iija0X zt;x1JfC%|0b~#4HRKjGATfcQOm8#Vksji=&Smocv5|n!M(MK2ZB)dA_tnnPDU*QHu z$S&_QDSmTfA_nv(4kB3il&VHw^ONKPY?KzE~d_n7R=@YpJ9C*H|}(WjuUku2mbyzcz%Kk86Px%AD#OK{d+AtQEOWP@H7H!68Q-#tV{KSxeIk} z|9yscG3ei~6O@FtS6JhJ00030|8}7>_y7O^21!IgR09CJy00R#;w zByj^|^8jj;fIy532&jOAQFM^q1P7S4m+6=9R=wB#x~FG==%2h(x9Zk+m%6vM*Zl(c zKY1i;oC040*;VkJJ+6PZIZ?Mx(!lS)@h6Z{N$P&5jO*WRnsn`tF^i&K>{|iAFF@Ak z*czE;*)6i8N!uoqbl?}KCEyp(nT`@mYa<4eyaEdf^)yycc#rsd}4 zjiNzw5f^1Ay>M>R0n-x^v&7=tkPOzy8mm0H}W|#fFj|z z`Fw_pN}D7bXqpNgXy4eHN_&8auLB?zur&~|a<`#I!=f<}%_mu9GFs9SP=M1H5|Kie zH%()edfLBtA6EZ;l~HlT1{94(vGM&4`18EEShsd9HgDc!(-i5JDvut;wyj%HT~lKMcBrQ-P*qip?iXH&GtW8;z5DdxuC;dHlUjq+Ss`qT zUuY5kn^;^(8_NqsJL(A{E^iT2$Kr8(wd*TVIri_{M?C{0k*Eg`omr7CUAm&SrWQw; zjELasYpy}B-o3GK!F=pwqAxF4V2#|`KZ=O$Y2rp~yN2~D-wI?&&(m@pd0nr)W6ZBm z(y=2-I(0^`K7BD_o?OO)$>uw>$6AsD_CGgVrI3}%$;_~?sl+LZe?9DMwfO-X6 z>rceC$aoq_z)2cvU>P=9yE_g!NqqfR^?3ZfhzZc396ZjceeB&B-rl1(mxJps$Uz=g zLyb~nIH+WfQ{RiCnytzjB{!c&5^$xo7O{M45Kf|RITfG2A&L$AG%y;lJhxRxw|4BB zqI#Ol%Fp8L3kpJlZl?wLeo!=B_w)imUQRkjqx7O?L;|EHiw>*`BI?jF1BxgQMC%>1 z^mDev&AwJWr2%K>;P%eBxQ(Q((x@&WjOvn$zTekh$EpRKcZv>geR<=YT_kwns(j?A zNY&gxm4#I`tXFwzUf;ByGd+(Y*2-c65#bU5hwB`SdNqPqKd+~ngElQZR}My$1xi*Y*lD??L;aJ<^PsSqt7nzH&5pk{9c)LY} z9m;gD-IWR4_(~l<*q<=L6NY2ONRXM!!#Z zPJJ(iSs%nOlVn;ZF^dU#^c4BoTVgm;$Hk=Whz_}UYH%LHJk$xst=BKWKyd6Q&_In2 zL{g|1xX|I6@)&MfUWY?2Kd6l{XEnJ` z9;WmQaVrR_q7MDnqVIDx*k8p!ko}=qQV?jMMyVIHYKaga^VY67#=RLuga?;h2B-&G zIZMm^QLBWdtz5zYZ-a@I%jpzC-CYa9$;T8DS`B+!os{nTcj zrD~^>@#KnqTgXMIE0W^XxeofsJ5eb7#GpL9{_`;YcxgUv?Uaks(*x$l_~NjGh1+#c zJNOZAm&MnFF{E7pp`Zp2J_2EVZgBwPN^`MhL^E98j#&`L2erOmUk1D{Tt2wCX z)yl2HjN6}x-xbFO1GvgwjHK1&plLNf- zg9zo=5SAT(F2QuAXNGJvH0fIXSL3fiD5q%DPC_;(lph2pG+u0_#RL!`hJr zn0{Hv{8Z@DD!_LF@N!uk_pXg%$iiB5n^%pSm)Dvg^@p8ak0Sc>I)R&4)MDAE_2|g+ z^vbX>e!%UOedJ^aDJIJt`w~d$d7Lgexa8m?lCnOn0Ol~?!$Um(XJKp`9X5yf{yri6 z^xPnd`8NG0uS0#2-MX?4ou92i*JrEI>o2u$tC#+)Jf7}GTuJaXn!edRbGx7$_ScL&i>2u?N1 zYSjw=>*Gtnzk!e(&`ZQ0v_RlJp4|4Wk3M}b!V!Mdy|70QT-2{0I(P13#6r8>dv>FY zU#Jz(Gcs_{AZ3q1)~}}|9>dm`0DErn2PMM8N?bTN8&kYwa&mHT>EO!@rXQ~^9(al2 z&u-lsck^5D(0B#n`cEtv@@8r`vD$KKM?(z}X_ zi%W}&iaMRtqD7~o=0%;9_freSDK9E&-l@51i#nySqLhA%hPTlQNf*6kYnbOm53Dm{3wu(o;lOeKn`-dWxrL z6Do}n(Z%J6F-1t=i}aho3a6D4R8=B{ZEDW%qB&qLm=orPIYJI$5n2h8r2q_3a_+h3 zZo1!o`_0tOc67b#SpXe?6QeD?R6~poNIAP3*|O%?njDYs%c;IWzYHF?Q|E{_4+_fG zW-A!VR_pg`HQ~`=nH%Paxl${0EB@S7m)HqPC_M$oNKE+!7hG@#JMe6Ulkb7dz!@db z89CtDv?dc%h~mC+TrqoLn>W~azyh)#i#a;)yz|abDDMs>FyYKWRmr_1sY+;wsnAR8 zSZ8q+cQUlhNnL1lTpZKhvY&`VY#pN;2iv%vI-mSlzMg#CH!g3q(MHS_AJ8S*t!Cd| zRrJl1YN6F(a#3U>jQ6wh>JHUAIb3pZf~3x&!#0k|F53yTh7Wr}ay&K!3T^S&g>clz zv2nS&+T@B?0COkwNst*&4p|C7Oqo`)JX&cJ!Mk^cT|{wKAJ_Tvn$@fE_{@KzzP{dq z_2}CHy_M!{e+V|(XZ~|0R<2yh3otPb+5;#SEnJ9&3l})ivNB4DVy9XiX-@ zQ5seY!sK&l%G`wo2s!88Y5@qOTd4*Gi3&?pBc_AdqBx^U;C#%iS+j8SO*bWyXg$N@ ziWMtxrOQJpUY7 zGqz}XjXHnuW95|rQ^XccKJh7?5JXdJWV7v|;+1!%xIQiuN8NSTT!X=b1{u0z+Eg?( zHDTzn$EZ9IM-3W?V}=aI%5T0Q+z=Dw1aA9E}wUwa*nJANn*Jm?@a zH8g%)o{#CxJC2yrCZ*g9%Wb~tS_QjUiMaOq8*rV{RTC$vJPD_c8H<{l8mwBg zCUA;2Pd@Pk;xzxGkMbaqa129-4ab?|&&HNN{xQD$?mIm7#eso2-*!391iH;ADugQ#uYvtp)z{lTYLhXJx)fR`b$}FJS6zQ*hgq|IE|WDN`{0!RY0<95Au zz4FQ&)HgKf)wDN8jvD2l`S$I%-@+d+y#!@tWjaK`@xzAU?^jR6ZoBV}gAYC!f7dH; z#K;kOe4G)Hh)N_XM~qGg&q1dt*k&$(NU~!lnUO`JHtI!M*L|;NApKbvOD($C%Ar9M zN0VJ@+(M!JOH%!4(lLY=<6utXTzV~;(lHdJ0-u2;-i=zG8c=-#~tuAVd*n{K+Pv8~HNBsK>VL?>cem@5ngwh$Es zw7CFGFhht$2SYtcB&jFfC*q(m(*_2gZ^`MEU@wWlYMb7@_rNQ2W@GyucEAw>2kO-V zj2?Y5x_0eq?(_P^(gK4cV-D0Jmjq+lrF-|lVjFg0IeR4Da>--VmJ3!=Itflh;ZeIP zGVPM-JpkNX2O{j0nkb0~L?o(INu-cYaPL3v!AU2cfRj!bh0#hUjT(s)l`gsHBK1Th zUQ2T`#*H0gZcpP*KLZo5z6whgFNTzq=*nrLIm0Jh_D9@$^G$G@NVM;dmoCK-haYC> z%{Sh_1NYyD0f!xmQNxED7m+C5D1(DY)Fu*@16UiI9K0)_ctDYKyDLn*=R$gi8>$b( z@n@fd5qi7f>SV;I6F?fN?bxy7aN)(5VB4Sk#K0M=R3D-@-f}Chx$b&w_tT%Eth5XV z9()k?`T0JmsH{}{#b!A>VBny`N&pc~9{zK)l zxN@7p3aM$llp?Y1*l#U`6(Z=8Xf4##jj zQw-xBez?v>N8-$5Y?9Yq0`uvr7SuL|h}Q6--S%r`%QK3Vl?zmPSykNQGIc%$Zbp^4 z0QsP-ym5^loL$5ZZ!scCowY=dB1xP;qM#H>B#IG<%9~aTE_l8kLmsTfB`?+E;rY#2 z`dtf}+u;o6a73d0i9}^$eDb@^TmX^upiDeTBx$GK@0dJwB#|hdI@%rOWe-N3h^J7n zNK__9)%l(BM*1`Rq(dvQ%_b$dZ=SvzyikwB?ybeoZmYqV$Lny_YmJ!wNi$Z~=FHV2 z62_#zNO3venKHy{li0%uQB&puMBPG3L?9xeBH%a>k)&QkQt=`ZcouF%LQH)#@bE{C zxO{d!&Uv;D7d%&wE9TVWv4zd3Zwh0GSf5gD{&rvmcKcCj-nh0ghZmPM;nsH>ak3WT z7q{2omv`6VcY3wl{B|Q2eA9wD?I-V0fbq}hIK;_?Fl{aX6RYQmi<@X^r&2^`OeP?w z55#YsN|X4ax6^uKd0E_|^8_s(m=tVPXubU`ET`k=|&YWm+*qq-(@HY+^8 zS85e5?_ZIZ*^izLd6~@TYjT+WQIlR34H$5LEqdNsgQ1Vq8XX^hBGGY)2!xISiTF~W zEYf5yfEla?5)tiClnZvRw8V&bwgAFLB%3}h26c=z0F z>BL^;_UiC_h^LKYdm|U6$#WaYDp9RrHOVn|8^V+MtUr zX=$-OII4VNzwdv=!i8E9LD!8^Vug@Y?zFwi(W%n}&P{jCsQ}#XLGHqcGltRj0fC3Rj1iFV2W1I-> z64P4os~TX$jC#ECS$KwSn|5zj_+JmK!fT^D{zz#m&5goSrL(N6 zqa-5iB^BfKPCNbQ>r2k?8Fg5&(k7q!oPOc=UzCV*#5rxEmwzWc3EBFT*HsBNQQ~c4 z;|iGDMMr%LW(>w>8S8piuOwUD~@Rd})@>n0L7dk!K=oo5Db zeQ=#3xv_xv4z9vM+eHT?!nh>sBNFn|h(u-TNM@!frpyIk5Isk1;~kk)lBY_r&MqQ) zuW!P*C+dR)Xhbuz&?RMzYP28|M`KXp$;)M7i!!!_`MB1kLX#n&NiVKO@Tch#~ z+Vb!~`88}5uPVtenpv5xcTYV`iGUIHN`u`;8NXHM9Co8dWd!-R)67QhZL zbO%Jl5DIJ@q=*>nRj)PZYR9h2sjz2$bX4`4B-(u9cb@_G)nGUMEYRcTwJ>xG+ZyFb zSQ#qc3TXDK+SGXANe1&mHz9V#m1qk4o_HG1b_9Q!CTvNF=Hg zDK0y|Vr}LEFp-Xm1*FZ#i3pnY>^u9JdQ5xIexEURcXOmeK-7N_TQXADpev;%-{qhu zbAUu}wnd9atey>d3>l*%6A)#+XadPL)RF7AZ5i(Wbrrf)0g@9G+nf(E9EFp~r%a8o zREiX!SeGKAbF*Y4nXWAB9XSw@5cgeO4x?w*=^L(HWZQ3`-Say0pHS@T(85#A$n$!$lQw z9Kf+0|8OlnU2W&bA8elgIJlBcC-xu``h=Xd6+8yO$StTKSPiVQorDUBJ%|?QU)PUm z!)Mgu8=ftm$+0$;omAkGZ(6jI84Hq=?6*w`{_Q8pRY^RGiJgyT8R{$-9yh53?i*5t zqk>P0v_ap+HzV+fjIh(JVI#jeqB@%;UjE0;8| zohajwq6lNtKJNLT5e=>eI#B9G1QQRb(xsty&ZsULL8UYuqJ8b4E1c=N%-n0sXfoAX zcfmjOhn;b=!lkk*(S5TLOh38`8|%v;Wk({>*iPSS8@Ls`1+^L=05CbEK*UY@Mf1zx zlPz`p=ry5#1s>ADU-3)5-1n+5lc_AD)lyE+dd)KsOlF0y)2F@{ELU})B6TT^8T)&jmQX0;+6Wd!F+g4o9U_N50@;>lsv zIAiZ}Y|&Ayp9strG~|ihxl4)mS&m1w&zZ+p^mWR(^_P|!ii&0pCcv}Z0ryh9N^V`5z|*N5jSy#?`9BL3L!W$0X`1J^wURY(p! zwkCE zb4V5bc3>qg(+_9Y9$Ja#M^xjZaUC&hXf^)hXBFu2BOR~19Abmv+wsUpYcX@7o;(ht zRXAC{0bPGsr5UU5;*Z1EuM6)Lz)q}C5Rs(a*W>{6Qz8ck&?4|}GYB?o2SkWLWGgEH zezjwnp4k<+=~q>FZbS!c$^r%`k))4^ptJESv)nB|+32)PcibVZ6 zmXGzvnjsI?VeS{fO-C_A{q^4}agi325k#mVXGtWGHKx_9`_UWax<%t8NE{N+N`M^9 z=D$=CL!}7q$-bPO7)QL%mx{%T(9cGiN6!#IDYNz8*(EREtS-8}xHTlX=O4CfnHE{T8};^P){P zse9CBouazXjd~G_aa!u8z1N6S{#lz}>QcAUW?bo1V>kU6M=W)09r;6by7p+-xd6~4 z!rPc^iihi};m{rQI`$?$Pd~8TqRZ1WpRUINch%ycyK6B1nFidW>+ScyYym$P)0f1F zi$s$~y(5vNO(dxc)7MyUspXv~Sm3Cu#}!Y>oZ6H9-?`>_c_f>$VyUpHYiHzfzBW{zvyH$27g?^B)56oT4tAp5>_X`;GDz zldovhm@3&3S<|`|z>6Rv(A`E0j$F-LsY}A!bz%c_Rnw&!P!ym?B(@y**8HY^u)F>J zCj3T!DCwu)>q-1KpEteLfDgaU=?^%;L<4^&MMMHAY|`}K=u&p*!*zIese8S)_}}bP zfxjPA369rl01<(}ZI%;Z8|~jA;LwC1+vZ1Fw*n;k343P(9PQh+6ucTT2Q<*C{F9Zz77qHqy_p6Gv*+UvD1#uu&HP_4q9Knn^uBXWXZsMGoJ=E;Fek ziMZY=SrSR=tR>qq^!CsBsBfkMgn>e5CdpB#EzG51chf6jjD8BfT))N79bJw0#&iHb z51*lLuKjc===W>=qw&Aj&qdQU$=AKvh{1Z5>~iy3@YZ$6JvG?n<{JD?3sut?PJV0s zt@k1QxzYa!$GFj`AwH^ayObqTrULkZ+<-+S^-ND2CVfOK-r4<_)QJeH%EbH|p7DB> zOg*9sAD-3`FOICn`TLgRB>i5rP5$5V(8H35SSC2~Us^2Dw_E=qPE$`^Ue3_(LA&Tz zP0Ef0;@F^#%YnK;)2h0aaG46=cOp_eB9raN`H7_XXoiS$n0QNDiM|DQ-M9o}_N>4~ z{VMT-7USJhJLt!;N{rj99EWXRhK}W-Cw(-mDn!ZdkvQFVsUkNG0hJUId~C)h^1noM2cfX((O$6{@u!Ou0A{XAbnfEs=hd~1NiM` z1S~MYdT^p_-WJ|kcfDaW!?CV)JozErX3Dm0g?kM7N3J9 z`52LSjBpmjl6<`59jcI>IA;@y_QAY%-55BgM;R{DXUVO4>zX>S3Rmj#a>Q=I*H{J! z$i)f7d_%p67u#d=pmk;n2lEQx(vaQ@2k2Ww#GL8AF3C$?B_bA|(v1Wt5yw$sen}={ zNW`}pl{s)+B1s$dbLPy(B^O{nlX1^(5RrHk#KFe9#gDP__@2VMaJ zO@T%vIq(Ej`{BeLCG1oLVTxjig97ah-AM5R{izdC9GQT8{Sr;+%P+lz&p-b>yypiv z*APGZ<(F{Bv}u?+^){z&mo_@G^pKegknXNpO}ZZK1hq%zLqs4VR2L)>YhSkPWBlLc z%MFfyT<`IjGx4uiUqyX=L%|sQGc@nK{WfMjJ`)S(&xijC+m? z?W?c9!Tx>vsJ&CtSWJ`ij6UzF;pXV;JpKp&s|YWaVVO*l5%eGuj6nIsu7f6)bormI zz(~Cs_-DsXJDq>|7g)G(A!u`cGiE%3#>NIys8J`L2>zw4@#mZi{=ttAKl~7H%$;kX z^ci#7X&{D*KU{P%9{uM`Oq_fT#R$Fr+G}WTYSIGqjp#E8{?vTlch))jVw`XDEhrwq z$(%HK5rK%1Z4>R%J^W)zTW+>>Djz7X21NhAwFcATkP+-^YwYa zafn3wrN zva+TKY#n{MVuk8}YbH%H&kQaxNzXs~tm<>->JZU!I0tPRkHZp)>eXcSrAwD!-+lLM z`|Zbg7eA!;81>0q01+EbL?UNpB%DMfBQODEM5M4E0Rf3fz(pIz>D;-qiE;a#cVX63 zPeaZ&op;}ph`;^zJK&K=AH!d+yb|o^cfbFG4Ws!h zEiJ<&U6%5X0P;P-8nPb!d1$ZeU;AhYZ1>qmDwa-n|paci4`4d+F1+ zpIK&h4gR1Xg06nH&pyW2VcXJ%X$pcFXRB@0O~uInWo9j^4L*;MBP9z!ZIW`UR;{uN z=9tYTQbZtPDF#UuMJ!fCQtg14j zbHrTf=$h1xxeJP*nv}h@0??U38sB;6os}0{aKYF`ixz#-q~A_lESEU8B&RP@bORyQ z5fvgjTrx58F)>p+ik#*T3&)%+UcC4d=7_n{X#DpW%w5sokpiTofX=*>8UWPXfB*dp zk390o&f*=J4s4E)6xUzpFqj;H*^@-JXowWYPhI!d!UT^5YPu6w&2 z%j4txy!iNCU;1ND6LZ0w3>q}(c;-lxU!&BZ#N085%BJs;`=VS!0004xNklDsmHe%Yv7MqJi-#c=J=SGNN3WBP90y7gf$ zm=orPIZ|S-m^0>1#gsib+am=?flVe2Gl9fSXGF)j~mH80`%Pp=H-tSGg$0A4Wj zHpGIoPW)sFGqBdN?ShjH)K7j+L0+OM=O6+@!KRG`h;~pg>VLZ-%hcD$Alu$=8w-#_ z+e%OfEp3bwBuj#JLpSTO-!>M&-XAi}-wZle0BY|^1&oE&g~Ao~_#ba+a{)5XsFh@y z`j}uLXT;P)7EG#RMrGmnCO|85F_?8c{67Ey0RR7FB^#A|> literal 0 HcmV?d00001 diff --git a/src/ja/hakusensha/res/mipmap-xxhdpi/ic_launcher.png b/src/ja/hakusensha/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c01e786c2d499cbbd1f5c55621df3802e56ae4c0 GIT binary patch literal 14979 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 CiP*dV literal 0 HcmV?d00001 diff --git a/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Dto.kt b/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Dto.kt new file mode 100644 index 00000000000..e7a0018b4d7 --- /dev/null +++ b/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Dto.kt @@ -0,0 +1,128 @@ +package eu.kanade.tachiyomi.extension.ja.hakusensha + +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonNames +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.put + +@Serializable +class RankingResponse( + val ranking: List, +) + +@Serializable +class Ranking( + val product: Group, +) + +@Serializable +class GroupsResponse( + @JsonNames("products") val groups: List, +) + +@Serializable +class Group( + @SerialName("product_group_name") private val productGroupName: String, + @SerialName("product_group_title") @JsonNames("product_search_title") private val productGroupTitle: String, + @SerialName("cover_image") private val coverImage: String?, + private val type: String, +) { + fun toSManga() = SManga.create().apply { + url = productGroupName + title = productGroupTitle + thumbnail_url = coverImage?.toThumbnail() + memo = buildJsonObject { + put("type", type) + } + } +} + +@Serializable +class ProductsResponse( + val products: List, +) { + fun toSManga() = SManga.create().apply { + val sorted = products.sortedBy { it.productOrder } + val first = sorted.first() + title = first.productGroupTitle + author = first.author?.joinToString { it.authorName } + description = first.introduction + genre = first.category?.joinToString() + thumbnail_url = sorted.last().coverImage?.toThumbnail() + memo = buildJsonObject { + put("type", first.type) + } + } +} + +@Serializable +class Product( + @SerialName("product_name") val productName: String, + @SerialName("product_group_title") val productGroupTitle: String, + @SerialName("product_order") val productOrder: Int?, + @SerialName("product_order_title") private val productOrderTitle: String, + @SerialName("cover_image") val coverImage: String?, + val type: String, + val author: List?, + val introduction: String?, + val category: List?, + @SerialName("release_at") val releaseAt: Long?, + @SerialName("is_free_streaming") private val isFreeStreaming: Boolean?, +) { + fun isLocked(purchased: Set) = isFreeStreaming != true && productName !in purchased + + fun toSChapter(purchased: Set) = SChapter.create().apply { + val lock = if (isLocked(purchased)) "🔒 " else "" + url = productName + name = lock + productOrderTitle + date_upload = releaseAt ?: 0L + chapter_number = productOrder?.toFloat() ?: -1f + memo = buildJsonObject { + val access = when { + productName in purchased -> "bookshelf" + isFreeStreaming == true -> "free" + else -> "locked" + } + put("type", type) + put("access", access) + } + } +} + +@Serializable +class Author( + @SerialName("author_name") val authorName: String, +) + +@Serializable +class PurchasedResponse( + @SerialName("purchased_list") val purchasedList: List, +) + +@Serializable +class AuthToken( + val token: String, + val expire: Long, +) + +@Serializable +class UserAuth( + val userId: String, + val token: String, + val expire: Long, +) + +@Serializable +class KeyResponse( + val bs: Viewer, +) + +@Serializable +class Viewer( + val url: String, +) + +private fun String.toThumbnail() = "https://assets.hakusensha-e.net/$this" diff --git a/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Filters.kt b/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Filters.kt new file mode 100644 index 00000000000..8c5fec7ea39 --- /dev/null +++ b/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Filters.kt @@ -0,0 +1,67 @@ +package eu.kanade.tachiyomi.extension.ja.hakusensha + +import eu.kanade.tachiyomi.source.model.Filter + +open class SelectFilter(displayName: String, private val vals: Array>) : Filter.Select(displayName, vals.map { it.first }.toTypedArray()) { + val value: String + get() = vals[state].second +} + +class ListFilter : + SelectFilter( + "一覧", + arrayOf( + "新着" to "product?type=new", + "無料" to "product?type=free", + "完結作品" to "group?type=complete", + "完結作品:少女、女性コミック" to "group?type=complete&target=comic_girl_woman", + "完結作品:少年、青年コミック" to "group?type=complete&target=comic_boy_man", + "完結作品:ボーイズラブコミック" to "group?type=complete&target=comic_BL", + "種類:少女、女性コミック" to "group?type=title&target=comic_girl_woman", + "種類:少年、青年コミック" to "group?type=title&target=comic_boy_man", + "種類:ボーイズラブコミック" to "group?type=title&target=comic_BL", + "種類:グラビア写真集" to "group?type=title&target=comic_gravure", + "種類:絵本" to "group?type=title&target=comic_picturebook", + "種類:少女、女性コミック雑誌" to "group?type=title&target=comic_magazine_girl_woman", + "種類:少年、青年コミック雑誌" to "group?type=title&target=comic_magazine_boy_man", + "種類:ボーイズラブコミック雑誌" to "group?type=title&target=comic_magazine_BL", + "掲載誌:花とゆめ" to "group?type=magazine&target=hanatoyume", + "掲載誌:ザ花とゆめ" to "group?type=magazine&target=thehanatoyume", + "掲載誌:花ゆめAi" to "group?type=magazine&target=hanayumeai", + "掲載誌:Trifle by 花とゆめ" to "group?type=magazine&target=triflebyhanatoyume", + "掲載誌:LaLa" to "group?type=magazine&target=lala", + "掲載誌:異世界転生LaLa" to "group?type=magazine&target=isekaitenseilala", + "掲載誌:××LaLa" to "group?type=magazine&target=xxlala", + "掲載誌:LaLaDX" to "group?type=magazine&target=laladx", + "掲載誌:メロディ" to "group?type=magazine&target=melody", + "掲載誌:マンガPark" to "group?type=magazine&target=mangapark", + "掲載誌:黒蜜" to "group?type=magazine&target=kuromitsu", + "掲載誌:楽園" to "group?type=magazine&target=rakuen", + "掲載誌:花丸漫画" to "group?type=magazine&target=hanamarumanga", + "掲載誌:Love Jossie" to "group?type=magazine&target=lovejossie", + "掲載誌:Love Silky" to "group?type=magazine&target=lovesilky", + "掲載誌:ホラー シルキー" to "group?type=magazine&target=horrorsilky", + "掲載誌:ヤングアニマル" to "group?type=magazine&target=younganimal", + "ジャンル:ラブ" to "group?type=category&target=ラブ", + "ジャンル:ファンタジー" to "group?type=category&target=ファンタジー", + "ジャンル:学園" to "group?type=category&target=学園", + "ジャンル:アクション(バトル)" to "group?type=category&target=アクション", + "ジャンル:コメディ(ギャグ・エッセイ)" to "group?type=category&target=コメディ", + "ジャンル:ミステリー(ホラー)" to "group?type=category&target=ミステリー", + "ジャンル:ヒューマンドラマ(禁断)" to "group?type=category&target=ヒューマンドラマ", + "ジャンル:スポーツ・音楽・芸能" to "group?type=category&target=スポーツ・音楽・芸能", + "ジャンル:青春・友情" to "group?type=category&target=青春・友情", + "ジャンル:感動モノ(ハートフル・ファミリー・動物)" to "group?type=category&target=感動モノ", + "ジャンル:時代モノ" to "group?type=category&target=時代モノ", + "ジャンル:SF" to "group?type=category&target=SF", + "ジャンル:グルメ" to "group?type=category&target=グルメ", + "ジャンル:グラビア写真集" to "group?type=category&target=グラビア写真集", + "ジャンル:絵本" to "group?type=category&target=絵本", + "ジャンル:BLコミック" to "group?type=category&target=BLコミック", + "掲載開始年代:1980年代" to "group?type=year&target=1980", + "掲載開始年代:1990年代" to "group?type=year&target=1990", + "掲載開始年代:2000年代" to "group?type=year&target=2000", + "掲載開始年代:2010年代" to "group?type=year&target=2010", + "掲載開始年代:2020年代" to "group?type=year&target=2020", + ), + ) diff --git a/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Hakusensha.kt b/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Hakusensha.kt new file mode 100644 index 00000000000..8c388cdd755 --- /dev/null +++ b/src/ja/hakusensha/src/eu/kanade/tachiyomi/extension/ja/hakusensha/Hakusensha.kt @@ -0,0 +1,188 @@ +package eu.kanade.tachiyomi.extension.ja.hakusensha + +import androidx.preference.PreferenceScreen +import androidx.preference.SwitchPreferenceCompat +import eu.kanade.tachiyomi.source.ConfigurableSource +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.model.SMangaUpdate +import keiyoushi.annotation.Source +import keiyoushi.lib.clipstudioreader.ClipStudioReaderInterceptor +import keiyoushi.lib.clipstudioreader.fetchPages +import keiyoushi.network.get +import keiyoushi.source.KeiSource +import keiyoushi.utils.firstInstance +import keiyoushi.utils.getLocalStorage +import keiyoushi.utils.getPreferencesLazy +import keiyoushi.utils.parseAs +import keiyoushi.utils.string +import keiyoushi.utils.toJsonString +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.serialization.json.JsonElement +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient + +@Source +abstract class Hakusensha : + KeiSource(), + ConfigurableSource { + private val apiUrl get() = "https://product.api.hakusensha-e.net/v1" + private val preferences by getPreferencesLazy() + private val authMutex = Mutex() + private val apiHeaders get() = headersBuilder() + .set("Authorization", GUEST_TOKEN) + .build() + + override fun OkHttpClient.Builder.configureClient() = addInterceptor(ClipStudioReaderInterceptor()) + + override suspend fun getPopularManga(page: Int): MangasPage { + val url = "$apiUrl/ranking/week".toHttpUrl().newBuilder() + .addQueryParameter("platform", "web") + .addQueryParameter("type", "comic") + .addQueryParameter("ts", System.currentTimeMillis().toString()) + .build() + val result = client.get(url, apiHeaders).parseAs() + val mangas = result.ranking.map { it.product.toSManga() }.distinctBy { it.url } + return MangasPage(mangas, false) + } + + override suspend fun getLatestUpdates(page: Int): MangasPage = getSearchMangaList(page, "", FilterList(ListFilter())) + + override suspend fun getSearchMangaList(page: Int, query: String, filters: FilterList): MangasPage { + val listFilter = filters.firstInstance().value + val url = if (query.isNotBlank()) { + "$apiUrl/search/keyword".toHttpUrl().newBuilder() + .addQueryParameter("type", "keyword") + .addQueryParameter("keyword", query) + .build() + } else { + "$apiUrl/search/$listFilter".toHttpUrl() + } + val result = client.get(url, apiHeaders).parseAs() + val mangas = result.groups.map { it.toSManga() }.distinctBy { it.url } + return MangasPage(mangas, false) + } + + override suspend fun fetchMangaUpdate( + manga: SManga, + chapters: List, + fetchDetails: Boolean, + fetchChapters: Boolean, + ): SMangaUpdate = coroutineScope { + val purchased = async { + val auth = getAuth() ?: return@async emptyList() + val url = "https://order.api.hakusensha-e.net/v1/users/${auth.userId}/purchasedJdcns".toHttpUrl().newBuilder() + .addQueryParameter("title_name", manga.url) + .build() + val response = client.get(url, userHeaders(auth), ensureSuccess = false) + if (response.code == 403) { + response.close() + expireAuth(auth) + return@async emptyList() + } + response.parseAs().purchasedList + } + val products = async { client.get("$apiUrl/products/group/${manga.url}", apiHeaders).parseAs() } + + val hideLocked = preferences.getBoolean(HIDE_LOCKED_PREF_KEY, false) + val result = products.await() + val purchasedSet = purchased.await().toSet() + val now = System.currentTimeMillis() + val chapterList = result.products + .filter { (it.releaseAt ?: 0L) <= now && (!hideLocked || !it.isLocked(purchasedSet)) } + .map { it.toSChapter(purchasedSet) } + .sortedByDescending { it.chapter_number } + + SMangaUpdate( + result.toSManga(), + chapterList, + ) + } + + override fun getMangaUrl(manga: SManga): String = if (manga.memo["type"]!!.string == "koma") { + "$baseUrl/store/koma/product/${manga.url}" + } else { + "$baseUrl/store/group/${manga.url}" + } + + override fun getChapterUrl(chapter: SChapter): String = runBlocking { fetchViewerUrl(chapter) } + + override suspend fun getPageList(chapter: SChapter): List = client.fetchPages(fetchViewerUrl(chapter).toHttpUrl()) + + private suspend fun fetchViewerUrl(chapter: SChapter): String { + val type = chapter.memo["type"]!!.string + if (type.startsWith("novel")) throw Exception("Novels are not supported.") + + val access = chapter.memo["access"]!!.string + val auth = if (access == "bookshelf") getAuth() else null + if (access == "locked" || (access == "bookshelf" && auth == null)) { + throw Exception("Log in via WebView and purchase this chapter to read.") + } + + val keyPath = if (type == "koma") "koma/$access" else access + val url = "https://reader.api.hakusensha-e.net/v1/keys/$keyPath/${chapter.url}".toHttpUrl().newBuilder() + .addQueryParameter("viewer", "bs") + .addQueryParameter("platform", "web") + .apply { if (auth != null) addQueryParameter("user_id", auth.userId) } + .build() + + val newHeaders = if (auth != null) userHeaders(auth) else apiHeaders + val response = client.get(url, newHeaders, ensureSuccess = false) + if (auth != null && response.code == 403) { + response.close() + expireAuth(auth) + throw Exception("Log in via WebView and purchase this chapter to read.") + } + return response.parseAs().bs.url + } + + private suspend fun getAuth(): UserAuth? = authMutex.withLock { + val stored = preferences.getString(AUTH_PREF_KEY, null)?.parseAs() + if (stored != null && stored.expire > System.currentTimeMillis()) return@withLock stored + + val userId = getLocalStorage(baseUrl, "UserId") ?: return@withLock null + val token = getLocalStorage(baseUrl, "AuthToken")?.parseAs() + ?.takeIf { it.expire > System.currentTimeMillis() && it.token != stored?.token } ?: return@withLock null + + UserAuth(userId, token.token, token.expire).also { + preferences.edit().putString(AUTH_PREF_KEY, it.toJsonString()).apply() + } + } + + private fun expireAuth(auth: UserAuth) { + preferences.edit().putString(AUTH_PREF_KEY, UserAuth(auth.userId, auth.token, 0L).toJsonString()).apply() + } + + private fun userHeaders(auth: UserAuth) = headersBuilder() + .set("Authorization", auth.token) + .build() + + override fun getFilterList(data: JsonElement?): FilterList = FilterList( + Filter.Header("Note: Novels are not supported!"), + ListFilter(), + ) + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + SwitchPreferenceCompat(screen.context).apply { + key = HIDE_LOCKED_PREF_KEY + title = "Hide Locked Chapters" + setDefaultValue(false) + }.also(screen::addPreference) + } + + companion object { + private const val HIDE_LOCKED_PREF_KEY = "hide_locked" + private const val AUTH_PREF_KEY = "auth" + + // the site's own fallback guest token, valid until 2030 + private const val GUEST_TOKEN = "a53d742d15704d3ba42ab291994485d0" + } +}