Make entire project async
This moves all communication with Mpv's unix socket into another tokio task, and uses message passing through clonable mpsc channels to receive commands to execute, and to send responses.
This commit is contained in:
@@ -1,15 +1,16 @@
|
||||
use env_logger;
|
||||
use mpvipc::{Error as MpvError, Mpv};
|
||||
|
||||
fn main() -> Result<(), MpvError> {
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), MpvError> {
|
||||
env_logger::init();
|
||||
|
||||
let mpv = Mpv::connect("/tmp/mpv.sock")?;
|
||||
let meta = mpv.get_metadata()?;
|
||||
let mpv = Mpv::connect("/tmp/mpv.sock").await?;
|
||||
let meta = mpv.get_metadata().await?;
|
||||
println!("metadata: {:?}", meta);
|
||||
let playlist = mpv.get_playlist()?;
|
||||
let playlist = mpv.get_playlist().await?;
|
||||
println!("playlist: {:?}", playlist);
|
||||
let playback_time: f64 = mpv.get_property("playback-time")?;
|
||||
let playback_time: f64 = mpv.get_property("playback-time").await?;
|
||||
println!("playback-time: {}", playback_time);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -11,58 +11,60 @@ fn seconds_to_hms(total: f64) -> String {
|
||||
format!("{:02}:{:02}:{:02}", hours, minutes, seconds)
|
||||
}
|
||||
|
||||
fn main() -> Result<(), Error> {
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Error> {
|
||||
env_logger::init();
|
||||
|
||||
let mut mpv = Mpv::connect("/tmp/mpv.sock")?;
|
||||
let mut mpv = Mpv::connect("/tmp/mpv.sock").await?;
|
||||
let mut pause = false;
|
||||
let mut playback_time = std::f64::NAN;
|
||||
let mut duration = std::f64::NAN;
|
||||
mpv.observe_property(1, "path")?;
|
||||
mpv.observe_property(2, "pause")?;
|
||||
mpv.observe_property(3, "playback-time")?;
|
||||
mpv.observe_property(4, "duration")?;
|
||||
mpv.observe_property(5, "metadata")?;
|
||||
mpv.observe_property(1, "path").await?;
|
||||
mpv.observe_property(2, "pause").await?;
|
||||
mpv.observe_property(3, "playback-time").await?;
|
||||
mpv.observe_property(4, "duration").await?;
|
||||
mpv.observe_property(5, "metadata").await?;
|
||||
loop {
|
||||
let event = mpv.event_listen()?;
|
||||
match event {
|
||||
Event::PropertyChange { id: _, property } => match property {
|
||||
Property::Path(Some(value)) => println!("\nPlaying: {}[K", value),
|
||||
Property::Path(None) => (),
|
||||
Property::Pause(value) => pause = value,
|
||||
Property::PlaybackTime(Some(value)) => playback_time = value,
|
||||
Property::PlaybackTime(None) => playback_time = std::f64::NAN,
|
||||
Property::Duration(Some(value)) => duration = value,
|
||||
Property::Duration(None) => duration = std::f64::NAN,
|
||||
Property::Metadata(Some(value)) => {
|
||||
println!("File tags:[K");
|
||||
if let Some(MpvDataType::String(value)) = value.get("ARTIST") {
|
||||
println!(" Artist: {}[K", value);
|
||||
}
|
||||
if let Some(MpvDataType::String(value)) = value.get("ALBUM") {
|
||||
println!(" Album: {}[K", value);
|
||||
}
|
||||
if let Some(MpvDataType::String(value)) = value.get("TITLE") {
|
||||
println!(" Title: {}[K", value);
|
||||
}
|
||||
if let Some(MpvDataType::String(value)) = value.get("TRACK") {
|
||||
println!(" Track: {}[K", value);
|
||||
}
|
||||
}
|
||||
Property::Metadata(None) => (),
|
||||
Property::Unknown { name: _, data: _ } => (),
|
||||
},
|
||||
Event::Shutdown => return Ok(()),
|
||||
Event::Unimplemented => panic!("Unimplemented event"),
|
||||
_ => (),
|
||||
}
|
||||
print!(
|
||||
"{}{} / {} ({:.0}%)[K\r",
|
||||
if pause { "(Paused) " } else { "" },
|
||||
seconds_to_hms(playback_time),
|
||||
seconds_to_hms(duration),
|
||||
100. * playback_time / duration
|
||||
);
|
||||
io::stdout().flush().unwrap();
|
||||
// TODO:
|
||||
// let event = mpv.event_listen()?;
|
||||
// match event {
|
||||
// Event::PropertyChange { id: _, property } => match property {
|
||||
// Property::Path(Some(value)) => println!("\nPlaying: {}[K", value),
|
||||
// Property::Path(None) => (),
|
||||
// Property::Pause(value) => pause = value,
|
||||
// Property::PlaybackTime(Some(value)) => playback_time = value,
|
||||
// Property::PlaybackTime(None) => playback_time = std::f64::NAN,
|
||||
// Property::Duration(Some(value)) => duration = value,
|
||||
// Property::Duration(None) => duration = std::f64::NAN,
|
||||
// Property::Metadata(Some(value)) => {
|
||||
// println!("File tags:[K");
|
||||
// if let Some(MpvDataType::String(value)) = value.get("ARTIST") {
|
||||
// println!(" Artist: {}[K", value);
|
||||
// }
|
||||
// if let Some(MpvDataType::String(value)) = value.get("ALBUM") {
|
||||
// println!(" Album: {}[K", value);
|
||||
// }
|
||||
// if let Some(MpvDataType::String(value)) = value.get("TITLE") {
|
||||
// println!(" Title: {}[K", value);
|
||||
// }
|
||||
// if let Some(MpvDataType::String(value)) = value.get("TRACK") {
|
||||
// println!(" Track: {}[K", value);
|
||||
// }
|
||||
// }
|
||||
// Property::Metadata(None) => (),
|
||||
// Property::Unknown { name: _, data: _ } => (),
|
||||
// },
|
||||
// Event::Shutdown => return Ok(()),
|
||||
// Event::Unimplemented => panic!("Unimplemented event"),
|
||||
// _ => (),
|
||||
// }
|
||||
// print!(
|
||||
// "{}{} / {} ({:.0}%)[K\r",
|
||||
// if pause { "(Paused) " } else { "" },
|
||||
// seconds_to_hms(playback_time),
|
||||
// seconds_to_hms(duration),
|
||||
// 100. * playback_time / duration
|
||||
// );
|
||||
// io::stdout().flush().unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user