From 2d9f441a76ecf2aa961032adf3c56f22237edba6 Mon Sep 17 00:00:00 2001 From: MrDulfin Date: Sun, 15 Dec 2024 15:34:20 -0500 Subject: [PATCH] Added default image when none is present --- dmp-core/src/music_controller/controller.rs | 13 +++++++---- dmp-core/src/music_storage/library.rs | 7 +++++- dmp-core/src/music_storage/playlist.rs | 1 + kushi-queue/src/lib.rs | 2 +- src-tauri/icons/icon-stickless.png | Bin 0 -> 29586 bytes src-tauri/src/lib.rs | 24 ++++++++++++-------- src-tauri/src/wrappers.rs | 10 +++++--- src-tauri/tauri.conf.json | 1 + src/App.tsx | 2 +- src/main.tsx | 7 ++++-- 10 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 src-tauri/icons/icon-stickless.png diff --git a/dmp-core/src/music_controller/controller.rs b/dmp-core/src/music_controller/controller.rs index 41411eb..1b40033 100644 --- a/dmp-core/src/music_controller/controller.rs +++ b/dmp-core/src/music_controller/controller.rs @@ -117,7 +117,8 @@ pub enum QueueCommand { pub enum QueueResponse { Ok, Item(QueueItem), - Get(Vec>) + GetAll(Vec>), + Err(QueueError), } @@ -185,7 +186,7 @@ impl<'c, P: Player + Send + Sync> Controller<'c, P> { loop_: false, shuffle: None, }; - + // for testing porpuses // for song in &library.library { // queue.add_item( // QueueSong { @@ -267,10 +268,12 @@ impl<'c, P: Player + Send + Sync> Controller<'c, P> { let QueueResponse::Item(item) = queue_mail.recv().await.unwrap() else { unimplemented!() }; let QueueItemType::Single(song) = item.item else { unimplemented!("This is temporary, handle queueItemTypes at some point") }; player.write().unwrap().enqueue_next(song.song.primary_uri().unwrap().0).unwrap(); + player_mail.send(PlayerResponse::NowPlaying(song.song)).await.unwrap(); first = false + } else { + player.write().unwrap().play().unwrap(); + player_mail.send(PlayerResponse::Empty).await.unwrap(); } - player.write().unwrap().play().unwrap(); - player_mail.send(PlayerResponse::Empty).await.unwrap(); } PlayerCommand::Pause => { player.write().unwrap().pause().unwrap(); @@ -441,7 +444,7 @@ impl<'c, P: Player + Send + Sync> Controller<'c, P> { .unwrap(); } QueueCommand::Get => { - queue_mail.send(QueueResponse::Get(queue.items.clone())).await.unwrap(); + queue_mail.send(QueueResponse::GetAll(queue.items.clone())).await.unwrap(); } } } diff --git a/dmp-core/src/music_storage/library.rs b/dmp-core/src/music_storage/library.rs index 284f6d5..587419d 100644 --- a/dmp-core/src/music_storage/library.rs +++ b/dmp-core/src/music_storage/library.rs @@ -1,4 +1,4 @@ -use super::playlist::PlaylistFolder; +use super::playlist::{Playlist, PlaylistFolder}; // Crate things use super::utils::{find_images, normalize, read_file, write_file}; use crate::config::Config; @@ -822,6 +822,7 @@ impl MusicLibrary { fn query_path(&self, path: PathBuf) -> Option> { let result: Arc>> = Arc::new(Mutex::new(Vec::new())); self.library.par_iter().for_each(|track| { + // dbg!(&track); if path == track.primary_uri().unwrap().0.path() { //TODO: make this also not unwrap Arc::clone(&result).lock().unwrap().push(track); @@ -1235,6 +1236,10 @@ impl MusicLibrary { Ok(albums) } + + pub fn query_playlist_uuid(&self, uuid: &Uuid) -> Result> { + todo!() + } } #[cfg(test)] diff --git a/dmp-core/src/music_storage/playlist.rs b/dmp-core/src/music_storage/playlist.rs index c4c0d8c..30611d0 100644 --- a/dmp-core/src/music_storage/playlist.rs +++ b/dmp-core/src/music_storage/playlist.rs @@ -48,6 +48,7 @@ pub struct Playlist { play_count: i32, play_time: Duration, } + impl Playlist { pub fn new() -> Self { Default::default() diff --git a/kushi-queue/src/lib.rs b/kushi-queue/src/lib.rs index 8bd2668..bbe466b 100644 --- a/kushi-queue/src/lib.rs +++ b/kushi-queue/src/lib.rs @@ -425,7 +425,7 @@ impl< use thiserror::Error; -#[derive(Error, Debug)] +#[derive(Error, Debug, Clone)] pub enum QueueError { #[error("Index out of bounds! Index {index} is over len {len}")] OutOfBounds { index: usize, len: usize }, diff --git a/src-tauri/icons/icon-stickless.png b/src-tauri/icons/icon-stickless.png new file mode 100644 index 0000000000000000000000000000000000000000..f87568c852844f30495f3957f44471281d110573 GIT binary patch literal 29586 zcmdRW_dnHd`2T&5b2#>~N5&x`*)5reh>*Qyl~JreLQ408rmnQ`Q3j4n4vFiWK_T^&2{Z zKFHnFOg#ahX+8Uab-EVXLce75QZez;ceVHOwehe6zP`Sq4_zL4-nVhH6Ls})$XJ(U z2LJwB<1X&7icY-U(ly!`K|8M|TDXIAu~{%2{{o@^g44}vwyhBfLo^Q{pQ>$69G zKNBEM)hezDw}CaCJ&;ErK`ZpYhh_%QSE}dO|1V$Q!`adO+adt#!bF?6Ejo*l{oQo#_4wJlc+v%Dh7XuHDO6#o%~B}(l!|2B`^t#Z}&Em@q(+&%1gdDZ+6`O`+qCK;FnyDNQDfEA~N5SFHb)tZ&Rs0>&q zKZnK=(n7e)$il6ko)@6epkYU#(np&^e*c-h2Ah>4cds7@#lW^lTD4 z<=}uc0-a%sg4W~@j;1BwkrrvY^&U}tVQxk3qxvYDfx1Ra;R%ny6$K%p^e z$DSEZ)!IhQ4B{S9dU`Itm)7O+^?|f`)xJ8jF|T;Rn}*S0?-gnuukYei`b^A# zT;N@M=4sS-uy-H)q$T^|C=2dv^Tx@)D(wikma_(9knMUfZ>wngs zs`}hN-Y0Y0UAov&t!PVo$ zRpa0{uBx3J6CuZYAN^LU^J4pv0lF1%>wf7s%UrE+27+zH<__<7c;f{VjI=R#usO@ z0iH1v*#qSFbX*lXijA$R^ia z_jYrp_?VCLiwZ;$NUr)8Eg_DkLyqU6Jno;e7qxYk0=u{@8FuZ^@ZKu1qmPd6-j(+? zY37*%EfRx_MC8o)=xQoA&ApSj0BGMhP5XIu-lLSb_|Xc7ne|$Q_l|0sOkZjfXZ~a~ zhUckj|C?lbOTizfX+P-5vt$v)GX_3#G~EENWJ22CAT5{`BT_Y=H)MPZ`5XJhNfHL> zDygmHxki-;+OI*`pO>^ZclW60&W3uMHMZz$?9Ze3Yx@N@sLR&HjC4VaFV|byL=a&H z?&93Vas=zTN@S=%Ny7m-=p*NG`DWi3ofDAmTUVni@c$@qpf7MCK+jJ%9qv04_=^i-A{yg@D>Z4=Rqc&QqYBrQ^`Q&6-ec& zpfi$!>vTT~{BXn~pD0^??#zHF?=_KFSeUaMPLj`O;(MlQM#OvbVV_sS3ye`gycv^6 z@5{(qG$WAMHnvIP23%);xP$uoT{h)r_5zACv-l^2C=#QORE-(nfOj`V zthF8z){4<$^17Yg6T*hux%a31fDMM@T3;S3e&ca*9x{z|s@I62XNGR1vrd&*A-WYDz#>(FmH zimfHc;O`LUi-yiA=2N`1Umln7ojSTM@5?9{DOugc8uiZydp8E(6T;si>#$l*%VzWP zYKhPKNu7bjb`;^6O=?!hVW038 z`?`uK#n6|KNQRY>J>xS0%4t_0T_YNy+&})>*CGL}__xbn`Q!}6pN|IF74>lCdUFp_$6l?i5P*9uaPx8*i{Pe>rQ`sx~^W8J6k%`5APM?q_+A zynC8bj$FoM0A@9eFU)ICgEg3^$TM(!>`yVfTF%JBpM2!u+M!46!WLsuYvZAF^Dh7$ z-TGZ9cDP!skEDe8k*vhTr9_3%3^K-wFPC$l${D$h3jDqPN{WhCmc-g|gyc4S6&527 zssEc0{}4N{bSpEJauOmH4fJHAn~lxDV^d{*qjywh|bJ|sh0JWV%CqgJCB{vGtk*9gl52ZxVTt;x%tY`QeomTNL) zE|qr%VLw&$SZb@Y_+NRmX=ct4wL;AyRsB=lYf8sKp5Uo9P$WVGLZN#%=FK;H$#r6$O$?F${>@Y>@G7QU5VdZgI7XI3(uEA&YGH$BE4m7egv z>HGW(%hYvqZclwD`bOz8cUJVJHnXE~ggU+Pyfo#aYm;!@c|<2rW^6@k*pBsO$=w{* zxu=pmPx+zNh5Ciaqn#UuNg(IjQ8;SiO($O5LtoZrT!vzw=-#p^9-Ug9O-s^gq?5%O#?1EZg}sIdCQRu8|G+c_UD z8!No?PMp`z+d_HPeKG%`AA33cmz=4A&Qm9G1i>7KID zVWE@JVX4O{V@$kz(@-Q%c&?X61@?h5GjE>OtvV6YdwcYqH7cr!ijP*jCfqyYVfhr2 z<;kMk6_51OEK-%Ak?#~O(>@iARRA0hi%70DAYFrIP?rDtTDw>2<4?{5W*`q4*jyCP zn}&aN$QdzdR5+ygYyw_a3VvitmVNr{(;KW%doA*(S>K}Htgq)XV}cH6;D^lcSkcTU z^+eCa;t{aCI&o-V{3|uJNW3Gi6^_9}q5Ho?y^FAPxnDnjvb~5+P7qy_qT7{goO@E8 zn|EIeTZI2waJWA;rDL+1dZ#GGa^cd}z>TZJVib=TrC;`cnH5^FU7OSU|kuk}H9%_E|O4(rQpr9b&KQnZC zpnzW+|5ulyo-DR))a)x==1^cc|8Y+F5vS;3$v-K=B#BUOz6@kCSC_}Wm_TvW2+HV7KS+_W)Oi^h&gK}V_jaV5 zc}yc4;lGeC=DSxAN7l5l94buJ()@S-+dw|0Tc6yy&BxjkbjJpYB{Q{xBHKPo?BIdw z^wmX@zI{P*3cg%oON7V3Sz@A0zaaqNvv#0N9K}@|I0c0zGV3*TP#}kc0y@4C#ft@3 z4qbel)o(}CuPigw?R(-#jV3|MjQdYl#ZePRJ%t> zZ!Yli^p^Nt!e-fq1oCPMT^%4#8X|Y()i zFJ7?qhCmXR(;?0-&fr(!8&`Orz;O9>haLP~w^?<$NQN_^9N6gE@$bgx=S;U}=5gnh z`8|8Qautj4>sF`BdsTKgwnz8Gs7O7UW*M5kUe3w7-1M5EspxWKw#3*+f|$en1J6&$ zk$1#OZif)hf%}i1k_j3T^mB(!IAt0R%NP3TRX%0swn_NKM;>`cj!QOa##PaMp@oy& z=zq!(sS+Y?e8|SY7O)c6B}M>A4Sv!yrobe0E24|Yj*VSZypXh{aGP8SWv0YO2LQ1I z@RN%~DsJ5&sLg6;N?&dmx%^aM8HQ6?;wWNydfSzl*V}D-%@qo^VJXAM@ zpFW(Pl2;uFZIWvCwQ)OCp1l(?-Auk7m?@oCNOH?KmkTUiSH9N@l@$o-)$q(_I7Tm~ zx~L2EZ-2WAtD%q;7F~+g#y$BEV7b7cJwyUx7tWpZFw(V5Ag!xhIonXo;D^#O6|SnP z`vUHUq`Wn$2ljDENXt37R+BP;dk$bk!dopzHCOIw7p24vG#bEiQ~uvHNy$$8dhoP* z+F5rxlhFDk@JBV9lIC|#JKaglAtxgIY@+2QDN0^yzM>kLU>DosPMBTht<#c zOV>_=ECbs8D*(9NmDa3rdK)#Afh?6GiWPk5vc2}L&%T;#bHcP2iW%r)+QtM^K|;BB z&h#p&+=OyRXNEm?aG`weh(ktyQHquT@1d-dhAF+_n(v z6&6x)uH$DYGI)cf?(p(!hE#wBtg%_#H-eBt0S+Y=2A=S!->%tUteJ194 zQdo~n!N+{jyWEY|zvT0%RSVwqpUb=X;=6pPSwU`kM!_O|x;eNzUtfDjpDiG?pOj1# zTNMFJCjOKLfmBP)or=VhV9OJ>_amNKB3C>TZvRNStXO({4q?*4l-^tLPtk{!3DOjt zZ~Y2?5d{t_i@Jz;IvRtxcW34s;-1>r3X*~+<)OJ;dMwf zOt0vv7VgcHL;fu)&}mMd7pt(bbNS1*c?Q6isNOxOF$?(nj^eVvR00x!k7g=w-NWSo z9WLhQ*DNqH)bSMY~fH=ZF&kuBb#hTMe>LtIaQiR3~9X1+A#|T0pT%~5G zJ7h)pa(vQ%uC1kL00Fl7=@31s8;Leoes?7^e*a02hvQ?(;iW##PR1#C3}Q}}t<#czlBgxl6;P)$5^ZzEer}v-OE$OD&y6q%0jCyD=T4kU=Q}fS@ze$WsP(oaJshmNG@@g>< z+~R_kvxAOiH!q!j_#hUI${mQk)qE3EI4~X8Rmh~&o64>hXAR4d!gDE^VO2i+=xzU~MI-)x`JR>Z9cw{lB5CVP&RQ5DpW2do@qIuS@* zhppswk@I+51SNLyCJs(3yJ}Ah7&t9o{=Pvz%<(4H3ExJr#cnYj3 zX8*jy*|xy3k9w;WB}sDLiv-c)&IRo-Q!QZI1Bfr3Zi{PPu#~R0_tF)SElc1wSFwbf zD(VQ4+h?*hTZc|nBE=?+X_#%*XV2wJD4Sdwv?M!d6tX3ur939)&8poe%~5stiuyQ{ zpWc2@(GtFVLs0w2eJie^#f}cIzW_U{A~!<)(a@gH9WMt0D()71{JtJ)D7D9`b5LUR zUf_hM@^!cP6aVsiS7 z0NC==k1PTvOb>gSq}8GdMNG@FKTLAt_Xv#?QaMRm(W&35a}i}NO)V5wVLwUAkBM1u z$ogoHP@vBjT+DjLq2pvtiz`60U7|F6U)Q`&bjKHgu5o0Xv}LC0d=ZFQb|x`ib8di# zi;;1I2M;5yDHI>(WFeabg~2BkTU#?I4Y{v}$rQcdAI_gi-z1D;-C)#)C5wGOKWKS} zqxo;Jq$&uc1n;n(*N#o6;H;5ITvZIEtx;@ytUxwAE%|(?#_RQP28ZT;LIXtXAbaEO z&;858_@-CXuI`A>EVh!s77hd?zc3}~-xKDC%tfkwQOCEvgb#!HT8&oy4aQ-54#h$K zmsQFz*6;j(+$NvVHIV%t;&QH6P99Oj0FwKZ=WHtXbEzpo@Y8_J@$uh|piPA}jtq=x zdO|aP^V^!(9l4J_DGGH&HYewWKZ9czm^#1$n1?Y{&A}-F^;g?#Ru=@Cbsf}5I7>=w8ert zD4|0zIM;Bt`W=7njGhVpCuXL5gjOgTFyVmqA#g`8KI2US8bv+ag5%%>3rv*8fD(S| z8H>mSu^1U9b8f0rd~GS`4akwr>7dj>0lx1*FdT`?QaiPLA^Per38veRj&yyWX!jU< zg8j-ZjM{Bi2g&o3cHB-JiUgH(I2JI95CC*Aka@o>nV#{2j+|#6t=-LoO^JYU%5%-Z zd+|8;zELxh=nQ>W?doald8uKM9YU$-X(>cz29e2Z8+WfqRe#bnzM7`Si@?=09}|U9 zPBY0jIU&a!mC;iwnqa-jlztf)h!TJl=%<&b*0~(Bc`be4-IExYj|L{cTvOvLX35#?Cf{xymxOcOGMy^bgGPX~_h^euGCuq}@fV%6 zH|dbRS?I*fI2s%>Y(r|4D3)u6?s|;>y7rcXYg4>fFOKdu$$d1BY8#Y- zY%=3~l7>h_%roR6&zT!=lzo%z;e#8*Opi2WOR2Z^t5u{H6RO`k7M#Ng#_SQ+mVxB)8UhR=se0^R=n1-N0fji{hLM0!9XIkuU>x zs4??Wo6q2VL;oJ5S^*pi<&+G85~ z`O1<<%#ws*)f_1$h{v>;rKkT`BgaW|&76<@xG~()yRb6dtmp=b&^f8!{ZFiFFT(Er z&_ENa6nAV)Vb*6Vxcidd=VCdNj0sq3zaSZJm~s|RvW^pJotk&hIwrG{ds1k`Yl0;* zkPOsWyQ6eQ@J++4>Px8}#GAk86de0z0QQ^-co6v@CH)kNWUEQBj1ghZ07D5sPVnBR zNj{-7rqRCry1FXhRu#LV_{V(ianiTha%%&Q{O)XhdVxMHt5e(MDcH zw{=3uZ5T!~(h|^scaZgR&aq2M`{EUN>>EpAGxH84MGs%MdY7HF}~{?^!l|d# zT6heejr6wyB&pmkVCkSpJNf}V278?BiC3v;7b z3-%6D(vvQ#z--buuo~oHfI6KWG2aMXSZ4DpG82QJ>URK zPMb`sQ~N-ugz``Kyg3-QK}0gsLy+t(#|ui}@aJ@o-p_gZxV)F3u&o1ibPSxt ze4v@(`a&c*P?Pe`ojr<929c#rck8D1sl4xa++`|$ACCKq;-jYs!4{l`q5&@ekmHTt#lt8XVv%p;fsgv=n4t8_0H2EZT!I8`41b1^j)5GNReGz2X zWeG@N*|j(7xAE2e}(Ir|1nt%MxQi4bFkocCUFDeof%fI zF*;vkG8@jy;u=$P$B?9Sql+Nop9)HOjS zguZrSPUH0r55xtd$S?Io-B{@0A>akiOk@g;DTsCTYDQeN|k3 zu#|z>d=R5gvnCUZ#}t-^r^)n;sRwgf@37fxMW#tOuPS6;&n9hqI8JC~Mz}b=vEtmc zu5S~4x)vKj1`UdY27Rkiu!TqdxCnbUW{wS%;{b1*p8gn>nfc+TtWTpd{%^njla=*x z`sbzsi<|Xpyrpp7nd^ZBB89OgA$KW=AG>B*bRKsDh%1|bh(rVO#1uh<{0J4fm7FsMi47;g{OE7o6Di{5C{04k_a|5~z)CP@S4^eDE0 ztVu)(uy&b3TlNc|R8`dR%d7Muq&e@qJo;gCYMLK8ab5Y)6r;Nkc~|@4N%nA7(X1e;!}QyL+`J ze<$Tan%n5!&@M9q!2r#{nbS~~GJs-w`t;#9coX#z3a=ja&^;_NOs-u7jCXcc=f*D2 zqa10dzc@+2+F`gMFtldiAVxT&aS!WN`sDZVn7+x~Mh}K*`u(0t8=d9}_ZfbqJP_Gj zdYm{K!d!*fEO*9KAamq_&aQn$_L}ZPiFJsYj`zyfAeeohRv}rF2a)?J9m41M@HYQC znGut}%>xgR!&!_}jMQ+ZHeMDAR{MThDi4xEN`G3OK;;)+rKBO2oP4{Ekv6u@uLCsm zWvAvth$~EpFtQbuWT^m3%dS0xSYk!Hk0R~G1k7o1@-g=^3E0vwta=8g#3e!19IM-W zZ{`YF#4N@4H{3IY*ETbWVkvw%x6m)atL$db3 zwVRo!1TbeTV1qV6{ZY@p+tJa(NI@{+gW=c;lxM;Jj{eGcIa3`sklUk$2uN>F2BwPu!-$XA zA5+F0jN1EK&DmN*GpW1vuF=|^wCPPq_gY|$bc}QO7rAn%2nck@AaX3f z=b$9-=gYwB1AJ)_ZpXMowD{%`fP&YO_$PbyP2qLi0;c;GqTL?6>07)X6wZLSs`nr9 z*kZT;W4KLE?gT zK}}?&VwtSO%xgs1O?<-n!pZXtr?iD3-4Ws;B?FdcB~%KiKv#K|f18NttkVLat0vnU zhHtsK5sEi0_$YvTP?*A5U`$_yDYU=&9U`Uzd`bx@1w)%lkD+5jN|@X0K79DN5tJ!G ziNah!R0<2iK5!Enu&f%JwWyj1NKY*LOR7tq@{X#)@QheH7)~h$#?y36YF!-W< z9CVA$$*EkOAv&*Sbi^huDCeAdRo(JyR`7Izi4n?p-?IV zxytF*f1&ZTRzPbCzvw9-aM~Lv8d~Fys2qUdmZ4x7!qXx8WYaq+nKeaW9B;o4JSqM` zl%|9aTp}tgE3cUlRopn{B5MhmT2lwdi{%Gm2{Y98=WpGu+G3*t z$;vkJ{QB__ZsU0MEuVw1WgT|djUN-Sr(kn4JUj=A*@Vz`#G1w?rr~{}cm0ODKw+Ru zDolrv?EiPlKXB#J3AEd-$A*j!5szWwu}85WX@P!jk|)sE%kd#XIQtgZESelvw7()r;NC*OZj~XQ6BeMs%ISa>JRML!aBfL$_m7*6Y`a$JCVJ z)+2UoU@03@=w$KXG@tr?mGjuxpBZS7PMN8X{WlY{magAfr6`8#`EU%zsFctvWA}En zjKme6D+Obp6qBi8WpL1nuOrbd0bRLRk#_o~^@%m+>|}yGUp>O*VpYWsV0`FU-02{{ z0}I;CGY(j4zZ#FL5sXQgqoKs%FzjX*p2PZ~_F_lJ=AbLSO`jBZYaHob2)d@=t|KYL z_XK652KBwFF#Te39IvreJ#UhMBJWXj<)iDw-d|eu02)LsKQ2XbZG2n+YHY|1umPrO z${@>j_GRnumA)CbAd8UVZ?j~u7dx~2m`V$6a#aKYuE|uHYBJp|Z=24sgFu#EJ}&b0 zXYi~BAIAI80Yp4}$pV?zG7Q@~k+)%iNG6Dyt2;EtM=FL*ets@b`Wsp6yh%n~@#;EP zeo+xu_2m96&_lKxKp?gB-WLZ)6S~5Xq2m~|W$$?b64;A^X`u4TmM&V^nK_74_@k@7#K`%}uRg6g6r{yD(&;}# zY6rbq4=8X(f{X}zGD;xOX2>Wd0$XJk5IuG@{>+3(kp!7;qjr=eYD|1@^!!}^7ve^L zCQ;Zk+!deIMRPOzHlOlOcp5J1K$IauF{MBP1*l>R11W90iOXfqIw4;pE4Tl4wi`6} zh&3vY88Q9w^>N{ttpN^@!XS1Wv1+drehx@ZZZGO)3%?hq;U=N}vwN&@C++4X%|cIe z%<}V;k8}uK|DW01(ibWpzj=;Hd+yl6m}m4g*cB230R{g%pa`E#f6q3QzhZVCg4LWE zH}Lf1-9Krg?Xi=!#5{4`Flkfb%xbagqZm z{dSw6&Hp>Tz^iuScJoG{{0&gH?Qw1bzdmv6sfOGeU^Z4=vlt(rDa3kB7~o&)7Py<6 zOF=awlbjCd3Y+y4o;lH}HhII?!g^pqBH*Nqmr2P9gii;4c3Po0X zyv~R0AH}birZ(L^R)^t2`hQ-7aHMgg_`AG^`QGt<03(gcyn&)O^!`(WZj+1pB!zwmH+nVi5=|ndB|2?wYm7*X zmwJrv6hMM*>4lQKFTq9e)t7`|t7OnoX$LRM$saHh|J&-lmvhdNYb+u{%8mT9)au_! zbf}3)#eqp;am;cB;iUiT)>g}7T5HJ=(IpqByC&Dq(;oz{ja7RT=RlRDAQjE$4=qGy zE)+kvyRm*iw9^$sX=bZ~%Sf-#p8|g1NupsFzNsX>IvD|$L#A&S>d-KQ2BnATKb@VY z9Kq5_WMzv~P_Hjbu-yVuvEh{ZY3+tPHWlf3U>(Vb)y6mVFb%s8OhKhH&UJq}Ev8)> zN|1fl)Q(>8C@7~Y6J^L}>d2BjXnbPKeNhMnFDbdi2nPN&bf#lAj!ivLWU2ucR5T1o z#TZL?$-boqh(3MiS)3CHom7;6rREBR(YbQ%$jVT3RZK+32-fe&PH9M$Ox<*^qc;!* zhGrWC=oHrfdFGLU+aeuVb%-kaH;86)#$N!nZ3-QjFLVIpyk^vo89^x&|04e7zv2KU zHtd7_GC7i`i7JYlUGgi>FN0faW+(GOIw%!1!j$l<^hT6E@>MIm>H33o%|{lGKp~+; zT83cks)+f1;5%UJswgE@ztLAK1rs+>oFP1k@C#k=A zbyY(fW*ynf;xj;Ktl+YdiHyRaw%2Cs&Tu=?+sCJ?GZ*_3Gb9yrx-@dePD|;<`i{mb zUE8aie~~>C8X5ik_dwof4$3Ej!k2B$j$c7NXf0+z2QJ)``kXn$Vg;su3t*T@o83D& zT3$Z`*wM~A#q|PW&B|WFu)E{}eE|}No17aaO9yVu-aak?-!`-iTHsA&XXdNt!!>t# zMB#3%I@wyH&fWt~rnfrn_@>Mf*Y-~yCai@H2PXfl9vM)=FN%fP9Y6l*y$@<$pRl<) zz3Y4-!i~Zhq8A~r%>G3EE}#TftaYT%dNee8yj1T0V43fi=(qm9XnDefu#^N|;VNOi zKGe*}cNO_&j*8VEXRBVn!fd`Iuw3|1??Vk?kD-EJgT2WxN}}9#Z~5ECZUqAqbZju* zyQE2rRJiuoybXe{lH*2CL+z5lyb@ZfNmfjn3tTU&Zer_u!2w(SIk~ucX40F<|$-(6(DqW zZ#K6JH7-YdpQA8DH|JhXU28WUw?a&Ou59DxR>R`(?RD|5ND)-#SWTh)4R}r$grcXG z|M&Ia@XG~j*29UHS2KvwuAFL+J0Xiv4%Z9}wa^c+=8%^DLfp6)Ksh0!Gxb-wMV%N+ z@6JqG8?7beGb$74dvFwG^|fQjz&TeIO#QntQF+28Tj_o72sz>~}FXk=|PBb2N^;Eqb2X&F1T=e+Uyy)zBrZ?;RDUFyG7 zAvN0&%j)n52rvhMZ4c!~|2j3}-D$CRr*rh4cN526mtvrvr&;d)JB2@Gh%y#DGot65 zz3QKaW0f6#3;ot@T!?vxVhwnDIY{%?zD#=RY2x=mA*OB_2rfcX<7$^I|@< zc}sJ&9yq54G5+oj!!X%cR!pqC-!}xtYNeo))3>{X2K2TFG*^BlDlj zRujhW-q3-NlN(jW8!VUpQoBkj4e)l>_O_E zZD`AYPC|`N!CtP)GUP6*u<^f%mpXrc5|W^laVM_$Og~pbADnzHC&8Uq^iNiou3kv% zV$5S+{B2=?~-#HMvw#v>7mY*K+BTeB_@5I(d2#qb* zJs$BP6q#)Gz`T^{a>8<8L*UY0_o?Fg52LMNHzCx?J0f?q!|8eM&jY0f%?BUO(2@q{ zyh$j*ZymFON}5h^e42liW^{;n0NFQRo&4t%sZWliW73zaH*@86Z_$B%jm*s)O^C7>E9ORi3z&t8(VyZU{A$T@g3o zL6&{G-1W^TVUr)#o8TWp{lKG|E<yNg5H ze}jb7QqR8sf-qoIy7Eb#p9J$n0DL)ZVJ;^6r#)cxsK^JytXEzqfJJ2=m0CTjoiwz3cz03PVA2R423XCnhdeF zW2umoTuRv?=0TzbbAc7&Bg3S#^v&QSUnMPy>L*xVM3)gat}Du}g!sWBFg9rxdlwvg z@y}<;_jxtQ8Pd*U;{7E7RPX04A!1K%lUzs&@Y%kdUs4x0n=5?^`Bxngs+TX9x6=Dg zDqB{8*~_m^$=kfOP%B=qP^-Y(+`LX3_9>p=t9gjWJaHwu*tja%ajhsg{uBNOW!tXf zGi!TWJD^78kH71~^beoB#Oc;_?0aDlGtb(IV#md72l}9s0$eoL*n(Z6LY(!jYrE&LbPz&2y^Zp|bC7deXk%mZgNWk-F{@w^11e#QqD7QYo>?xT0I{qjmXMY8@=> zUSlBiqoOksQW3;c_aaS-nYs354X|>nodKjg3G)bdM1)x(adYY%D$VQkw73%Fq<~mh z@bU5smhJIIN%nIqTVJ&sRMX{nkHqXcgrJ5WEYERG%+~4Cr{0)JThs1{YNDgy0gW0v zr}I6ZUZ}U+M(^#aSjhmqq4ikeA3z16$G>}6<|a29lv6(cfee|EVaKX94D+?vFk}5f zt`$t}>qz?5M^H;;NT5egsNvN3CW9hIpO{^wX^^$oNt)2~&6A-DQ&!F6X4<;iHE~er zcDiRQG){q$y#CI#!Y+&c{x!AX_u7(=embQKMEo-lx=@gqwayorAp%Oo3J<2 zCO+0rYs2*r3F?IP;rN74ec4_c-i;f&oh}j-^9|;|iO+wRJ1IzYCVq%F^{qF&X7QCI zXD~RCK0bc$EGVs+PatD7IZw|^8>}Dz??TZGIvDB_RXYR<6g6#^+S7%nIthgjC z{j1Yq4e$NukoBdca6SEJMX&hT-2SJqceCAS)N48T$LS@bA{xPEoFK^4QpYKMu!y#a);KxKq$bm+m-Cxv5Zlpwe7f&6<`h6o_ z5BQD?_|C|D7{;O3snsOq0Z%Te8X3F)JqxL86@7BD(}_?DA^gi)gJB)}V6^Xd=@G@- zME`OsF2jQpQ!)pjxjbGxorHt|VcHy^^DKL>^3n7YPMNH>%YCcQ%XpP%UFcx{$Y6E1 zhYz2W0XHa7_P_LW1mFzB2)G^krdxe%Z)i9;jyt7-Z~ZfQk`+D__SiBUnpfatK5A%+ zgrbTVOpl=Xwh;Us#N4~9I^`XqzRrQ1W6GA_OxcKPySC|wHPcjOsDH!0uH5WvaQ*l{HIVvl(B7-{zo*giLp5$mNaI z(hHBp`0zGS z1Ip$ot_?Y#Qx+jAbWeS}`bhLC6SyC$&zlQ5wM1`k=X%W$Tci|aQxx=_3^+2h5CaV+ z;A)Ni@g21diDy4A-}*kPJxsmNAs2SUeG0#0MKm5-KjIWmIv0!f2?j~eVnQm}NTo#x zDKl{hqMy$dWPi_^!PXV6s#&2>>lQ<(Y{Z)4aLT!nBy%2zvL8)+;c#{z*6tHxADHNv zoD8cTjc*kUzSTM2BT@{vm%`_F*@jM6QwzVzCp@Jbm-uvYFA;{j@L+~#GY~4&DQk)UCo9eHDVtdF>=zz4mh+%Gu^VcKQT5iXo_Y7b023uBavxMR7zO3Hg1H z{A2WU5gAOF@aMeJdttS=K=#1-u5Uiyc8E; zOt~&-0TuTU6AiI46|W2G_q17tqgl>;ll(^cVjYU7dm&csy+!Rm2fbUWHZYx*r3~Vg z#^cW}T9?;NuTcK__E70QeF%yEOI$(64;K3N=`R4GXix z?LGbv3&3t|4OqV>hUC}|R}~C>x>@n3_pf+gMto3b(8Bb<2Nz)pz6Un_aueb5o_+&; z8FB2NejR!m?Bp?D#68b8@$GXnaYwL3rV+WlZL_>@!>k8MhJAgecCp64-Wvy8&Gdso zFaqehczuu9@uj!FY+CCcK2X0fWBB#r-z(yF6iGd>QxayDLq3#H+EoXw&aV6(@u0tw zG3gB(@OG}!u;_Lq;qL@F$G3yo5jBOZudfQH%Hl3~SMPPZ!QyU#8+<-psY8Cag-PP#+^N;yKxvLD3k%aUKa@kih3Bj#zQ}*^W z*Ae1h26taQ%dQ^QY#sQ*EL@ZkX}4F=uY8qhEmI9XzI%UsCihGF{l;iM zr|F2>e|JPfrINZxY`qtP&g;6!;2zbR+<6BChxQK~wl*GU-aliFtJ><$^6`R!kxd*S=k|Z+FA&;K=nLc7>%$66;)y$q(_* zyo(h#BdbIAM33F(P@*N=V$v@bY7%nX&DJNmdfG!7w-(cT@AN>>o@|dtSD#)QI{T*p zbiX&k?A#(bR=z)Mf&|4Twb7jY97Pzu{uFn^?6~EJh?l&`lc)fy_ht#R!#zC9D;=Sh z_ILqorL43cE3}lBywm6(0{k1((YK2*4|3V-^4vu~JjhJE;2rr~f}68U6t`&xmFc$8<~^w_s^f&(6-YB-(#iSua6@;w(NNJ#q_Y^&-FP|GF8B$ zyHRd@P89-8cTH2?;3I*RV0R!Fc(Mh#z=h>^xHfX!j~HT6-Qgn&I`Mq}yNKjDns<=<+-jxZ z3UDxLK9l)^nGL2R%RcfVfT!&zbgz!KV)Q*(rrDij02NV!GP_Lj$3(>lPm1{9>P6zM ze`NmL-|YMO&!{bWI*Q*zcsd%|)BF4kD^ijO%7J((Z4}4#=*^euH$!%zn?|Cce?vb% zK9AZ)Su>M%OTY|bNC1dqC6!0bcxuJ--vW&Lr}5*4Za(`8v3+_1E1wJ=ver4KxDDhEe zJDbM(Uc;8jOtUqqb|mWStggn%qk042$pHtF@){V@s~20c&Ox~P2v*;=`x8)T#U0AO zq)@(C%PTM+lW9y;_AI#ci2XyxF)uoc8NMPAs#BPuB?MCnqf^)YdZq?SpQ`g#T1&v- zb1fcPj9RxuPs3&>jIJg((SQZu#W>SP>6~Qr<;OJEq5FNgLxY6X6m6H?S`kTaRZw}z zp{I|Cgg@cAD;>CuN7@&r?XFRM)XslnMX0<*nc)6L9N5sEkFY>K{(`N)l|FWT=0|1~ z0iXpjH0WcPWJp5llm=eZKM#__CUmmwFfAURvXXcHFi(AE`W6?mlWB%qikX2%(N+%~ zJ~Vpg>s0p%&LfDXlkt+r;R=6J)|Ff(o}+N_)!)@<)1I9Ab5V~#k0sDa7N0VCvwtV@ zXO~E?k-y#SYdntAleBRCx+iY@he9Te8{HblzM@5C_8R?p^QPuv>F1YrS82_k(v?*eIU5}& zZ~>%XhNI2ut5TbcPZ}&0xMNS!+&Mce0r(tEnP=GRFzP=?f6x)-SHJK4ib)SI5G54Y zmQC?UG5_;d#(ss^>wOv8I(_$;O_E(@BHkRO*Gsg32Z$wb>a!!hqX$0nIhTH0HC)Pq zIvs41?bvH7UJfO`>&r}GbR&L$yjvSZ6`{OHc<&z;?7xFhIUko9Tl|EfzCG7>!)(Aw zvD^((!bvF&5Zg)-E87A{#~G(WR}qa7FSIp1x^)6aWZ`Ft9B^4i`d?E$gP4Wm8XDXt$yy0pf*MKA zIRYR24L2y!-L>Qk`|m*mqFV^+aFkYyBJ4;2Zxs^GdW3LEP>)u4_fpnPS`!~);`r?B zwnL1A+9oPYUu2xe#qpB5N9=TXm3IP;Pwy4{ z*)EJaiq>oOz1{>QoztH%N*Bp~xCI4lxQ?TUviQHDutzQp?=n@AG69prqkqMvu%C}C z5yG8PC%sq8p$KONn{er?=H=*ad(T8}r2Wd9)5vHYwpv`Wj3`&7@VSByTo_LcrbUzK%=%{yU z1MrJvEd76fs@7G_K`N;UJ1r_&{#d|!?jd>L(Ob49YfDD|6bs%Km%d-*7m|$Mz7=HL z5SoL4x$oIyVH`XV03-I9Bg?RK@fA6BaO_Yf;VSElDmFYXf%p*IurLiJ{_snFj>iWf z-$I>UX{n>gg8U(#wb4{*;xC#+4(>M?y9fbtxmUJhB5^(J*Lc_xV|Q;4+mSy<%kC|W zAm1T=9;0gq5;?v($JaxcD=!ZJ_*+86@Hws5jU=D53P(e@v}FdQkkyoxnlQPa`j!d> zyOtaSn9Pxuo5(&F>(=&kLtjT}FWw`J@T-g%TXA1b+8;{#9Y=Zd?U#;|8+|$M!>4kV ze1oQ3x6U@gsZPim?qpQPH0TgR%VEMY0R0w9=#cQxh}rVVU(`d!W{=P7jp!PVl34-gRg`z!bRHsP;9Th%=edLJ3XuV>xBR3`;I??{ZRBM)h_Zk`7_YR(A!`TXM+JwSC^h0Z3L;<~=^tdrO6XxGPYKYwKPOARY;@ zJf0@;P24j@M9jeQ@vc!V1)4v*WEDox8TTRtkARZ4kBFy7W9PrT$w&k{8z3pyhlpOR z!l!WnfQp2NQ^)mWB8(xo7NsC+0}p){_lERF`#J6YP>gHW)O!*Hf3kYt;N4$JAT}l+ zQFr$Eq!tyEfYK7a0$?8If4IOzVxUn4`zPeXWmo!2QKM~6w-8e$Eo`oPkKP(l zs#ie^lhby6m&YCu76`a(sq^xmhmQHW41n%$lB4{)tSPdPEOF^bZJLzNQmgmbn9;8V zi@By?--O7`6fDUi_qXB&PS0q3*FTakd5M?Qq6Ax^PGBKecjvGBf$1?F0~2k}&Vp_a zi+2eeY|Y_um}@b=vK-L2X@TvMm+Pgt64ia@{liZ)am~%@kN!h;NpU5M2up#mU!m9! zNp5CfGFQaSFn3XXlD1pq-&*o9LSbrFiODIZ^&0Tc2JrnCp7343D&1X*GSrwX#bN^y zjDA||Nm3OcvNCDvbHplBx~(Y6?oFUVb2J_qT-k@3vrr~LmB0+B7R57yK#M}NFIL#2 zHKmpertKQrgu!hf0Bz~tu<$cj%ADISGqAXVxU8b+BY13daps|+#ZPldb_&jzP)eU) z(dy1KK@M6hCG=|lYZMZolkV={O>sM33eS?f1)9M^=}{Wc|@#s=i} z#-?b>Q8@*AIr(xJ(6xChs=jax#F^e;R#AGYyNTzzl9R@ba=xq!K*}{EEhQPjVQeq|Ir7hetYKc!gChe;@|eqw_PYS<)*Tm~?Sy|(L+=L}IcbzJ=(K++h zo=K;DYS|#cXvCp-`l+c1=R3j1{5-RosQKOx=I6)z-purc9)Oc|$>eRt@W$_P9RiUU z;?>h353b|VsW|2^c8=`sI`RaMB3YHOksgqGy6z;LvdHAOh3dWhkzS&k6a#Mp@RdI6 zZp7Ubffi-Lt+#Kx9iP>zvz^Ntjz1#UAgRF0p9}FskGN#)2>C^G0KNtF!>P

e|x1 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 IXgEdwA30^E=Kufz literal 0 HcmV?d00001 diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index bebbf7b..937b6af 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -11,6 +11,8 @@ use crate::wrappers::{get_library, play, pause, prev, set_volume, get_song, next pub mod wrappers; pub mod commands; +const DEFAULT_IMAGE: &[u8] = include_bytes!("../icons/icon.png"); + #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { let (rx, tx) = unbounded::(); @@ -32,9 +34,9 @@ pub fn run() { ).unwrap(); let scan_path = scan_path.unwrap_or_else(|| config.libraries.get_default().unwrap().scan_folders.as_ref().unwrap()[0].clone()); - // library.scan_folder(&scan_path).unwrap(); if config.libraries.get_default().is_err() { + library.scan_folder(&scan_path).unwrap(); config.push_library( ConfigLibrary::new(save_path.clone(), String::from("Library"), Some(vec![scan_path.clone()]))); } if library.library.is_empty() { @@ -86,23 +88,24 @@ pub fn run() { .unwrap() .to_string(); - let bytes = futures::executor::block_on(async move { + let bytes = if query.as_str() == "default" { DEFAULT_IMAGE.to_vec() } + else { + futures::executor::block_on(async move { let controller = ctx.app_handle().state::(); controller.lib_mail.send(dmp_core::music_controller::controller::LibraryCommand::Song(Uuid::parse_str(query.as_str()).unwrap())).await.unwrap(); let LibraryResponse::Song(song) = controller.lib_mail.recv().await.unwrap() else { unreachable!() }; - song.album_art(0).unwrap_or_else(|_| None).unwrap_or_default() - }); + song.album_art(0).unwrap_or_else(|_| None).unwrap_or(DEFAULT_IMAGE.to_vec()) + })}; res.respond( Response::builder() - .header("Origin", "*") - .header("Content-Length", bytes.len()) - .status(200) - .body(bytes) - .unwrap() + .header("Origin", "*") + .header("Content-Length", bytes.len()) + .status(200) + .body(bytes) + .unwrap() ); - println!("res sent") }) .build(tauri::generate_context!()) .expect("error while building tauri application"); @@ -121,6 +124,7 @@ struct ConfigRx(Sender); struct LibRx(Sender>); struct HandleTx(Receiver); +struct DefaultImage<'a>(&'a [u8]); #[tauri::command] diff --git a/src-tauri/src/wrappers.rs b/src-tauri/src/wrappers.rs index cbbbfb2..e591705 100644 --- a/src-tauri/src/wrappers.rs +++ b/src-tauri/src/wrappers.rs @@ -12,9 +12,13 @@ use uuid::Uuid; pub struct ArtworkRx(pub Sender>); #[tauri::command] -pub async fn play(ctrl_handle: State<'_, ControllerHandle>) -> Result<(), String> { +pub async fn play(app: AppHandle, ctrl_handle: State<'_, ControllerHandle>) -> Result<(), String> { ctrl_handle.player_mail.send(dmp_core::music_controller::controller::PlayerCommand::Play).await.unwrap(); - let PlayerResponse::Empty = ctrl_handle.player_mail.recv().await.unwrap() else { + let res = ctrl_handle.player_mail.recv().await.unwrap(); + if let PlayerResponse::Empty = res {} + else if let PlayerResponse::NowPlaying(song) = res { + app.emit("now_playing_change", _Song::from(&song)).unwrap(); + } else { unreachable!() }; Ok(()) @@ -78,7 +82,7 @@ pub async fn now_playing(ctrl_handle: State<'_, ControllerHandle>) -> Result<(), #[tauri::command] pub async fn get_queue(ctrl_handle: State<'_, ControllerHandle>) -> Result, String> { ctrl_handle.queue_mail.send(QueueCommand::Get).await.unwrap(); - let QueueResponse::Get(queue) = ctrl_handle.queue_mail.recv().await.unwrap() else { + let QueueResponse::GetAll(queue) = ctrl_handle.queue_mail.recv().await.unwrap() else { unreachable!() }; Ok(queue.into_iter().map(|item| { diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index caddea4..ae2c4d3 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,6 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Dango Music Player", + "mainBinaryName": "DMP", "version": "0.0.1", "identifier": "com.dango-music-player.app", "build": { diff --git a/src/App.tsx b/src/App.tsx index 5f0ebe2..a354661 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -18,7 +18,7 @@ function App() { title="Title" album="Album" artist="Artist" - artwork={<>} + artwork={Now Playing Artwork} /> ); diff --git a/src/main.tsx b/src/main.tsx index 6c54cf6..37ea778 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,7 +1,10 @@ -import React from "react"; +import React, { StrictMode } from "react"; import ReactDOM from "react-dom/client"; import App from "./App"; ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - , + // + // + // + );