From ef9d26cfe8d4e80939636c96a4b06c537ee30031 Mon Sep 17 00:00:00 2001 From: Nam Anh Date: Mon, 9 Jun 2025 09:11:59 +0700 Subject: [PATCH] Add MayoTune (#9106) * Add MayoTune * Use fallback for text contents * Use DTO and refactor * Use `selectFirst` for status * Update fallback thumbnail URL * Lint code * Implement as single source * Encapsulate `ChapterDto` * Use relative URL * Correctly handle request endpoints --- src/en/mayotune/build.gradle | 9 ++ .../mayotune/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 3139 bytes .../mayotune/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1721 bytes .../mayotune/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4417 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 6532 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 9647 bytes .../extension/en/mayotune/ChapterDto.kt | 35 +++++ .../extension/en/mayotune/MayoTune.kt | 124 ++++++++++++++++++ 8 files changed, 168 insertions(+) create mode 100644 src/en/mayotune/build.gradle create mode 100644 src/en/mayotune/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/en/mayotune/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/en/mayotune/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/en/mayotune/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/en/mayotune/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/ChapterDto.kt create mode 100644 src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/MayoTune.kt diff --git a/src/en/mayotune/build.gradle b/src/en/mayotune/build.gradle new file mode 100644 index 000000000..e3353ffa2 --- /dev/null +++ b/src/en/mayotune/build.gradle @@ -0,0 +1,9 @@ +ext { + extName = 'MayoTune' + extClass = '.MayoTune' + extVersionCode = 1 + baseUrl = 'https://mayotune.xyz' + isNsfw = false +} + +apply from: "$rootDir/common.gradle" diff --git a/src/en/mayotune/res/mipmap-hdpi/ic_launcher.png b/src/en/mayotune/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..76d3f603511de886588f7416e6b7a85dd5acae4c GIT binary patch literal 3139 zcmV-J47~G+P)ch3aU4J57;Td{MSLilL+g8i20f&854pB+jN}jm zJrqr^O%DZn2v8s=2XuJfBERiC))O~;rRpY7VQU$g zr{X%tEC(g$)$aI*ysq-Pf*5PK!Ya7ETH7IXek9qJ`*tNXPT{A6_W8{fJAzN7cN}*>7hf1eqF)6>(`_TAcY2X z{`~oqM~@!;J#A|IlLAsy5YTr3|KEY;!NI|IpWCE`Z21g=PcNzd^yM8?BBot z6#I;2r6{laLUXs(i&yyK#fzt2cwzs~D^)KUjC58%z}3eQoa1i~9z6IihZ)VZ^)X}Ar){-5Up;@aqp$Gl2Vgn<51 zfr>R)1gd0MTL~&Tm>P?h-CZ@Xy|v8%dV@A-a=v;Mt8%qGH}^I-&)t=(SiS_wX7q%j z;gbS3s3t=y-HDzwp{PFi{f+T?*Hkm}q=YvmG2uZ_}+e7fzVavaAfXWx5Ji=4=ble<`Gg;$< z;ZvXmR6MmcfUY*#N4u0VY*=jom2pG2v6u7t#Jv=5j3$t#Bnc=>Rk5!ph|Wmu>{D$3 z6_`~e0#XiVohhuv#T2gJO(M#ipCd`4XPXJA$q$5rDk4oP+L|pWgjh+b8=$fV<3iIk zEu?h=$+(GFG=*3!4TEj85GfGI?HS_{ptPdEqRQ=PwVle7A?{ zR#M+A^!E=)KFCgY@RH=c*Uf6}B55;iVsY#tQUueqF@jJ#&j89O;}6ofJiHuGGXu!u zyO-|#*5Z4;3R(lDZ?r-ZlpPe;A{|X4HarXex+XMlZiSC3vaGlm@e#WFFUR!9 z62v|Xij86U@clh1JzBoRUcXN%ny_$StAbr3VI|6n0*c?h4}C6ymOb52AK4g(hIgm` zkGh%}jCTtX#)EjwkP(NSYrJ|!Lmw<(PF(3X)DcaLXHSAtdK$%G{ovM{K5Wg`4 zA6;~)cLVK!C&ycGCMI27|Fr}bxIZ&V^f#WsMoSsc%=ng#|rNsdxdo+1367(_wbuIyPd)C6hn1z?<$+ouE z4Nz`I(Yrb%|9cn8`Y<%Zu-$=gr^^x+9DfF%1dx|*#4)>Q+JT}#NoC_82hi(Js>=-V zMZy_*XyLV8G}6I(0op<@_UGJFjlyg0oPELIB(6=s()d^E%ys*u}-mc>4P{7Ya4JqjrivyNHLx9 z$ewWW^0bm2%SbXzREL+v_j>kk1tmzLXWF2iP7Tj&%2?)yOpy%UN!gp%7oPAVchBoZ zhH4IIsV}o=oXu<}kRj5!&Pe&2ELRAwew!tMJs=!h}4y=3$%Gw}qE2RFqh#v=b zYPRRPA2o1kIL*YFV#5hka1v5;K+6D(J%B;?t~}qfOoDRjrlwr`3E}Dw=zbK&r4jg^=!CMXbWms} z(|CCG9+J!&%JXgx6g!Pk1Q1WjpfLNjV^a`YJ5)sD7B1hRO=J6KnV*g@tx7JJ<1iLUOIeI*eB#$QKm}fD@R0&fX&5-~il$iGR zfF1l5D<**!=-IRCHB5q>*^41g4HFc%7zP7Hc^1NcHlL>!^v6^odL){LG;L9m+X|5o zQ^H>UJw&N%+YmzQ`k+fLd8zpEcQ1xo4wLC{kt};# zK^O`nX*KA#J(R-VRr|HVSyo|=Y6GY?>R!b(>d`c_q_qK5kMXUNKKuVoBmL3}AN#Bl z76pf4OVBX_iq_nVt>$TaAKR)^vEs3D75Y-gRe5&0-_3F`$aaw`v@^Oa232dHF}lJSxwxwcO~{q#+K>GhpZfC+gf z+$%30rsSbY<@bNw(%^FgsZ;AOHN*#~*){ z$b1!3q(>gVlO^&5NGgdG$vKW3s>>zsg+?`ER2rcqA(K^6_R?4&$;!%|$j6o(=N}6! zTcJ`382L(B*{<(=WmR`QO z>1|-;)q0)P&+u|y%WGYrcHT$@h67687u9VyK)E+6r*75LX+Q^_4Br3Sq-)M~4Uh}c dH9#(a{s&`nH>1pI9Yz2E002ovPDHLkV1hC3>Qn## literal 0 HcmV?d00001 diff --git a/src/en/mayotune/res/mipmap-mdpi/ic_launcher.png b/src/en/mayotune/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b2f3f77e9edb19b42e4566bc2c6a752b796acf2c GIT binary patch literal 1721 zcmV;q21fabP)fEfz-J@KN8}@tv#$npj?X^i5+J7l zj$wFkBtI<_D|Q z>f=X`9({lB-o2On*o{Di-|Pe+UeDBOwa2+!?(_G-__hs|O6Av5sq`)1A4HLe1(4v? zoYuN>n(-1(;aI=ptm`PHrudt6PP_fvoe@a!g9!rI=-0UZ?>`QY0Oq;wb_5{Y3!MPc zyp|_`wf+qld<+R-fvZ+ITkU=DF9GQ09&zsR1bK-7!~^^vK)1lheeSveEX#oEv!)BF zjN$Hqc;3EvR>MA%-dH|`sbT`zjCpP_7e=9@2`~sWHa2Z6mtA;4iL-~~ z!T`Jz3%+r^0I%0!Y#0 z2P0)+baDiS@S$lyPBZl1Stzqq^+FH_SxO%N|<#5Wq;@0W8-8Qi#!! z&Sanwh?0A-RYy>_VO=f4f3gZSIR;~P;#B(BPJow7Eo?LbIOLhjG%6IDlsz!VJ-{x+ zVVeD8LnFsjdb1e6T>liJCh%5vVJ_sMG6@8)D{#vV7#|d13J{AO>5*V)dbP>4x>mNa z&LZZ}^WuF0;B#J`G?<0VFbl2h23W2EAI}=x!13|y4}he~6*fam(#Bjq{IBax*nh4= z1RDxjs9Xjr#n{ukE;%p8Z`XY6Q45Lj;&lPwnHG|)51-7l4vZ>nHhjEbn{unfs6-n& z4nltbnhx~x&Y_``qlfGJ0bE{dE$zT22G2^sPg?L82BC`0bZJK(7YWe@Al|<=oy5(O z!WL<@yrXer$~@J0`MLf8(Axq)&6DpFQQF|5n&fSfN(W5f4h?sinY_^3X6S9lut*uX z9s%HYN`)kD)BELGfa+d=8`BoXGsD(G4a$R8d{{A?gPO{{6JgCr?7ymFzkI;Q1rdOV z?*c?9BVc@1-|5K|y>H^L4IdtB$@Q58GBHJK@D!p{&~K^;91`SODcr=J!(n0DV>N0u z85L#~mtcf0nv&B>naGYTGZ6<9SwahIp@sUE$4)JgpVV952p18<`SkNQWalTg`I7!8$V z3Z+C4VdpR_wHN~VZ}NJA1uL00k>*UWk?B^o+eUZxcy9r4d2XdXo(qxln#Q@cCcFc7 zTBMgR#!E$J|7$Wr7E7rZZcs)WO!Pez>*KWVK+t~#y6J^Me%>i)4||Fp`+=c9nd?9r z|2$y8T4<2oJ?C1NghD5W<6HoGY0S>)&@hx=(-JLSX5mS< P00000NkvXXu0mjfck?$9 literal 0 HcmV?d00001 diff --git a/src/en/mayotune/res/mipmap-xhdpi/ic_launcher.png b/src/en/mayotune/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..0e41703a7f0c3a88a567ddbed1eba302372257aa GIT binary patch literal 4417 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 Hu0mjfXKN#` literal 0 HcmV?d00001 diff --git a/src/en/mayotune/res/mipmap-xxhdpi/ic_launcher.png b/src/en/mayotune/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9e891551c8a25c0e3a7c576b80dabec25b8cf4 GIT binary patch literal 6532 zcmaKRWmMD;(DiS3=~_}@L0DjE36;*JyAc8DT)L%^kd#=uI}|CEhChgabR!KS&C(%A z^ZK6Woaf{7VeXuJ=6;-W=gdrumWCoR0gM0u0Agh&Ih}tQ{r>|G=O1n>tTh7wjjFPo zw4Sf&L7t%#ot;OY<6(HIa490TlwGBieI+^2-bSp=P%Ng_#D)xEh&Yx-cM_OG@PE&W zvmn7eNZ`gMv~w^#^zxZIsW3E>;p;-YRV_a3fUwFZOP?BASE*Bzf~7vwD|$oUvS88MzeDrCS2fSfclIRxlWz3dqP!@q}c z;Nyj;#c1X}1;~m1ufj60dd1p;EVeQR!4)_ADHzi*13)?sW?{TU*-lcD?>C)mf3LOd$WMSS z54vskAmu!^6s8MqJ~W~856Rp>sFdlvS`E7;X=N{&l5rX&QhzQ;K$_TU0KxterBXHt z&b7PGnOiUb?{r)6OI1(FRE7H1wh4gI;fVbO9vn6OTnT-NykQ>empa5xY zUpTAgs{z&}nNtH`8&8(gt7S?&-~K%Tm}LDI?MG%tfb|#Tc}APRO`gXUIr%#iM2j)y z;f1zYK_XMTBtHrn*mRfWYS}>+6hz_%Za7<^ zv578`k^%|YGi?q^Y1XANq%kN-{pP1w?C=eI+Q7ZESBP!v)SKJ z_0durZasWB4##iLsT3>8U3^hmCXf~dVBkKufADlU(oBySelfd5T^)2p9eHmu8lePO zV-u?zmtdWHVsfx<8I|eR>Y$}re4Dxx8sb-%ixiRsr+Dg{(NdqE#!@WgG}kqJXl7FS zl;~PZNTGZ_6Z`kDa`US^(cb&iQA&;!Zf$YxQeV?7>na>AvXvHT-DW+w5GRpud!}p` z%uGtn7*A3Mv0sG8pGq{x<0J!_hkMPCu*B7$UNPBB$uGPct82*0=!S_K`#`{tS)t2w z6!MR4R2x8Ro`KEgwVK5;%EjWN-=jW#NmU-~a1n~X@U!-O3|6bw(E!7_Kr$a#*9?uK zTvIf*Du6RRFr9G^>k=f&w*b0IBqc+=zXHIC7GJH&XXp0aYPI0&f-H!8fRp>V=qQq+ zY-{>i6U}s#d%GO%I4XIlI$aeTHLiBk7NbGp$1xWs+60ED091SxDZd7_EhQ8Od=p}K zj9vRxLHiZ}#r~-d`+nsoGJ_Q3*7RaM`p*@g`wMJAyw%WZ)xy$ebM2v!uF4bm54BiXh`VGF@x9T6FU7G z5CfLDT=Fjn7X8W8(3rJC)Zg!X5oDCaZ?0_WehxocWFMbx;w#M%NEC$W2IhK%2!}na z;cLFE?y6gQ!Nt-_FZ&3{X1>wnvq^;dp-P*wW~L<-0X@a?uZ_~R*7{_m?d=f;>2i{p zrTL*eofJ%uZ>j4RS#Pr*ax{j5wIo6eDDr6BrzVsRZWPwZgUGlovyu2q*L+WoyRBSy z*H29!xqu5{T~Dc0>Ki^Q4~TJG3bGI!K&LvoB{ss}T44(>R8LV)nq?2Nuf{vuwSL91 z3?Vu2oPsLsg}2qq{~4gmb?P9ir;+`0+x))uDZd@KkN`;Yz*gyQnwNoo)}<3AEkFG3 za%zQT)0eK;HO}^G3QKB%6iIZHc=Te6ZpAolM`&p956H2Y;?5=W#a@0_aL6TFcqk;h zDy?~)z-II*Uj)f;RT;Zvy9$ffCn@sM4hr1<_*6YHA$FnbOGhjNVsKB##Ja3Y_D<~z zC%g9bRh8TcQR2AuOS$dCIt{{kDEc|*$T#HlwV}$0vleSUqnReUHQ^%p8=HAW#iyBN zY~hZFfS2*(w0sss;{Yp3!RBc?PNPlc*M}@S?ow1U#T}1-7ZZ2=HYoYGueBw9XB`jp zM|gKTB|XO8K9>V``V50m%amq_2JOnI>=X8_&Qj|oFsQ56hl()c;KjbYh{&en{}oYH z0{SWz{yDP?>$i0rL529$_3C!+9Mp3<472#WI!U1~STIW_$k>}+iLhLsy4R5=E?BsS z7XTCC5j&g7v1FUR0@k$pRQsMOT1%gnlz^TivRFxyNeRZd+1Ot+v5qxhCH~QM``E^^ z^-0Hbox1n!33uelbry=wz@Ahn)84M4A@(jlvzTumRwTA4YVG=AHR*9IM2al>Y(o0iPiV z_avNt3O4r#uwcZyL&>1v5X(i8(&m`s?hPM3Ii7^K^@(9tIK7?3%SA2WB9;#{3g${w z&jC_ioj?73-+xVd_C=E_KdTSo8pGv~B;6)ye;Npv^+_dliX9Cmuh`qLyvN zh43$}7c=~RBBqbX^X5mgWLEEIXd}Eq`B69ni?j&LR1V_ci0SVDS>2uM^=;ZY*d$N= zm8N}lQ7DWi!u{QSct!GmACtlx>=cdpA3a+RyaGQV)N+?lZgDN)|7-LDcga12F!#=vkjKuuf`QS*c1j{(q|hil&&Gv zXiK}lSwFsId|-}xy`{(7_m$uCHOJRZSa~vzj%_KIBV1iq!aFl%(81@KV?lxJ4MKPr z>d%U1xZ7cL%(XiheS(dqTr36O(&w|CF)>x?LZ)f2O&@ zhlxj~Y-FUr;Aa>){BN`zj1-#|J;aXI)l2&k>2f`A*AQM5H~eaXT-|DCw7im*^{9-( zhi!w_$$zB#4Q?UcY3K}h@G9Lqy=HM$o#(2DkmU^#{AwMWT%*>n$g+k~o)zk-H{X{m z68h`L)^au9w3FHv6lhMsJPKOoerot-vQ`cS5K2gC*_Q?x7#AvmSJ8QXIwq_!_lA$P8GzZI0)aS{+ zF_iMvim86oR&j|IKLt9~ZfecuFFT#$O5ICTsO-!!l$m1ijPn(`~*Bf8Rglx4y@$Yt4m9FQ-v^&R~!pFjJd<4%Co5o4yV%Mt!6 zJqoYE+g-?(NEtQLSi(fXndjxMaqIKawF7T9ra&kY{( zyU+h@?rxm<#sBBf_{qM|2uRz85W}%ff&gv%^?;EoB`;^117w>xYVU=W!IqP!edYx& zN*rLj?l-Tw@Mjaau= z`Qj@_c*`8U=w4u9Hc%mZkXO_!0Q<;roGY^1&UTsAt99o{sbe55DUhR>&o1tb_3}80 z;pgC>%|UhO=de^B5WMtk0Jfuyr5GS0UmMIcD^VUY8xa&?=tR=IdrKuNiT>nw_@;OS z)T2o%(=hX)S6dfP)%VZh?jxovPdsW*1cR9u_Oma-hkXu&;iCl+Q4K=KrTGGN3Y9<( zKw{w?{uF-QJ7Wyu`Q!KFN@)rfR03#?GXs1rUI&mwC^+YO_k90oDcUj^|7xl#uqD3a zrrqn|^K7GEzJHZBfD{6uKZOeS*_GD*dNF&OKSEPWHRNiUhLuz2z^ZodVwYORU}4|j zmrWCK(zE&96e=OU#uh{;od0x^|F@w{N<_d5gFf6KFY9meF%s%3)$O1zO`R~P+{fu| zSTs(+z}c}|O7VDJq)6Jvh=7Ws5En#Gzx%@)Uq_5Kb-(~y$lZc1B92Ogy7>N?QeUZfrbzlY23~1EOUC-rhF{uF^dQ0LnF@!Kx<{wP0X zFK@v|Kd0@-Xs2|%31qMle9fR;y9Iehd3V~@bu39FJd_I`TYPk?;aU`SS5Bv>yL;uu zjPYBGX2>3xax$J3Wz=idxp9Qg;3P5^v8p+!jEl zUpCw~agOvC^VWtC?Hep4oer;sWOT;UA=?mLK2qhsZ(WI`$7Y5HPm6zm>-DrX7+%7U z0rI!;YkFK|6xN+Nf#HUODVrk2gj9R%|?*N zdDP0%lfuZBFl}$j*N#)RF7J6*`DHjgOqjA*3Cs2oYt2AupGoKDuh(zrk-IM*Wvr!c z^AlgnFObvtZBfHwUJy$JG5S^1;gU4brfr%4RY{ZWP6-BWlmH=H+U9RHJAm*TGxK`_ z`2M)-hkmgB)iiGA9wq`Zax{#xL;a!leu`Z9w|VItZpGd@fay0KX+oasIgn>H3J!%w zL>fB{hJQpr%7}I;-^PxO)fGfYj2U5%_q%S+cSMRlbkDw=(rTynJAXo?^MJ&wy>f|v zvEtD1^91;UWI@G}=k9fh?vmE5rc4P6PnbZ_1hM1~I&ie2g3ptZgkwGRa$q3NqFMqt zDGBpI`;@j{KO=&=k;#|DlU`@QZ=CR+GFHcMZQTL2y3@6UD)}DiY93!Yw+8yH~?PDzLC5RI-CW zXrMb43kzA^!=~{FXn;US-V7K)NZB5h__ALQUat`x07%>>G9Z5SL}yO^X;t{me4}C| zfY#~kIW%`*P01q0+UE#1Gw8(k!OifB%FsIC%uOFuLzV|HId=a$PROlsNG69W> zjHKtkqg(^Gv4)nFl?|+}t}@IMlS;vPqb(SsRW&Wf`W|H*RwaGFs;_=Zk>X z!?EFthSM8qDrGxUno@V$+XZj$8D54wzqF<(XGxu=@|Fc82)X|dV#D7AcGY%V@AlBT z{&%t^3zhg&pY!-2rrH_Nxwlg{^WV|>}2VHSLKbbWIZu%J#sgVt1}@5;7wc6Qz?NtC=^Jlh_7_@Hs)Cd!q= zyD1Tj)2IOA6tXgQdhuse?C5smXN9g*US_5+EkVRwrJ{0EdyCp!$gs~Q>5MS7fUam> zIR=AKJvMu|YnU~?K}IO%JWS;9z6LmF{~b-Ki+}g`D;+Jme!H^^4-ZdNU`kTF4gU5* zCH6qYN93sdDo~Ovv5(E_%iOGM$JJI_29Jr+L>BkR-w8*CA&_MSAJU(@r*87UI+1lv zoLF_bN`_wz)`8o~UPtvxIi%JFk)YK)0pc7k=h>~``iTriUw$}@tPJNJJ=2>{es&?3 zDWJ8yL^42t$s{0Q8q(82EZddvT((>6A;;%Vhkg;5ESz#=BBs9kP##oYWXRl+E@4^a z@v^b*B>mTyGNCD?7C{>adWUh6KlviB=s4mYKO19kKu64^PHS(gTGLrFgY(nUqJP*Iawvvu0gu&CK5G6{D@GgpWgo0|3BRQC8HwKcfG)VPW3yb!VLr05AX* zMY-p%O#hh}I2o^d%LsYeigyK)Jc%u4QLUwIIUt^iSr)dB|EhsPBQpyRjI>$oLtu7u zGWGCKCc+2{v|C6ifATq_9bGJg2ECy$HV(#tLUQrc3X7?=K`prt=VOu@2+es z4SugAS8vlgqB4?cZ+7*1UGggU7PX;`bDjl-(08=7H|ruvK_9HW6a__3{I24w0@`%@ zB5+dB{x&G^H5_$_s^TmJ`zOcSzqmjeB0vKIM^%-XnVCWgr4}7=I6#2(&E+8uScRB9 zLqZm}HzzXx1000sIZy;PKx`TW43P2!T*%|@=^f}-ST^g=*>-GxICGVP=isE;2$eRq zU&*BJPVKDQUDt1rQ9lXs!1TQfE-Rq+-Ycy@xCz~A${w+%9Z-v=M_tNCj?5LL2mQ!& zDt~GxjFBNEdFPr~DD-4^A=|+5*ptS=Wq+hAQ|;UXtk6cT?+uJ-6A7mt;8`6(dUvj6 zWyAQ|j&+AJ+mB0R|7~sg_0)d;9fDlsNR*-1sBhn*Bjq5)`6N#6*)-emO6qo+Flaw) zFK`LhEbGSvR;Vh{E}G4b6wKpMkerL@&?%?WZ`0G$ z9WqxtbqhiN8YV{1OZ>@ZN&&>XugkQcid&ZEi zdUNL6ew5#F+xK6);5t;U>1lcP(*zjGd3UiI6M?AM+}sQf={>R)ksSe0;zV5^Dl z<6k~g0GCbro;l{YxVSq4`o*(PLBuzqy5@v9PEJn7JDZyqFikbRVW`Lj7u$1q;|q^!R&r77UGL&3~&kUq36&_d)@9`0XW2hoi>x+VZ_A8b(&XC z9Fc6qsD?b^K*6@eHMRblyP*FOwFrHGTlInusINqU4fKPEI*+cSxf8__WI8DT4~+!? zKeiwVdBrrI0}O0jQ-N*({5B=hpc+L0xQ#-<4S=Est6PkVKVJR80L$Rb#cM@c{QV$3 ztwMG#_{YNgQ6HgTcBJr8rM~~;+7D;$l4wluOiw!G?Pt>RP$)pZ#{gEC=}`)wz8Wq= zkR%(1|GV@m7Fw^TZW6%5M*#AA&WOeBpxJI4?G7ki7#87sQ2tW?MDi`?B0!A>mnkQ& zJ05iV1%ezTCg_3b;%kqSZuE|810cR^2jEDN@ZX*@VNe7u5DuwqM0_~mAz-?%S%ka( zakk-82psuKxk5}Lnp7LmbQ_G=Lg6nWv>nyIOG3!NynTsnBjf#GXYmi0s`LLVZcQ%f zI{bUXu1jV7zeCOY3imbK%yw43*P+(@*q-WpU*@g9Rfn7u?u}_T-IMgz|J8cFzMl=X zE)p^v`Q~HQNHyOviMx&G`>_qpWzy$4@bfdwZ%v?v{+o9^y zL!!H<7!Lud#(O5BW=lrOjk=W$6zfQI$5;ro5Fdj6?-8o2ZmN}=$JW}0jq~w!=yV|s zXpBVZV_{;9VnPORt`n+1ss+cBxzEGrloFZT(O+F~9R;O!V zi7%K5ymvM*lGeGp@ombs5a*Qo+LuNZUz+9OI%60ZV7kOpkj}`Xt$WXoxlov3{~p*a z_j-3wX%wfA$F~M^aUQTRDJBw{t25j`pPksRJKs(g2}$ydlzH=+9K|RcaN+|!#je^r z&+$sk)UWk8c`7fs5$r^>?166%&i`B8ed;wr0y1zth)#GF>=0_?Y5)4p zhWHjG;NO^wbOG8Vis%blB?XUGS(YMEjQcn|F!si(I@lfm+TZn2l(~yThI2|S{s|Aw%tsh95ZIp6q8L&HD3^KIzZzo@fnzcz{wO*cTvc|NY-u)* zhrBQCpZq*Ivhc_uWCzn3BDqJF^*2K1$LegZ>zL<4+Y#jYp0yeBLFh0{jy0m;&qRwc zt97A^RHyUsBLudc_Mbh!^E&%F%FQ^<$2|&Cm29QER)@@%JlXPsVbA; zRH!vJG>9n&ZCDh*z+tbvOC!VeBqZM6S{Ojk1r_pdsl{h1BnM=QuiI$(;92FIOq1I} zkVwv1uVIvmPD7D@~2uq^` zI_<&OP4#n$Q2zBk8&jJi>{^)O2fIqFXktLbTb#iU7M~G*#}S;47-*=j*}(kvk-DF6 zUnWtsCd9%vt7er@TsG3AU{f)P5Vp#&Izb8&mOC>{v8kh!A@Z+C@H%R<(gw!swK;N8 z(v$+QXYWZ?hvwQWHg~$G!Pxb%i*J$$So|y8USJv8KZe%?7EwR&fuJvYf38xGg5ao0 zt0^WhHb!LqImfODyQARJiED==3Sw+Vq?JMi=P6+PhN`u(V$Zh3Qof+(n?RfbZscs85n#Q;94*YW4?XT=3AM42bTo=^hN z__#h@rKQ1oHI7@1RPl!aHPPmmF({2;vj^x@T#{IT$YD(jT7HX5jr#oSS z7h!Urxv$3F`&OESiM~4WFF`SdL#-Y$cW6xk6vhDBauqkmS3~9 z3az9kv59Du>Z4~$zL;|WL*z<}3*-%3n6joHyree{Tl_1hcvbYTGjt<;ylTCyO%%V; zWAYT-S5}WU!+Ada2G+B63XqH8a$g>_FEiHQzzQtZ)o9*=m~m7oiShR=l=xn=_hp*L zzVPx5b-&)ZDTOyZgRMO|G-TY9weF2veT zHVFEX=q2Mw8(m`m-O*+q@*+Le?lafrehn&bXJ&imQZ8RB6~NLhb& z(>lyWM=6x{+Ktl3;9PIgm76U#!Jj>(P>}pJk}}-dNb6+c(;77n%As6uwdsO%Cm>vS zS?oX7r~-^~qPTBkF$t&2SSp{wghd}@Uwm(Az(A#5vup*>QCH0S*p{D-hW?C*fTp^C zXQ768(_hCTlvKxQH5fCYg_PDMZ(4HFR{nXb@F{$@5bbhvdS`ykulx4OerxBrnX7!^ z;)G1Rb64>Nnaq8vHZ$bNDeFC#CW5^&Tj;~pr56R_J&ZT>T_@%EIU=M0ztjn0Ke+Nw zL}kEbQdjn&0`51f>LbL1DNeo|`~9}^QKp+M@KV3FvbQSj>O>1O)6s*Xo%lua|(>^R+jD0?}c=qFkcZ*eOMc>oc|`V zWWfHwMwRj77!U||p{FMiuO6Rmdc`}zaqYmyC-f6HYfI<7!U{H6%}8V&d%aMhsBlpd>iel*Gcm208dm5jbNq{*%-^RkJRSsncH<$_&mQJtmD-D!CdG{(13P=5?swbYrrnS`*YrVGEX>q8) zVHW*%BU78g(SQ4^TU0yvo z{&_mM7R2@CZQ9rvv3h~!1=6}zi|NND%M0g6^-W2en_HPRU7K#hs+$zvEq zTkVN$6L$D@p%kRd?|n?)a}g9f`BYHqz;)&t%a3bmijV@j)Wn+kHO$YBuQd70R2U&X zbX?#5R42arA=2spJS@i>{r-DYIm8^QhYNb{h6YHjsT?um3HigneI@Mr;9}!l4n^Z; zW_eCp(nL7Md~xx7z@2CExko~X+oJo7aQkar)`O?0(GBtuEFgsm@;-FJin%Qw9ydN? z((q&QbGjlO=%;)HT0MA~rOQ`U+Qir+yfmR%>H9Hq*h%8QvIv%XjO^=GnsAP6U9z`B z&g|m#EL5yNj5jZHO=|M1XFL;84AEw_WdEkG&FJ7;jXs(cVmaK`IoH=XE+Yk|0J&y1 zn|9prx|g}X_uTl$3V+^wIcyP7=-Ok)%kBNXkY)*UOvtPzx;@0_ZVEqMsN+jUfa<6X zD-Nr-<+_ZA29;H@*W>{8#0CR3zL_=v-M?yN`^AcxtWZPIQ zcM=Y^yt5hd#Fzf01p9&fFLF66rKCPhJey?LCKl{~g_I4t(Sc!jWgs3)c_UMrWBAYz z`HG+iu;~nxweJ1F1|6NT&MpR%VODlWwu1}up>YI!hNxLdCdTRO<3oK>2+9b6EDk4? zjU6muIsD57t_jioR-@=k<9rqItEhkTG!r|F=2TXcY&>Eimo?d#LY?K8*7Bd4!zSf8YgIEUMH5M*j{$M^Y19}Lt zPDQ#tm#0U6_7*d6()(^Yqs10h<2gH%xx4{g`rPa7be^AQ&Ibw!1tLvlle%D**kKc$ z>vF;dL17}_PW`}jD6XZ9duLj|*1x}b{F+dWequyu%b3mp2)`f)PtiaC3owKlY3EPOB8|y;!j~KX8^@^+0LqZi3ife=zjLS&6%KJmBb$j zuhOnHs=f+)(dj)==;{{OIh90F#w<)F^@p$;Ps}X%KkR7O<(;}!+M>)ptvE*#O@&O#+C}M0_D7(P6HzASf6%xx z@-bYOGkhb_o8HEn-8J4M{cbOICHrC5#gh*zL}*g+SZ`ok^VF^2D%7^q{Mm1J1I5;Y z8_$ILxn5YG9!FFq43!7LlF4qkVd*EY%BOk3dwYqGBF;9;y*MzQ+raJS^_1rEDk25E zfK;2@K39l8aK{>N=VsrEJ|p(RA3BLphWuqSnR6VR6; zI}chT+lyz!`sSyJ$DN^MXZS5GJgSdDqX{l3yf^|Ge14SH=hR%nfx{aVV%!q#OoRy$ zD_#lSil)0pn>26~HNbLQBRaG$%}jJX$9PBl@QF-NRS1X9>BPiHB@Gay0z0n#af{|< z;Xjrr%tO@m=>D3X&8_au;#oQKFpIfbzG%3T7rIcvc5`Ln6IIk#s|v}a~&fJ z|J^Ru`}VelMmD(?p9ViDunuZ|xg2Ph5dAMR$KbROOePe)SU);d7uf20EN5SLLUifz zO4!W9^`M1X(~&UK%e!74*>Mi2gy z_LWo;K@|$0hgcDVEVB->=X0Odx(YZqkr;CUjvHC{=FsVyKmOs>cge?1u|Ej|4vUlE zhOz|fuW5Mx7!6#DUPD8K&XMa-mA~jdYq_4^KI!VY#cigJGYf4oAuW8pdo>T}W*A0Z zJZ1gLzxFVUcINs7SWi!su?&S%I0y6F?aO4z8vok%M%D|sCSwpa3S?4)^Qp!!o7&7S zcKALjc*yEu;+j8G>yPU3cL?glqfAUihy7?IbtXr%AIGLXZj=PAY4ZDqkAGCTJEBw? z2Mp*R!T6 zpfX0t&agT0pT!z7FNY=lfsv6#|C|U)WpRq&npXx{f-m@$Yvm0)QC-w#?TmT1EkVoo zyj;v9$vruVJQ}>ds2-zX;FTHm3~1}tzD4vq=Dr`ndVi;bjW<3#joJ>Y>Q|v7D^BYw zk*-zk*DP(P2AJHU9B4H;>y$9=D7;7~{(Zw)%V_GQlqn%tR?YYPZAyDrmf$)Fx~*rB zAY!FGWlo_$7@N^-MT+H)ZGuL!gy0?jYdVR@6H<+xi{&TpoG{P|{2}v)x!ABerTHd% zKChbmg5Rt) zbN6p4tWZ5F6HdwU&d|0lB{#$c7>)NI%$J0OOg6G3S~G#RZ0%ufo%3z^JU;$)Z%ih2 zvHS0a1$K-#JMCTI;-rAz0H^$_W`L;sHjG{SXQW8GH-7Yj@V8=vG!-Yc#Dil0Y~;8D zkZ2|NP4Vx%_}!d3KL6u~P=Neo(tkFC<=GCeWB=!rsVa|GXm}j+OqqA|`&96ft5!`1 z1Qo0GdXHe|?t}?^o!g+Cyi+zDm&Dme=(^UVQI(8VZm1|gkRO^8rgCw?s9hl!iT}1y`_`Tm zsC#^h02@&khaoy@k<}&kB{iY6>t$=Tr@YD5LG4_Ww`0*S_u#DyBX9FzIUOQss)^%y zVn2IUAgqm%yz!Z^uc(#Do$QH^@r_OrrdxfOn_cY8-~OzxCUUXftQv8AHIgs+ z@QY=6dQnL;B1PAJ;A5p9n;HZ)eV2;ez0obMnz^?W8}Iki@S^3lQ`}c~cRHhYP&dsN z!zQBczAB*@z_Zfi<17{69~sBZy$ehJYx45IkL`=T{o!nHA91F>#E`ArR?>-)#~Oz^ zoplUh*S;9ofMI|hY?}>!@pvW?wr@H0lGN|yW3tJd^25`uD^&+#sn8jhM&p??YB{+j zkl{Coet**VfJ=@>7w^ZFjql=4;C0F8Vk0_5-dfq0Jq_oxyBg2zY;b1B`*~pALJpkr`X=PDR#x?2F+lU+lq;`7;7grg*{oW7408 zXm31>fBk+TG5*+@(7QHi_*zxdrsnM{vP73e5f$-*muj$I=gF*r`(y;F0Sli_55xe+ zX!YrreHmg4YZ^N3o6cuS+IR@r!aq*ch^?7H0i5Z-U;ePd*|QsDM8S?nWW|<-E13Lv z{aNGzxuU*ffH=2R`Cg1S1J&9K{(!f7X$C|6FRkJJ*q(uqe+suVaHG2w+6 zL}gL-`>&beNpqr(JEC>5SiV1Otvf4|KZ_dPGnYo<8q(H6Me1-C7B6GpZ^ZwHkE)pL zaDJ-y0m4y>xatzTpZ9C>w;P4pF0E)5`EqE`xfEN}vvdjyn)kANE1o6azlqF!bVOC1O6d(v8-2gKh;LIR$NNu#lGYMXmR-xD}q+Q5iDgGFa;Z zSholHgDlmCI~ZutPv#m-o=QYoDkVoIgltNh|K0!XT;-Y2DWRXrV`YIaspJH8`);j& z5ZF?qvd6DV$#JkrU7v+_vfo&?_Xyx+i>BJSd1Fi&UP6sZmB7_?a5q5%-IqWy?$~q$s;N}>L?ks!PgI}y{f@r z8)HY)HL+VPfBv)14tU+#F*&eA6s`C-)Q~x9_$AHh&7p^(zQq=Q^D+|C!ptF>DAi1k zQvN#l6~EKnPG%9{D6kj2tBLADEXKpzf-lgul z3dy_q1iyW~-!;-#On$9(q@T;RN$x%pAp?>rv7>@1jT2{UOVleH&dtrmQ@Po1Jc)Sm znfi#KM4v;lD#)OcJeh}5JS_#vDudJIi}+sEpF_o; zc8JiVO@hP@?92*dNd82W^Ptlp)6>IrUP%118CIg?c>`05RH>+|)oOHj{I2FOnL@ph zyPpx?)RJZ-a%4EOmp4mXI{7$%Zi8<{p{1Ql#*PF$Kk7TlSM!&QYG`j7hY3S{3?UCa zb|BX5Ni-VfkJJ(<|BB`t(A3BfuXR7<%{70zUCM%rXFv3uMYjf`imeM|EjCAu0PwokEm?cXPje40L` z67^RU?@AD;VZ@b`4Nkg6(jk@B@_}`by6CjkB?*Us~Fq z808~`)J~sLb6EXk{G{$iL?moK`S5pQUseutkf6e^FdIC=ECJEFun!7p`{(a_6`%Eq zdY&IaaN9(q!>>Fj;pp~c6IVZNjzS>LAyhO}!*{Q|gFAIniim*9z>!B?rHGfICy#x~ zP+E{ery^30`@UXb-v7J7j|0rKI@(*I$k*tJd%1JJ%ac_y(1-E=lO^!QSmelY8H%+= zl6eVm?TQ=mL^%A@b`+!j5mGw$O|)n7wS2ME@RNUr4TMGOT<})i#X?7v9dBk!PeQgg z2RuhEBn%7S@=Y(%)Vz`kk|B@t7F}LF$+;~>K1%=A-aGQUP=56B==rQKNi^WdM&jb) z%FT3VSe6L`5Ph+ka=3Try>f$Zf-(%Y+kTbU!VjPGXK+Bm|IP$!+ctxr`! z%XI}eJ7UK7v)MXVV9pY)!{8yoEH?&pq!w#3&4MoU7#cbRsw)4}!HHJa(pqo77;wE^ zisNfPZ?uAr+^)+3e%SOOe>rvp6-c{A?FF5+m|Y*2$=)<9Em`DCmLTUyUlLbN%dW3`G83u3CGyq4_E@#I9u?Md+4 zyu5(;98jc_Z&ZS^#bF`FmQzeA9rCZ{xIHymxct+?yT%T-8t?E){DaDCNd|11k1^u; zkU~GRj9t`qKlp>2j*J>Ep7DWM z8=|Ixa7AojMUXNwFmy~(&e`AeG;C}uiYDXr`1))SMML78WhXz}XEz~%BG z=NDJNAMX^q{Bwg%&>D>%$_K+(43FN>n&M<_BwTo5piwAw*M|$;H*=+08vP3#J)ZZc z(C08ryvU1$j>U}Ij}QXBBhkOTb4zL@Lt<2@{#_Y7@xJBTD*}}2TJp?e(bA-g=Ri2r zdwQ8F^7V!N!`y<%Dg1~1dsIEw38P?lJ8QW7LYS&Ep!v=PIZXGv+*OAV-Z#MTh0X2G z3HcXOL;9@2>LP(^&Cq32v&T2AD0RhkMM!wdOdMe}1aWAzdN;KPqA9_4t>=dl&(wB)@6@PvxFU@E`otp00EcBS;ae zYB_5Ck4o?~J*kkoe`zhIX!{xZ|Bp&|d-TzDHRYa4ND3eQJ^coHM@aX>glZYlIDHRd O0hK43ik0%_q5lW1vfCa2 literal 0 HcmV?d00001 diff --git a/src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/ChapterDto.kt b/src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/ChapterDto.kt new file mode 100644 index 000000000..9504fc646 --- /dev/null +++ b/src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/ChapterDto.kt @@ -0,0 +1,35 @@ +package eu.kanade.tachiyomi.extension.en.mayotune + +import keiyoushi.utils.tryParse +import kotlinx.serialization.Contextual +import kotlinx.serialization.Serializable +import java.text.SimpleDateFormat +import java.util.Locale + +@Serializable +data class ChapterDto( + val id: String, + val title: String, + val number: Float, + val pageCount: Int, + val date: String, +) { + @Contextual + private val sdf = SimpleDateFormat("yyyy-MM-dd", Locale.US) + + fun getChapterURL(): String = "/chapter/${this.id}" + + fun getNumberStr(): String = if (this.number % 1 == 0f) { + this.number.toInt().toString() + } else { + this.number.toString() + } + + fun getChapterTitle(): String = if (!this.title.isEmpty()) { + "Chapter ${this.getNumberStr()}: ${this.title}" + } else { + "Chapter ${this.getNumberStr()}" + } + + fun getDateTimestamp(): Long = this.sdf.tryParse(this.date) +} diff --git a/src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/MayoTune.kt b/src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/MayoTune.kt new file mode 100644 index 000000000..38fb713bc --- /dev/null +++ b/src/en/mayotune/src/eu/kanade/tachiyomi/extension/en/mayotune/MayoTune.kt @@ -0,0 +1,124 @@ +package eu.kanade.tachiyomi.extension.en.mayotune + +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.online.HttpSource +import eu.kanade.tachiyomi.util.asJsoup +import keiyoushi.utils.parseAs +import okhttp3.Request +import okhttp3.Response +import rx.Observable + +class MayoTune() : HttpSource() { + override val name: String = "MayoTune" + override val baseUrl: String = "https://mayotune.xyz" + override val lang: String = "en" + override val versionId: Int = 1 + + private val source = SManga.create().apply { + title = "Mayonaka Heart Tune" + url = "/" + thumbnail_url = "$baseUrl/img/cover.jpg" + author = "Masakuni Igarashi" + } + + // Popular + override fun fetchPopularManga(page: Int): Observable { + return Observable.just(MangasPage(listOf(source), false)) + } + + override fun popularMangaRequest(page: Int): Request = throw UnsupportedOperationException() + override fun popularMangaParse(response: Response): MangasPage = + throw UnsupportedOperationException() + + // Latest + override val supportsLatest: Boolean = true + override fun fetchLatestUpdates(page: Int): Observable { + return Observable.just(MangasPage(listOf(source), false)) + } + + override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException() + override fun latestUpdatesParse(response: Response): MangasPage = + throw UnsupportedOperationException() + + // Search + override fun fetchSearchManga( + page: Int, + query: String, + filters: FilterList, + ): Observable { + val mangas = mutableListOf() + + if (source.title.lowercase().contains(query.lowercase()) || + source.author?.lowercase()?.contains(query.lowercase()) == true + ) { + mangas.add(source) + } + + return Observable.just(MangasPage(mangas, false)) + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = + throw UnsupportedOperationException() + + override fun searchMangaParse(response: Response): MangasPage = + throw UnsupportedOperationException() + + // Get Override + override fun chapterListRequest(manga: SManga): Request { + return GET("$baseUrl/api/chapters", headers) + } + + // Details + override fun mangaDetailsParse(response: Response): SManga = SManga.create().apply { + val document = response.asJsoup() + val statusText = + document.selectFirst("div.text-center:contains(Status)")?.text() + ?.substringBefore("Status") + ?.trim() + + url = source.url + title = source.title + artist = source.artist + author = source.author + description = document.selectFirst(".text-lg")?.text() + genre = document.selectFirst("span.text-sm:nth-child(2)")?.text()?.replace("•", ",") + status = when (statusText) { + "Ongoing" -> SManga.ONGOING + "Completed" -> SManga.COMPLETED + "Cancelled" -> SManga.CANCELLED + "Hiatus" -> SManga.ON_HIATUS + "Finished" -> SManga.PUBLISHING_FINISHED + else -> SManga.UNKNOWN + } + thumbnail_url = document.selectFirst("img.object-contain")?.absUrl("src") + ?.ifEmpty { source.thumbnail_url } + } + + // Chapters + override fun chapterListParse(response: Response): List { + val chapters = response.parseAs>() + return chapters.sortedByDescending { it.number }.map { chapter -> + SChapter.create().apply { + url = chapter.getChapterURL() + name = chapter.getChapterTitle() + chapter_number = chapter.number + date_upload = chapter.getDateTimestamp() + } + } + } + // Pages + + override fun pageListParse(response: Response): List { + val document = response.asJsoup() + return document.select("div.w-full > img").mapIndexed { index, img -> + Page(index, imageUrl = img.absUrl("src")) + } + } + + override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() +}