use std::path::Path;
use crate::error::{AppError, Result};
use crate::ffmpeg::Ffmpeg;
pub fn burn_subtitles(
ffmpeg: &Ffmpeg,
input: &Path,
srt: &Path,
output: &Path,
) -> Result<()> {
let srt_dir = srt
.parent()
.filter(|p| !p.as_os_str().is_empty())
.ok_or_else(|| AppError::InvalidPath(srt.to_path_buf()))?;
let srt_name = srt
.file_name()
.and_then(|n| n.to_str())
.ok_or_else(|| AppError::InvalidPath(srt.to_path_buf()))?;
let input = input
.canonicalize()
.unwrap_or_else(|_| input.to_path_buf())
.to_string_lossy()
.into_owned();
let output = output.to_string_lossy().into_owned();
let filter = format!("subtitles={}", escape_filter_filename(srt_name));
ffmpeg.run_in(
Some(srt_dir),
&[
"-y",
"-i",
&input,
"-vf",
&filter,
"-c:a",
"copy",
&output,
],
)?;
Ok(())
}
fn escape_filter_filename(name: &str) -> String {
if name.contains([' ', ':', '\'', '\\', '[', ',', ';']) {
format!("'{name}'")
} else {
name.to_string()
}
}