Switch to async UnixStream in music player
This commit is contained in:
parent
2d242520c1
commit
b005176bcf
|
@ -10,7 +10,7 @@ path = "src/main.rs"
|
||||||
required-features = ["bin"]
|
required-features = ["bin"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
canary-magpie = { path = "../magpie", optional = true }
|
canary-magpie = { path = "../magpie", optional = true, features = ["async"] }
|
||||||
futures-util = { version = "0.3", optional = true }
|
futures-util = { version = "0.3", optional = true }
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
// Copyright (c) 2022 Marceline Cramer
|
// Copyright (c) 2022 Marceline Cramer
|
||||||
// SPDX-License-Identifier: AGPL-3.0-or-later
|
// 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_magpie::protocol::{ClientMessenger, CreatePanel, MagpieServerMsg, MAGPIE_SOCK};
|
||||||
use canary_music_player::*;
|
use canary_music_player::*;
|
||||||
|
use smol::net::unix::UnixStream;
|
||||||
|
|
||||||
pub type MagpieClient<'a> = ClientMessenger<&'a UnixStream>;
|
pub type MagpieClient = ClientMessenger<UnixStream>;
|
||||||
|
|
||||||
pub mod mpris;
|
pub mod mpris;
|
||||||
|
|
||||||
|
@ -54,24 +55,29 @@ impl<'a> From<MetadataMap<'a>> for Metadata {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl 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();
|
let new: Self = metadata.into();
|
||||||
magpie.send_panel_json(0, &InMsg::AlbumChanged(new.album.clone()));
|
let msg = InMsg::AlbumChanged(new.album.clone());
|
||||||
magpie.send_panel_json(0, &InMsg::TrackChanged(new.track.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
|
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();
|
let new: Self = metadata.into();
|
||||||
|
|
||||||
if self.album != new.album {
|
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 {
|
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 };
|
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;
|
*self = new;
|
||||||
|
@ -80,14 +86,14 @@ impl Metadata {
|
||||||
|
|
||||||
async fn player_main(
|
async fn player_main(
|
||||||
player: &PlayerProxy<'_>,
|
player: &PlayerProxy<'_>,
|
||||||
magpie: &mut MagpieClient<'_>,
|
magpie: &mut MagpieClient,
|
||||||
) -> Result<(), Box<dyn std::error::Error>> {
|
) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
let mut playback_status = player.receive_playback_status_changed().await.fuse();
|
let mut playback_status = player.receive_playback_status_changed().await.fuse();
|
||||||
let mut metadata_tracker = player.receive_metadata_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 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 {
|
loop {
|
||||||
futures_util::select! {
|
futures_util::select! {
|
||||||
|
@ -107,7 +113,8 @@ async fn player_main(
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(status) = status {
|
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() => {
|
position = position_tracker.next() => {
|
||||||
|
@ -119,7 +126,8 @@ async fn player_main(
|
||||||
let position = position.get().await?;
|
let position = position.get().await?;
|
||||||
let position = position as f32 / 1_000_000.0; // Microseconds to seconds
|
let position = position as f32 / 1_000_000.0; // Microseconds to seconds
|
||||||
let progress = ProgressChanged { position };
|
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() => {
|
new_metadata = metadata_tracker.next() => {
|
||||||
let new_metadata = match new_metadata {
|
let new_metadata = match new_metadata {
|
||||||
|
@ -128,7 +136,7 @@ async fn player_main(
|
||||||
};
|
};
|
||||||
|
|
||||||
let new_metadata = new_metadata.get().await?;
|
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!")
|
.expect("Please pass a path to a Canary script!")
|
||||||
.to_owned();
|
.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 {
|
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 dbus = zbus::Connection::session().await.unwrap();
|
||||||
|
|
||||||
let mut first_loop = true;
|
let mut first_loop = true;
|
||||||
|
@ -176,7 +184,7 @@ fn main() {
|
||||||
if connected {
|
if connected {
|
||||||
println!("Disconnected from MPRIS");
|
println!("Disconnected from MPRIS");
|
||||||
let msg = InMsg::Disconnected;
|
let msg = InMsg::Disconnected;
|
||||||
magpie.send_panel_json(0, &msg);
|
magpie.send_panel_json_async(0, &msg).await;
|
||||||
connected = false;
|
connected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -200,7 +208,7 @@ fn main() {
|
||||||
player.destination().as_str()
|
player.destination().as_str()
|
||||||
);
|
);
|
||||||
connected = true;
|
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 {
|
match player_main(&player, &mut magpie).await {
|
||||||
Ok(()) => {}
|
Ok(()) => {}
|
||||||
|
|
Loading…
Reference in New Issue