2023-10-18 14:47:03 +01:00
|
|
|
pub mod errors;
|
|
|
|
pub mod types;
|
2023-10-30 22:49:09 +00:00
|
|
|
mod ffprobe_output;
|
2023-10-18 14:47:03 +01:00
|
|
|
|
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-30 22:49:09 +00:00
|
|
|
fn extract(path: &Path, ffprobe_command: Option<&str>) -> Result<ffprobe_output::FFProbeOutput, AnalyzeError> {
|
|
|
|
let output = Command::new(ffprobe_command.unwrap_or("ffprobe"))
|
2023-10-19 17:22:01 +01:00
|
|
|
.args([
|
|
|
|
"-v",
|
|
|
|
"quiet",
|
|
|
|
"-print_format",
|
|
|
|
"json",
|
|
|
|
"-show_format",
|
2023-10-20 15:31:26 +01:00
|
|
|
"-show_streams",
|
2023-10-19 17:22:01 +01:00
|
|
|
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());
|
|
|
|
|
2023-10-20 15:31:26 +01:00
|
|
|
Ok(ffprobe_out.unwrap())
|
|
|
|
}
|
|
|
|
|
2023-10-30 22:49:09 +00:00
|
|
|
pub fn analyze(path: &Path, ffprobe_command: Option<&str>) -> Result<types::FFProbeData, AnalyzeError> {
|
|
|
|
let raw_data = extract(path, ffprobe_command)?;
|
2023-10-20 15:31:26 +01:00
|
|
|
|
|
|
|
let mut data = types::FFProbeData {
|
|
|
|
tags: raw_data.format.tags.into(),
|
|
|
|
album_art: None,
|
|
|
|
};
|
|
|
|
|
|
|
|
for stream in raw_data.streams.into_iter() {
|
|
|
|
if stream.codec_type == "video" {
|
|
|
|
data.album_art = Some(types::FFProbeAlbumArt {
|
|
|
|
codec_name: stream.codec_name,
|
|
|
|
height: stream.height.unwrap(),
|
|
|
|
width: stream.width.unwrap(),
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
2023-10-19 17:22:01 +01:00
|
|
|
|
2023-10-20 15:31:26 +01:00
|
|
|
Ok(data)
|
2023-10-18 14:47:03 +01:00
|
|
|
}
|