/* 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) 2025 metamuffin */ use anyhow::Result; use std::{ fs::{remove_file, File}, io::{copy, Read, Write}, process::{Command, Stdio}, random::random, }; pub fn matroska_to_mpeg4( mut input: impl Read + Send + 'static, mut output: impl Write, ) -> Result<()> { let path = format!("/tmp/jellything-tc-hack-{:016x}", random::()); let args = format!( "-hide_banner -loglevel warning -f matroska -i pipe:0 -c copy -f mp4 -movflags frag_keyframe+empty_moov {path}" ); let mut child = Command::new("ffmpeg") .args(args.split(" ")) .stdin(Stdio::piped()) .stderr(Stdio::inherit()) .spawn()?; let mut stdin = child.stdin.take().unwrap(); copy(&mut input, &mut stdin)?; drop(stdin); child.wait()?.exit_ok()?; copy(&mut File::open(&path)?, &mut output)?; remove_file(path)?; Ok(()) }