use anyhow::{bail, Result};
use clap::{Args, ValueEnum};
use std::path::PathBuf;
use vsd_mp4::text::{Mp4TtmlParser, Mp4VttParser};
#[derive(Args, Clone, Debug)]
pub struct Extract {
#[arg(required = true)]
input: PathBuf,
#[arg(short, long, value_enum, default_value_t = Codec::Webvtt)]
codec: Codec,
}
#[derive(Clone, Debug, ValueEnum)]
pub enum Codec {
Subrip,
Webvtt,
}
impl Extract {
pub fn execute(self) -> Result<()> {
let data = std::fs::read(self.input)?;
let subtitles;
if let Ok(vtt) = Mp4VttParser::parse_init(&data) {
subtitles = vtt.parse_media(&data, None)?;
} else if let Ok(ttml) = Mp4TtmlParser::parse_init(&data) {
subtitles = ttml.parse_media(&data)?;
} else {
bail!("cannot determine subtitles codec because neither WVTT nor STPP box is found.");
}
print!(
"{}",
match &self.codec {
Codec::Subrip => subtitles.as_srt(),
Codec::Webvtt => subtitles.as_vtt(),
}
);
Ok(())
}
}