async clipify

main
Bel LaPointe 2023-12-28 17:30:09 -05:00
parent 68dd89ffc9
commit 6513dc09b4
2 changed files with 29 additions and 12 deletions

View File

@ -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) => {

View File

@ -207,18 +207,16 @@ async fn analyze(file: String) -> Analysis {
async fn clipify(file: String, content_spans: Vec<lib::video::ContentSpan>) -> 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,