2019-06-18 23:25:30 +02:00
|
|
|
|
use env_logger;
|
2019-06-19 00:51:11 +02:00
|
|
|
|
use mpvipc::{Error, Event, Mpv, MpvDataType, Property};
|
2019-06-18 23:25:30 +02:00
|
|
|
|
use std::io::{self, Write};
|
|
|
|
|
|
|
|
|
|
fn seconds_to_hms(total: f64) -> String {
|
|
|
|
|
let total = total as u64;
|
|
|
|
|
let seconds = total % 60;
|
|
|
|
|
let total = total / 60;
|
|
|
|
|
let minutes = total % 60;
|
|
|
|
|
let hours = total / 60;
|
|
|
|
|
format!("{:02}:{:02}:{:02}", hours, minutes, seconds)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() -> Result<(), Error> {
|
|
|
|
|
env_logger::init();
|
|
|
|
|
|
|
|
|
|
let mut mpv = Mpv::connect("/tmp/mpvsocket")?;
|
|
|
|
|
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")?;
|
|
|
|
|
loop {
|
|
|
|
|
let event = mpv.event_listen()?;
|
|
|
|
|
match event {
|
2019-06-19 00:51:11 +02:00
|
|
|
|
Event::PropertyChange(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);
|
|
|
|
|
}
|
2019-06-18 23:25:30 +02:00
|
|
|
|
}
|
2019-06-19 00:51:11 +02:00
|
|
|
|
Property::Metadata(None) => (),
|
|
|
|
|
Property::Unknown {
|
|
|
|
|
name: _,
|
|
|
|
|
id: _,
|
|
|
|
|
data: _,
|
|
|
|
|
} => (),
|
2019-06-18 23:25:30 +02:00
|
|
|
|
},
|
|
|
|
|
Event::Shutdown => return Ok(()),
|
|
|
|
|
Event::Unimplemented => panic!("Unimplemented event"),
|
|
|
|
|
_ => (),
|
|
|
|
|
}
|
2019-06-19 00:51:11 +02:00
|
|
|
|
print!(
|
|
|
|
|
"{}{} / {} ({:.0}%)[K\r",
|
|
|
|
|
if pause { "(Paused) " } else { "" },
|
|
|
|
|
seconds_to_hms(playback_time),
|
|
|
|
|
seconds_to_hms(duration),
|
|
|
|
|
100. * playback_time / duration
|
|
|
|
|
);
|
2019-06-18 23:25:30 +02:00
|
|
|
|
io::stdout().flush().unwrap();
|
|
|
|
|
}
|
|
|
|
|
}
|