From 580b2b1b16ebd4726cac5a9282b3bfd7b330f1f0 Mon Sep 17 00:00:00 2001 From: Chopper <156493704+choppeh@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:40:56 -0300 Subject: [PATCH] Move snowmlt to lib-multisrc and add Solarmtl (#7054) * Move snowmlt to lib-multisrc * Fix snowmtl * Remove assets from src --- .../machinetranslations/AndroidManifest.xml | 22 ++ .../assets/fonts/LICENSE.txt | 0 .../assets/fonts/coming_soon_regular.ttf | Bin .../machinetranslations/build.gradle.kts | 5 + .../res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 9002 bytes .../res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 4365 bytes .../res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 14405 bytes .../res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 28480 bytes .../res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 46346 bytes .../MachineTranslations.kt | 211 +++++++++++++++++ .../MachineTranslationsDto.kt | 38 ++- .../MachineTranslationsFactoryUtils.kt | 5 + .../MachineTranslationsFilters.kt | 2 +- .../MachineTranslationsUrlActivity.kt | 10 +- .../interceptors/ComposedImageInterceptor.kt | 37 +-- src/all/snowmtl/build.gradle | 4 +- .../extension/all/snowmtl/Snowmtl.kt | 221 ++---------------- .../extension/all/snowmtl/SnowmtlFactory.kt | 16 +- .../interceptors/TranslationInterceptor.kt | 14 +- src/all/solarmtl/build.gradle | 10 + .../extension/all/solarmtl/Solarmtl.kt | 20 ++ .../extension/all/solarmtl/SolarmtlFactory.kt | 17 ++ 22 files changed, 384 insertions(+), 248 deletions(-) create mode 100644 lib-multisrc/machinetranslations/AndroidManifest.xml rename {src/all/snowmtl => lib-multisrc/machinetranslations}/assets/fonts/LICENSE.txt (100%) rename {src/all/snowmtl => lib-multisrc/machinetranslations}/assets/fonts/coming_soon_regular.ttf (100%) create mode 100644 lib-multisrc/machinetranslations/build.gradle.kts create mode 100644 lib-multisrc/machinetranslations/res/mipmap-hdpi/ic_launcher.png create mode 100644 lib-multisrc/machinetranslations/res/mipmap-mdpi/ic_launcher.png create mode 100644 lib-multisrc/machinetranslations/res/mipmap-xhdpi/ic_launcher.png create mode 100644 lib-multisrc/machinetranslations/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 lib-multisrc/machinetranslations/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt rename src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlDto.kt => lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsDto.kt (69%) create mode 100644 lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFactoryUtils.kt rename src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFilters.kt => lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFilters.kt (96%) rename src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlUrlActivity.kt => lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsUrlActivity.kt (77%) rename {src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl => lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations}/interceptors/ComposedImageInterceptor.kt (91%) create mode 100644 src/all/solarmtl/build.gradle create mode 100644 src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/Solarmtl.kt create mode 100644 src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt diff --git a/lib-multisrc/machinetranslations/AndroidManifest.xml b/lib-multisrc/machinetranslations/AndroidManifest.xml new file mode 100644 index 000000000..dac6d158a --- /dev/null +++ b/lib-multisrc/machinetranslations/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/src/all/snowmtl/assets/fonts/LICENSE.txt b/lib-multisrc/machinetranslations/assets/fonts/LICENSE.txt similarity index 100% rename from src/all/snowmtl/assets/fonts/LICENSE.txt rename to lib-multisrc/machinetranslations/assets/fonts/LICENSE.txt diff --git a/src/all/snowmtl/assets/fonts/coming_soon_regular.ttf b/lib-multisrc/machinetranslations/assets/fonts/coming_soon_regular.ttf similarity index 100% rename from src/all/snowmtl/assets/fonts/coming_soon_regular.ttf rename to lib-multisrc/machinetranslations/assets/fonts/coming_soon_regular.ttf diff --git a/lib-multisrc/machinetranslations/build.gradle.kts b/lib-multisrc/machinetranslations/build.gradle.kts new file mode 100644 index 000000000..dc076cc37 --- /dev/null +++ b/lib-multisrc/machinetranslations/build.gradle.kts @@ -0,0 +1,5 @@ +plugins { + id("lib-multisrc") +} + +baseVersionCode = 1 diff --git a/lib-multisrc/machinetranslations/res/mipmap-hdpi/ic_launcher.png b/lib-multisrc/machinetranslations/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..c61c9328c5c68ba05d8c5372dfed05a47d2e929c GIT binary patch literal 9002 zcmV+_Bh}oAP)#M(0`)@5zPNDfEF+pzCZN!Q6_A^H!!>M z?6Ko6wYzL1@?xvX6$-YzUfL#E+$WpOiyePHcbP=XHmc)nonqc7{8lFi{* z9D@JsdM$h@6bep}h$o-jlW*VG`quCNrPsR3`vUc006D&U?=Nd7PrGqeCNC3nQm6#% z?o2KxxqJc8SODR>4SxKgOe`cOODs(_4uLp#Rh*X0>cwAjX0Ph)bF6`iyW)C`8> z%M&ns0!Yc>s;NQ_i)oVrCTWhhiP!6uP+vqPLFa^Hod775h>H!smqP-x1mES7o_In+ zkOCf?#C=lOc2Wv$4hg3+M&dYW3l1ILKa{6$yLKxu&Ne7*hheD zIF6G^*r5s-IHiQr#`7Ewr-Dq?BA~j`cDp3fDJ2A(!!0pPI);g)F^_bP_cZrNVL!pi z;~L>a0>7DY7)izC_2yLfjO1`*x6>s_08jO{<2O4cGy_S;y`A=gOlt7Rm6eX@*4JPE z+8=)YgZY-$|CJ!UA3)siU9f)ZcdKjaf0Vb`T$CM7BE!iR^&11rIiP0Pm*YxORxu9_ zJPDREl7%@y1m%7$@)JGf3S7ozv1xM#{tNJgZ&FP zwzc%DYq*D2BFh!S0CdF_XL1X;hSI|gN)IGNxrpSA!KGy`Mjcfptz{!Q)6%7FMULVE&=OhKpxP1u zT`Zb<7ywmwf=?CW7(v{0FDO5_XAM5C9atrWo+I+dxeKH_o>KH}05l$pf!uRaQ|W); zt(TwpcMK!)@d4WSMoWED^GuZ%RWP%G&FsJ8NRmu&+ zYNY+>yK?WN&q_xGQUhsBLyFRgBzOt*pG*Wg*S$aq`uG5?-`3XB(AYGyxY|@Bv-ak7 zVm|<(DC#ddXj&eUw^1=AW4t+ek~~$6;HAJH%BMKF01HJh$W>IIG`WQQWs$L7lTIQJ z21rQ|wVHZ@jvq6)5G9AkA`6pVC}iZksxp~6q)Lt*Jtp@)u~7C0!;nxKfsB-aOzp8G zcqth;vhvx|0BYN{yQQhAKP1SA4uzBd8!6)Ib9OYdMaeQCso7NtQai8bk*GOAntAd| z5@b#9m=iO;l#vWd4T)X>vMixW6OX~M1O!$UL`>2*pr>fLEGZ`7luFvf)17&_4giIY z_sD&7m&m^EKCzW~AaN;iMdISZ0wq(i!0}bjmj=+L9lHQfqXNW98cU@R85QA*(UUy^ zm?3Pc6FG|#q+qHvQ5p<~aH8ZM`bm@|g_+k@APnHNMp+1zs*$B`l$0zuo1oI0SJlJY zNRa`W_sh^z1vrE4Ir+>Wzl6HF<;PFIEC<6$arnw`e>fDq(5OTT3y}zPta!RKfHt(X zwKO(0&7?$dn!I^&rHUbh;RmyyFI{Q!5&4JGWjU1U6VU=$$Eu_$Kt(l#lu05 zE=U=?W|F)O+(AiE$>g~_kNgBlq(@CRfzoF@db{}DZmBIKWMY4h^ai`-{sk*#Z!m(m zj&uO8JQ|0|%t$;930hI2iWLE(Wg$}pDouhmw(V$XY=#7J79>7heal)|tEd)C2W)ho$0!La zubAIdH92XEtSONSvgJ$VVRF$)@&3i>U zkTocH+zKeod?tnaCZmDQmmV(-pe;LgfTWw$57KbKB3@bP{3Et*yWQv}jTBCRzt1K5bds;Kbj55{F+5F3GH5gfIcWOQ05)%TdJw8uYN}xe-tk1By;L** z2CW!WOk*&}MjUQ^PdK9DURmxJpVwoQ3KJ!X($P~@#H4-RGD(AA8L4Zct4QPo!IC&% znOEg3lE9#;mIzpVNQr<)krBv9Zz>J7g6CtQ*I3^mp`Nf591aPEd!@Y0FE%)Pr`1-= zJMSEjHJjUH#f9G!sg$Hr*+BcN zB|3@(s2Koh8UZWT8;!|vI$My6rn*|GuJD;WA!hGzB3B2HT+s0}tOGxp0HcH?Fo_r= zZRnN_-w}{&e#YzeV4IRhNy=luFvFO<3u=(S3WwrpOdti!^GK}Ou_%=wUnJOIft)S} z@<+y}@j`-nA`#iT`)%2{eV^=sV;I8za|iU7FHIT^GLFl`b6=Ej81X0;$BtA?71riR zZ%o3;e4u^RywX&xZ5LIn86=G$5v$u1i%T#Z$Dq?v->*vQt1(~z;{Y(^4^=CM0059K zy?G&(f#aD0BtXK1^D=5=7R?HbIQcC>*X(- z4@rAhG_ZH&g3W*W(cvVl-cw8#x@(5==dK>Fl$H%HDU{W!LUKQeRaeT-to!m*S5&2 zwl+Bqi5gg6C*#f>ERj%1cJ4g@pu&=ZY4^Y>7+UL*J;xwHkyv2&suERfW$W6On(CUF zQKUb~BF6h=Dw7Orm)hDI8BkjXRdGWNY_e(JQJJ%9x9mF_mR`g;gR1QEo#~fKbA7o= z7t^YhF1vUz;q^O@$j|32R#0mzobrj0!=!D;+gwqN!RY5WASEtH2Qz>IuQ&~f;rTaQ zH&HfkKPa2t*e=6PYm({LOqMf73>9B>mF(GnP?oLRDB);AYO5>coWaciC@gOuH~>ye zYvL>kkeG)eS7uW2z|IvVs@S5XOIoUGYG$T1gJ;52Cd%lW&{rvg+diPaUK-$YxRB!9 zxUWNIuiPa&-VI789Mya}CZ9T^T)sYS0yqQbLA;y%l^}e#{CM_4S+;qvs+iyFkZUhF z3zC$OR6HvOd(*OY|6xohFOA-uj5=!&IE$7n1I}{Dg=5Z=#@4NSB!MuZ!taq`%?%QTY8^g&MAG2G3_wajZ8cGcIiwTuz*{Rz2550h zH6$oab8UICB;ulDNU3S6?I#18nzZDz?NE@LXnGbG{60g5`s{b;ir(u?4R}P2)0ZXoXxd_H^W; zy)yW;)8sH5!8)kbycb@TJ$v^91gA`%I9^6g`~)N~FYms4NDjQ)E>X}zb$OZeud7xL zI(oDN(qmGxOztypO_fh4VvwK`LybjC7q|3-1d({@@+Wa|2BK=Xj5tXJO!d$~gJ5#Y zW&NHG`Ok%$s|Gh70Oj&288fs>W?XxbG}lzh+lRvPyCM>&XSE#k5|H3@;Lk};IV}}ll!<3`GP6F!MR*Dk?e5dK;mL=Te=F5?2` zv9NvNuv*OwB$WPJ8~{dOl~b|4z~&d`lm^fea8P|i{Y-kn3$rJZGO=E{^K)0oA6{4^9U$I*?wnk6)x|P@(JD#Db28j?yH+&|$-2S@QQNPLRsFI<0+iVdA}g^6(?i z$q`799pT8h@uTF5Y1hLx*(3}OV(1cqXAOQ4KLF1_T0%WNI$j@+nta|++1K79t$W)g z9Sa3sTQIvcfR-)?K=lm>HINhsL6V2KO+97^KrfnRxIZ|kvZ_Yr!h${e@)nq9mqdbx zI-!%jBWQ7fJiEptwB_`RerXa^>Y?0hU`9 zEZHP~20&R5?a1K+*&=y!3`Mau^076%PeAJoQj%04-m>6adxFr0-A0 z*Nh)byh+?E1&QD1lUk^l2fomspk9x!cvJdSdL?q~9houZlUjONvuQv4lkIR35Ek^W zmZ?`=Bm)};$ZsB9D2F<_#0}Sa#`I6f^;0g@;^LF@*UD4REeAiPWW=y$x%Jj-<@D1} z(-496)g3$El80wKA;AuW4e%OAjX77Y`|?fV_LZx9Kx;|ImgYReR0w>yo=^{}85loG zLWy(~F&ws?c9gv%ffc{GuQY&K*RE`7XlPIsg9~F~Nlj6hFAOIt{C-G)OOsTOyzrVl zxpKQy`P~xlIRwjeDZ&w?N8uFy;*l4?HzB$1(-+GZr(OlOKP5l>#iP>M-U%-`Enk>^ znS9~KtD#1A`O_0G%Yx@tsRRu@qfzes#tm}bd1sr2fw5S>akI>t^|bUH4}k~sGJ4EN zx%t+c#SRG~zy(%S;JGKTAbAZ+k-tV9$sjj}Y-1t=j%0-sbBTp|0&~9i_0j;^vT1{6 z6pb<&fJ|P95tuSHNYkl6k&_;tzfR^X+a^A!OeFZOe0}QWQdjMg3rAfj_s@P__U_*= zciucr#$RxbY={1T|EIGh2uIQ5Ov??^Cdrq-G(~ImzjQl4DC4eAHo4j-30 zrd=V!ht$i2F&E0~yY|SY?QhD|D<(^0O@(ZDW54_W0CgjWgwB+`me`_3baq_)Eqj6G(vavUu5QdF0`zF;k~_d~O*yuvYH*&Yke=Q3Hdh z9}M|ppoJ`gpth|JY8cqW%JeM5=t33dj)G5xC20NTB)t)*Ed$ViV$5W_pSHq zKYvWRI)jMK@-l7u6*6PSG=w7}zxwqYS+(MI@I_i0n=0j-ci$=#CXCkn5%bP3E`CKG zoAW%Rw_Gh&^MHQx)w^z!@~SHJ=!4M+g4SNC_E*C{gL{xmir+IJ)PRIRDm&BQG7qHNCPsUF(FXbB{MFJC42dfnlbf%*TyB~& z5w1YBiZfrD3B(|mt==dPJn*!1cL$Y6u7|YUcH51Jz3lSiUp^vhR{|j9f*KkC&^K?B z%O+l=DH6IE^X4srV~C;3~E|i>66Cl za+6n5iZE$o&Y?Hh75K(=SCl3}J9fOG2{V(hvJ&;yXE81-0z|X_@`gR~=fA9$9lQ6# zhfm3k*L+ew527A&T7&84(0sNj(JX#>o&4^%&qyy4SPsm5GxsF#zF4^X4s-Cjn3rO$nTCWmUN}4n9rl8XDkymNBKN;l)Ll zPn3!V1k(`90d-ZH>L^xp+327Eb#(>qntEkv0JS0AL4cHRGz)mLHm@mD_&}NqqGUkt z7A}7SQnUt@%%jqWIBLqLE|MwmZ7vvjrb(Vr(g+YH@Zv%c?W|{!83aI%tX%!siSqS3 zzM_izA3u3OUR(EuN?IL)(Yx-x0{~6XOe4X4{@E90?i2H+58;eWdjoJ~W;7Y0lMHcS zRee91e#^}=@Qk5igETi*mPtcxJ?@31y|FK<0o`5417EpjQfUBfdt)0)&y6z~3L#i(+Ynk-nbOrD3Y z6N@8>RY=SD@uTJTuic{8`S~w?BX8|GsBx3e?~vPWzeOfZny9LghJW+)GxKH5s@DJv zvWy64=v*@ROfaF>*`-#hyskzjPPtkJoIY5F4yZ$#gt;iBT(rb(@dd_0lAbZ;^3nj> zvTcjj<~iyjNn3PeZlbwp(|y6$G31L6b@gG=QO!lCA_*BhaDY^mdqI|Nsi>$>fJn4& zw(XXK2aaLF$QUBNs)Cw~g(;^C(c1c&L?cLEs9Da)$dPBu8N<)OHu`)JYqh?<8Ks=C z)Kt?!MP3|}j^lndEY@D+okKmnGHm#888YGwsX=ZPzCRLogQW~%Oaj#mt-xv_K_Ee$ zfjdf7v5i}{v@}tIK$cv6Q`$XY?^R6c{?puZaI|nSICn{?QxxqbP6V(7BOZ^48wb}{ z*XVJEB;m}#j57)5_m^94gDF623e{3)V>+z}8NX&QmOg|LM_|gmi17OWMlJH=N4k!y z`DV70@z`mD1|y7!$`H5!RlQwJykk7frko zqm$;JS;h>){R}vUgQZs+0Z`0oSC{)Vy+BiI%1CUGGQCE+Tj`cHGpiW_M>**gQ>`>e zw%TvNIZ1$Uq^noFuu?2B)4Pr)c^{;L5%t?xV!~e-5xftnVFJXSAW{JaimTTffV7UqKehJ;prRC+6*sG4CeJs?*y@C}%sWji579PaJ=?N~I92R>7K=<5m zb!jBMasx;j!Kx||Yb`neQz1362fHgQ^RH@ROsB3G{um^lXt+|AH|k{wzvvfH3Q0Of zIyh17R?{9uYb~sa^ShR|_4DL4bU4-`X*!r->S7odK>Gq%%eP`N(-UB%ECdz%{ufIG zXzAJwNSKkNSphIjcobCn8%#bGkfzXXckM8vXKhIqK|)#rnQV|D*Ng1}1{^wqybiBv z)X;!T@Kk-MDwadZ{U=NU_wh|BJ7F*kf?8A4>l*MBZ&g*(RBGz@MhdxT%!+2MvGyTY zz4w+90b0@u6>DfxE2gVyEh)j^3fM5)Vs?>n5&>XZQ>8?|8$Qw2UQX4jjTQTZirrwW zwsO3bJZ-Mh))v$2Luh$h?FnKljFz8FxS~HOpPBBFViTvTB#+^};Y*pTo4}gi2@sQK zT%5k1u0Y_nYf4kGMXNWo)BzwP8O8NBH&byT@medPK`SbuDjB$W2>F*T_#Ax*2MX-W zV7UlmiX(XyN8lO-$!bG5!1n-DR%lt5uSKfF>!$Nb4l&naSA7)4$P{urJxIfbP})wx zT&Ga`H=4`7004@yI6>SFNH*8Wi7}GK?eLRa*ynXXuGt@iH>rR{fCTbEPkno8X#l;r zk}3vAk)5UN!J*|*qA@-X%_UoNlNdNNjZ{4r6*=q}JzH#t(RzCbK1+KvDPeZMQVQ@J z+gj+;FuLZGLX;FI?o)}VySmISjaA50!au60K+zGiwP_<2GKHv=gi!4WBM9y3!vdf{ z$!9&ns9Z$p1Zq`*(q-!Z4#pL#i6}&3n}D%|O>jJJB-k?Xz&o?{VHu}U($Z))3`VoEH`FWpdP0x_|E*lfkI;Q0Xzz$wMdvDZHgJh5C@qK z7xNebTYA&Ely+ng94Gd>5x~;tLFUw~7@y@pnlqbXn^RT}Vekh~Io*XWk&bW_K`rve zYQmKma3`cjk;Y(ho=Ic|qoi+WhhEQx3;WQ_Q0eudKfof_j#L)j(H9ubkRLt|EU`0<;RW_?AQBD#2xy@N?e~47G=QF5w6dkC|Dc&11S<-Z5_&7yEMh1mzTNEi0}%9< z`O?;08WuY`zHnp`#F_w*e1b56Ra7?tlX77~c_z})4WCAjVGyhO7OER>BYZgCg9z zwP-Z3;9FlP4WPM8TU%;T7gKkirni`I(uY*ItjrOkF%r=@+u1Y}ps#`bXa}^2*p#j5 z08*a(7@(S9UV|zHwM085cr1fXGc+GWP_K%FZ zCF8)Vtl_JQpmAa?6VH27-Q5HY&7D-!ax{C|6Oq81_m@c0fBehRma6K0kRan7bNOjn z84){>`{fgaO!dw)&J0Qi~qTyX~6g3c!7V7&!gs8OFd8%%#7`9bj;|ZWZ3o24l^9X4tz=u{TP~C zs;RNKn1K3>CXZyS2}qpJaZw^M3wCKlS?UJ4N1)1RlanKzDLIPbUmyJ_sALXKl{T1j zP#SB|LYYQn1B$|EA!mIQExx6l6l7bh@8KW60008zNklSXGp(6d%B`OB9KP^@I!hLd2wD_(^6QB$(oWe~7hEv# zrn`UmaKEO3llV9!!N~F<5~vtgoNCqyCoPI*1@;gj38>jUAAFW-ANqb^a)~sXHaXG| zj*G&YvDj#GK(s=zGyu>G;`X9wNGYH(C_^JBIn5OL4FBoVLX=DZN0%cEP~zI|7ne{Z zjr?{@)sPLR3W#RjFeb~lQle*wq?QDm@xHD3?MrW#qk9iwD2bD+_u&BX2shpp=Z?K( z*k^9N>$hdK_2=1;A_NB^?4k-82d#j~XjTz7_qfY-!jWhgpILSHNxor(8w?Goem<{X z%8>~qLYxSDcic#N(HzrbcEQ7C3YJZqY*pcl>Z}+8ZZ2^YRy2lr)g06@HM9|bf()PF{xM!E_T78dn?A?t^@>wxFZTHtNbKk%H;^Jc_ zQeHn~c=OmRuesFUuYS1G?eUIjmF)5;P~w?t#S4!;q*0LHF9)`@O1R^Q1rDX>y}EY-kq-ih2XPFPBq)r6#cc*+ zA9mgc;QkN&iCRq|)Ca7sH&>I%g1`CtC=(?hd~=Bj7|;1A=lw&Gc%Pda^JV}kzW<7t z-+S&yooEr1|I6SM=UoJ;`1yeg`B4G--zW|LBV#%R(1*Z$3ZPQ}{e7DFU(e5iqTfSO QEC2ui07*qoM6N<$f}RNMqyPW_ literal 0 HcmV?d00001 diff --git a/lib-multisrc/machinetranslations/res/mipmap-mdpi/ic_launcher.png b/lib-multisrc/machinetranslations/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..68cb9f512aaf5234baede4593ee081f9c218de73 GIT binary patch literal 4365 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%0A$pAtpq6XU)P0MZG$ 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�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 RA2t90002ovPDHLkV1oGxdC~v? literal 0 HcmV?d00001 diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt new file mode 100644 index 000000000..d74aec66f --- /dev/null +++ b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslations.kt @@ -0,0 +1,211 @@ +package eu.kanade.tachiyomi.multisrc.machinetranslations + +import android.os.Build +import androidx.annotation.RequiresApi +import eu.kanade.tachiyomi.multisrc.machinetranslations.interceptors.ComposedImageInterceptor +import eu.kanade.tachiyomi.network.GET +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.online.ParsedHttpSource +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import uy.kohesive.injekt.injectLazy +import java.text.SimpleDateFormat +import java.util.Calendar +import java.util.Locale + +@RequiresApi(Build.VERSION_CODES.O) +abstract class MachineTranslations( + override val name: String, + override val baseUrl: String, + val language: Language, +) : ParsedHttpSource() { + + override val supportsLatest = true + + private val json: Json by injectLazy() + + override val lang = language.lang + + override val client = network.cloudflareClient.newBuilder() + .addInterceptor(ComposedImageInterceptor(baseUrl, language)) + .build() + + // ============================== Popular =============================== + + private val popularFilter = FilterList(SelectionList("", listOf(Option(value = "views", query = "sort_by")))) + + override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", popularFilter) + + override fun popularMangaSelector() = searchMangaSelector() + + override fun popularMangaFromElement(element: Element) = searchMangaFromElement(element) + + override fun popularMangaNextPageSelector() = searchMangaNextPageSelector() + + // =============================== Latest =============================== + + private val latestFilter = FilterList(SelectionList("", listOf(Option(value = "recent", query = "sort_by")))) + + override fun latestUpdatesRequest(page: Int) = searchMangaRequest(page, "", latestFilter) + + override fun latestUpdatesSelector() = searchMangaSelector() + + override fun latestUpdatesFromElement(element: Element) = searchMangaFromElement(element) + + override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() + + // =========================== Search ============================ + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + val url = "$baseUrl/search".toHttpUrl().newBuilder() + .addQueryParameter("page", page.toString()) + + if (query.isNotBlank()) { + url.addQueryParameter("query", query) + } + + filters.forEach { filter -> + when (filter) { + is SelectionList -> { + val selected = filter.selected() + if (selected.value.isBlank()) { + return@forEach + } + url.addQueryParameter(selected.query, selected.value) + } + is GenreList -> { + filter.state.filter(GenreCheckBox::state).forEach { genre -> + url.addQueryParameter("genres", genre.id) + } + } + else -> {} + } + } + + return GET(url.build(), headers) + } + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + if (query.startsWith(PREFIX_SEARCH)) { + val slug = query.removePrefix(PREFIX_SEARCH) + return fetchMangaDetails(SManga.create().apply { url = "/comics/$slug" }).map { manga -> + MangasPage(listOf(manga), false) + } + } + + return super.fetchSearchManga(page, query, filters) + } + + override fun searchMangaSelector() = "section h2 + div > div" + + override fun searchMangaFromElement(element: Element) = SManga.create().apply { + title = element.selectFirst("h3")!!.text() + thumbnail_url = element.selectFirst("img")?.absUrl("src") + setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) + } + + override fun searchMangaNextPageSelector() = "a[href*=search]:contains(Next)" + + // =========================== Manga Details ============================ + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.selectFirst("h1")!!.text() + description = document.selectFirst("p:has(span:contains(Synopsis))")?.ownText() + author = document.selectFirst("p:has(span:contains(Author))")?.ownText() + genre = document.select("h2:contains(Genres) + div span").joinToString { it.text() } + thumbnail_url = document.selectFirst("img.object-cover")?.absUrl("src") + document.selectFirst("p:has(span:contains(Status))")?.ownText()?.let { + status = when (it.lowercase()) { + "ongoing" -> SManga.ONGOING + "complete" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + } + setUrlWithoutDomain(document.location()) + } + + // ============================== Chapters ============================== + override fun chapterListSelector() = "section li" + + override fun chapterFromElement(element: Element) = SChapter.create().apply { + element.selectFirst("a")!!.let { + name = it.ownText() + setUrlWithoutDomain(it.absUrl("href")) + } + date_upload = parseChapterDate(element.selectFirst("span")?.text()) + } + + // =============================== Pages ================================ + + override fun pageListParse(document: Document): List { + val pages = document.selectFirst("div#json-data") + ?.ownText()?.parseAs>() + ?: throw Exception("Pages not found") + + return pages.mapIndexed { index, dto -> + val imageUrl = when { + dto.imageUrl.startsWith("http") -> dto.imageUrl + else -> "https://${dto.imageUrl}" + } + val fragment = json.encodeToString>( + dto.dialogues.filter { it.getTextBy(language).isNotBlank() }, + ) + Page(index, imageUrl = "$imageUrl#$fragment") + } + } + + override fun imageUrlParse(document: Document): String = "" + + // ============================= Utilities ============================== + + private fun parseChapterDate(date: String?): Long { + date ?: return 0 + return try { dateFormat.parse(date)!!.time } catch (_: Exception) { parseRelativeDate(date) } + } + + private fun parseRelativeDate(date: String): Long { + val number = Regex("""(\d+)""").find(date)?.value?.toIntOrNull() ?: return 0 + val cal = Calendar.getInstance() + + return when { + date.contains("day", true) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis + date.contains("hour", true) -> cal.apply { add(Calendar.HOUR, -number) }.timeInMillis + date.contains("minute", true) -> cal.apply { add(Calendar.MINUTE, -number) }.timeInMillis + date.contains("second", true) -> cal.apply { add(Calendar.SECOND, -number) }.timeInMillis + date.contains("week", true) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number * 7) }.timeInMillis + else -> 0 + } + } + + private inline fun String.parseAs(): T { + return json.decodeFromString(this) + } + + // =============================== Filters ================================ + + override fun getFilterList(): FilterList { + val filters = mutableListOf>( + SelectionList("Sort", sortByList), + Filter.Separator(), + GenreList(title = "Genres", genres = genreList), + ) + + return FilterList(filters) + } + + companion object { + val PAGE_REGEX = Regex(".*?\\.(webp|png|jpg|jpeg)#\\[.*?]", RegexOption.IGNORE_CASE) + const val PREFIX_SEARCH = "id:" + private val dateFormat: SimpleDateFormat = SimpleDateFormat("dd MMMM yyyy", Locale.US) + } +} diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlDto.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsDto.kt similarity index 69% rename from src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlDto.kt rename to lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsDto.kt index 1b7c9b61d..4302cc8ea 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlDto.kt +++ b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsDto.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.extension.all.snowmtl +package eu.kanade.tachiyomi.multisrc.machinetranslations import android.graphics.Color import android.os.Build @@ -8,6 +8,7 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonTransformingSerializer import kotlinx.serialization.json.buildJsonObject import kotlinx.serialization.json.jsonArray @@ -31,14 +32,17 @@ data class Dialog( val y1: Float, val x2: Float, val y2: Float, - val text: String, val angle: Float = 0f, val isBold: Boolean = false, val isNewApi: Boolean = false, + val textByLanguage: Map = emptyMap(), val type: String = "normal", private val fbColor: List = emptyList(), private val bgColor: List = emptyList(), ) { + val text: String get() = textByLanguage["text"] ?: throw Exception("Dialog not found") + fun getTextBy(language: Language) = textByLanguage[language.target] ?: text + val width get() = x2 - x1 val height get() = y2 - y1 val centerY get() = (y2 + y1) / 2f @@ -62,14 +66,15 @@ private object DialogListSerializer : override fun transformDeserialize(element: JsonElement): JsonElement { return JsonArray( element.jsonArray.map { jsonElement -> - val (coordinates, text) = getCoordinatesAndDialog(jsonElement) + val coordinates = getCoordinates(jsonElement) + val textByLanguage = getDialogs(jsonElement) buildJsonObject { put("x1", coordinates[0]) put("y1", coordinates[1]) put("x2", coordinates[2]) put("y2", coordinates[3]) - put("text", text) + put("textByLanguage", textByLanguage) try { val obj = jsonElement.jsonObject @@ -85,13 +90,28 @@ private object DialogListSerializer : ) } - private fun getCoordinatesAndDialog(element: JsonElement): Pair { + private fun getCoordinates(element: JsonElement): JsonArray { return try { - val arr = element.jsonArray - arr[0].jsonArray to arr[1] + element.jsonArray[0].jsonArray } catch (_: Exception) { - val obj = element.jsonObject - obj["bbox"]!!.jsonArray to obj["text"]!! + element.jsonObject["bbox"]!!.jsonArray + } + } + private fun getDialogs(element: JsonElement): JsonObject { + return try { + buildJsonObject { + put("text", element.jsonArray[1]) + } + } catch (_: Exception) { + buildJsonObject { + // There is a problem when the "angle" is processed + element.jsonObject.entries.forEach { + if (it.key in listOf("angle", "bbox")) { + return@forEach + } + put(it.key, it.value) + } + } } } } diff --git a/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFactoryUtils.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFactoryUtils.kt new file mode 100644 index 000000000..96c03fa74 --- /dev/null +++ b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFactoryUtils.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.multisrc.machinetranslations + +class MachineTranslationsFactoryUtils + +data class Language(val lang: String, val target: String = lang, val origin: String = "en") diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFilters.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFilters.kt similarity index 96% rename from src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFilters.kt rename to lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFilters.kt index 104b0db3c..a9624d1f7 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFilters.kt +++ b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsFilters.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.extension.all.snowmtl +package eu.kanade.tachiyomi.multisrc.machinetranslations import eu.kanade.tachiyomi.source.model.Filter diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlUrlActivity.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsUrlActivity.kt similarity index 77% rename from src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlUrlActivity.kt rename to lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsUrlActivity.kt index d793f15db..31c01a251 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlUrlActivity.kt +++ b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/MachineTranslationsUrlActivity.kt @@ -1,13 +1,15 @@ -package eu.kanade.tachiyomi.extension.all.snowmtl +package eu.kanade.tachiyomi.multisrc.machinetranslations import android.app.Activity import android.content.ActivityNotFoundException import android.content.Intent +import android.os.Build import android.os.Bundle import android.util.Log +import androidx.annotation.RequiresApi import kotlin.system.exitProcess - -class SnowmtlUrlActivity : Activity() { +@RequiresApi(Build.VERSION_CODES.O) +class MachineTranslationsUrlActivity : Activity() { private val tag = javaClass.simpleName @@ -18,7 +20,7 @@ class SnowmtlUrlActivity : Activity() { val item = pathSegments[1] val mainIntent = Intent().apply { action = "eu.kanade.tachiyomi.SEARCH" - putExtra("query", "${Snowmtl.PREFIX_SEARCH}$item") + putExtra("query", "${MachineTranslations.PREFIX_SEARCH}$item") putExtra("filter", packageName) } diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/interceptors/ComposedImageInterceptor.kt b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/interceptors/ComposedImageInterceptor.kt similarity index 91% rename from src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/interceptors/ComposedImageInterceptor.kt rename to lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/interceptors/ComposedImageInterceptor.kt index cf581282d..6278f6037 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/interceptors/ComposedImageInterceptor.kt +++ b/lib-multisrc/machinetranslations/src/eu/kanade/tachiyomi/multisrc/machinetranslations/interceptors/ComposedImageInterceptor.kt @@ -1,4 +1,4 @@ -package eu.kanade.tachiyomi.extension.all.snowmtl.interceptors +package eu.kanade.tachiyomi.multisrc.machinetranslations.interceptors import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -12,14 +12,14 @@ import android.text.Layout import android.text.StaticLayout import android.text.TextPaint import androidx.annotation.RequiresApi -import eu.kanade.tachiyomi.extension.all.snowmtl.Dialog -import eu.kanade.tachiyomi.extension.all.snowmtl.Snowmtl.Companion.PAGE_REGEX +import eu.kanade.tachiyomi.multisrc.machinetranslations.Dialog +import eu.kanade.tachiyomi.multisrc.machinetranslations.Language +import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations.Companion.PAGE_REGEX import eu.kanade.tachiyomi.network.GET import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaType -import okhttp3.OkHttpClient import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import uy.kohesive.injekt.injectLazy @@ -35,7 +35,7 @@ import kotlin.math.sqrt @RequiresApi(Build.VERSION_CODES.O) class ComposedImageInterceptor( baseUrl: String, - private val client: OkHttpClient, + val language: Language, ) : Interceptor { private val json: Json by injectLazy() @@ -61,14 +61,16 @@ class ComposedImageInterceptor( .url(url) .build() + // Load the fonts before opening the connection to load the image, + // so there aren't two open connections inside the interceptor. + loadAllFont(chain) + val response = chain.proceed(imageRequest) if (response.isSuccessful.not()) { return response } - loadAllFont(chain) - val bitmap = BitmapFactory.decodeStream(response.body.byteStream())!! .copy(Bitmap.Config.ARGB_8888, true) @@ -165,11 +167,17 @@ class ComposedImageInterceptor( private fun loadRemoteFont(fontUrl: String, chain: Interceptor.Chain): Typeface? { return try { val request = GET(fontUrl, chain.request().headers) - val response = client - .newCall(request).execute() - .takeIf(Response::isSuccessful) ?: return null + val response = chain.proceed(request) + + if (response.isSuccessful.not()) { + response.close() + return null + } + val fontName = request.url.pathSegments.last() - response.body.byteStream().toTypeface(fontName) + response.body.use { + it.byteStream().toTypeface(fontName) + } } catch (e: Exception) { null } @@ -225,14 +233,17 @@ class ComposedImageInterceptor( return dialogBox } - private fun createBoxLayout(dialog: Dialog, textPaint: TextPaint) = - StaticLayout.Builder.obtain(dialog.text, 0, dialog.text.length, textPaint, dialog.width.toInt()).apply { + private fun createBoxLayout(dialog: Dialog, textPaint: TextPaint): StaticLayout { + val text = dialog.getTextBy(language) + + return StaticLayout.Builder.obtain(text, 0, text.length, textPaint, dialog.width.toInt()).apply { setAlignment(Layout.Alignment.ALIGN_CENTER) setIncludePad(false) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { setBreakStrategy(LineBreaker.BREAK_STRATEGY_BALANCED) } }.build() + } // Invert color in black dialog box. private fun TextPaint.adjustTextColor(dialog: Dialog, bitmap: Bitmap) { diff --git a/src/all/snowmtl/build.gradle b/src/all/snowmtl/build.gradle index edb782da6..0928c6457 100644 --- a/src/all/snowmtl/build.gradle +++ b/src/all/snowmtl/build.gradle @@ -1,7 +1,9 @@ ext { extName = 'Snow Machine Translations' extClass = '.SnowmtlFactory' - extVersionCode = 6 + themePkg = 'machinetranslations' + baseUrl = 'https://snowmtl.ru' + overrideVersionCode = 6 isNsfw = true } diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/Snowmtl.kt b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/Snowmtl.kt index e6c460d64..ab026c08d 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/Snowmtl.kt +++ b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/Snowmtl.kt @@ -2,226 +2,35 @@ package eu.kanade.tachiyomi.extension.all.snowmtl import android.os.Build import androidx.annotation.RequiresApi -import eu.kanade.tachiyomi.extension.all.snowmtl.interceptors.ComposedImageInterceptor import eu.kanade.tachiyomi.extension.all.snowmtl.interceptors.TranslationInterceptor import eu.kanade.tachiyomi.extension.all.snowmtl.translator.BingTranslator import eu.kanade.tachiyomi.extension.all.snowmtl.translator.TranslatorEngine -import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.multisrc.machinetranslations.Language +import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations +import eu.kanade.tachiyomi.multisrc.machinetranslations.interceptors.ComposedImageInterceptor import eu.kanade.tachiyomi.network.interceptor.rateLimit -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.online.ParsedHttpSource -import kotlinx.serialization.decodeFromString -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import okhttp3.HttpUrl.Companion.toHttpUrl -import okhttp3.Request -import org.jsoup.nodes.Document -import org.jsoup.nodes.Element -import rx.Observable -import uy.kohesive.injekt.injectLazy -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale import java.util.concurrent.TimeUnit @RequiresApi(Build.VERSION_CODES.O) class Snowmtl( - source: Source, -) : ParsedHttpSource() { + language: Language, +) : MachineTranslations( + name = "Snow Machine Translations", + baseUrl = "https://snowmtl.ru", + language, +) { + override val lang = language.lang - override val name = "Snow Machine Translations" - - override val baseUrl = "https://snowmtl.ru" - - override val lang = source.lang - - override val supportsLatest = true - - private val json: Json by injectLazy() - - private val translatorClient = network.cloudflareClient.newBuilder() - .rateLimit(1, 3, TimeUnit.SECONDS) + private val clientUtils = network.cloudflareClient.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) .build() - private val translator: TranslatorEngine = BingTranslator(translatorClient, headers) + private val translator: TranslatorEngine = BingTranslator(clientUtils, headers) override val client = network.cloudflareClient.newBuilder() .rateLimit(2) .readTimeout(2, TimeUnit.MINUTES) - .addInterceptor(TranslationInterceptor(source, translator)) - .addInterceptor(ComposedImageInterceptor(baseUrl, super.client)) + .addInterceptor(TranslationInterceptor(language, translator)) + .addInterceptor(ComposedImageInterceptor(baseUrl, language)) .build() - - // ============================== Popular =============================== - - private val popularFilter = FilterList(SelectionList("", listOf(Option(value = "views", query = "sort_by")))) - - override fun popularMangaRequest(page: Int) = searchMangaRequest(page, "", popularFilter) - - override fun popularMangaSelector() = searchMangaSelector() - - override fun popularMangaFromElement(element: Element) = searchMangaFromElement(element) - - override fun popularMangaNextPageSelector() = searchMangaNextPageSelector() - - // =============================== Latest =============================== - - private val latestFilter = FilterList(SelectionList("", listOf(Option(value = "recent", query = "sort_by")))) - - override fun latestUpdatesRequest(page: Int) = searchMangaRequest(page, "", latestFilter) - - override fun latestUpdatesSelector() = searchMangaSelector() - - override fun latestUpdatesFromElement(element: Element) = searchMangaFromElement(element) - - override fun latestUpdatesNextPageSelector() = searchMangaNextPageSelector() - - // =========================== Search ============================ - - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { - val url = "$baseUrl/search".toHttpUrl().newBuilder() - .addQueryParameter("page", page.toString()) - - if (query.isNotBlank()) { - url.addQueryParameter("query", query) - } - - filters.forEach { filter -> - when (filter) { - is SelectionList -> { - val selected = filter.selected() - if (selected.value.isBlank()) { - return@forEach - } - url.addQueryParameter(selected.query, selected.value) - } - is GenreList -> { - filter.state.filter(GenreCheckBox::state).forEach { genre -> - url.addQueryParameter("genres", genre.id) - } - } - else -> {} - } - } - - return GET(url.build(), headers) - } - - override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { - if (query.startsWith(PREFIX_SEARCH)) { - val slug = query.removePrefix(PREFIX_SEARCH) - return fetchMangaDetails(SManga.create().apply { url = "/comics/$slug" }).map { manga -> - MangasPage(listOf(manga), false) - } - } - - return super.fetchSearchManga(page, query, filters) - } - - override fun searchMangaSelector() = "section h2 + div > div" - - override fun searchMangaFromElement(element: Element) = SManga.create().apply { - title = element.selectFirst("h3")!!.text() - thumbnail_url = element.selectFirst("img")?.absUrl("src") - setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href")) - } - - override fun searchMangaNextPageSelector() = "a[href*=search]:contains(Next)" - - // =========================== Manga Details ============================ - override fun mangaDetailsParse(document: Document) = SManga.create().apply { - title = document.selectFirst("h1")!!.text() - description = document.selectFirst("p:has(span:contains(Synopsis))")?.ownText() - author = document.selectFirst("p:has(span:contains(Author))")?.ownText() - genre = document.select("h2:contains(Genres) + div span").joinToString { it.text() } - thumbnail_url = document.selectFirst("img.object-cover")?.absUrl("src") - document.selectFirst("p:has(span:contains(Status))")?.ownText()?.let { - status = when (it.lowercase()) { - "ongoing" -> SManga.ONGOING - "complete" -> SManga.COMPLETED - else -> SManga.UNKNOWN - } - } - setUrlWithoutDomain(document.location()) - } - - // ============================== Chapters ============================== - override fun chapterListSelector() = "section li" - - override fun chapterFromElement(element: Element) = SChapter.create().apply { - element.selectFirst("a")!!.let { - name = it.ownText() - setUrlWithoutDomain(it.absUrl("href")) - } - date_upload = parseChapterDate(element.selectFirst("span")?.text()) - } - - // =============================== Pages ================================ - - override fun pageListParse(document: Document): List { - val pages = document.selectFirst("div#json-data") - ?.ownText()?.parseAs>() - ?: throw Exception("Pages not found") - - return pages.mapIndexed { index, dto -> - val imageUrl = when { - dto.imageUrl.startsWith("http") -> dto.imageUrl - else -> "https://${dto.imageUrl}" - } - val fragment = json.encodeToString>( - dto.dialogues.filter { it.text.isNotBlank() }, - ) - Page(index, imageUrl = "$imageUrl#$fragment") - } - } - - override fun imageUrlParse(document: Document): String = "" - - // ============================= Utilities ============================== - - private fun parseChapterDate(date: String?): Long { - date ?: return 0 - return try { dateFormat.parse(date)!!.time } catch (_: Exception) { parseRelativeDate(date) } - } - - private fun parseRelativeDate(date: String): Long { - val number = Regex("""(\d+)""").find(date)?.value?.toIntOrNull() ?: return 0 - val cal = Calendar.getInstance() - - return when { - date.contains("day", true) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis - date.contains("hour", true) -> cal.apply { add(Calendar.HOUR, -number) }.timeInMillis - date.contains("minute", true) -> cal.apply { add(Calendar.MINUTE, -number) }.timeInMillis - date.contains("second", true) -> cal.apply { add(Calendar.SECOND, -number) }.timeInMillis - date.contains("week", true) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number * 7) }.timeInMillis - else -> 0 - } - } - - private inline fun String.parseAs(): T { - return json.decodeFromString(this) - } - - // =============================== Filters ================================ - - override fun getFilterList(): FilterList { - val filters = mutableListOf>( - SelectionList("Sort", sortByList), - Filter.Separator(), - GenreList(title = "Genres", genres = genreList), - ) - - return FilterList(filters) - } - - companion object { - val PAGE_REGEX = Regex(".*?\\.(webp|png|jpg|jpeg)#\\[.*?]", RegexOption.IGNORE_CASE) - const val PREFIX_SEARCH = "id:" - private val dateFormat: SimpleDateFormat = SimpleDateFormat("dd MMMM yyyy", Locale.US) - } } diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt index 3856b8a90..ed9796480 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt +++ b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/SnowmtlFactory.kt @@ -2,20 +2,18 @@ package eu.kanade.tachiyomi.extension.all.snowmtl import android.os.Build import androidx.annotation.RequiresApi -import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.multisrc.machinetranslations.Language import eu.kanade.tachiyomi.source.SourceFactory @RequiresApi(Build.VERSION_CODES.O) class SnowmtlFactory : SourceFactory { - override fun createSources(): List = languageList.map(::Snowmtl) + override fun createSources() = languageList.map(::Snowmtl) } -data class Source(val lang: String, val target: String = lang, val origin: String = "en") - private val languageList = listOf( - Source("en"), - Source("es"), - Source("id"), - Source("it"), - Source("pt-BR", "pt"), + Language("en"), + Language("es"), + Language("id"), + Language("it"), + Language("pt-BR", "pt"), ) diff --git a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/interceptors/TranslationInterceptor.kt b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/interceptors/TranslationInterceptor.kt index 09150a328..656ff99d8 100644 --- a/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/interceptors/TranslationInterceptor.kt +++ b/src/all/snowmtl/src/eu/kanade/tachiyomi/extension/all/snowmtl/interceptors/TranslationInterceptor.kt @@ -2,10 +2,10 @@ package eu.kanade.tachiyomi.extension.all.snowmtl.interceptors import android.os.Build import androidx.annotation.RequiresApi -import eu.kanade.tachiyomi.extension.all.snowmtl.Dialog -import eu.kanade.tachiyomi.extension.all.snowmtl.Snowmtl.Companion.PAGE_REGEX -import eu.kanade.tachiyomi.extension.all.snowmtl.Source import eu.kanade.tachiyomi.extension.all.snowmtl.translator.TranslatorEngine +import eu.kanade.tachiyomi.multisrc.machinetranslations.Dialog +import eu.kanade.tachiyomi.multisrc.machinetranslations.Language +import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations.Companion.PAGE_REGEX import kotlinx.serialization.decodeFromString import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -15,7 +15,7 @@ import uy.kohesive.injekt.injectLazy @RequiresApi(Build.VERSION_CODES.O) class TranslationInterceptor( - private val source: Source, + private val source: Language, private val translator: TranslatorEngine, ) : Interceptor { @@ -66,7 +66,11 @@ class TranslationInterceptor( val key = list.first() val text = list.last() - mapping[key]?.second?.dialog?.copy(text = text) + mapping[key]?.second?.dialog?.copy( + textByLanguage = mapOf( + "text" to text, + ), + ) } /** diff --git a/src/all/solarmtl/build.gradle b/src/all/solarmtl/build.gradle new file mode 100644 index 000000000..5a8b5945f --- /dev/null +++ b/src/all/solarmtl/build.gradle @@ -0,0 +1,10 @@ +ext { + extName = 'Solar Machine Translations' + extClass = '.SolarmtlFactory' + themePkg = 'machinetranslations' + baseUrl = 'https://solarmtl.com' + overrideVersionCode = 0 + isNsfw = true +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/Solarmtl.kt b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/Solarmtl.kt new file mode 100644 index 000000000..f4a264431 --- /dev/null +++ b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/Solarmtl.kt @@ -0,0 +1,20 @@ +package eu.kanade.tachiyomi.extension.all.solarmtl + +import android.os.Build +import androidx.annotation.RequiresApi +import eu.kanade.tachiyomi.multisrc.machinetranslations.Language +import eu.kanade.tachiyomi.multisrc.machinetranslations.MachineTranslations +import eu.kanade.tachiyomi.network.interceptor.rateLimit + +@RequiresApi(Build.VERSION_CODES.O) +class Solarmtl( + language: Language, +) : MachineTranslations( + name = "Solar Machine Translations", + baseUrl = "https://solarmtl.com", + language, +) { + override val client = super.client.newBuilder() + .rateLimit(2) + .build() +} diff --git a/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt new file mode 100644 index 000000000..07cd2ff65 --- /dev/null +++ b/src/all/solarmtl/src/eu/kanade/tachiyomi/extension/all/solarmtl/SolarmtlFactory.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.extension.all.solarmtl + +import android.os.Build +import androidx.annotation.RequiresApi +import eu.kanade.tachiyomi.multisrc.machinetranslations.Language +import eu.kanade.tachiyomi.source.SourceFactory + +@RequiresApi(Build.VERSION_CODES.O) +class SolarmtlFactory : SourceFactory { + override fun createSources() = languageList.map(::Solarmtl) +} + +private val languageList = listOf( + Language("en"), + Language("fr"), + Language("pt-BR", "pt"), +)