From 24f1b6f96ed8f96cc69723baf83183458af8206b Mon Sep 17 00:00:00 2001 From: funkyhippo <52957110+funkyhippo@users.noreply.github.com> Date: Sat, 27 Mar 2021 11:53:17 -0700 Subject: [PATCH] Cubari extension. (#6311) --- src/all/cubari/AndroidManifest.xml | 57 +++ src/all/cubari/build.gradle | 12 + .../cubari/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4241 bytes .../cubari/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2352 bytes .../cubari/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5664 bytes .../cubari/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 10382 bytes .../cubari/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 14952 bytes src/all/cubari/res/web_hi_res_512.png | Bin 0 -> 29301 bytes .../tachiyomi/extension/all/cubari/Cubari.kt | 353 ++++++++++++++++++ .../extension/all/cubari/CubariUrlActivity.kt | 64 ++++ .../all/cubari/RemoteStorageUtils.kt | 147 ++++++++ 11 files changed, 633 insertions(+) create mode 100644 src/all/cubari/AndroidManifest.xml create mode 100644 src/all/cubari/build.gradle create mode 100644 src/all/cubari/res/mipmap-hdpi/ic_launcher.png create mode 100644 src/all/cubari/res/mipmap-mdpi/ic_launcher.png create mode 100644 src/all/cubari/res/mipmap-xhdpi/ic_launcher.png create mode 100644 src/all/cubari/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 src/all/cubari/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 src/all/cubari/res/web_hi_res_512.png create mode 100644 src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/Cubari.kt create mode 100644 src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/CubariUrlActivity.kt create mode 100644 src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/RemoteStorageUtils.kt diff --git a/src/all/cubari/AndroidManifest.xml b/src/all/cubari/AndroidManifest.xml new file mode 100644 index 000000000..a28e3cbe3 --- /dev/null +++ b/src/all/cubari/AndroidManifest.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/all/cubari/build.gradle b/src/all/cubari/build.gradle new file mode 100644 index 000000000..afc7c9fd6 --- /dev/null +++ b/src/all/cubari/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Cubari' + pkgNameSuffix = "all.cubari" + extClass = '.Cubari' + extVersionCode = 1 + libVersion = '1.2' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/all/cubari/res/mipmap-hdpi/ic_launcher.png b/src/all/cubari/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..a43b765ef06f687be1c7acdec6f41c7bd5ebfc6a GIT binary patch literal 4241 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�)VC=!wKrXTe- z`?GDucGyF{5FZyXUxHpC&-MAN!tu z)k*8xy4u>>4W*@}tE#K3srmyBg=^;@3?%(y0e<}qbDCa&a^ literal 0 HcmV?d00001 diff --git a/src/all/cubari/res/mipmap-mdpi/ic_launcher.png b/src/all/cubari/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d2a531cfc999e0e3fcab789ce1a51256f7640554 GIT binary patch literal 2352 zcmV-03D5S4P)5t&g3S5e)AUa zo6ArC0;p{Z`m+GWEJU?#r79x&Nkq8&G$Q~385tQ?o6WY_>-GLoRaF&HRaHgug;jq3 z{Hf{V<8nX$Z8R5s{KC6NbJ0gcCBebL$1E1hpLuzCrFsNL0D}7U>zCzryC@F%!G%VEr7 zv6Q-8u2>=}likS(K)v+z^e+$)O$JeIQXls*6Iw5n(L4^yObPNkrKP1&MD*X90Mzf% zqlZ)PK1M#S?^AIFZbh@XX5*M&US8gSh+H)SNJ~pI1i&}t+8Qum0F56%o&o}X8B%{Y zVhwItzLv-1p-r1M(b=-SfBu|p&Rveb zE8mR>p-!DTv}4B(TDfv1ojP?&_}0Hma(Xe^-jeLPQ`IFUMa>O|A0PbaU} z%Y>IVttl=rK5pDN8aZ+#_3z)GDk>^Oycq>F6!7E64>bT?yLJ@-jA*byg9dc?@L`%i ze?C2Z`c#-+MQAy0;C?wdIrQ-1Lqqq`GhJn6r5b=PUAiy;W|~;AU;)*yU!Ug9oA*Bn z57!wsY#6}}Efx!l9o*&LPN$Q0?b@YhK{Wu$$;nPLmT1d9YBmN2mcvOic7~AuNEP-MV!vGyl7H?=&tpdGchMF=K|0;CjJek#+0V zQC3zKdmn3pfr5g9#MCcezEDa^3Vr?hRYT9pG0>(>8^b&R*Ln8r8ExFSQKNmh)7-gp z4P8Os$>|mr+`D%#TW8g(RgBemTexr`9XN162+ysc%t8qX2|g^8nVCsTmo6nFFPFkaxpOD=?AcQYfBpJ( znmv0q(!Pe*>(;GH+qZA0K7IO#xmXXtAS4oE@7}#>?AWn%?b{_a-&+xYPHhs+qap<(U80n6BDVVq=cqUoyy*w zHER~Zg`l9avNGDTWs8V~@87?xSs*ShPOwl&NC;iJbcvwpqeqVl7r+K-X=${7|9+uS zXc#PIRtRDuatAKnh7KJ{4<0;VK?{My!^0^(J)NSWqG-&RF*JDaV0!Z83A0jJS(zGu z#*G^b3rw0ci7hg4;6S8u4fBi|HHucRUM+-y>zqD)T9g&MHsXPcXRHNf@CJ?J9V9V% z-m+!OsB`DeG-SvS;Z7wbC29a-V`CWrXyfYDtBmtu1@r|62Q!y}wxB&Q5^pFixRvDM zjt3&<0rck0o5efRrcI-Z7cXk)w@H&GbmPViRx80ecpq1Baj_bJn3xy_0Ey|ykt59S zQLrsuyqK^!5)sUbgoQxl?fm)k%$McHlMn}i1T|>TATb3@gpAJT!4fF1k;MUk3y-_Y z9UU!PsA3ec6j%db>eZ{q#zBoRISM>I2t0S}*pVeIyvNt; z-n~0>OEd`Cx^-)&l;OjNQ*Lgq27uG)R09wd73GtOvB8QJE7$?%{{8zjV#EmMQi~QX zqM0*i3VD$ukdg1)xg+`@7y=%^Q3Ub^hS|1ln-CuJklbK#Bt}{Lu*}DgAJqWZ?RH@S z9*8L7u3Wjovy0}vS*=~GI8E|F+>yLIapqdBysq$C!+5fKp@*D-r2E-q#X3t5=E z4m6B4kiFNgU8~VP2k`doTQvaT;o%w!K!eARAJ=FQngu%n7&bt;fB=Q1{51qDD%Qfn zLXGPnnAfaXLw)=91>5+z5B4Z3DpCUw78WJ|;Kj?AFSCrv-H8i`poK7CA2b9zXcF;( z8j06OU@*8FN@oNy@`+sIpb|ZE<_ul9aDmlOT;u$J!=D`vhZ=y8kPvpLM?)?EtDp>! zGc2!#ARJ2U-Me?QalRSc2~>z@oURai7IRLyI78b@T zML9X~-xvo7ScCgBzncjx3y)(ZG>`0zKdqPvkN(2KLUjOqA-zzta5x*cY}ryIFIg}Z z;V}ni2^5K=M~`Og<_|zYL4g{8(9lq)kuWkC&?e{;d4VS`v(3#c5*ZoEw7+D@5_V?x zCp^Ypym+Ao06{D-#^XWmLlK6u0rfu*Zj8$X8Glbc*UAiqvIGGQ|2G3E@0pjErv|`k zwF&@63!^VSKAz}J5>9Y6X&>Xcxw&cpA|fIf3z_*br#BU? z$#ab6V=dKna&mIi03Z{aZRRgf^=@bMtmpQc)|2JP&dyc?V7J@8>@E1vh3{arYheDB5XEWR$yS@Xn(At*QAOYs0wf7c5b)(XnuY^J~5T}`#yko z>*BA2cDsFbP*706fPjE7RpI`hc}7B4Yrfp$@mz8^9RKlnJn#&UObmu!DTxR|e>Dx&Cvj*>_^}<8OVqe$hnjH5}Jar{MDWR{Zb38q}U)e(n6*Ti|c4 WO;xD_YUM!y0000^PtuYsD!g%z6ZIyR7OiePRt!Lr@A>N_UPVR4zg>dTx7z?QO+Ksu zy})zP85-;oSQz>-ukEK8-MV$Vys)tFdLcwzGYC#13IaeIAw=f%>C^vHTU$HGOZ#n< zV+u#7r=T3~;(0HBlB~vifoTK6rWozowVPW~QZh~mQ7wdMXm-w45c~j;+AoA?KXvNV z6^)IJ(&6fSZ*!husK)Hei)URz4Qd@ar~7HKm*x1Ko0^(hUshJuQwUMnYz0nV;0HjO z5F%X&kv(O~loBucF||L412e73Wi5V!_X8lTHJH9D$ocv)e6Fml>>-38BC7SGp&$Tc z2q8L7o;-QE$@4Bt2;#tkMk`^hN%u9$@V_6Jw*5BCs;a8mObD@72=PZ00Cbu(Y0@&k zXeWr~BpdD6EK2Xo<#5$8e(`@$g$PQK)z#I#gb-zs0$}6&FizIx;DQdy%RvTl)Vg(e zMPYtm1-VvDO--}_Oq@7TT0l@C+6HJ^$Pq^zAtp?iAPtK|MzxfbKbg_?pKUtz*+L6- zo(U|+B3xxHB$M^^^`fe(O1$~zo8sALpS5P%K?H7&_m4mRh!%he6DC*zP=oR^VVkq< z*|Vp3_~D1eCYumsZM>$0TU}i(cGzJDQC3!F%^kw{29Av!fbrwUJ1xLw6<*;bH+bo# zmx{@gCyQ09R*5H`cp|Pwg9htbtXqT9YGpC%yE;d|uCf-j&Fqst_TGDM(Wg%zQC?my z0jR93jI#o-yu~XztF5h#)&jZbf{RgXpuPPm}5jkLqkH9(&dCc*=eVp zq!oB6K+xQVKI-f1qXl5hm@&&*;(*n;W5zB>FM%*9)0xDg!>57pRO=mD{=rvj~;CWzz-CCf7`Zg#X}E0BssUB zpg^2*$|+L&btkO^|Bty?$o<(FTI^UgcZ>hOXj zL0-<$b$_Z~J>O8#m5P>BB&DJy+kUp;Gq7BBEz=_S9ytIbMvSnQBK$N}fr7I=^2j5l z#vOk6;bO^>B~I+nVFg5y6dhJ zJMX-+6fno>8XuFY#|O^YZoBQoiWMtjN@TITXaN{Le0V}4W;!<4pf9-K0vYa+Z60vI z0b=FKm7#baZA5D)PMj$Jw%l?{k&%%h($c7wONS?FYHGy%`SZnRpM54i|NL`NR8$lz zJD3(he`lR_mN?;r6XHrBL4?mSOP4McW5$e$l{9oJ(ySs{0EP`47MBMEwT523ddWWvFvcJ@r&^#u;aX z0)cY@4}YcuYi8L^O-<1PFm&ip&pbd;hOQ0V6y}Z)i8S`vXCG^_W3!z8{rihcF1bV| zY+)%v2kDz{z7ZE+e6d)(cyR*laopvXUmnNjx)sLy6lXTQO3UZS^MJvF2PfnKF2SptyYIgH#IRw*WWf!glI(an zSGf7K(@vAoQnC(G0cu(ePXFecZQ(4avHKEO0rHFyR_ou2{IF1ze98U5%^+oT-^LS_u#yM*Ycp|10ES|kEPF-+w_ zuoMPe0wsW$GG&T%z<%1#{>V!a0|yR_i-L5j(FM=I&}70+q7|YMA|GhL%i+SS*I$2q zD83IGLh1mZ{p2AZfBbPA9a0ne@WT&9US6IxG^JJqE$YtJ1s2;QuZ9j7Fd!}wGr3zA zE;V*SPqq#{8DC)71-)(9Ny+_`gQGRN^0*0$byYsurAZn|ll zg4#kvGFj##=u5xvJ@?#G+;h)82};0mqeqX9QK)_a8z5|pd_DjGyo9Ls5pKTx^2-8V zrPhPCG4*GQbd<26s_E0GdkUXYF*9g5b*2%`dqF4+{MciUmGM2vpH28mc#l8+xYTI9 zhC`ADxF(21O84G-udnv&77;lB{rmTiWx}Q~b!#~B#1o|u7}(KAA1w&mOp4OaM{{3z z;e}XIW#f6~4URwl_?X6<{H^;I&hOp3w*-sa!PNk9(xgeTl86!>{)%gvHkYj z$5m|=*j~OMascx3@_ehIlp0=p?KRPI6aLRh4#6Z9RASe;a^!D3tTYZyPq!#&{aKC>2Jm-YbLJ}T? z#f=j$QyMU}Ul&sQ_U*+dpL`-~M7BoZ?%;zDmR96);3g>gcS7KoUV2HEEo_asfKj7H zF@YZ2&ArT;HA`e?XG=OlImi|0i+fOX${34_i$!T^sXW(o$dNBg>D#xjbxKkRhWS+z z9g1YkGy#T54JId}ZA441_Qo4;$h;tk=9?CwzTa`j9SIhud=EmLHf@@iGiOem|G@$V z4<0P`*kcb_(%5USy<#O4{a(pysPba%CIFEy%<9vpPeL_R=W;?wLP@ekCSHF1^;fH- z)X%}ZnV_*Xj+-%KM%<*04xr5Z zvB#vcsiv+|RaF&jEvR?z-p)yRV&~_cdrqh+$6Ic>C8o9dO`8_M7ZY~e%9+e^2j4nfJ$)u-+%x8Wkt25q(p9~ltOO9fBu-tWK{=^#E}fy z1fa6AGFkw7_3GseLvdzA3S^6flawC31g|vt`RAV(!-o&IIykDB2OfA}tQ%Y8rFNPi znUbb*$^F^dd+)s`jyme7xO*U!#{bw7E&K^fStu4lPgtqm)H&cB{QK{}FC!2a?dTSuAEOt=6s6pM|NTx&!#c>+)v?My zsPE>zk*u+PNNGR!X*;K)q9R%VdiLyTrJx5Nd{9yaVIn?Y?OIl3CqB(+qYOgUAwz~( zHIwZ5kV6hh=*!lROIWI7czWv8sn+XIk|0?$8$g;BPW%Do3IdMrzyDrFe5&ab#^>_# z@@N6*(W6HK1rf!d{aldJ0~xT*Ig(kDnNmK`!C{GtOE3!-EQryDE$dbNxau)FC}`=R zL9wT+;xv|0G^J`AjhLFvJTQqG+X;_Z)1+TV2cfL2ELs3^b8`~_xagvbq?U5w-+uc| zmI&19Vw;JJ^ZW0=M+-pr?%fjrfDf;|_FAj6BEzH{z@!Yx z5YYy+V>*QpO)z*@V;_rnUCpZ+sjfqWLv6^_ppkFC{Wi7&!bL?C70F3Z492aj*<}Hx zrKQmV(5+iHYc&)OSLwc5%E3*&^UgamDk1`*O8L`IKgq;KH8c)t!U^h`s&4ia-~fq? z)8u2DKuthcg9K+of3`*<#l5Xtw=RxKOiS8qv(02bl&lFknYXYxUfmMbtXUI10Iq1p z79z3@;SqrV41*mvZd}~@dj`rw5#z^?x6%U}zx(bxxrAJ=TAH+@3tsebN#(6wvVP-{a8OVJiGQAG#D+h~%`>BQ%hhFx^R zv7AFlijVQ59j-;~hPpmEiK_u92^V!AF91j~36~iUc?*6|w-6iuvwzj9RnY>_rArrQ zDMATYrx$7@tZLBPM<0C@3;7fXI7d}`F@>cAMPZNrD3Iw*7XZhP963_pSoNsK1_J#Y zdg!6DxaI8HzxOog?kP`R#}*Cv2qN^<7RnQ^{CKgR{i z^5x5;1)zQV_6d1_5|W|<_?OU6U&Cn=B*&AKK?AC(fiM%rvs;9Fu5)dXkRF$t=dq76 z36tyk?3Yf1`h8F$zwyQ!GXHE?v4b zS^%=LvOIkNF*VN3E1ow6N9B}Ikh;35!SsU=$U2!4)Pe8=nEhxv)=0IMxnD1bt7|s3 ztqU)_P=bZXgQsmxA2dQDzn~_sR#Q;R;h_)aB&fo=fV4SW z{aA`^gu>7xt07oc8C2lrH5V^l94!DD85uDrtY3`JSOC1a?Y7&-Ku|e>?Z532Qz9bD z)i`G}IC5E@T;MERxNyS(U|N8eux!p% zosZ=x!1PGNC1}6xE=TKUK|DSA;)^dzN6*rA{#*hNY849>EZ8sr_-Urj;a)UAvO{)B z=1fHr{&j)nr}-_RBhDpyqn5;K4k9k~AW5?P&;1q_7Dfwza>6$44m&yq zbWm&&Z?al!0v{9=KuQTm{=iXx~QQ5eT-v(WkT=SL4fP%1D5W}e4D(KaSn2>1Nv zS6$B3i{f-;aajYU6DDqGXP$YcRECxcUY$R0-n?i5AQAJ^M3=_t=b`;1NyPE2`{!3n zY$Xmg5EU`0KGb(z`1<*J6sF&go}Z{=SdKzsN6CTsUyr_83dG#GbE5@7l_I<%Aiv0g z{bZTce+XOu7aBPS50WS=Y^mVY`E%yXi5>vc2l!EdjfyBCP-~&IpnmT`g`@PRN(?qf zs9S>zJY@~~v0mFKq1aY8Ckuoc^Upv3ykP+FqoE+thZ3}Mh&GOQ2|z#AFBk~ovrI~B zso>Q$XV0D;Edb01B%|@R0R;ugD~i#5g3Vg|9CxyU_EHR8K9K{^p+ko_Cu{@5&j0sj2_kkTevOYQk!G7~y)|L(n9&s;cVd z!oot9RWLp0`63^`H)sF=Pd2n~+qUiISy@@HrKYBC;U$1%C?<&D!yMxWP*7jxmq(aZ z$oIOsx}`-$MSE0LRk4JccgWOxy-&;!0QU1kZPX2N($mwo&dkhwFfA>ux8Kcq`HC=9 z^LG(E30+-X-LJ*P#mBB)yLMjl>q}}{`W7YRtlp%=TElD>DP(77ACi`qHZ3(ZwNFY) zO6-^P5LOU#w`H?IoNF?md-1iOwc0e?(qBVkV`EWub@h9zR;_xnrlw|PGxhNEV9<}} z+w}Y_Kwgh|_vY7GWeOnxf| z1dibO^$R|u{pzi%{~VG3HB$8!RepgS5ct&(fZ#LllJtGWZ4e94L69%?Z2r@QAEuxG zC!q9K*#ZJWS1JL$i+Q#iVEZ6JyO0000RJXNeBdpbV3zEZwZhnU;#xG#0FSEu^=iI?7e_pu%TcB8-nsz!2+lV z0%{OKLJNcxlF&jD$RuGhnVJ9kU1kq^c22wRJ-Douch{Pgym!w%_muB^`#byWb6$&U zUdhnoOuVxX=TXacCN=4(FO1W*$Lb+tef zKy@`=^Wi3dni#071)2b=tNEG_Hv!bdKwT}+1W;Yg*L?Vy0MIj$XS1go(*pgC$>!-? z8rj*Bm;JZVWp3tIdkX*{0Z~K1)Cd5Phx}1B{y%KsU-?{nm77o2+X5OeeFFf}-_-@A zdH|%Ere)HkNo|uSPu^tIs8I*Ex3?eP($aE>b8cJbT&rz?{{E-REdR=V`&mDypV8@j z&&2M>-tBuXR7Sop^X|Sr`tGSKRTrJsruTie?PTiM+uz^6prxhdroO(u%h#+~bMq~? z+_KC$w@!hnW)Rg1AbAd^;ji_ilTJFKzrX*?HEY&P>+bFzv3BiR*W25>9#DK8lIn<1 zquCA*0VgM&1%$7YbMnsxiUo4c`$A>3gHg&LdA7B+x#7cyyOASDc6WAmUN?OB@bhlG z@y2VNb94~M7G^5VcJ%;Az|(f}$tR!C-QE556)RS3x^5l79(u(_YgzEb7$L=Ksga)p zBKr;>5JG^pX?qLrcBvrR_DZ{EX(iLy;u ztpI9s&J92M=%bJB@9)33ySsaMXjG)kN@_HP7%PWWas+6Zjt-eG-N`;+rA$(YJ#5)R zY?@-_5U@s$9J#imqvMphbLU<;z(QJBXMv~|05Pj-cg~GC_Sj=D=<4b^G1agZB(`KU zFyMM(d}UCLOz>szWJqd=FB>zr@mpG);_EV{DxQn{AV>uC8sIb6pBRFi_TXzE%K@0zlKI zOgy zO`C5!Skq(3k>_KWSSP1gM@DL+OhyQ_p^nIXZ-{B^EY#Mg4ES;w)|#+Yt5$6{03dYG zvjU(F80hfB51$`1OeZ{O15mDs2{o<{fT`7J`;2sm73x05h-r}=aQX&9s)KzDl4GV*rYCpsrGUR?&6;We zbl72sc^N3y5xMtLtT1xqNO$U~r@F1T-g=Pe0FanXzQkQG@00&aVm?b+`KW@#MH9@CpjMYL676Tgh zDhH5{B4auyXQcbgpYEI&yx;}yJ@0vs>+I~*NeBP$>vV6zioetYW#!71?lYhHjQi7{ z{!{=gW_rr7o-ZHGN>4udWHk(Q=%I%e3=}hCazCYOVypA^+0mm%yAOWwgKp~7sp~OA z#dxUc^-@1T^V6UH)P3`t-*hlj%JkT_&zar%7_7UyyE*`cMuOHUDV=2Rr$Bf3;fK4A zeB>i;#E22aNWJHtd)&hhv!J~GrA?LOD<(^uC0&Nr)~ACg_4lOLW>Mbe`(7AO?%6uZ z_gieSh1+t=EsLx$b3gdO58QXZ``rRSDVDJ;?`vmY9z3VPRvCb%PMtc0fpWm4ffZw~ zkgXpxW{msV*S_X<*kOkvt0ha8xQ~78WA6U@?=Ko$o+}%Mkpiu+JTVg!(<9Ob3;@_> z+O%oKS1VSmD46x1|NQ4*2ba}6xvZqqtzEme8U~s&Wy+w4j*W)UD2RO@YPi?G{`G}; zh6zY>{`u#--~RTuMS}}~Qtz|(L+{cfHTRiRhwA}!*kOmc?|kPwuDzYrA?JSo``^2d ze)OY3^OXx&I~Zc1;$EcyiZyO4Cld<}0aPEhz8-}pxNn%BI>5!cI97gP4J^a5A1o|amN*=msuov{rJZ}cITdZ?s^*$av055_MCwuWvUE72OoU! zdH~W5rTQ^12lQh>|cb)t4m%r?uc;bomMysz3u^CEPFqAPR zJ~kOUc5G30Oc-qf>%8L~?{Eti6ibWV`o!2Rr~I}r^yhW!)>Xqm2OV@!5I{aU^)Zic zq}T>wR`h`ne83%j^wCAVSFKv*zVVH3xWD}6FM}g?kcP~@tB^T}eP7l*`2ZEG*UMh^ zGWVq~eaTTTW?mOwcwwQ1a45!}%P~i(`uYY}WdJ(xzysIw1Em@>)IcHT;rqS!-rIfg zi(hp3f4K10;&5BOe7VNWdXBdg{l{i%sb}?lU3NRtZM|TeSG?jCZkJtlDUvc>|HB{t zP_R%4xVh#iROT4_aId$ww;BclKrvkrVjSBbu{_WSj8;Iz_2iRJy7#{Ky>8a5SwTNZ zD1ZH)TAgko^W_`aA+v*q6CV`i=;`Unnn9K^RlfB^3v~Hh8GsHr;DA8@g$frlTQSy= z4tddwUgXX?>nzvN(NQ$=HP>9@KKt3v7Stc=v>fwf%auF&bIR;vr;z>&nci6JxCS53 z%V*kzzgQW4Y*`tA_TPX1_2PkIBQ(c`>*qJ#cw_hRkAK`9a>yY?BjGf}PlD$;222Z} z(0fzg`%FSv08wt(bLX9RF6tnE;?WjQxqKE6wf@&Wr}NPFSdhK)$}0=^MhKX`@B8}t zsxe^}KsofTX+6bGh~^J{=tG60jU|gqFTK=VaKQzI*o@ixoG3$ISyP&*EO;b6KA-o$ z|NZVIFL_C^N8Mg_rC+m(q_t^$pJAUHZ@kgH?scz=?#A_)_-X*O-+ucgr||-qkYkI= z=!iUNbf&uB{`R-s_SY5=tFzWZj0=(1*w z4t&d7-cmRYWy#{=i!UzNN5ULJd8XdwV=iKg@NxrII(MUuHYyfs5xb;EDKwXPFh{`R+G;giv>1IA+DW#pwepZ|QJjT#9a%8Ez)SLa$oq_&VHoU((Tmu+K>+oiylZW5xQi%P#Ydrd+*4 z{xBQDe82tnb8mXnn+gDp8pQ^ap;sBR0+?_qu&y<8=FEbnGXa`C_uRAatWTOW zX)r{@nwqjEj5R^p?dF?r4l<8#c2^mI_S$Q&^#BxN8y}teMk)?A7EGV_yyq2-@W224 zuUIpB?6JoN+t-3JB&hZG00$9^3E5|#eZ0WY`l&245KV}KleIY_3IUeR&o_`L2TUsq zs+m^Gn+!91(M1;(J~P${^}FT&x=wnKR5p#DJb7}^6CE>Knt^m{K<`Y`Wyu0_fsp>q zZ+_!lWQ^$@@)dSM->_2K|^feGaL9yFa_unuDkEPyAYfNTKTk9 zN-&cT3zj$@C3ZU238{t;J!`+`Gs`T17FI%l>r0zm%<5}j``W_aMH$POEy~;4xkVdgiMufL@IaWkw+GB&cYOoT$V7bJx{R?_W=*1|M=sNA7nFm zXDuBR17D2MxQ8|ZL=xv5VrFK6zxc&32B-JAfQND3_rCYJU;XM=LmtUxTH2$sc%a>P z-+jJy5c)b;*UYjK&*OJND6>_Eis^H&up==Bo?P=}StOOG z0ES>OL@wqm)JB+F(%7v^p|SxU)&?0YHZs8i(CQw|RFwiKN8^M#TfRT`*kg+&3!HZ} z3hOxpTp>t(rb~CCzR&YaV*wv5q|-f{%%d4r%JBH(j~6qfU;p~og)hlBr~nRT{ME01 zb>VVIUE~Q%(_YdJ7AP^(CHYqdpj~&}HMld?He!fL@Xiv>iGb$9jw2{QkQ@{2UX?@(gJJ z4WnBE?)8Wap+y4(=N}yb>oKxf@yFXtnej>CJx1)p68y_DhwqBD2c3B5op%<3S32F+ z4_C&|e)h8hNHNw#TjA5fRiLk!sqzg7(pR=GY?obj32y5NnHfFu=oA9uiF4+nQ5aE# zBc#N#1`j~Qf5ePS>z*95#e0ZFW@`|h*q_%&-M3qMYRr8I)!89(n0&85`3e2Nn{7`OAw5eyKl;&+qE5pY6I(M^8Gv@$ zX(w+;YfQJuJsO=oUR<({gTF-2P;5Rvreg_!#zd#&UV!zSbIvJN(sMMHkNq?wVRDF7 z+GCGBa*N>ZxZ@6Y^2sL`I?I|AK2t9=9ZaV$n39<$f?O^Qh+Ia}c~*8h$D~PG*%R?z`{4!gnK$X*(>&3Oskl8D}J!M;eTy!d+a zL5Q6y1JDjT?BEUO@KL@r`1I-1iwazWVVU<-n6H9`#h2h~Ht8p)dRt?Sl@YtEmJYpal~op>nuCcbqC{= zV-YgvqEVs$tFF3g$f)(PON@O&;E{aTh6IR0o@C8R{GU_Sm#esI=7m{ai1sajec(-j91TS5Hes^*lIN@$!G*xKZJ&<8 zKL!9`Hgq04F63Ya*{SO@OSFq=PXvXPZm&s(f0A&{upZ;>C^u2vbR@2%S+z)A-7i3fQ6? z#~gD^!L*|DVr9b%&QUL#88whF`QQ8A_Xh9FJ^iovzxbC`e->lqqRq95^nqyQ%9Ygt zC?s^{dm5ahcwry@rIL&`^b0XR)>P@nj?Kc@tx71UEIP*g9|%yU`=YgcrX|HXJd*<+ z(j9ooXI!gV9s0yd%tG;2|&8wm24#O^Gr6ldE}jhxoJ$ zLGsLga@g_FM;|Q)6P+Epa-4&lTtb^-4oMHQ)8;;(kp}93oT!F@w%Tf|;LcPTt(-v0 zsF34K@Sq}Q$$uX2dh>us|1xGcwfp$gaFim>eSv1y3_kw&3xC29lYP4-C*V z!D4713I0YOFddbOq#TC6d=t~04EL+;TkjIJ@E2;xfY+B1q>6gF!<={*S_96T- zCsdW$2G7&LJ^-PCm{sL09k6_X2EqxK(rmiHV<3s?3d)9`hC>xn7aE8O2J3TH|JcqB zxdMpjL=VcsD+2|GDeRU45cews(3V?n89m|-8;t8+8ir%s>{Qxzn0&^GCJTxdq_O%$)sozPuU++G2|>g41}I0go&lErsPk0_ar^NWgUQhkpZ` z&B7vw12A$~Y-N^4(3FqmFkLv=IB+~Pa;5Qk2jInY%DPj?Z4m1)`-}w-pJ4&K%l!FH zytmKb-~>Qc`=!hlrWy`7o(B_+O9*l`b%mE+~&#}>s zM!{dfG@Ax6MgW%TiGG!TLl zEx>(1K}T~T0$COihoe+l=$_ShmNR54wCx;i=lMU=cp6==y=nHa>0{>1cMmYqXBZ<4pNj9u6htaEpJQ6= zS%|6a_pm!r3=A&0haQBDLm{#;Q}*bik5J4&qdTs z$8=S;0i^)JeYWkOIdHo9gtTtxl;+W(Wyt`r`(|D~w!-A#KxFT~uXAIXh=o)Zhb54X zNKS+}8c08v(m%p#k38~7H2~Ul(@niUIOmHhl#v<&9KQjk*R}*CgfI}5N8?x%$!B7r zSsGzgK4miGdGg|*@++>mVhFQoa~5JG3kKMLs6s$28w66Ck8-lC!p;m?M9nc&_B%B zaK`0q2NnPmPQoY#M4=z6v-&|7fX+hjI!mz;^H!6DD3g!ID?KU@t10icv=(q_e{Q}~VuMa-A)xH;})-|3`KUI_J^ z)o*LEFpCIlz$?ofDYGRk$L7LMfBMtKCd1s2S}8yK!Z<(_znJat(5y?|%e0-SM?k@H z5DrV(nq-+J1su8m&_fSZ1E6u^#%29(yl<*64FZEOwI&22bYXHB>CDt*1}2Rq`7m?C z)cMSZPwVJ+0VGbj;Ky4qExZq{Btc&2GguOqVV#RmQaVv)f4QcUvZ3o(1jdJDJ2(X% zmPi;V0$8^AU+)ww%aByMfMviIK;N9s1Xd z^@wBPlE%e<6f>7G6GNGB9RMO6j_i@=VtUU0EWm@#NtHG94)W(`stAUcyhFOn4g@^! z_?OrZ&jsjVPS{zln8}KF?!%XARP`SVfG1TJ4i>qOvF=NJL z9j+jqpu;vW3!K`HKf`zYzXkvm$5#ZyFbcJ&Rd+CXqAiGn2~DT9xhZ3MEO5#`i}RAL z%rf)KWggy3R03uX_Tf1~bos?1+2WH6pb!gH2B3{M-q;Hu-T6NK!FPyHVtwt_-Pj0c zrojlt0cUAjJ_AM;6B(WIW486MMkAgj8UPmsJ}vFyuz71BXjVdV0X}pXCY*y802Dec z7d){k{-Q;Ts$n1jkQTPOQGDWA?lXHp|D=2-Ha}eTcyIMN%(f$#&B@89A$Ds7Fmm#s zoCthGx=h(+s;(I!B&azc6z{qG%sEVk$NT#0uPeJj4eVU+}Rk(d6HtrQy@v*r+$?IX!PjOrDtI{-=Ol)**7_(ni&j@_{Tr~ zF}U}ehNIC5?qYoklNoa~men+|asn2_K2Zi7Iv&b9)VVScU>zb8#LVOHMB^=7xG>2+ zW!P!q!iCi^kN_yfI9e02W`q6CT{H4A0Pmv_@qx&BgCR`>Xjn5sth4g%Gii+k56(Rz z1n@ND6406_#yr-nq2HKf=mWUWj4WALw#;Ffm{wY_U_mti>g?={IufN(q{8@W7*U+3 zlXK~Y@`-W4gILxM#*jGxIIOpk9`}JvhjUC@Dh(h(>)_31TQfS%cl4aE6MeuZ9T5q5 z=LyK8?gYd!fxw*+(>*EX@#(Jl^XFFsppK4?WIT`t3b8&cVx~Goo=JI-Nylym9BTGQ zctah7?t1Ae23ma z^AYMIVJ*2J%3-HU0hD9DXf#AECxS_=PmF1Z1(1Ye%Wi%!F7e1RM?S9J56lW{n(I!y%e- z`WON7Xdk^1)A!C4>&BR9?%cW60BGdMk?U!oP-kG*@nB( zXr|C;EuXV7*3hY0lCWQ@vvfY8v_3%7F0d$(2Y?9=w)|w2PyFVXryRz*@4ox00nmsM zBZ?nev5jG8Pm+e25Izmr&z=I028;!dgGhAr000O{Nkl4L$ z7+6wIy_gw=eF#k@=7$S&%n}H*yHFdXz@NG=<-Pabd#hm}AAmyQH5UlE zW`g&?XaWL8Y;1~~qjPEnS*<2Zw-uWS*c&JN$UrBR_;J|MD<18C{p(+a_|zdIWz1ID_vh%PA=D9A_#_SI2odKj3#QEYSjY3l zImcKoNALJpuyO#|#!q!dtYLjjVH<|&wfwjW;+(ZHmMVz$tH+F_%xqaR88cb(F3Qh| z{WuQg04~5ppq=$*>+;pYG@V+xj^Hpwy_$(MPe7 zgwF@JJ^@w|e(}&l4-Kw)4H>rTOlSLE@ml+sAq2$Ox?Sv<*mFbzusxZ&5O_v}r5sC_ zVw6~0r=IoIyD|XjfU+EoQ|oA@{8pWy2p|Qri>+vdO%SR zE6tugyBYuq15x-gQ{0?}5&-Ia5uRuVeq)}sBc}8MBw-~1wEb6u%4gPmpo(cI3kdx= zc8~Yy`-GkFyCJb9i(FQ!HC?3uN(tvOW-E90VOd8$hd}HDY)tU_1arh@VL8SZRw%cxd)=k(bPJSCRW(-GdwdPb#1Ef}yR0|O7Gi6Ox%C(Tw`8jEF zftS8Oy)$Rd+|fD5$?I#Jb3M+vUffkSAK&Mvw^XE4lNPYFJLdq<=rLo) zT;I~tvP~Hsl$*AZjqWp5Db~zk%x5x93Mggo`^w69y}i8)XU&>*m~*b{*#yu?05pF5 z`1AVu`i=_~E=RxQ0HqcH)XO}zisW1-iOuSA@1+J~tY73EJv}{F%$_~_Oa-8I&m;p4 z8(<&+)H!b4xMTYI`pzFVY}oMFXeXBi06^%UzGq4Up@Z6-b1+UJq&qq~ zju<|C__?jEt>fzH^prO@)nOvcYh{AabE)^HIxrWwv2>|- z7G0|Z^x6Ri0zg?;84*o}n6M#c3@y~z*?H{n;ln>XY}l}IK2u^3=C-r2R40YZlg%dw z1d^s6z}fP|%y+%_a=_!$h#|IOpaP!d%a@^%9X`aPbVV1fQae5n6eHuQCnNvW+O(7 z*r%Xj>3-rCjG#c!zt9Q-~AXTVdMeQE`eJO>M*hlGg`*8K4qaB*Ku zUP+ublQ*yh#3Uh(0SRCMH1db;(aysx2jbwssG*?3T4Kro5r6?WFcNA zkJQlu0t5>n00W2wI5KT7WxDDCkY+An81YaGnD{Jz0=Tl~vW~WEKB}hS8bHEAfJRtH zi{?`7Q;P{3A_)dQXkjg^B*5a|CV;BLGl1YvK*GP`=du2t(%`8VK>B$xQvxRaxyd}$ z0f;vXh%}h&cQu!=QJt&v(cr1qRMuRv=7U8GXjT!>=(1zLX4Xbq%Kn-ik4Kt%AfHus2 sZ&6gpzJpcdz07*qoM6N<$fa1Bi4F9ZGjgcXxLw-QDrc`~8?Z zKkjqybM86&?6dY-YX@tn$>Tqxcm@CfzM_JxCi1`azaKUx@~XLLhXnw1fTFClwwv)m zDi(s~!&HwWstqH3<`s$5@2h20Y$0v*_s?IH(S71(eSK@D%fYIrQDl15l*yWr$Etwa zgejvAJ0~JJ6>s@E;&HiOXR+xmJQ)2g%_@B<)oCmK>?z%8q>2C4dAKoQQL8x5CkzMA z(w!z6Y;oWmZW?gtM+4|=uN?_CW5Lq!iblmp(ORF0-#2w%0i!W~FY2*80KLqhmYHiB zz=N+$=1PhXU_U>;qF6zbQpeQUrrAa@4WM~6{^tp7_q9G-LK6pyMmtt)y$Atua=lE? z3@q3Sk895`lVw0}`Dicf_;}CHVxY2r;4NL#H;#xat`VR8rb18g3>2PqQ!*v#NsED% zOW`G5 z)1zAK!AwW0Q%5H~wCd9TQ1Jox-Gq9FJ(dUS^ccRRDtSpt@))eQ*uq?f zHT#ar@f9&~xu^jnpc^ccf=`UZc=ou>iikZE~_ z9^!mb1tZUvaC=7(o7zr0ujVn3UUH=VfA(4Txq4;6Q^!)d= zoh7B{E$Y|m`c>9rcQkIRe&%wJ)GXSc`R0yaoKufbGM~fBud>l!_f*yG)rf-+#_@?} zMY08?f?Wp^rPEwzP5trP*ZX25UB={IrY>Wl;=^~N)QCs%0qe_BbV+#G>DM0WZ|&^? zxFZO#vt>m%xNX>|mZB5#m8_3l9#h}W%aKlNcac&+U2hM;3g*;){eu^!q!8SAm3>>N z4azy3n3*-*<`^KnX|J5W_U{9b4axa-SI8`%wsGjYm?GnEE0?^$BEh@&(KB8 z=X)u3(Sfub{@u~Hgi994LBBKz61Kwp-KzPF@h)6sKMhT0-viH-t)^1yXniT)D*4@4 zB|WhX&+OaZzgrrGRFeeQLMeq0GbkPYter{_tr8wjyw}d71c)ZAw6V?3-^){9GzZam zY!~Mf^e2*js#F$`UZD+X*g~J=vkrbR9>-+o$X21AFlC|`II}r-zO1+S7weu!-W-lO zdNdMc#AaBrYFk`A zE$LXd5x*5kMDrmhGL^N^;+Y@@Owbo--6m?E?H~}{pU1!@Ey`pswZEA)wY8iXJi<}` ziJ~mR*A3$xdJbvNv6R}m)B27$rPkaq#5cea&@8zaLf25W^C~>iH0L#IhwEQ0I*-)Q z!{wB4w{QFm+DC>`QB7etAQ`f6z4Sqg#a3=wMd=WUg{0@dev>VDs;h{00JALX@M$o_%Wf1$LmQ9YD1O$fqZ`U)B?|+p-I+FDIb5A3{<&Ei7&lK|NbM5i(#RG?kWedCpI(geh z=B{-p-IDlpt`Lf!1zVAMM+l#uW7`?dL@_x_d?*CyB#J3t)%2=kk^P;0p!)TpHd<=m^MTEPt#>5bBhy2;9hy+m3D(tmQreH zI%f-V8QT70$Iwnb!{;HOU4@|$nOVUtUFxqelROBiaMcJAarKE6|$JHhxcipuy+kYIol7lI!EF1Af`l;~gQ7pIGK8 z@JUdvHcO&h+LC;ka``y$GftYsyKpM~xpsp*1Z?cdIrUDU@~pNw;;ByE$LTlS!#eTz zNyV9v$2Iw@QbgSNw~vMu=87M%5>wVGdep~TI6Hu`e6U$Uj43lwU z14p^)ALHW!lNR?Rl;hu-nBLS4`?ld46B%FC&p=;$swZs~n~tQ4)}pqC2`}qae`OVf zZOvFq>7#m{kI65TqA1zjr$lz^FiZ9F1y*udLco zln)g@tyZ_iXYLI=#BSVB-8Nm;7sqfhV?SvV!I=yP}QaL2nbI9fk* z;kJ{o;IxmZq58;E)p=BOr<{&&E%(x`zCK9Usu2(t>^ z$>uYj>%atPqMh}#cq#b>-|pb}v&6|pDv*mA<^s6x&e^gXIeRn`w__2Q_WmnKRIsM%=m84hz{GQVEon5von7v9!PYld z{-A?J2VPynHM`BkSZ`f-AF?$DJw6=y>ON`|&^jH25T{bF#0E~a#@^9*?w7mT!kVs@ zJtHw$cQ}^xcDy2P8vRsxX=b{^C|?f0`4?JtF>Od_+Q98|60+vGa+fynNVB@$J$|`f zWmJ-q@)QMGC9|QMJ#y<2eSK#_tMWbdOFPa~r(Q7WV3VY4({EY`WZnbVubwfU5|eWH z0>NX#Bc>EvatG(cdtNO#wjBFDUHO`wTTdU{U;R0#S!h>eN!12>oR%PR#-%vO&qW4P zKefgNN22NO&I!(Z8{B{&QHrSD;mQGGKJIo7*G6yvp}j{$sHW zkQ%O0#`ka_8FKx2XoUTs+k6^V*2m1jcze`l+OlVK^en;H!{(`O7UnKBIM)S^j4iWe zyYsv_0~S_BiQ1D_?l(Wv$X+ddYq?wcGH;WM|ID*nWh`ZSC``Ge1#)DB%ooV@7r$DZ zFd~fH?bRmDq8TL9$`wg=6Z&jKt83y7eQ|48X4*z)sJpU-@1*v}dGO<_S*Dva-oQ}a zyvgJrgldutQ3HO2va@Hmd!z@0ni8pvEx*$nn}<=X^Z>eKm)>Dtttmy&;fFkmw7KJ2Lb z76@dCB~zr6oUwKvf;HUCtrljHD^cD6LJq~^_eE@(SnOL9+bHTd-u=SIaE5HZBGc_H2z2#fU6S{V{c2Pgi4)Y_)}!Qa z?>hJkoh~NOL50a≫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�GR+`EpuX|YMt;+OcZ+&f|2mApbf`o>RkTl#dN^XgjWXCxrH*m!!Yk&19VM)DscmG)PkBb*clhs-gsh9Qvn6NEVuUtfY1!FS#Y|kgBiv5@5OmvPUg`E<*%_ z8bZPZU5)Bpc1Ct9l!I5@Gf0NA0tzWlkk2Ut&uzcuHp?tMa@4i#h(oKS_LnE!OVjla z|7*=*IQ;W3eBdqi>=QyNqMYPB7!|na#6rGt#~I$Ej_eHz`SmW$!yveI5-I{olEbwN zX4A@bfO-?(J*tsO%HuJ~EQaxEx_TOE<;I>|=pjAuPv4Ur>Tw28?`Q$B0%Y?*D8t9Q z?M@t006-Ox@@2F>UGEe9uQ7?mgICcZ!%6D+@4B)4W0*tx~{2KqS;yHsX_L>U``C)IhLxmDE_FRsEX66wz;o^115i zkM>OWpB{-&yU;&BM}0wG5|-4A<-)3+EDe8~2qF_kzB%Sy7zH$%gZms^3$CBcv-Fc7 zu9=&KhfS&vSa9=`gb_SLJn2^7@gp`-x zGwgpo5xyteW53j;^DcT$HBlog>qLq5%x*+1VzF%p8Fw!|lYq=gMm9E4s}f|Gh(&bZ zp8Yqg=SVI5>@NIx4~M7xVGOl8B1b~XS27QWcMSC!6$Svu{Fdk2V+*0={F{QvB}+1( zf5$0N3K?EU9|H*)H4A-J8v2dUz!UtprIP*8WKvMKp8g)}%CzS`~NZwS)0 z;XOQ<$X~kW?8@tY?RV34dBl4A3*(Q_=SehFIx4fo7t=`@s8Z?vVjlam<%SV7;@K6U<3Mf&-{;LB4@6jk1Eu3s?AC6N|r z7YE*@?P-IcsDGC$)l~?8^t~eBXvZsLSi}ZPwqFC%gEV{BLVVu!7_gsIx6fi0>56d} z#R>vU(4_oVgUJJz4byvRM%znK=;(-?<@HwheC69q18OJKj-}|<-s41_8p2HkU_eGP zbf=25X)CB1t7`QpIRh|i0Qe=)mfuv*O;7-x0)B(fami$lZ#XI5`de)`G+zbQoWq3t zWb@>DG0^X)zps2)qkT3#)n26f>TC3cqwUkxJ*?)(=4oLNLTdVX^qkRyp}H${@P6qW z1ry_Cta?VkM}8mm>xA^k>KoN*;%TX})zK^0V%4`@_4OZ#UB}*BK9vaO=#G}{qYP~t zY}*V*mNg${XQE1}bad`NWR~=l#fHAf7@v+UH;v@lPU-{k>ju`BYN0NJ9y1RgE)$M$ zt|M_CPA7r#k|P}Ny8tKmnJ;zN_n>T)_-|I1%QJg^Sv1?cU*8K~ICxZCA{!>vr=t$4 z3-gezl&rfs%c| u^-r?w^Y literal 0 HcmV?d00001 diff --git a/src/all/cubari/res/web_hi_res_512.png b/src/all/cubari/res/web_hi_res_512.png new file mode 100644 index 0000000000000000000000000000000000000000..1dfd0c08c6ba294fdb7ca6765214cb7dde922176 GIT binary patch literal 29301 zcmbTd2{_d4+de)R`%aW3TiN%0A3{nbdm{UU?E5~$P+Ca{*^07e4`mx8OO`0fl5K3s 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 literal 0 HcmV?d00001 diff --git a/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/Cubari.kt b/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/Cubari.kt new file mode 100644 index 000000000..d8e0c4f03 --- /dev/null +++ b/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/Cubari.kt @@ -0,0 +1,353 @@ +package eu.kanade.tachiyomi.extension.all.cubari + +import android.os.Build +import eu.kanade.tachiyomi.extension.BuildConfig +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +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 okhttp3.Headers +import okhttp3.Request +import okhttp3.Response +import org.json.JSONArray +import org.json.JSONObject +import rx.Observable + +open class Cubari : HttpSource() { + + final override val name = "Cubari" + final override val baseUrl = "https://cubari.moe" + final override val supportsLatest = true + final override val lang = "all" + + override fun headersBuilder() = Headers.Builder().apply { + add( + "User-Agent", + "(Android ${Build.VERSION.RELEASE}; " + + "${Build.MANUFACTURER} ${Build.MODEL}) " + + "Tachiyomi/${BuildConfig.VERSION_NAME} " + + Build.ID + ) + } + + override fun latestUpdatesRequest(page: Int): Request { + return GET("$baseUrl/", headers) + } + + override fun fetchLatestUpdates(page: Int): Observable { + return client.newBuilder() + .addInterceptor(RemoteStorageUtils.HomeInterceptor()) + .build()!! + .newCall(latestUpdatesRequest(page)) + .asObservableSuccess() + .map { response -> latestUpdatesParse(response) } + } + + override fun latestUpdatesParse(response: Response): MangasPage { + return parseMangaList(JSONArray(response.body()!!.string()), SortType.UNPINNED) + } + + override fun popularMangaRequest(page: Int): Request { + return GET("$baseUrl/", headers) + } + + override fun fetchPopularManga(page: Int): Observable { + return client.newBuilder() + .addInterceptor(RemoteStorageUtils.HomeInterceptor()) + .build()!! + .newCall(popularMangaRequest(page)) + .asObservableSuccess() + .map { response -> popularMangaParse(response) } + } + + override fun popularMangaParse(response: Response): MangasPage { + return parseMangaList(JSONArray(response.body()!!.string()), SortType.PINNED) + } + + override fun fetchMangaDetails(manga: SManga): Observable { + return client.newCall(chapterListRequest(manga)) + .asObservableSuccess() + .map { response -> mangaDetailsParse(response, manga) } + } + + // Called when the series is loaded, or when opening in browser + override fun mangaDetailsRequest(manga: SManga): Request { + return GET("$baseUrl${manga.url}", headers) + } + + override fun mangaDetailsParse(response: Response): SManga { + throw Exception("Unused") + } + + private fun mangaDetailsParse(response: Response, manga: SManga): SManga { + return parseMangaFromApi(JSONObject(response.body()!!.string()), manga) + } + + override fun fetchChapterList(manga: SManga): Observable> { + return client.newCall(chapterListRequest(manga)) + .asObservableSuccess() + .map { response -> chapterListParse(response, manga) } + } + + // Gets the chapter list based on the series being viewed + override fun chapterListRequest(manga: SManga): Request { + val urlComponents = manga.url.split("/") + val source = urlComponents[2] + val slug = urlComponents[3] + + return GET("$baseUrl/read/api/$source/series/$slug/", headers) + } + + override fun chapterListParse(response: Response): List { + throw Exception("Unused") + } + + // Called after the request + private fun chapterListParse(response: Response, manga: SManga): List { + val res = response.body()!!.string() + return parseChapterList(res, manga) + } + + override fun fetchPageList(chapter: SChapter): Observable> { + return when { + chapter.url.contains("/chapter/") -> { + client.newCall(pageListRequest(chapter)) + .asObservableSuccess() + .map { response -> + directPageListParse(response) + } + } + else -> { + client.newCall(pageListRequest(chapter)) + .asObservableSuccess() + .map { response -> + seriesJsonPageListParse(response, chapter) + } + } + } + } + + override fun pageListRequest(chapter: SChapter): Request { + return when { + chapter.url.contains("/chapter/") -> { + GET("$baseUrl${chapter.url}", headers) + } + else -> { + var url = chapter.url.split("/") + val source = url[2] + val slug = url[3] + + GET("$baseUrl/read/api/$source/series/$slug/", headers) + } + } + } + + private fun directPageListParse(response: Response): List { + val res = response.body()!!.string() + val pages = JSONArray(res) + val pageArray = ArrayList() + + for (i in 0 until pages.length()) { + val page = if (pages.optJSONObject(i) != null) { + pages.getJSONObject(i).getString("src") + } else { + pages[i] + } + pageArray.add(Page(i + 1, "", page.toString())) + } + return pageArray + } + + private fun seriesJsonPageListParse(response: Response, chapter: SChapter): List { + val res = response.body()!!.string() + val json = JSONObject(res) + val groups = json.getJSONObject("groups") + val groupIter = groups.keys() + val groupMap = HashMap() + + while (groupIter.hasNext()) { + val groupKey = groupIter.next() + groupMap[groups.getString(groupKey)] = groupKey + } + + val chapters = json.getJSONObject("chapters") + + val pages = if (chapters.has(chapter.chapter_number.toString())) { + chapters + .getJSONObject(chapter.chapter_number.toString()) + .getJSONObject("groups") + .getJSONArray(groupMap[chapter.scanlator]) + } else { + chapters + .getJSONObject(chapter.chapter_number.toInt().toString()) + .getJSONObject("groups") + .getJSONArray(groupMap[chapter.scanlator]) + } + val pageArray = ArrayList() + for (i in 0 until pages.length()) { + val page = if (pages.optJSONObject(i) != null) { + pages.getJSONObject(i).getString("src") + } else { + pages[i] + } + pageArray.add(Page(i + 1, "", page.toString())) + } + return pageArray + } + + // Stub + override fun pageListParse(response: Response): List { + throw Exception("Unused") + } + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return when { + query.startsWith(PROXY_PREFIX) -> { + val trimmedQuery = query.removePrefix(PROXY_PREFIX) + // Only tag for recently read on search + client.newBuilder() + .addInterceptor(RemoteStorageUtils.TagInterceptor()) + .build()!! + .newCall(searchMangaRequest(page, trimmedQuery, filters)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response, trimmedQuery) + } + } + else -> Observable.just(MangasPage(ArrayList(), false)) + } + } + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + try { + val queryFragments = query.split("/") + val source = queryFragments[0] + val slug = queryFragments[1] + + return GET("$baseUrl/read/api/$source/series/$slug/", headers) + } catch (e: Exception) { + throw Exception("Unable to parse. Is your query in the format of ${Cubari.PROXY_PREFIX}/?") + } + } + + override fun searchMangaParse(response: Response): MangasPage { + throw Exception("Unused") + } + + private fun searchMangaParse(response: Response, query: String): MangasPage { + return parseSearchList(JSONObject(response.body()!!.string()), query) + } + + // ------------- Helpers and whatnot --------------- + + private fun parseChapterList(payload: String, manga: SManga): List { + val json = JSONObject(payload) + val groups = json.getJSONObject("groups") + val chapters = json.getJSONObject("chapters") + + val chapterList = ArrayList() + + val iter = chapters.keys() + + while (iter.hasNext()) { + val chapterNum = iter.next() + val chapterObj = chapters.getJSONObject(chapterNum) + val chapterGroups = chapterObj.getJSONObject("groups") + val groupsIter = chapterGroups.keys() + + while (groupsIter.hasNext()) { + val groupNum = groupsIter.next() + val chapter = SChapter.create() + + chapter.scanlator = groups.getString(groupNum) + if (chapterObj.has("release_date")) { + chapter.date_upload = + chapterObj.getJSONObject("release_date").getLong(groupNum) * 1000 + } + chapter.name = chapterNum + " - " + chapterObj.getString("title") + chapter.chapter_number = chapterNum.toFloat() + chapter.url = + if (chapterGroups.optJSONArray(groupNum) != null) { + "${manga.url}/$chapterNum/$groupNum" + } else { + chapterGroups.getString(groupNum) + } + chapterList.add(chapter) + } + } + + return chapterList.reversed() + } + + private fun parseMangaList(payload: JSONArray, sortType: SortType): MangasPage { + val mangas = ArrayList() + + for (i in 0 until payload.length()) { + val json = payload.getJSONObject(i) + val pinned = json.getBoolean("pinned") + + if (sortType == SortType.PINNED && pinned) { + mangas.add(parseMangaFromRemoteStorage(json)) + } else if (sortType == SortType.UNPINNED && !pinned) { + mangas.add(parseMangaFromRemoteStorage(json)) + } + } + + return MangasPage(mangas, false) + } + + private fun parseSearchList(payload: JSONObject, query: String): MangasPage { + val mangas = ArrayList() + val tempManga = SManga.create() + tempManga.url = "/read/$query" + mangas.add(parseMangaFromApi(payload, tempManga)) + return MangasPage(mangas, false) + } + + private fun parseMangaFromRemoteStorage(json: JSONObject): SManga { + val manga = SManga.create() + manga.title = json.getString("title") + manga.artist = json.optString("artist", ARTIST_FALLBACK) + manga.author = json.optString("author", AUTHOR_FALLBACK) + manga.description = json.optString("description", DESCRIPTION_FALLBACK) + manga.url = json.getString("url") + manga.thumbnail_url = json.getString("coverUrl") + + return manga + } + + private fun parseMangaFromApi(json: JSONObject, mangaReference: SManga): SManga { + val manga = SManga.create() + manga.title = json.getString("title") + manga.artist = json.optString("artist", ARTIST_FALLBACK) + manga.author = json.optString("author", AUTHOR_FALLBACK) + manga.description = json.optString("description", DESCRIPTION_FALLBACK) + manga.url = mangaReference.url + manga.thumbnail_url = json.optString("cover", "") + + return manga + } + + // ----------------- Things we aren't supporting ----------------- + + override fun imageUrlParse(response: Response): String { + throw Exception("imageUrlParse not supported.") + } + + companion object { + const val PROXY_PREFIX = "cubari:" + + const val AUTHOR_FALLBACK = "Unknown" + const val ARTIST_FALLBACK = "Unknown" + const val DESCRIPTION_FALLBACK = "No description." + + enum class SortType { + PINNED, + UNPINNED + } + } +} diff --git a/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/CubariUrlActivity.kt b/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/CubariUrlActivity.kt new file mode 100644 index 000000000..4d06f04e9 --- /dev/null +++ b/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/CubariUrlActivity.kt @@ -0,0 +1,64 @@ +package eu.kanade.tachiyomi.extension.all.cubari + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +class CubariUrlActivity : Activity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val host = intent?.data?.host + val pathSegments = intent?.data?.pathSegments + + if (host != null && pathSegments != null) { + val query = when (host) { + "m.imgur.com", "imgur.com" -> fromImgur(pathSegments) + else -> fromCubari(pathSegments) + } + + if (query == null) { + Log.e("CubariUrlActivity", "Unable to parse URI from intent $intent") + finish() + exitProcess(1) + } + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", query) + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e("CubariUrlActivity", e.toString()) + } + } + + finish() + exitProcess(0) + } + + private fun fromImgur(pathSegments: List): String? { + if (pathSegments.size >= 2) { + val id = pathSegments[1] + + return "${Cubari.PROXY_PREFIX}imgur/$id" + } + return null + } + + private fun fromCubari(pathSegments: MutableList): String? { + return if (pathSegments.size >= 3) { + val source = pathSegments[1] + val slug = pathSegments[2] + "${Cubari.PROXY_PREFIX}$source/$slug" + } else { + null + } + } +} diff --git a/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/RemoteStorageUtils.kt b/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/RemoteStorageUtils.kt new file mode 100644 index 000000000..3e4fbd060 --- /dev/null +++ b/src/all/cubari/src/eu/kanade/tachiyomi/extension/all/cubari/RemoteStorageUtils.kt @@ -0,0 +1,147 @@ +package eu.kanade.tachiyomi.extension.all.cubari + +import android.annotation.SuppressLint +import android.app.Application +import android.os.Handler +import android.os.Looper +import android.webkit.JavascriptInterface +import android.webkit.WebView +import android.webkit.WebViewClient +import okhttp3.Interceptor +import okhttp3.Request +import okhttp3.Response +import okhttp3.ResponseBody +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.io.IOException +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit + +class RemoteStorageUtils { + abstract class GenericInterceptor(private val transparent: Boolean) : Interceptor { + private val handler = Handler(Looper.getMainLooper()) + + abstract val jsScript: String + + abstract fun urlModifier(originalUrl: String): String + + internal class JsInterface(private val latch: CountDownLatch, var payload: String = "") { + @JavascriptInterface + fun passPayload(passedPayload: String) { + payload = passedPayload + latch.countDown() + } + } + + @Synchronized + override fun intercept(chain: Interceptor.Chain): Response { + try { + val originalRequest = chain.request() + val originalResponse = chain.proceed(originalRequest) + return proceedWithWebView(originalRequest, originalResponse) + } catch (e: Exception) { + throw IOException(e) + } + } + + @SuppressLint("SetJavaScriptEnabled", "AddJavascriptInterface") + private fun proceedWithWebView(request: Request, response: Response): Response { + val latch = CountDownLatch(1) + + var webView: WebView? = null + + val origRequestUrl = request.url().toString() + val headers = request.headers().toMultimap().mapValues { + it.value.getOrNull(0) ?: "" + }.toMutableMap() + val jsInterface = JsInterface(latch) + + handler.post { + val webview = WebView(Injekt.get()) + webView = webview + with(webview.settings) { + javaScriptEnabled = true + domStorageEnabled = true + databaseEnabled = true + useWideViewPort = false + loadWithOverviewMode = false + userAgentString = request.header("User-Agent") + } + + webview.addJavascriptInterface(jsInterface, "android") + + webview.webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView, url: String) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { + view.evaluateJavascript(jsScript) {} + } + if (transparent) { + latch.countDown() + } + } + } + + webview.loadUrl(urlModifier(origRequestUrl), headers) + } + + latch.await(TIMEOUT_SEC, TimeUnit.SECONDS) + + handler.postDelayed( + { webView?.destroy() }, + DELAY_MILLIS * (if (transparent) 2 else 1) + ) + + return if (transparent) { + response + } else { + response.newBuilder().body(ResponseBody.create(response.body()?.contentType(), jsInterface.payload)).build() + } + } + } + + class TagInterceptor : GenericInterceptor(true) { + override val jsScript: String = """ + let dispatched = false; + window.addEventListener('history-ready', function () { + if (!dispatched) { + dispatched = true; + Promise.all( + [globalHistoryHandler.getAllPinnedSeries(), globalHistoryHandler.getAllUnpinnedSeries()] + ).then(e => { + window.android.passPayload(JSON.stringify(e.flatMap(e => e))) + }); + } + }); + tag(); + """ + + override fun urlModifier(originalUrl: String): String { + return originalUrl.replace("/api/", "/").replace("/series/", "/") + } + } + + class HomeInterceptor : GenericInterceptor(false) { + override val jsScript: String = """ + let dispatched = false; + (function () { + if (!dispatched) { + dispatched = true; + Promise.all( + [globalHistoryHandler.getAllPinnedSeries(), globalHistoryHandler.getAllUnpinnedSeries()] + ).then(e => { + window.android.passPayload(JSON.stringify(e.flatMap(e => e) ) ) + }); + } + })(); + """ + + override fun urlModifier(originalUrl: String): String { + return originalUrl + } + } + + companion object { + const val TIMEOUT_SEC: Long = 10 + const val DELAY_MILLIS: Long = 10000 + } +}