aboutsummaryrefslogtreecommitdiff
path: root/stream/src/webvtt.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-11-28 13:31:28 +0100
committermetamuffin <metamuffin@disroot.org>2023-11-28 13:31:28 +0100
commit1d2ed0a54c21e0ab7dd01b5f3975bb5df12d40ea (patch)
treea7531389b2a8ad6d8b89d92900b96fcf0e431774 /stream/src/webvtt.rs
parent9ac41109362dc118f1dbd2e86e9c8d64fd7364e9 (diff)
downloadjellything-1d2ed0a54c21e0ab7dd01b5f3975bb5df12d40ea.tar
jellything-1d2ed0a54c21e0ab7dd01b5f3975bb5df12d40ea.tar.bz2
jellything-1d2ed0a54c21e0ab7dd01b5f3975bb5df12d40ea.tar.zst
ass to webvtt conversion
Diffstat (limited to 'stream/src/webvtt.rs')
-rw-r--r--stream/src/webvtt.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/stream/src/webvtt.rs b/stream/src/webvtt.rs
new file mode 100644
index 0000000..74a12a5
--- /dev/null
+++ b/stream/src/webvtt.rs
@@ -0,0 +1,37 @@
+use anyhow::{anyhow, Context, Result};
+use jellybase::CONF;
+use jellycommon::{stream::StreamSpec, LocalTrack, Node};
+use jellyremuxer::extract::extract_track;
+use jellytranscoder::subtitles::webvtt_from_ass_blocks;
+use tokio::io::{AsyncWriteExt, DuplexStream};
+
+pub async fn webvtt_stream(
+ node: Node,
+ track_sources: Vec<LocalTrack>,
+ spec: StreamSpec,
+ mut b: DuplexStream,
+) -> Result<()> {
+ // TODO cache
+
+ let local_track = track_sources
+ .get(*spec.tracks.get(0).ok_or(anyhow!("no track selected"))?)
+ .ok_or(anyhow!("track does not exist"))?
+ .clone();
+
+ let codec_private = local_track
+ .codec_private
+ .clone()
+ .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))
+ .await??;
+
+ let webvtt = webvtt_from_ass_blocks(node.public.title, codec_private, ass_blocks)
+ .context("transcoding subtitles")?;
+
+ tokio::task::spawn(async move {
+ let _ = b.write_all(webvtt.as_bytes()).await;
+ });
+ Ok(())
+}