From a43401b6c4a5b2d06bab2b1c073168d6fa4b149d Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 17:32:42 +0200 Subject: [PATCH 01/11] Replaced trim_right() with trim_end(), as the former is deprecated --- src/ipc.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ipc.rs b/src/ipc.rs index f9c8a00..5414d2b 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -281,7 +281,7 @@ pub fn observe_mpv_property(instance: &Mpv, id: &usize, property: &str) -> Resul pub fn listen(instance: &mut Mpv) -> Result { let mut response = String::new(); instance.reader.read_line(&mut response).unwrap(); - response = response.trim_right().to_string(); + response = response.trim_end().to_string(); match serde_json::from_str::(&response) { Ok(e) => { if let Value::String(ref name) = e["event"] { @@ -406,7 +406,7 @@ pub fn listen(instance: &mut Mpv) -> Result { pub fn listen_raw(instance: &mut Mpv) -> String { let mut response = String::new(); instance.reader.read_line(&mut response).unwrap(); - response.trim_right().to_string() + response.trim_end().to_string() // let mut stream = &instance.0; // let mut buffer = [0; 32]; // stream.read(&mut buffer[..]).unwrap(); From a14b02fb1038bb763247bfc37d50180ca2002084 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 17:33:34 +0200 Subject: [PATCH 02/11] Fix documentation tests, with a hidden use mpvipc::Mpv --- src/lib.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a70143f..558133d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -316,6 +316,7 @@ impl Mpv { /// /// #Example /// ``` + /// # use mpvipc::Mpv; /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); /// let paused: bool = mpv.get_property("pause").unwrap(); /// let title: String = mpv.get_property("media-title").unwrap(); @@ -336,6 +337,7 @@ impl Mpv { /// #Example /// /// ``` + /// # use mpvipc::Mpv; /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); /// let title = mpv.get_property_string("media-title").unwrap(); /// ``` @@ -354,7 +356,8 @@ impl Mpv { /// #Example /// /// ``` - /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); + /// # use mpvipc::Mpv; + /// let mut mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); /// loop { /// let event = mpv.event_listen().unwrap(); /// println!("{:?}", event); @@ -399,6 +402,7 @@ impl Mpv { /// /// #Example /// ``` + /// # use mpvipc::Mpv; /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); /// /// //Run command 'playlist-shuffle' which takes no arguments @@ -579,6 +583,7 @@ impl Mpv { /// /// #Example /// ``` + /// # use mpvipc::Mpv; /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); /// mpv.set_property("pause", true); /// ``` @@ -638,4 +643,4 @@ impl Mpv { Err(msg) => Err(msg), } } -} \ No newline at end of file +} From 461a87d377f597f45fd11618264740ff1b81ab0a Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 17:34:10 +0200 Subject: [PATCH 03/11] Add a Debug implementation for Mpv --- src/lib.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 558133d..2cb7a4e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -110,6 +110,7 @@ pub enum ErrorCode { pub struct Mpv { stream: UnixStream, reader: BufReader, + name: String, } #[derive(Debug)] pub struct Playlist(pub Vec); @@ -122,6 +123,14 @@ impl Drop for Mpv { } } +impl fmt::Debug for Mpv { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt.debug_tuple("Mpv") + .field(&self.name) + .finish() + } +} + impl Clone for Mpv { fn clone(&self) -> Self { let stream = self.stream.try_clone().expect("cloning UnixStream"); @@ -129,6 +138,7 @@ impl Clone for Mpv { Mpv { stream, reader: BufReader::new(cloned_stream), + name: self.name.clone(), } } @@ -138,6 +148,7 @@ impl Clone for Mpv { *self = Mpv { stream, reader: BufReader::new(cloned_stream), + name: source.name.clone(), } } } @@ -263,6 +274,7 @@ impl Mpv { return Ok(Mpv { stream, reader: BufReader::new(cloned_stream), + name: String::from(socket), }); } Err(internal_error) => Err(Error(ErrorCode::ConnectError(internal_error.to_string()))), From 244a34057f5eee8f0431d56605f30a6438175276 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 17:34:20 +0200 Subject: [PATCH 04/11] Switch to edition 2018 --- Cargo.toml | 4 ++-- src/ipc.rs | 2 +- src/lib.rs | 3 --- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d32fff6..e4e0ca3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,8 @@ license = "GPL-3.0" homepage = "https://gitlab.com/mpv-ipc/mpvipc" repository = "https://gitlab.com/mpv-ipc/mpvipc" documentation = "https://docs.rs/mpvipc/" - +edition = "2018" [dependencies] serde = "1.0.1" -serde_json = "1.0.0" \ No newline at end of file +serde_json = "1.0.0" diff --git a/src/ipc.rs b/src/ipc.rs index 5414d2b..83428cf 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -554,4 +554,4 @@ fn json_array_to_playlist(array: &Vec) -> Vec { }); } output -} \ No newline at end of file +} diff --git a/src/lib.rs b/src/lib.rs index 2cb7a4e..d33e110 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,3 @@ -extern crate serde; -extern crate serde_json; - pub mod ipc; use ipc::*; From 939541599f705c5830baaad484b8fd6ce3ce82a1 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 17:54:38 +0200 Subject: [PATCH 05/11] Remove .unwrap() from examples, they are bad practice --- src/lib.rs | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index d33e110..4d38586 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -325,10 +325,13 @@ impl Mpv { /// /// #Example /// ``` - /// # use mpvipc::Mpv; - /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); - /// let paused: bool = mpv.get_property("pause").unwrap(); - /// let title: String = mpv.get_property("media-title").unwrap(); + /// # use mpvipc::{Mpv, Error}; + /// # fn main() -> Result<(), Error> { + /// let mpv = Mpv::connect("/tmp/mpvsocket")?; + /// let paused: bool = mpv.get_property("pause")?; + /// let title: String = mpv.get_property("media-title")?; + /// # Ok(()) + /// # } /// ``` pub fn get_property(&self, property: &str) -> Result { T::get_property_generic(self, property) @@ -346,9 +349,12 @@ impl Mpv { /// #Example /// /// ``` - /// # use mpvipc::Mpv; - /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); - /// let title = mpv.get_property_string("media-title").unwrap(); + /// # use mpvipc::{Mpv, Error}; + /// # fn main() -> Result<(), Error> { + /// let mpv = Mpv::connect("/tmp/mpvsocket")?; + /// let title = mpv.get_property_string("media-title")?; + /// # Ok(()) + /// # } /// ``` pub fn get_property_string(&self, property: &str) -> Result { get_mpv_property_string(self, property) @@ -364,11 +370,10 @@ impl Mpv { /// /// #Example /// - /// ``` - /// # use mpvipc::Mpv; - /// let mut mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); + /// ```ignore + /// let mut mpv = Mpv::connect("/tmp/mpvsocket")?; /// loop { - /// let event = mpv.event_listen().unwrap(); + /// let event = mpv.event_listen()?; /// println!("{:?}", event); /// } /// ``` @@ -411,14 +416,17 @@ impl Mpv { /// /// #Example /// ``` - /// # use mpvipc::Mpv; - /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); + /// # use mpvipc::{Mpv, Error}; + /// # fn main() -> Result<(), Error> { + /// let mpv = Mpv::connect("/tmp/mpvsocket")?; /// /// //Run command 'playlist-shuffle' which takes no arguments - /// mpv.run_command("playlist-shuffle", &[]); + /// mpv.run_command("playlist-shuffle", &[])?; /// /// //Run command 'seek' which in this case takes two arguments - /// mpv.run_command("seek", &["0", "absolute"]); + /// mpv.run_command("seek", &["0", "absolute"])?; + /// # Ok(()) + /// # } /// ``` pub fn run_command(&self, command: &str, args: &[&str]) -> Result<(), Error> { run_mpv_command(self, command, args) @@ -592,9 +600,12 @@ impl Mpv { /// /// #Example /// ``` - /// # use mpvipc::Mpv; - /// let mpv = Mpv::connect("/tmp/mpvsocket").unwrap(); - /// mpv.set_property("pause", true); + /// # use mpvipc::{Mpv, Error}; + /// # fn main() -> Result<(), Error> { + /// let mpv = Mpv::connect("/tmp/mpvsocket")?; + /// mpv.set_property("pause", true)?; + /// # Ok(()) + /// # } /// ``` pub fn set_property>( &self, From c429d88d1b5c99139527cfd471ff7dab71892da3 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 18:32:33 +0200 Subject: [PATCH 06/11] Property id is an isize, not a usize, and can be absent if 0 --- src/ipc.rs | 8 ++++---- src/lib.rs | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ipc.rs b/src/ipc.rs index 83428cf..a90a608 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -256,7 +256,7 @@ pub fn run_mpv_command(instance: &Mpv, command: &str, args: &[&str]) -> Result<( } } -pub fn observe_mpv_property(instance: &Mpv, id: &usize, property: &str) -> Result<(), Error> { +pub fn observe_mpv_property(instance: &Mpv, id: &isize, property: &str) -> Result<(), Error> { let ipc_string = format!( "{{ \"command\": [\"observe_property\", {}, \"{}\"] }}\n", id, @@ -337,7 +337,7 @@ pub fn listen(instance: &mut Mpv) -> Result { } "property-change" => { let name: String; - let id: usize; + let id: isize; let data: MpvDataType; if let Value::String(ref n) = e["name"] { @@ -347,9 +347,9 @@ pub fn listen(instance: &mut Mpv) -> Result { } if let Value::Number(ref n) = e["id"] { - id = n.as_u64().unwrap() as usize; + id = n.as_i64().unwrap() as isize; } else { - return Err(Error(ErrorCode::JsonContainsUnexptectedType)); + id = 0; } match e["data"] { diff --git a/src/lib.rs b/src/lib.rs index 4d38586..5775ccb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -38,7 +38,7 @@ pub enum Event { PlaybackRestart, PropertyChange { name: String, - id: usize, + id: isize, data: MpvDataType, }, ChapterChange, @@ -389,7 +389,7 @@ impl Mpv { run_mpv_command(self, "playlist-next", &[]) } - pub fn observe_property(&self, id: &usize, property: &str) -> Result<(), Error> { + pub fn observe_property(&self, id: &isize, property: &str) -> Result<(), Error> { observe_mpv_property(self, id, property) } From 8f105eb41f9b831cdb964ba9a4f39f01b4702004 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 18:34:23 +0200 Subject: [PATCH 07/11] Add a logging system, using the log crate --- Cargo.toml | 4 ++++ src/ipc.rs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index e4e0ca3..c1500ad 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,3 +12,7 @@ edition = "2018" [dependencies] serde = "1.0.1" serde_json = "1.0.0" +log = "0.4.6" + +[dev-dependencies] +env_logger = "*" diff --git a/src/ipc.rs b/src/ipc.rs index a90a608..7b7d93f 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -1,3 +1,4 @@ +use log::debug; use serde_json::{self, Value}; use std::collections::HashMap; use std::io::BufReader; @@ -282,6 +283,7 @@ pub fn listen(instance: &mut Mpv) -> Result { let mut response = String::new(); instance.reader.read_line(&mut response).unwrap(); response = response.trim_end().to_string(); + debug!("Event: {}", response); match serde_json::from_str::(&response) { Ok(e) => { if let Value::String(ref name) = e["event"] { @@ -418,6 +420,7 @@ fn send_command_sync(instance: &Mpv, command: &str) -> String { match stream.write_all(command.as_bytes()) { Err(why) => panic!("Error: Could not write to socket: {}", why), Ok(_) => { + debug!("Command: {}", command.trim_end()); let mut response = String::new(); { let mut reader = BufReader::new(stream); @@ -426,6 +429,7 @@ fn send_command_sync(instance: &Mpv, command: &str) -> String { reader.read_line(&mut response).unwrap(); } } + debug!("Response: {}", response.trim_end()); response } } From bd18199bada95611b7c228503d9112e80ab02b0b Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 23:02:39 +0200 Subject: [PATCH 08/11] Add a very simple example fetching properties --- examples/fetch_state.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 examples/fetch_state.rs diff --git a/examples/fetch_state.rs b/examples/fetch_state.rs new file mode 100644 index 0000000..e2a01f7 --- /dev/null +++ b/examples/fetch_state.rs @@ -0,0 +1,15 @@ +use env_logger; +use mpvipc::{Mpv, Error as MpvError}; + +fn main() -> Result<(), MpvError> { + env_logger::init(); + + let mpv = Mpv::connect("/tmp/mpvsocket")?; + let meta = mpv.get_metadata()?; + println!("metadata: {:?}", meta); + let playlist = mpv.get_playlist()?; + println!("playlist: {:?}", playlist); + let playback_time: f64 = mpv.get_property("playback-time")?; + println!("playback-time: {}", playback_time); + Ok(()) +} From f02b2549a0445ff580945b536660c871d0850a4d Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Tue, 18 Jun 2019 23:25:30 +0200 Subject: [PATCH 09/11] =?UTF-8?q?Add=20an=20example=20copying=20mpv?= =?UTF-8?q?=E2=80=99s=20console=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/media_player.rs | 94 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 examples/media_player.rs diff --git a/examples/media_player.rs b/examples/media_player.rs new file mode 100644 index 0000000..dde77bb --- /dev/null +++ b/examples/media_player.rs @@ -0,0 +1,94 @@ +use env_logger; +use mpvipc::{ + Error, + Event, + Mpv, + MpvDataType, +}; +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 { + Event::PropertyChange { name, id: _, data } => { + match name.as_ref() { + "path" => { + match data { + MpvDataType::String(value) => println!("\nPlaying: {}", value), + MpvDataType::Null => (), + _ => panic!("Wrong data type for 'path' value: {:?}", data), + } + }, + "pause" => { + match data { + MpvDataType::Bool(value) => pause = value, + _ => panic!("Wrong data type for 'pause' value: {:?}", data), + } + }, + "playback-time" => { + match data { + MpvDataType::Double(value) => playback_time = value, + MpvDataType::Null => (), + _ => panic!("Wrong data type for 'playback-time' value: {:?}", data), + } + }, + "duration" => { + match data { + MpvDataType::Double(value) => duration = value, + MpvDataType::Null => (), + _ => panic!("Wrong data type for 'duration' value: {:?}", data), + } + }, + "metadata" => { + match data { + MpvDataType::HashMap(value) => { + println!("File tags:"); + if let Some(MpvDataType::String(value)) = value.get("ARTIST") { + println!(" Artist: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("ALBUM") { + println!(" Album: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("TITLE") { + println!(" Title: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("TRACK") { + println!(" Track: {}", value); + } + }, + MpvDataType::Null => (), + _ => panic!("Wrong data type for 'metadata' value: {:?}", data), + } + }, + _ => panic!("Wrong property changed: {}", name), + } + }, + Event::Shutdown => return Ok(()), + Event::Unimplemented => panic!("Unimplemented event"), + _ => (), + } + print!("{}{} / {} ({:.0}%)\r", if pause { "(Paused) " } else { "" }, seconds_to_hms(playback_time), seconds_to_hms(duration), 100. * playback_time / duration); + io::stdout().flush().unwrap(); + } +} From 2911b9bb49b2372095f2ae2e1def479a8fb1e2cf Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 19 Jun 2019 00:30:16 +0200 Subject: [PATCH 10/11] Simplify user code by parsing properties ourselves --- examples/media_player.rs | 74 ++++++++++++++-------------------------- src/ipc.rs | 38 +++++++++++++++++++-- src/lib.rs | 16 +++++++-- 3 files changed, 74 insertions(+), 54 deletions(-) diff --git a/examples/media_player.rs b/examples/media_player.rs index dde77bb..f54d6c9 100644 --- a/examples/media_player.rs +++ b/examples/media_player.rs @@ -4,6 +4,7 @@ use mpvipc::{ Event, Mpv, MpvDataType, + Property, }; use std::io::{self, Write}; @@ -31,57 +32,32 @@ fn main() -> Result<(), Error> { loop { let event = mpv.event_listen()?; match event { - Event::PropertyChange { name, id: _, data } => { - match name.as_ref() { - "path" => { - match data { - MpvDataType::String(value) => println!("\nPlaying: {}", value), - MpvDataType::Null => (), - _ => panic!("Wrong data type for 'path' value: {:?}", data), + Event::PropertyChange(property) => { + match property { + Property::Path(Some(value)) => println!("\nPlaying: {}", 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:"); + if let Some(MpvDataType::String(value)) = value.get("ARTIST") { + println!(" Artist: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("ALBUM") { + println!(" Album: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("TITLE") { + println!(" Title: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("TRACK") { + println!(" Track: {}", value); } }, - "pause" => { - match data { - MpvDataType::Bool(value) => pause = value, - _ => panic!("Wrong data type for 'pause' value: {:?}", data), - } - }, - "playback-time" => { - match data { - MpvDataType::Double(value) => playback_time = value, - MpvDataType::Null => (), - _ => panic!("Wrong data type for 'playback-time' value: {:?}", data), - } - }, - "duration" => { - match data { - MpvDataType::Double(value) => duration = value, - MpvDataType::Null => (), - _ => panic!("Wrong data type for 'duration' value: {:?}", data), - } - }, - "metadata" => { - match data { - MpvDataType::HashMap(value) => { - println!("File tags:"); - if let Some(MpvDataType::String(value)) = value.get("ARTIST") { - println!(" Artist: {}", value); - } - if let Some(MpvDataType::String(value)) = value.get("ALBUM") { - println!(" Album: {}", value); - } - if let Some(MpvDataType::String(value)) = value.get("TITLE") { - println!(" Title: {}", value); - } - if let Some(MpvDataType::String(value)) = value.get("TRACK") { - println!(" Track: {}", value); - } - }, - MpvDataType::Null => (), - _ => panic!("Wrong data type for 'metadata' value: {:?}", data), - } - }, - _ => panic!("Wrong property changed: {}", name), + Property::Metadata(None) => (), + Property::Unknown { name: _, id: _, data: _ } => (), } }, Event::Shutdown => return Ok(()), diff --git a/src/ipc.rs b/src/ipc.rs index 7b7d93f..fa16307 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -1,4 +1,4 @@ -use log::debug; +use log::{debug, warn}; use serde_json::{self, Value}; use std::collections::HashMap; use std::io::BufReader; @@ -279,6 +279,40 @@ pub fn observe_mpv_property(instance: &Mpv, id: &isize, property: &str) -> Resul } } +fn try_convert_property(name: &str, id: isize, data: MpvDataType) -> Event { + let property = match name { + "path" => match data { + MpvDataType::String(value) => Property::Path(Some(value)), + MpvDataType::Null => Property::Path(None), + _ => unimplemented!(), + }, + "pause" => match data { + MpvDataType::Bool(value) => Property::Pause(value), + _ => unimplemented!(), + }, + "playback-time" => match data { + MpvDataType::Double(value) => Property::PlaybackTime(Some(value)), + MpvDataType::Null => Property::PlaybackTime(None), + _ => unimplemented!(), + }, + "duration" => match data { + MpvDataType::Double(value) => Property::Duration(Some(value)), + MpvDataType::Null => Property::Duration(None), + _ => unimplemented!(), + }, + "metadata" => match data { + MpvDataType::HashMap(value) => Property::Metadata(Some(value)), + MpvDataType::Null => Property::Metadata(None), + _ => unimplemented!(), + }, + _ => { + warn!("Property {} not implemented", name); + Property::Unknown { name: name.to_string(), id, data } + } + }; + Event::PropertyChange(property) +} + pub fn listen(instance: &mut Mpv) -> Result { let mut response = String::new(); instance.reader.read_line(&mut response).unwrap(); @@ -391,7 +425,7 @@ pub fn listen(instance: &mut Mpv) -> Result { } } - event = Event::PropertyChange { name, id, data } + event = try_convert_property(name.as_ref(), id, data); } _ => { event = Event::Unimplemented; diff --git a/src/lib.rs b/src/lib.rs index 5775ccb..1edb582 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -36,13 +36,23 @@ pub enum Event { MetadataUpdate, Seek, PlaybackRestart, - PropertyChange { + PropertyChange(Property), + ChapterChange, + Unimplemented, +} + +#[derive(Debug)] +pub enum Property { + Path(Option), + Pause(bool), + PlaybackTime(Option), + Duration(Option), + Metadata(Option>), + Unknown { name: String, id: isize, data: MpvDataType, }, - ChapterChange, - Unimplemented, } #[derive(Debug)] From b0a62f25eb2c3bb09743d0e36c51149103b8ade2 Mon Sep 17 00:00:00 2001 From: Emmanuel Gil Peyrot Date: Wed, 19 Jun 2019 00:51:11 +0200 Subject: [PATCH 11/11] Run rustfmt on the entire crate --- examples/fetch_state.rs | 2 +- examples/media_player.rs | 70 ++++++++-------- src/ipc.rs | 13 +-- src/lib.rs | 170 ++++++++++++++++----------------------- 4 files changed, 116 insertions(+), 139 deletions(-) diff --git a/examples/fetch_state.rs b/examples/fetch_state.rs index e2a01f7..6387399 100644 --- a/examples/fetch_state.rs +++ b/examples/fetch_state.rs @@ -1,5 +1,5 @@ use env_logger; -use mpvipc::{Mpv, Error as MpvError}; +use mpvipc::{Error as MpvError, Mpv}; fn main() -> Result<(), MpvError> { env_logger::init(); diff --git a/examples/media_player.rs b/examples/media_player.rs index f54d6c9..c7d0cf0 100644 --- a/examples/media_player.rs +++ b/examples/media_player.rs @@ -1,11 +1,5 @@ use env_logger; -use mpvipc::{ - Error, - Event, - Mpv, - MpvDataType, - Property, -}; +use mpvipc::{Error, Event, Mpv, MpvDataType, Property}; use std::io::{self, Write}; fn seconds_to_hms(total: f64) -> String { @@ -32,39 +26,47 @@ fn main() -> Result<(), Error> { loop { let event = mpv.event_listen()?; match event { - Event::PropertyChange(property) => { - match property { - Property::Path(Some(value)) => println!("\nPlaying: {}", 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:"); - if let Some(MpvDataType::String(value)) = value.get("ARTIST") { - println!(" Artist: {}", value); - } - if let Some(MpvDataType::String(value)) = value.get("ALBUM") { - println!(" Album: {}", value); - } - if let Some(MpvDataType::String(value)) = value.get("TITLE") { - println!(" Title: {}", value); - } - if let Some(MpvDataType::String(value)) = value.get("TRACK") { - println!(" Track: {}", value); - } - }, - Property::Metadata(None) => (), - Property::Unknown { name: _, id: _, data: _ } => (), + Event::PropertyChange(property) => match property { + Property::Path(Some(value)) => println!("\nPlaying: {}", 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:"); + if let Some(MpvDataType::String(value)) = value.get("ARTIST") { + println!(" Artist: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("ALBUM") { + println!(" Album: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("TITLE") { + println!(" Title: {}", value); + } + if let Some(MpvDataType::String(value)) = value.get("TRACK") { + println!(" Track: {}", value); + } } + Property::Metadata(None) => (), + Property::Unknown { + name: _, + id: _, + data: _, + } => (), }, Event::Shutdown => return Ok(()), Event::Unimplemented => panic!("Unimplemented event"), _ => (), } - print!("{}{} / {} ({:.0}%)\r", if pause { "(Paused) " } else { "" }, seconds_to_hms(playback_time), seconds_to_hms(duration), 100. * playback_time / duration); + print!( + "{}{} / {} ({:.0}%)\r", + if pause { "(Paused) " } else { "" }, + seconds_to_hms(playback_time), + seconds_to_hms(duration), + 100. * playback_time / duration + ); io::stdout().flush().unwrap(); } } diff --git a/src/ipc.rs b/src/ipc.rs index fa16307..72fb641 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -1,10 +1,10 @@ +use super::*; use log::{debug, warn}; use serde_json::{self, Value}; use std::collections::HashMap; -use std::io::BufReader; use std::io::prelude::*; +use std::io::BufReader; use std::iter::Iterator; -use super::*; #[derive(Debug)] pub struct PlaylistEntry { @@ -260,8 +260,7 @@ pub fn run_mpv_command(instance: &Mpv, command: &str, args: &[&str]) -> Result<( pub fn observe_mpv_property(instance: &Mpv, id: &isize, property: &str) -> Result<(), Error> { let ipc_string = format!( "{{ \"command\": [\"observe_property\", {}, \"{}\"] }}\n", - id, - property + id, property ); match serde_json::from_str::(&send_command_sync(instance, &ipc_string)) { Ok(feedback) => { @@ -307,7 +306,11 @@ fn try_convert_property(name: &str, id: isize, data: MpvDataType) -> Event { }, _ => { warn!("Property {} not implemented", name); - Property::Unknown { name: name.to_string(), id, data } + Property::Unknown { + name: name.to_string(), + id, + data, + } } }; Event::PropertyChange(property) diff --git a/src/lib.rs b/src/lib.rs index 1edb582..8e3ded1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,8 +3,8 @@ pub mod ipc; use ipc::*; use std::collections::HashMap; use std::fmt::{self, Display}; +use std::io::{BufReader, Read}; use std::os::unix::net::UnixStream; -use std::io::{Read, BufReader}; #[derive(Debug)] pub enum Event { @@ -132,9 +132,7 @@ impl Drop for Mpv { impl fmt::Debug for Mpv { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { - fmt.debug_tuple("Mpv") - .field(&self.name) - .finish() + fmt.debug_tuple("Mpv").field(&self.name).finish() } } @@ -185,9 +183,7 @@ impl Display for ErrorCode { f.write_str("The received value is not of type \'std::f64\'") } ErrorCode::ValueDoesNotContainHashMap => { - f.write_str( - "The received value is not of type \'std::collections::HashMap\'", - ) + f.write_str("The received value is not of type \'std::collections::HashMap\'") } ErrorCode::ValueDoesNotContainPlaylist => { f.write_str("The received value is not of type \'mpvipc::Playlist\'") @@ -290,9 +286,9 @@ impl Mpv { pub fn disconnect(&self) { let mut stream = &self.stream; - stream.shutdown(std::net::Shutdown::Both).expect( - "socket disconnect", - ); + stream + .shutdown(std::net::Shutdown::Both) + .expect("socket disconnect"); let mut buffer = [0; 32]; for _ in 0..stream.bytes().count() { stream.read(&mut buffer[..]).unwrap(); @@ -449,33 +445,25 @@ impl Mpv { option: PlaylistAddOptions, ) -> Result<(), Error> { match file_type { - PlaylistAddTypeOptions::File => { - match option { - PlaylistAddOptions::Replace => { - run_mpv_command(self, "loadfile", &[file, "replace"]) - } - PlaylistAddOptions::Append => { - run_mpv_command(self, "loadfile", &[file, "append"]) - } - PlaylistAddOptions::AppendPlay => { - run_mpv_command(self, "loadfile", &[file, "append-play"]) - } + PlaylistAddTypeOptions::File => match option { + PlaylistAddOptions::Replace => { + run_mpv_command(self, "loadfile", &[file, "replace"]) } - } + PlaylistAddOptions::Append => run_mpv_command(self, "loadfile", &[file, "append"]), + PlaylistAddOptions::AppendPlay => { + run_mpv_command(self, "loadfile", &[file, "append-play"]) + } + }, - PlaylistAddTypeOptions::Playlist => { - match option { - PlaylistAddOptions::Replace => { - run_mpv_command(self, "loadlist", &[file, "replace"]) - } - PlaylistAddOptions::Append | - PlaylistAddOptions::AppendPlay => { - run_mpv_command(self, "loadlist", &[file, "append"]) - } + PlaylistAddTypeOptions::Playlist => match option { + PlaylistAddOptions::Replace => { + run_mpv_command(self, "loadlist", &[file, "replace"]) } - } + PlaylistAddOptions::Append | PlaylistAddOptions::AppendPlay => { + run_mpv_command(self, "loadlist", &[file, "append"]) + } + }, } - } pub fn playlist_clear(&self) -> Result<(), Error> { @@ -492,13 +480,11 @@ impl Mpv { pub fn playlist_play_next(&self, id: usize) -> Result<(), Error> { match get_mpv_property::(self, "playlist-pos") { - Ok(current_id) => { - run_mpv_command( - self, - "playlist-move", - &[&id.to_string(), &(current_id + 1).to_string()], - ) - } + Ok(current_id) => run_mpv_command( + self, + "playlist-move", + &[&id.to_string(), &(current_id + 1).to_string()], + ), Err(msg) => Err(msg), } } @@ -533,21 +519,17 @@ impl Mpv { match option { Switch::On => enabled = true, Switch::Off => {} - Switch::Toggle => { - match get_mpv_property_string(self, "loop-file") { - Ok(value) => { - match value.as_ref() { - "false" => { - enabled = true; - } - _ => { - enabled = false; - } - } + Switch::Toggle => match get_mpv_property_string(self, "loop-file") { + Ok(value) => match value.as_ref() { + "false" => { + enabled = true; } - Err(msg) => return Err(msg), - } - } + _ => { + enabled = false; + } + }, + Err(msg) => return Err(msg), + }, } set_mpv_property(self, "loop-file", enabled) } @@ -557,21 +539,17 @@ impl Mpv { match option { Switch::On => enabled = true, Switch::Off => {} - Switch::Toggle => { - match get_mpv_property_string(self, "loop-playlist") { - Ok(value) => { - match value.as_ref() { - "false" => { - enabled = true; - } - _ => { - enabled = false; - } - } + Switch::Toggle => match get_mpv_property_string(self, "loop-playlist") { + Ok(value) => match value.as_ref() { + "false" => { + enabled = true; } - Err(msg) => return Err(msg), - } - } + _ => { + enabled = false; + } + }, + Err(msg) => return Err(msg), + }, } set_mpv_property(self, "loop-playlist", enabled) } @@ -581,14 +559,12 @@ impl Mpv { match option { Switch::On => enabled = true, Switch::Off => {} - Switch::Toggle => { - match get_mpv_property::(self, "mute") { - Ok(value) => { - enabled = !value; - } - Err(msg) => return Err(msg), + Switch::Toggle => match get_mpv_property::(self, "mute") { + Ok(value) => { + enabled = !value; } - } + Err(msg) => return Err(msg), + }, } set_mpv_property(self, "mute", enabled) } @@ -627,38 +603,34 @@ impl Mpv { pub fn set_speed(&self, input_speed: f64, option: NumberChangeOptions) -> Result<(), Error> { match get_mpv_property::(self, "speed") { - Ok(speed) => { - match option { - NumberChangeOptions::Increase => { - set_mpv_property(self, "speed", speed + input_speed) - } - - NumberChangeOptions::Decrease => { - set_mpv_property(self, "speed", speed - input_speed) - } - - NumberChangeOptions::Absolute => set_mpv_property(self, "speed", input_speed), + Ok(speed) => match option { + NumberChangeOptions::Increase => { + set_mpv_property(self, "speed", speed + input_speed) } - } + + NumberChangeOptions::Decrease => { + set_mpv_property(self, "speed", speed - input_speed) + } + + NumberChangeOptions::Absolute => set_mpv_property(self, "speed", input_speed), + }, Err(msg) => Err(msg), } } pub fn set_volume(&self, input_volume: f64, option: NumberChangeOptions) -> Result<(), Error> { match get_mpv_property::(self, "volume") { - Ok(volume) => { - match option { - NumberChangeOptions::Increase => { - set_mpv_property(self, "volume", volume + input_volume) - } - - NumberChangeOptions::Decrease => { - set_mpv_property(self, "volume", volume - input_volume) - } - - NumberChangeOptions::Absolute => set_mpv_property(self, "volume", input_volume), + Ok(volume) => match option { + NumberChangeOptions::Increase => { + set_mpv_property(self, "volume", volume + input_volume) } - } + + NumberChangeOptions::Decrease => { + set_mpv_property(self, "volume", volume - input_volume) + } + + NumberChangeOptions::Absolute => set_mpv_property(self, "volume", input_volume), + }, Err(msg) => Err(msg), } }