48 lines
1.1 KiB
Rust
48 lines
1.1 KiB
Rust
|
mod ffprobe_output;
|
||
|
pub mod errors;
|
||
|
pub mod types;
|
||
|
|
||
|
use std::{
|
||
|
convert::Into,
|
||
|
path::PathBuf,
|
||
|
process::Command,
|
||
|
};
|
||
|
|
||
|
use self::errors::{AnalyzeError, FFProbeError};
|
||
|
|
||
|
pub fn analyze(path: &PathBuf) -> Result<types::FFProbeData, AnalyzeError> {
|
||
|
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();
|
||
|
|
||
|
return Ok(types::FFProbeData {
|
||
|
tags: ffprobe_out.format.tags.into(),
|
||
|
});
|
||
|
}
|