use crate::audio::player::AudioPlayerControls;
use crate::common::errors::MyError;
use libmpv::Mpv;
pub struct MpvAudioPlayer {
mpv: Mpv,
}
impl MpvAudioPlayer {
pub(crate) fn new(input_path: &str) -> Result<Self, MyError> {
let mpv = Mpv::new().expect("Failed to init MPV builder");
mpv.set_property("vid", "no")
.map_err(|err| MyError::Audio(format!("Failed to set no-video property: {:?}", err)))?;
mpv.set_property("audio-display", "no").map_err(|err| {
MyError::Audio(format!(
"Failed to set no-audio-display property: {:?}",
err
))
})?;
mpv.command("loadfile", &[input_path])
.map_err(|err| MyError::Audio(format!("Failed to load audio file: {:?}", err)))?;
mpv.set_property("pause", true)
.map_err(|err| MyError::Audio(format!("Failed to set pause property: {:?}", err)))?;
Ok(Self { mpv })
}
}
impl AudioPlayerControls for MpvAudioPlayer {
fn pause(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("pause", true)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
fn resume(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("pause", false)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
fn toggle_play(&mut self) -> Result<(), MyError> {
let paused = self
.mpv
.get_property("pause")
.map_err(|err| MyError::Audio(format!("{:?}", err)))?;
if paused {
self.resume()
} else {
self.pause()
}
}
fn mute(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("mute", true)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
fn unmute(&mut self) -> Result<(), MyError> {
self.mpv
.set_property("mute", false)
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
fn toggle_mute(&mut self) -> Result<(), MyError> {
let muted = self
.mpv
.get_property("mute")
.map_err(|err| MyError::Audio(format!("{:?}", err)))?;
if muted {
self.unmute()
} else {
self.mute()
}
}
fn stop(&mut self) -> Result<(), MyError> {
self.mpv
.command("stop", &["false"])
.map_err(|err| MyError::Audio(format!("{:?}", err)))
}
fn rewind(&mut self) -> Result<(), MyError> {
Err(MyError::Audio(
"Rewind feature not implemented for MPV audio player".to_string(),
))
}
}