From 00a855e590f6450415fd8dd7525ce15a520cef51 Mon Sep 17 00:00:00 2001 From: nullptr <62841684+not-nullptr@users.noreply.github.com> Date: Wed, 13 Nov 2024 16:30:13 +0000 Subject: [PATCH] feat: ffmpeg support (+ many bugfixes and refactors) (#5) * Separate menu into custom component * feat: audio conversion support via ffmpeg --------- Co-authored-by: Realmy <163438634+RealmyTheMan@users.noreply.github.com> --- bun.lockb | Bin 120042 -> 121115 bytes package.json | 2 + src/lib/animation/index.ts | 2 - .../components/functional/FancyMenu.svelte | 76 ++++++ src/lib/converters/ffmpeg.svelte.ts | 61 +++++ src/lib/converters/index.ts | 3 +- src/lib/store/index.svelte.ts | 2 - src/lib/workers/magick.ts | 2 - src/routes/+layout.svelte | 99 +++----- src/routes/+page.svelte | 23 +- src/routes/convert/+page.svelte | 233 +++++++++--------- vite.config.ts | 7 +- 12 files changed, 307 insertions(+), 203 deletions(-) create mode 100644 src/lib/components/functional/FancyMenu.svelte create mode 100644 src/lib/converters/ffmpeg.svelte.ts diff --git a/bun.lockb b/bun.lockb index 70a4bc834b57a57f3e9af94eb15e519386e87acb..ba0a4ef78a28d82cd05e28ccaa3aa47a2f1fd64f 100755 GIT binary patch delta 21195 zcmeHvcUTqI*8c2~qZ||~3J5A#v4Aw`9>fZcUGRX2a>OH|G$}@~fEtY^_H7)EC2C>} zF&axOpx8BH*Vu?H#+XE-xf+vPA(ro5QzT!m_kPcl-@VW8pF0olto`o2c3FF`y=R{p zX6_f&Sh20fLa(-)v+A8L{C>RnUG;+=)z02}8tu6A=&1`WJlB^^AG^MPP`7ukGJ%eO zMdoG&H+@y2#0ZT9p|AiEM#wbC`jB-*l_#fWjLfo56b6CYAwCi5_K?{Vtf@IxLHMbf zAk+l^2C^391V|Ui3y^gok7@CXASs_UJIj(;fO@UjX`a^f3Bqn9)JDQ)NUC5pBxSTD zWn`s8&jQ{MJhp})I71$QbcBr1tG=myKQa&SOJ!
  • f~a`rjYMKwuH=ubb~Z&@&1r4 z!0SUchkOEan?YXGv&YJfF6H6=Yq z5H7o`Lvc!zxu}i2Bh@+~9eIUu;51aRnj8s9Zam6r&Gbyk79OL#I^c(qpW>~shIkny z<=X>^(JI`9^fdHV;bH_@L8fGTlIshhtyRUh5Kn%dlANBA1;3xH@zE*iqdd{KS#8wx zWKCvzre-8ra?py@l(du_A=yJsPend5;3mWm6|%Y!FYae`8Ea z(irfRZ0kf6S0MO%sukDpQe8jOk~7A0oHZ|Lj3sp(6i*_a`e%$K+jDfPCHVk26~sHL z`rklOKU&64pn8OH-l|8LA*ms`St*`l(TL34^t_~uQC532ggmvvjnd(9*AO62IRgoA zF5K>`N>xE9+>3b1unm$bS_et}C-|#9F*e&X&ytoZShA8cEm_&tU;NY_Y1c`WO(3b< z-H_w}G^iHz@KTghi#%>R0@Tv&0qUeBKPC?xg?MV1-sLY44`(S1fW%+ncR11dau-T8 z1YZkk1OM!4IYDa0c_C{0en@J_$Sg}zffZd75UM6jhNP}O14#;L)~sYJdPDcL6l5gJ zM_aOU#-p+av^C5lOaiOjAcxA#vAE^P~2S|BNt5}lgz?V1Du8?R4dRMk{Z|=k_wvM zQ_bh9alK(lV=~62jIv}E^inH2-;0l}(X_xJN-ZukB?}WXTS&_nl;a8Fso0z`)^w`* zn#R9_B-g11NsE-S9w5giNnQR|L6Y4g`l$IAgHt)IuQq@w=_#3(?Cd#+H)66C9zgz zt&miOzOd*EiGX+-V|}dkF@9iH^OZwVIz~;o1dfEHa!TV>r`rZeP5lUx;^%3ydV-=~ z9~CB9QZ1vb6~oj%xXb4l+ZgMOPUTkdBZlFc&haVHwj=u^?m5#Dbu%zZ%g`^CO zFP5*9iQLZah12syvHz7?`Af#GkPcn3ub-ZivFT~|qH8O*+tz$!%VzV62I1^54|WI_ zokX7RU}D2~u|qgp%qws{!-E@!vkpA3VYsoPnjn}^590?N0$CuhKuR7DZWPW=^1Mdj zVgmy&X=Gx9c?F{8^I*qtc7W$Oh8uq~2m*Y#(1uS74&oJvpTL8i!r5`2hx6~e80Yc4 z!YSN%r3MypXjW6IaOZi>;jEAs<9v));QSj8ZXC{hd0yji<5W0J7w8%|YaD3Y2Szy! zd|E(|E!-s-MBvlH0_#P9QM&~k=ybu3Z*9&i==LyaQJz?yw_Eo3@rkI+V^D4CWRmcX{05!GGtI!gJ zda7-C6>@{0sBxoTg+4{7yQ25#RmdOfiW)cZRcNms66-YNCCyESL`=STUfMj=um_C`Ad~K*++Mw+Lg6c}UA}o5q5W%%`*tvvI-F zsc0l4G(rg-dlhPhZIfEkbcEEpuOX!BgU-GOcZ(v3*NH!1YG;YcZ!KuWV-$zii1v z+MA4ZTB)-G)2dORIJgxrK_o|HmXbZ9eV}M)%|kkv3_Y;f3gge=gVPXFT$<`K><9Db z&mBXJPqg^zRF=`FjoKp239u<(ln1jAY>&pOg9X`w1R+UP^zl%$VG_m#*?^e%bB9pl z7KErTY?b_CTXh!L@Q8jvtS!&)XcBYU@{*3|2qaNO)i~PD9`a!CaHC&4wM>ymbO;nv z+VK)^ld%YqG?NVcpc8rwjE2EZVJ+HYCV`=~9)X7OU?GZyM-l3Rc(lSJ&{(^J+OIZB zo=C6(Y93g)49r($u7SoAVEDsGMtBF(I^q{@Oz>1SM5VVDykgWp2f=zO`d|hJFPi;R z8ig8%AVghNO<8s3gQ<03Ni>#&bw^qarEN_*s+wwl$AGE5PqwZB>#DYU}`=xHvk0^Q@dgU7#Xj$%yj4L0*zh3$gyiEPVzPwxrKp7!gvLY3WJlt&FVpo@}Vy< zqCLRKNiZQCP*E5Ui7<(m!gxM}ZD(ErVd~5)BTU8xonP7D5y)=xysqKKmdF~8+;DN2 zkO@X5*WeMRK*NV%>bh5n&;X@JdP7<5k%b6Ro75h;7|uhwqesw3LlB9z1ioDj{z675 ztCV3Nn7=X~W+Fr`ff)#Mz64Wyit^ZFl;OK*&_VA&V`nfV(;|bJI~9z|!}iwme`-IRe(5OfcADq)m!3JrSaum|qyF1z=Pv`V*7%Jf-o@SY+*c zsYc?W0FUhjMt+ag5=PDgBeRq=!#7~KxTEe4SUEMV9zixlcxUfW@o*$BkxWL9C_xyA zT$qn2F%L|eSD25VfvF4E!O%d%3osKeMb^mPwB{P8Vn$#@$#hJ#y;*6G z8*Yr11ObZz*3}41+QVSciawd>*hgK{(Rkz@3r1xr6I%SZ53lTJGTQZ3_ege}b%uw6 zksURtrwvoUuq=m#iWmFx%Kj!}Be(*Mzpdg8UujHrb%*|H=T=ubcc{kHNwE}6TOhgy z8lHl|S+Uyo!+24P)N9UMFtv2*_+wx+SeRsBBKnV5b%mM0s61sN8Rmjvs69fB=MbXu zFw4=kwXtvzgNHi@8vB4z=}O;;iw5z^!6xG&M0z0-^An@{NMk4#&h9l>Z#2VtG;=Vo zj5Zl}AX3c$zh-xMUQD>L0Xm#IO?4~j6+W*%ZTiHWg1AEGptmzZf2Qeh4^`oyVCz$Aw~#`145#90btuJ!zy2`YEvC5!iUWr6lA$J1 z9>yz&nvAXqx;xP(JP%B>!Xr@Jn!roqP3#w55g%^oF&u8hpPNICg$U8QqFxMqN4#19 zv2ZQ|^HtJVSNJNJIwEwLdJZ-gY09=jg(D6q}>282M;0e${lH%bh%JD}@@g22zl2opb#vu!o;2$ECg3xKoL6S1S z21UX$RM|yrB>;o8|lIB=IB_7f=NmA-zjlWJ(`VlRiB-!jHR3qlF!D3*Js(*{rw&I44;mjI<+1n3}1{E{XwL()Og zhObI*6G7}6opAh7QfW7o*#9l5w3}KyNh9xTZB~!8?`yFn(P36cKG$lSLPr0jrTkG+ zjz?NNNn7A4K=G9T9VDr~--+NLN&J~6pFNS<@%k2)rXC>G^2!f0UH3lNSFPSzpN*2nA9Mg{;Qy zlO2_2g@aMfE_Bi)1tT>6uOv06o2K_VN!=_VomBd0dL${>mtjGq0{Vm1fTZVZbo^1$ zc*bcNhH5fi(|etyNovv3NmBVq8YfBIs&Ol852i&>Lb8@Xk_w_HmehbuNX9+KI4TQh zj;2MDQs1Cd$cb7!Ns6DO@xLOeJEkK)6){6A2eLqkcvDN5sU?uC2gRitCrRck(>O`G zg06=ovo=Cf(x*64LqCHg{jFO3Hb`=lose`?N!U+{yEVmPNNVW;P4RV-3Oa&xs^|+% z?{$*OEkina%y~#sy`bs8lH{*c;AO}^s^%?V|o_K zY5u)7;olVRfO2vGI$kHK{?{h_r{ig8u}2B{?l$1^@ zdpGS0@jCh6P0C-}to(PALQeH+bE0|Jg;)gsBb$`%%d=DM3a&)nnJg|H6Sm^Xy#tFq zu5as@IV1e%YwONr5ANN1=PLhG)0+?9ytM{PcWyD_y|qHg1;gQO_xx5bKDnXqtbOD9 z-lrc2On6b}1*E>4p^0MiZv3c6zwVuMC;HTAOXp4>TzwvO=SkM?cGqfkKJ&}8qNs1K z?&#UO`bYg5KWdS5X>|4Jjz!Oo{^0k;j-nx*TtWvgdg)|geDzevKK?7lAE>OEu_^rQ zp!NHu)!UrB;_CdqtbE6ppR8)yWuoi8&YqL}<~tp-YyRTh^JUI;hQ2e>?F%W$G2LyJ zhwsbB^=MPAH_x3{Ofj?OeBe|wYr%`Anz?PEJ-08ASSub^U}mlPR-D^#W1*ROa0||D zc`?rIc)e+6)}E)}+<_m&*^@g@H#09j9_Nm{3}cplEa{5;NnyzQH2=Fg|$ z+=-Xt9Kd~Mn(?rH4$eXRHqOC3c$S%k@I^R>@_RUk@rbv~tTSJZvxz^(Ih;q$HnT2# zEzS|V0_U!L;2bmS#*1+7&e_{$)`Q34+>>v`xfeISV`h=uf^!rv#<@4IH`mN0o`Q29 zeh}xr+Cq_o7q5~H{Z;!F0kh}=1chRfwl|GeD*?nK5v13-lpTfRPu@?UW?z|cHeFpnBOYAdV2IjE^_I)O? ztvv5D*avn4Y&&ne1@>))eOn~9gO`H^ZG(MVCAN#t*$Vr>9)cC~;BByPJM7ygu|51A zSmfuhZ@a`w`SR_s59~SEejfEX?ArnRK9|@*UI7-n6ZY+p@SizFJ7C`~*tb(+M|s>% z*aub$_60ZYf_=MT-!6%j@nSHiV%WD^!oTFC?1p_{r@>Bh=VI7b0{e<3c9xfcdF+9G zB@#Q&^GaYJ*bT5RdD}g(Z!hfIBe6@o94x35_U)C}6+UM#>;roUR?dSI61&Ue z4#GaLQn2s2@eu4g4EqjA>>e)$b2$eoYCzN4`3h{XQJ%fLL2 z!M>vsd(88W!alGYU{844W3cZF*mq1~zw&ahpyROb3yJ-m&-nuOfjtDP;K9dXUm5H> zF5$nF?tw*~fPG~Wp1v$EgMDDn!CvyH6R__j>^mWejPc47LwM{d7$DM+KV5ML+xbZX$JOcwyOU%fN!JN**z%vr7$y3h2K(Nzb_T2d_3_J$|&q}Ng zF9Y*94+GChtRBxh2Lr)wfHmN4&%?kAFz~#@8uD_mpf6$I1&KNGITv6c*h4U99{eQ? zya)rol$Z;@2Nrn=240j{6TbW+3INouVN&w23r45^+Lqe+`jhCSw=bd_1m@v`j7NFh}yvT!aKFZ=5E_p-^s6L-wjV{ z>;(MdHDp~R|6R@DcF)#e!R?FMi0a0+XWpO93`r*3q2h~f4dw$LL>hWU&_9|jx<&s| zX2VZCh&8n8rdC?Oc;ybNO!3zNWZEmoxs}9|V8&55+=;7N_4-e?-m4@hDin>BHVGXpFE6KzAzXF6I^B zDo_qw1Fi!%fSbTA;A`MEK(|Iu04ISn0Np}84$v*w5?~Lo7bpex0s8?O_Bp`Yz&ikj zT>jCQ85`0#F9a3=OMrKQrLxhFbu0K7!6M)jU^&Wo4_FDT2HpqO0BZqq3pePr09pdA zfYyKq&=zP1bO7k)_heuS;0!bdT!5xPGl0CNInV-VNjJD#BS1b$K1e>-9_Rq%ps-wE z0zfw>LxIi!-MFMX<#a3fdw?D%Hw8`t2f+^khk>5pk-$UX4)87T9Y7DAt^=2WtMr7n z9D(z|1>h8L8aM+S2g-n>z;!fJ0e}g4 zj2bvT0m<+l5>$04FcSOX0j!at#EKdFdS$D(2Q#i$UdE!TSJ<2H1}u@nt;wg znA|Cd4X$U8ASn(61_1r#m=!~zsQlxn0vA}|uL0HXmaG!+;J zqygzb20*hX8=x7K1JLAZ089d?!4#eXP&}a!m<7BEOb2EFGl92(*}xpKSX+#hHJGfV z^>{w82#|rL0JWNWiu9>h)&bN5tAUjOS-t{T1*`$y2i5|lPigCcj{zDYiaP+1kp)|D zqBV-fTpv$Tr0^zy)-LLq{Xj9W8=y(Q71$1J13m|K06PIHlop2)U=Kj~N`ZZVUOqK| z>N`wrA;+NvavX9n-I1y@b<*2FQlTvXT7m8WHvww+4d6OJjcEmZ1(0u)16P4Fz-izV zPzD?Wjssr+CxH{x7uv4rB_&cNSAa_ZRYv>*a2_}ZdkQw@f~m%_!hVa+y}k~e$e>OkWT;_rboa}z(Zgf@Hc?c z9|OMvzW^_R3g9{LciH0)P$t9m%5o2 z@EVZhAGDBD57OF9Yfzx<7Q~DNw3-n}Z3AEj(8YcNBwhHaSEu;rvM7Rwk8R!mBeUwg1d<`K{jr0ehO)OnY>L8J> zD|%)xgsCIFfet{mSDDqkv{4`(x@b{8x_&&3zzN6RZ26dpwcho}#I7=_Hr5&al_Zf3 z_xAGf_44tifvJTQ{iUT>DN5hM2@4liYxpRIj~j)QPF_A<-e`w>s|#~>p^Lc_6bffL z1y+Q-*-FXk?d9hq43Qf|Fh7?>D4=5sHx0^f_qXHL4;2OfP61xtX|g4PIkN(J5`!QEsU3UMsTR+cTdl7nmUfy25n5Z(N^1hK>AYAnK#rMq5E3f=% zo1;>m59z7(y67*8n}&;fFaFK;mdM&Eol6SMx--XWodl(6jpXg!SQ8c@pQqAeWp^uc zY~n8*z{pcCCPpRIY(6LEE2SMuFDlucUG(?GZ@)Ob*~8y{nbH7^3@$%P8P)u?id?(} z<<)Q$roT}JU1b=3<(b{tkFJesDnEh>7j+yuul0`3!49k%Vj3WWdrf(659TC#)|5Z$ z!F&VsH_Ef;M85cZeap$3)u>c|=e+%;53P_B89boRshw*Vf1Y2Z=V~u6L`ebq>*MQ+rjGr|w$+6y z4gCf4**2e!8Bs4}VpU3vy?m4M>aV09uQ5RG`9s>FDh>Umb*IWopFt-AtW_xs?d1-= zn3Jpip8K^KqkH-+{pw(q#%_B#5gMKJH{(Y(dS=r7x^cJVIx@?O%=Dh2&@{6VI3?OmJH+fbF_S6hBY4bxxX-`F!HAuGJi z$|{W!wPo)}biV$||M|6bn;h}D*S|_*k(?CC`~vhh+4nd!s-Li6`E(oR@8#QxX086N z`;M0nezt3TqE%JOq=xb-6z;0O9e>$(&&zo~n^~2{&W1~)(CPZ?^xIq6BzXTYvq6=D z{=$9Gqe=a1*L~}JRZ9IvazDzezoP$i`0}a#D^I+v($HVx|1P4H?XTUsAE`>oZ6vQm zURV9K|Hac>8=&adgqpCF2ZwUy6P4fG*yOS>!R;AcG z%1wJCum1IcI^Uf4>G162vnq{ln7K_b*t4@%w7D@m%DyV4Q&Tw=d0qAI1B@;Y-xlK; zbXR0SSc|B;M>mz%^k%*;`rFJ$;=KQEH+Sa(WkUIr#$EYgZ_E?@lK>6tZrzi=AYEMm z6a}pk5gYn236<$@N-x@V_;5;dpV?KF1vHa0p&`aJlfNFyoaER(tiEe*Gxc@VKew?i zo7GIljY~K7o%|SgCB;AGW-sJLLz%NuNK3ttQEuw%=h=H>Hf|Q{Jcb!?EHVSFo8JfB zI2{@^Gj6&&*SG6jTZ9G{ry!^-MG9SGoU5B#x_C@jqND^;-gR#Bb>wy31`S;M3mX~Y zn)GWjqfBJMUOq}6>~)jt_Qi}m0}Z;C41LQzKX}J)N7d2;yaI%4NNI|c5FaVJ@w8i? zA_eO!Eua{H|-VRgr=InBp3;QGIVRw1u5E%W>2mX}1e1^cB)WOI4I0K|`L zE{`Ri+gx5vTupa!)xSOwwA6En`{DYid#X1sjxa^nu(njT7=>~Be=@AR`OrgYosU-_ zcHu2$w}EJt{w0dCd6R29ikBveSl*T1#HT0Z=z*|M|D?o_fhYS}>VEzO%D^R^YRPIN zuN#Q2P4FU1{A9_<{vxAGF$M_VlaR9pp-BDv5zCfzIdXA# ztP_gtH4%5ooiG?AqO@HUj9n&oEyU0 ziJJoDXG2)DtNw8ZpYRV`O`cJ&v0|puk7z`y8D^=A&Yx#KdKu+7Y0+}^Sk~C}HLimB zPUh;aqJPohol#4+?)|C^TO+hf*<+=I$eFRQ1e4?KSXh!5BJYEA)ju{7llb6el=N#`X@BcarGjNGof;qIFxlLOwNhJkp5%sR5`XG!i>)H zb(H0ze|aLbS>*8i#l7*Q2tDmfUiH5hKDp~q)>!KqQCoDiMNsPz*Vit8%FNQ1+&?aw zVs10Jbv(N)<^;(v;;}R~=%V}*D4gh;a_;u*;Xf;8E1N)9q|m~*)xPPsbLJI!Ry7e_ z)@K;Hu&Ab-X@zXvMJ^<+t~XAu-pGmFUE$kVV@nfy-#dn!nn#CrkryVS)+lJurr$f` z?D9p9Q#w)E>JHwlrNnJ)ao>LCguO_i8H`T0c9C5ZFbuiSpp9eyio-kh+Ki-aHZ6+K znB7GlkN{u*Ri2Rm=WftN-kpFckLc>dF~a&cGS<&o)1qC!btWw%yxXOl96cQ4mfTHk z)(2xJLhl#ocAQ5s=e+%BB(Qy@1JBTFK5T8MPD9uJgUri{YrbJBOrPU;UF(t1|2M zhseXwU9a~|OmL+P>QHrW-^d2_Rmz7GVSKeH`Dr5S5f5jE^lrc+uKg-6?EqlnOj(UV_0wX5~=FTUt3sXagHQEv!FY)sVgp) zWbcs}SN%I5&h_i3Mz^S={MF zN?i=h)5=L>4#h56FS22X!RD!OMn8GYDCRVF9e8cV&IUJMQG8l`{KWGGvCt>@q0&s3~XJR5Coinh93?ytJpgHc0cZiF4^ zuCz#TmD}>bQP?lxl938U*VlH4UKE+_`kKnLiKcaoc)7p)6IH5zD<$q&z@YoRD;}Uy z^gVg7@-winwhnX`(+A5ttt>=@+x~2YW8aQe?oJdg{5oJ);8AZohgZK(ZDQmuqtO>m zG1#M_FG|-Q@-2$~SEjI#f4wCdFc$6mKes~i%CXo2VTHahmc1v=ik5?y}{;`~12Zqa&8n(|uBWZ7i&0%T0ycc;jCv0fI!d0W2{Ae70 z-~3~7SBI&^-IY71;`fdIWu0A4N3Wkd_u^ZWs_Y|z@HAY`N@czU|Kx52d|!Wtp0Vs~ zovE|?$aPs}f_f?a=eK3-(be_Q)yMDof111HCT3DQK|OvPt~_omj9Rqg+RgJb9*XQT zVj9XV(pVF*-UzvC8m?>K$hm2(huC<8Y)WVNd6LHJi=#)#kC5h?oT$zQ{bPeaF1?)` zGHQ4ERc!L2gF|Z^a9bs^ZWj4z24+9X_s?X$cDD3v3CHmqdbsZ(znRH8h`7bN zC6jp225_oxnqy4umk$0e zH@72#t_w$lM+^?15OU?I*4i0Ycjb>~Etu2jv`lMq$I*)DqKb~W_~M*AViI%QwJnQX zx0TBdG8d;mCU*2xbUd-r`pOY!S#zxbU3h8%MFF=sy>gQC_53+`nbvH1+C=8+qE)BF Rph!ikS$ucBJ&7g8{SU~j-xL4< delta 20531 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 N`Xq4Mt|FC@{$F!z;hF#d diff --git a/package.json b/package.json index 2015120..2d9c4cb 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,8 @@ "vite": "^5.0.3" }, "dependencies": { + "@ffmpeg/ffmpeg": "^0.12.10", + "@ffmpeg/util": "^0.12.1", "@fontsource/azeret-mono": "^5.1.0", "@fontsource/lexend": "^5.1.1", "@imagemagick/magick-wasm": "^0.0.31", diff --git a/src/lib/animation/index.ts b/src/lib/animation/index.ts index 6392734..6c8fed0 100644 --- a/src/lib/animation/index.ts +++ b/src/lib/animation/index.ts @@ -67,7 +67,6 @@ export const blur = ( ).matches; if (typeof config?.opacity === "undefined" && config) config.opacity = true; const isUsingTranslate = !!config?.x || !!config?.y || !!config?.scale; - console.log(isUsingTranslate); return { delay: config?.delay || 0, duration: prefersReducedMotion ? 0 : config?.duration || 300, @@ -155,7 +154,6 @@ export function flip( const [ox, oy] = style.transformOrigin.split(" ").map(parseFloat); const dx = from.left + (from.width * ox) / to.width - (to.left + ox); const dy = from.top + (from.height * oy) / to.height - (to.top + oy); - const { delay = 0, duration = (d) => Math.sqrt(d) * 120, diff --git a/src/lib/components/functional/FancyMenu.svelte b/src/lib/components/functional/FancyMenu.svelte new file mode 100644 index 0000000..bfff5e0 --- /dev/null +++ b/src/lib/components/functional/FancyMenu.svelte @@ -0,0 +1,76 @@ + + + diff --git a/src/lib/converters/ffmpeg.svelte.ts b/src/lib/converters/ffmpeg.svelte.ts new file mode 100644 index 0000000..95cda30 --- /dev/null +++ b/src/lib/converters/ffmpeg.svelte.ts @@ -0,0 +1,61 @@ +import type { IFile } from "$lib/types"; +import { Converter } from "./converter.svelte"; +import type { OmitBetterStrict } from "$lib/types"; +import { FFmpeg } from "@ffmpeg/ffmpeg"; +import { browser } from "$app/environment"; + +export class FFmpegConverter extends Converter { + private ffmpeg: FFmpeg = null!; + public name = "ffmpeg"; + public ready = $state(false); + + public supportedFormats = [ + ".mp3", + ".wav", + ".flac", + ".ogg", + ".aac", + ".m4a", + ".opus", + ".wma", + ".m4a", + ".amr", + ".ac3", + "alac", + ".aiff", + ]; + + constructor() { + super(); + if (!browser) return; + this.ffmpeg = new FFmpeg(); + (async () => { + const baseURL = "https://unpkg.com/@ffmpeg/core@latest/dist/esm"; + await this.ffmpeg.load({ + coreURL: `${baseURL}/ffmpeg-core.js`, + wasmURL: `${baseURL}/ffmpeg-core.wasm`, + }); + + this.ready = true; + })(); + } + + public async convert( + input: OmitBetterStrict, + to: string, + ): Promise { + if (!to.startsWith(".")) to = `.${to}`; + // clone input.buffer + const buf = new Uint8Array(input.buffer); + await this.ffmpeg.writeFile("input", buf); + await this.ffmpeg.exec(["-i", "input", "output" + to]); + const output = (await this.ffmpeg.readFile( + "output" + to, + )) as unknown as Uint8Array; + return { + ...input, + buffer: output.buffer, + extension: to, + }; + } +} diff --git a/src/lib/converters/index.ts b/src/lib/converters/index.ts index d09bf00..9c412d2 100644 --- a/src/lib/converters/index.ts +++ b/src/lib/converters/index.ts @@ -1,3 +1,4 @@ +import { FFmpegConverter } from "./ffmpeg.svelte"; import { VipsConverter } from "./vips.svelte"; -export const converters = [new VipsConverter()]; +export const converters = [new VipsConverter(), new FFmpegConverter()]; diff --git a/src/lib/store/index.svelte.ts b/src/lib/store/index.svelte.ts index 134e96e..c837707 100644 --- a/src/lib/store/index.svelte.ts +++ b/src/lib/store/index.svelte.ts @@ -11,8 +11,6 @@ class Files { result?: (IFile & { blobUrl: string; animating: boolean }) | null; }[] >([]); - public conversionTypes = $state([]); - public conversionTypesReverse = $derived(this.conversionTypes.reverse()); public beenToConverterPage = $state(false); public shouldShowAlert = $derived( !this.beenToConverterPage && this.files.length > 0, diff --git a/src/lib/workers/magick.ts b/src/lib/workers/magick.ts index 9fb783c..2d568e0 100644 --- a/src/lib/workers/magick.ts +++ b/src/lib/workers/magick.ts @@ -6,8 +6,6 @@ import { } from "@imagemagick/magick-wasm"; import wasmUrl from "@imagemagick/magick-wasm/magick.wasm?url"; -console.log(wasmUrl); - const magickPromise = fetch(wasmUrl) .then((r) => r.arrayBuffer()) .then((r) => initializeImageMagick(r)); diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 32ffd0b..dc85a70 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -5,28 +5,40 @@ import { quintOut } from "svelte/easing"; import { files } from "$lib/store/index.svelte"; import Logo from "$lib/components/visual/svg/Logo.svelte"; - import { fly } from "svelte/transition"; import featuredImage from "$lib/assets/VERT_Feature.webp"; import { PUB_HOSTNAME, PUB_PLAUSIBLE_URL } from "$env/static/public"; + import FancyMenu from "$lib/components/functional/FancyMenu.svelte"; + import { writable } from "svelte/store"; let { children, data } = $props(); - let navWidth = $state(1); - let shouldGoBack = $state(false); + let shouldGoBack = writable(false); - const links = $derived<{ - [key: string]: string; - }>({ - Upload: "/", - [files.files.length > 0 - ? `Convert (${files.files.length})` - : `Convert`]: "/convert", - About: "/about", - }); - - const linkCount = $derived(Object.keys(links).length); - const linkIndex = $derived( - Object.keys(links).findIndex((link) => links[link] === data.pathname), - ); + const links = $derived< + { + name: string; + url: string; + activeMatch: (pathname: string) => boolean; + }[] + >([ + { + name: "Upload", + url: "/", + activeMatch: (pathname) => pathname === "/", + }, + { + name: + files.files.length > 0 + ? `Convert (${files.files.length})` + : `Convert`, + url: "/convert", + activeMatch: (pathname) => pathname === "/convert", + }, + { + name: "About", + url: "/about", + activeMatch: (pathname) => pathname.startsWith("/about"), + }, + ]); const maybeNavToHome = (e: DragEvent) => { if (e.dataTransfer?.types.includes("Files")) { @@ -78,54 +90,7 @@ - +
    {#key data.pathname} @@ -137,7 +102,7 @@ easing: quintOut, blurMultiplier: 12, x: { - start: !shouldGoBack ? 250 : -250, + start: !$shouldGoBack ? 250 : -250, end: 0, }, scale: { @@ -151,7 +116,7 @@ blurMultiplier: 12, x: { start: 0, - end: !shouldGoBack ? -250 : 250, + end: !$shouldGoBack ? -250 : 250, }, scale: { start: 1, diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 14297d5..cfce393 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -12,13 +12,22 @@ const runUpload = () => { files.files = [ ...files.files, - ...(ourFiles || []).map((f) => ({ - file: f, - from: "." + f.name.split(".").slice(-1), - to: converters[0].supportedFormats[0], - blobUrl: URL.createObjectURL(f), - id: Math.random().toString(36).substring(2), - })), + ...(ourFiles || []).map((f, i) => { + const from = "." + f.name.toLowerCase().split(".").slice(-1); + const converter = converters.find((c) => + c.supportedFormats.includes(from), + ); + const to = + converter?.supportedFormats.find((f) => f !== from) || + converters[0].supportedFormats[0]; + return { + file: f, + from, + to, + blobUrl: URL.createObjectURL(f), + id: Math.random().toString(36).substring(2), + }; + }), ]; ourFiles = []; diff --git a/src/routes/convert/+page.svelte b/src/routes/convert/+page.svelte index 81f17f4..29fd5e4 100644 --- a/src/routes/convert/+page.svelte +++ b/src/routes/convert/+page.svelte @@ -1,15 +1,17 @@