diff --git a/src-lib/src/video.rs b/src-lib/src/video.rs index efb171b..01a1fb8 100644 --- a/src-lib/src/video.rs +++ b/src-lib/src/video.rs @@ -67,6 +67,25 @@ pub fn clip(output: &String, input: &String, content_span: ContentSpan) -> Resul } } +pub async fn clip_async(output: &String, input: &String, content_span: ContentSpan) -> Result<(), String> { + fs::create_dir_all(Path::new(output).parent().unwrap()).unwrap(); + match async_process::Command::new("ffmpeg") + .args([ + "-y", + "-ss", &content_span.start.to_string(), + "-i", input, + "-t", &(content_span.stop - content_span.start).to_string(), + output, + ]) + .output().await { + Ok(output) => match output.status.success() { + true => Ok(()), + false => Err(format!("failed to ffmpeg clip {}: {}", input, String::from_utf8(output.stderr).unwrap())), + }, + Err(msg) => Err(format!("failed to ffmpeg clip {}: {}", input, msg)), + } +} + pub fn screenshot(output: &String, input: &String, ts: f32) -> Result<(), String> { match screenshot_png(input, ts) { Ok(png) => { diff --git a/src/src/main.rs b/src/src/main.rs index 1689d31..f75cb0f 100644 --- a/src/src/main.rs +++ b/src/src/main.rs @@ -207,18 +207,16 @@ async fn analyze(file: String) -> Analysis { async fn clipify(file: String, content_spans: Vec) -> String { let d = format!("{}.d", &file); - match content_spans.iter() - .map(|content_span| { - lib::video::clip( - &format!("{}/{}.mp4", &d, content_span.start), - &file, - *content_span, - ) - }) - .filter(|x| x.is_err()) - .map(|x| x.err().unwrap()) - .nth(0) { - Some(err_msg) => err_msg, + let mut last_err = None; + for content_span in content_spans.iter() { + let output = format!("{}/{}.mp4", &d, content_span.start); + let cur = lib::video::clip_async(&output, &file, *content_span).await; + if cur.is_err() { + last_err = Some(format!("failed to clipify {} at {}..{}: {}", &file, &content_span.start, &content_span.stop, cur.err().unwrap())); + } + } + match last_err { + Some(msg) => msg, None => { match opener::open(d.clone()) { Ok(_) => d,