Music player lifetime loop

This commit is contained in:
mars 2022-11-19 23:33:06 -07:00
parent 7e4900c59b
commit a65164d70b
1 changed files with 83 additions and 37 deletions

View File

@ -83,6 +83,41 @@ impl<'a> From<&MetadataMap<'a>> for Metadata {
}
}*/
async fn player_main(
player: &PlayerProxy<'_>,
magpie: &mut MagpieClient,
) -> Result<(), Box<dyn std::error::Error>> {
use futures_util::StreamExt;
let mut playback_status = player.receive_playback_status_changed().await.fuse();
let mut metadata = player.receive_metadata_changed().await.fuse();
loop {
futures_util::select! {
status = playback_status.next() => {
let status = match status {
Some(v) => v,
None => break,
};
println!("Status: {}", status.get().await?);
}
metadata = metadata.next() => {
let metadata = match metadata {
Some(v) => v,
None => break,
};
let map = metadata.get().await?.into();
let metadata = Metadata::from(&map);
println!("Metadata: {:#?}", metadata);
}
};
}
Ok(())
}
fn main() {
let args: Vec<String> = std::env::args().collect();
let module_path = args
@ -92,37 +127,8 @@ fn main() {
let mut magpie = MagpieClient::new().unwrap();
let result: Result<(), Box<dyn std::error::Error>> = smol::block_on(async {
let dbus = zbus::Connection::session().await?;
let player = find_player(&dbus).await?.unwrap();
use futures_util::StreamExt;
let mut playback_status = player.receive_playback_status_changed().await.fuse();
let mut metadata = player.receive_metadata_changed().await.fuse();
loop {
futures_util::select! {
status = playback_status.next() => {
let status = match status {
Some(v) => v,
None => break,
};
println!("Status: {}", status.get().await?);
}
metadata = metadata.next() => {
let metadata = match metadata {
Some(v) => v,
None => break,
};
let map = metadata.get().await?.into();
let metadata = Metadata::from(&map);
println!("Metadata: {:#?}", metadata);
}
};
}
smol::block_on(async {
let dbus = zbus::Connection::session().await.unwrap();
let protocol = "tebibyte-media.desktop.music-player-controller".to_string();
let script = std::path::PathBuf::from(&module_path);
@ -134,15 +140,55 @@ fn main() {
let msg = MagpieServerMsg::CreatePanel(msg);
magpie.messenger.send(&msg).unwrap();
std::future::pending::<()>().await;
let mut first_loop = true;
let mut connected = false;
Ok(())
loop {
if !first_loop {
let wait = std::time::Duration::from_secs(1);
std::thread::sleep(wait);
}
first_loop = false;
if connected {
println!("Disconnected from MPRIS");
let msg = InMsg::Disconnected;
magpie.send_json_message(0, &msg);
connected = false;
}
println!("Connecting to MPRIS...");
let player = match find_player(&dbus).await {
Ok(Some(player)) => player,
Ok(None) => {
eprintln!("Couldn't find player");
continue;
}
Err(err) => {
eprintln!("D-Bus error while finding player: {:?}", err);
return;
}
};
println!(
"Connected to \"{}\" ({})",
player.path().as_str(),
player.destination().as_str()
);
connected = true;
magpie.send_json_message(0, &InMsg::Connected);
match player_main(&player, &mut magpie).await {
Ok(()) => {}
Err(err) => {
eprintln!("D-Bus error while connected to player: {:?}", err);
}
}
}
});
if let Err(err) = result {
eprintln!("Music player error: {:?}", err);
}
/*let mut first_loop = true;
let mut connected = false;