2023-10-18 14:47:03 +01:00
|
|
|
pub mod errors;
|
2023-10-19 17:22:01 +01:00
|
|
|
mod ffprobe_output;
|
2023-10-18 14:47:03 +01:00
|
|
|
pub mod types;
|
|
|
|
|
2023-10-19 17:22:01 +01:00
|
|
|
use std::{convert::Into, path::Path, process::Command};
|
2023-10-18 14:47:03 +01:00
|
|
|
|
|
|
|
use self::errors::{AnalyzeError, FFProbeError};
|
|
|
|
|
2023-10-18 15:55:44 +01:00
|
|
|
pub fn analyze(path: &Path) -> Result<types::FFProbeData, AnalyzeError> {
|
2023-10-19 17:22:01 +01:00
|
|
|
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<ffprobe_output::FFProbeOutput> =
|
|
|
|
serde_json::from_str(output.as_str());
|
|
|
|
|
|
|
|
let ffprobe_out = ffprobe_out.unwrap();
|
|
|
|
|
|
|
|
Ok(types::FFProbeData {
|
|
|
|
tags: ffprobe_out.format.tags.into(),
|
|
|
|
})
|
2023-10-18 14:47:03 +01:00
|
|
|
}
|