use anyhow::{Context, Result}; use jellycache::{Cache, HashKey}; use log::info; use std::{ io::Read, path::Path, process::{Command, Stdio}, }; pub fn create_thumbnail(cache: &Cache, path: &Path, time: f64) -> Result { cache .store( format!("media/thumbnail/{}-{}.image", HashKey(path), time as i64), move || { 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(); let mut output = Vec::new(); stdout.read_to_end(&mut output)?; proc.wait().unwrap().exit_ok()?; info!("done"); Ok(output) }, ) .context("creating thumbnail") }