async clipify
parent
68dd89ffc9
commit
6513dc09b4
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue