Add probe.rs
This commit is contained in:
63
src/probe.rs
Normal file
63
src/probe.rs
Normal file
@@ -0,0 +1,63 @@
|
||||
use std::path::Path;
|
||||
use std::process::Command;
|
||||
use crate::error::{ProbeError, Result};
|
||||
|
||||
/// Execute ffprobe and return JSON output
|
||||
pub fn run_ffprobe(video_path: &str) -> Result<String> {
|
||||
// Check if file exists
|
||||
if !Path::new(video_path).exists() {
|
||||
return Err(ProbeError::FileNotFound(video_path.to_string()));
|
||||
}
|
||||
|
||||
// Execute ffprobe
|
||||
let output = Command::new("ffprobe")
|
||||
.args(&[
|
||||
"-v", "quiet",
|
||||
"-print_format", "json",
|
||||
"-show_format",
|
||||
"-show_streams",
|
||||
video_path
|
||||
])
|
||||
.output()
|
||||
.map_err(|e| {
|
||||
if e.kind() == std::io::ErrorKind::NotFound {
|
||||
ProbeError::FfprobeExecution(std::io::Error::new(
|
||||
std::io::ErrorKind::NotFound,
|
||||
"ffprobe not found. Please install ffmpeg."
|
||||
))
|
||||
} else {
|
||||
ProbeError::FfprobeExecution(e)
|
||||
}
|
||||
})?;
|
||||
|
||||
// Check exit code
|
||||
if !output.status.success() {
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
return Err(ProbeError::FfprobeFailed(stderr.to_string()));
|
||||
}
|
||||
|
||||
// Return JSON output
|
||||
let stdout = String::from_utf8(output.stdout)
|
||||
.map_err(|_| {
|
||||
ProbeError::ParseError(serde_json::from_str::<serde_json::Value>("").unwrap_err())
|
||||
})?;
|
||||
|
||||
Ok(stdout)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_file_not_found() {
|
||||
let result = run_ffprobe("nonexistent_video.mp4");
|
||||
|
||||
match result {
|
||||
Err(ProbeError::FileNotFound(path)) => {
|
||||
assert_eq!(path, "nonexistent_video.mp4");
|
||||
}
|
||||
_ => panic!("Expected FileNotFound error"),
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user