aboutsummaryrefslogtreecommitdiff
path: root/stream/src/webvtt.rs
diff options
context:
space:
mode:
Diffstat (limited to 'stream/src/webvtt.rs')
-rw-r--r--stream/src/webvtt.rs46
1 files changed, 31 insertions, 15 deletions
diff --git a/stream/src/webvtt.rs b/stream/src/webvtt.rs
index 48cf8d5..2de9835 100644
--- a/stream/src/webvtt.rs
+++ b/stream/src/webvtt.rs
@@ -5,12 +5,13 @@
*/
use anyhow::{anyhow, bail, Context, Result};
use jellybase::CONF;
-use jellycommon::{stream::StreamSpec, LocalTrack, Node};
+use jellycommon::{jhls::SubtitleCue, stream::StreamSpec, LocalTrack, Node};
use jellyremuxer::extract::extract_track;
-use jellytranscoder::subtitles::webvtt_from_ass_blocks;
+use jellytranscoder::subtitles::{parse_ass_blocks, parse_webvtt_blocks, write_webvtt};
use tokio::io::{AsyncWriteExt, DuplexStream};
-pub async fn webvtt_stream(
+pub async fn vtt_stream(
+ json: bool,
node: Node,
local_tracks: Vec<LocalTrack>,
spec: StreamSpec,
@@ -24,7 +25,29 @@ pub async fn webvtt_stream(
let local_track = local_tracks.get(0).ok_or(anyhow!("no tracks"))?.clone();
let track = &node.public.media.unwrap().tracks[tracki];
+ let write = |blocks: Vec<SubtitleCue>| -> anyhow::Result<()> {
+ let output = if json {
+ serde_json::to_string(&blocks)?
+ } else {
+ write_webvtt(node.public.title.clone().unwrap_or_default(), blocks)
+ .context("writing webvtt")?
+ };
+ tokio::task::spawn(async move {
+ let _ = b.write_all(output.as_bytes()).await;
+ });
+ Ok(())
+ };
+
match track.codec.as_str() {
+ "D_WEBVTT/SUBTITLES" => {
+ let webvtt_blocks = tokio::task::spawn_blocking(move || {
+ extract_track(CONF.media_path.clone(), local_track)
+ })
+ .await??;
+
+ let subtitles = parse_webvtt_blocks(webvtt_blocks).context("parsing subtitles")?;
+ write(subtitles)?;
+ }
"S_TEXT/UTF8" => bail!("no subrip yet"),
"S_VOBSUB" => bail!("no vobsub yet"),
"S_TEXT/ASS" => {
@@ -34,23 +57,16 @@ pub async fn webvtt_stream(
.ok_or(anyhow!("ASS is missing required codec private data"))?;
let ass_blocks = tokio::task::spawn_blocking(move || {
- extract_track(CONF.library_path.clone(), local_track)
+ extract_track(CONF.media_path.clone(), local_track)
})
.await??;
- let webvtt = webvtt_from_ass_blocks(
- node.public.title.clone().unwrap_or_default(),
- codec_private,
- ass_blocks,
- )
- .context("transcoding subtitles")?;
-
- tokio::task::spawn(async move {
- let _ = b.write_all(webvtt.as_bytes()).await;
- });
+ let subtitles =
+ parse_ass_blocks(codec_private, ass_blocks).context("parsing subtitles")?;
+ write(subtitles)?;
}
- _ => bail!("unknown sub codec"),
+ x => bail!("unknown sub codec {x:?}"),
};
Ok(())
}