diff options
author | metamuffin <metamuffin@disroot.org> | 2024-05-14 00:25:19 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-05-14 00:25:19 +0200 |
commit | b07bafa8eda0daa472d47e17042e9804f1d1ba66 (patch) | |
tree | 81df41bbdb829534ecc2dd1b00a81723a6426303 /transcoder/src/subtitles.rs | |
parent | 8752a12e954600152e9eaa60ed29af585ed06c64 (diff) | |
download | jellything-b07bafa8eda0daa472d47e17042e9804f1d1ba66.tar jellything-b07bafa8eda0daa472d47e17042e9804f1d1ba66.tar.bz2 jellything-b07bafa8eda0daa472d47e17042e9804f1d1ba66.tar.zst |
better handle BlockGroup without duration
Diffstat (limited to 'transcoder/src/subtitles.rs')
-rw-r--r-- | transcoder/src/subtitles.rs | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/transcoder/src/subtitles.rs b/transcoder/src/subtitles.rs index 2532781..db23d5b 100644 --- a/transcoder/src/subtitles.rs +++ b/transcoder/src/subtitles.rs @@ -10,7 +10,7 @@ use std::fmt::Write; pub fn parse_subtitles( codec: &str, codec_private: Option<Vec<u8>>, - blocks: Vec<(u64, u64, Vec<u8>)>, + blocks: Vec<(u64, Option<u64>, Vec<u8>)>, ) -> anyhow::Result<Vec<SubtitleCue>> { match codec { "D_WEBVTT/SUBTITLES" => parse_webvtt_blocks(blocks), @@ -46,26 +46,30 @@ pub fn write_webvtt(title: String, subtitles: &[SubtitleCue]) -> anyhow::Result< Ok(out) } -pub fn parse_webvtt_blocks(blocks: Vec<(u64, u64, Vec<u8>)>) -> anyhow::Result<Vec<SubtitleCue>> { +pub fn parse_webvtt_blocks( + blocks: Vec<(u64, Option<u64>, Vec<u8>)>, +) -> anyhow::Result<Vec<SubtitleCue>> { let mut out = Vec::new(); for (pts, dur, block) in blocks { let content = String::from_utf8_lossy(&block).trim().to_string(); out.push(SubtitleCue { content, start: pts as f64 / 1000., - end: (pts + dur) as f64 / 1000., + end: (pts + dur.unwrap_or(1000)) as f64 / 1000., }) } Ok(out) } -pub fn parse_subrip_blocks(blocks: Vec<(u64, u64, Vec<u8>)>) -> anyhow::Result<Vec<SubtitleCue>> { +pub fn parse_subrip_blocks( + blocks: Vec<(u64, Option<u64>, Vec<u8>)>, +) -> anyhow::Result<Vec<SubtitleCue>> { let mut out = Vec::new(); for (pts, dur, block) in blocks { let content = String::from_utf8_lossy(&block).trim().to_string(); out.push(SubtitleCue { content, start: pts as f64 / 1000., - end: (pts + dur) as f64 / 1000., + end: (pts + dur.unwrap_or(1000)) as f64 / 1000., }); } Ok(out) @@ -73,7 +77,7 @@ pub fn parse_subrip_blocks(blocks: Vec<(u64, u64, Vec<u8>)>) -> anyhow::Result<V pub fn parse_ass_blocks( _codec_private: Vec<u8>, - blocks: Vec<(u64, u64, Vec<u8>)>, + blocks: Vec<(u64, Option<u64>, Vec<u8>)>, ) -> anyhow::Result<Vec<SubtitleCue>> { // TODO dont ignore codec_private @@ -98,7 +102,7 @@ pub fn parse_ass_blocks( out.push(SubtitleCue { content: text.to_owned(), start: pts as f64 / 1000., - end: (pts + dur) as f64 / 1000., + end: (pts + dur.unwrap_or(1000)) as f64 / 1000., }) } Ok(out) |