diff --git a/apps/music-player/Cargo.toml b/apps/music-player/Cargo.toml index 107df85..09ab086 100644 --- a/apps/music-player/Cargo.toml +++ b/apps/music-player/Cargo.toml @@ -10,7 +10,7 @@ path = "src/main.rs" required-features = ["bin"] [dependencies] -canary-magpie = { path = "../magpie", optional = true } +canary-magpie = { path = "../magpie", optional = true, features = ["async"] } futures-util = { version = "0.3", optional = true } serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/apps/music-player/src/main.rs b/apps/music-player/src/main.rs index 9814f0d..aaf7e71 100644 --- a/apps/music-player/src/main.rs +++ b/apps/music-player/src/main.rs @@ -1,12 +1,13 @@ // Copyright (c) 2022 Marceline Cramer // SPDX-License-Identifier: AGPL-3.0-or-later -use std::{os::unix::net::UnixStream, path::Path}; +use std::path::Path; use canary_magpie::protocol::{ClientMessenger, CreatePanel, MagpieServerMsg, MAGPIE_SOCK}; use canary_music_player::*; +use smol::net::unix::UnixStream; -pub type MagpieClient<'a> = ClientMessenger<&'a UnixStream>; +pub type MagpieClient = ClientMessenger; pub mod mpris; @@ -54,24 +55,29 @@ impl<'a> From> for Metadata { } impl Metadata { - pub fn new(magpie: &mut MagpieClient, metadata: MetadataMap) -> Self { + pub async fn update_new(magpie: &mut MagpieClient, metadata: MetadataMap<'_>) -> Self { let new: Self = metadata.into(); - magpie.send_panel_json(0, &InMsg::AlbumChanged(new.album.clone())); - magpie.send_panel_json(0, &InMsg::TrackChanged(new.track.clone())); + let msg = InMsg::AlbumChanged(new.album.clone()); + magpie.send_panel_json_async(0, &msg).await; + let msg = InMsg::TrackChanged(new.track.clone()); + magpie.send_panel_json_async(0, &msg).await; new } - pub fn update(&mut self, messenger: &mut MagpieClient, metadata: MetadataMap) { + pub async fn update_diff(&mut self, messenger: &mut MagpieClient, metadata: MetadataMap<'_>) { let new: Self = metadata.into(); if self.album != new.album { - messenger.send_panel_json(0, &InMsg::AlbumChanged(new.album.clone())); + let msg = InMsg::AlbumChanged(new.album.clone()); + messenger.send_panel_json_async(0, &msg).await; } if self.track != new.track { - messenger.send_panel_json(0, &InMsg::TrackChanged(new.track.clone())); + let msg = InMsg::TrackChanged(new.track.clone()); + messenger.send_panel_json_async(0, &msg).await; let progress = ProgressChanged { position: 0.0 }; - messenger.send_panel_json(0, &InMsg::ProgressChanged(progress)); + let msg = InMsg::ProgressChanged(progress); + messenger.send_panel_json_async(0, &msg).await; } *self = new; @@ -80,14 +86,14 @@ impl Metadata { async fn player_main( player: &PlayerProxy<'_>, - magpie: &mut MagpieClient<'_>, + magpie: &mut MagpieClient, ) -> Result<(), Box> { use futures_util::StreamExt; let mut playback_status = player.receive_playback_status_changed().await.fuse(); let mut metadata_tracker = player.receive_metadata_changed().await.fuse(); let mut position_tracker = player.receive_position_changed().await.fuse(); - let mut metadata = Metadata::new(magpie, player.metadata().await?); + let mut metadata = Metadata::update_new(magpie, player.metadata().await?).await; loop { futures_util::select! { @@ -107,7 +113,8 @@ async fn player_main( }; if let Some(status) = status { - magpie.send_panel_json(0, &InMsg::PlaybackStatusChanged(status)); + let msg = InMsg::PlaybackStatusChanged(status); + magpie.send_panel_json_async(0, &msg).await; } } position = position_tracker.next() => { @@ -119,7 +126,8 @@ async fn player_main( let position = position.get().await?; let position = position as f32 / 1_000_000.0; // Microseconds to seconds let progress = ProgressChanged { position }; - magpie.send_panel_json(0, &InMsg::ProgressChanged(progress)); + let msg = InMsg::ProgressChanged(progress); + magpie.send_panel_json_async(0, &msg).await; } new_metadata = metadata_tracker.next() => { let new_metadata = match new_metadata { @@ -128,7 +136,7 @@ async fn player_main( }; let new_metadata = new_metadata.get().await?; - metadata.update(magpie, new_metadata); + metadata.update_diff(magpie, new_metadata).await; } }; } @@ -143,23 +151,23 @@ fn main() { .expect("Please pass a path to a Canary script!") .to_owned(); - let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set"); - let sock_dir = Path::new(&sock_dir); - let sock_path = sock_dir.join(MAGPIE_SOCK); - let socket = UnixStream::connect(sock_path).unwrap(); - let mut magpie = MagpieClient::new(&socket); - let protocol = "tebibyte-media.desktop.music-player-controller".to_string(); - let script = std::path::PathBuf::from(&module_path); - let msg = CreatePanel { - id: 0, - protocol, - script, - }; - - let msg = MagpieServerMsg::CreatePanel(msg); - magpie.send(&msg).unwrap(); - smol::block_on(async { + let sock_dir = std::env::var("XDG_RUNTIME_DIR").expect("XDG_RUNTIME_DIR not set"); + let sock_dir = Path::new(&sock_dir); + let sock_path = sock_dir.join(MAGPIE_SOCK); + let socket = UnixStream::connect(sock_path).await.unwrap(); + let mut magpie = MagpieClient::new(socket); + let protocol = "tebibyte-media.desktop.music-player-controller".to_string(); + let script = std::path::PathBuf::from(&module_path); + let msg = CreatePanel { + id: 0, + protocol, + script, + }; + + let msg = MagpieServerMsg::CreatePanel(msg); + magpie.send_async(&msg).await.unwrap(); + let dbus = zbus::Connection::session().await.unwrap(); let mut first_loop = true; @@ -176,7 +184,7 @@ fn main() { if connected { println!("Disconnected from MPRIS"); let msg = InMsg::Disconnected; - magpie.send_panel_json(0, &msg); + magpie.send_panel_json_async(0, &msg).await; connected = false; } @@ -200,7 +208,7 @@ fn main() { player.destination().as_str() ); connected = true; - magpie.send_panel_json(0, &InMsg::Connected); + magpie.send_panel_json_async(0, &InMsg::Connected).await; match player_main(&player, &mut magpie).await { Ok(()) => {}