mod ffprobe_output; pub mod errors; pub mod types; use std::{ convert::Into, path::Path, process::Command, }; use self::errors::{AnalyzeError, FFProbeError}; pub fn analyze(path: &Path) -> Result { let output = Command::new(crate::meta::FFPROBE) .args([ "-v", "quiet", "-print_format", "json", "-show_format", path.to_str().unwrap(), ]) .output(); if let Err(err) = output { return Err(AnalyzeError::IOError(err)); } let output = output.unwrap(); if !output.status.success() { return Err(AnalyzeError::FFProbeError(FFProbeError { exit_status: output.status, stderr: String::from_utf8(output.stderr).unwrap(), })); } let output = String::from_utf8(output.stdout).unwrap(); let ffprobe_out: serde_json::Result = serde_json::from_str(output.as_str()); let ffprobe_out = ffprobe_out.unwrap(); Ok(types::FFProbeData { tags: ffprobe_out.format.tags.into(), }) }