/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2023 metamuffin */ use jellybase::{cache::async_cache_file, AssetLocationExt}; use jellycommon::AssetLocation; use std::process::Stdio; use tokio::{fs::File, process::Command}; #[derive(Debug)] pub enum Encoding { Video { codec: &'static str, preset: u8, bitrate: usize, width: usize, }, } pub async fn transcode(asset: AssetLocation, enc: Encoding) -> anyhow::Result { let original_path = asset.path(); let asset = asset.clone(); Ok(async_cache_file( &[ "snip-tc", original_path.as_os_str().to_str().unwrap(), &format!("{enc:?}"), ], move |output| async move { let args = match enc { Encoding::Video { codec, preset, bitrate, width, } => [ "-vf".to_string(), format!("scale={width}:-1"), "-c:v".to_string(), codec.to_string(), "-preset".to_string(), format!("{preset}"), "-b:v".to_string(), format!("{bitrate}"), ] .to_vec(), }; let mut proc = Command::new("ffmpeg") .stdin(Stdio::piped()) .stdout(Stdio::piped()) .args(&["-f", "mkv", "-i", "pipe:0"]) .args(args) .args(&["-f", "mkv", "pipe:1"]) .spawn()?; let mut stdin = proc.stdin.take().unwrap(); let mut stdout = proc.stdout.take().unwrap(); Ok(()) }, ) .await?) }