use crate::LOCAL_IMAGE_TRANSCODING_TASKS; use jellycache::{async_cache_file, CachePath}; 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 { async_cache_file("thumb", (path, time as i64), 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 }