use crate::LOCAL_IMAGE_TRANSCODING_TASKS; use jellybase::cache::async_cache_file; use jellycommon::AssetLocation; use log::info; use std::{path::Path, process::Stdio}; use tokio::{io::copy, process::Command}; pub async fn create_thumbnail(path: &Path, time: f64) -> anyhow::Result { Ok(async_cache_file( &["thumb", path.to_str().unwrap(), &format!("{time}")], move |mut output| async move { let _permit = LOCAL_IMAGE_TRANSCODING_TASKS.acquire().await?; info!("creating thumbnail of {path:?} at {time}s",); let mut proc = Command::new("ffmpeg") .stdout(Stdio::piped()) .args(&["-ss", &format!("{time}")]) .args(&["-f", "matroska", "-i", path.to_str().unwrap()]) .args(&["-frames:v", "1"]) .args(&["-c:v", "qoi"]) .args(&["-f", "image2"]) .args(&["-update", "1"]) .arg("pipe:1") .spawn()?; let mut stdout = proc.stdout.take().unwrap(); copy(&mut stdout, &mut output).await?; proc.wait().await.unwrap().exit_ok()?; info!("done"); Ok(()) }, ) .await?) }