aboutsummaryrefslogtreecommitdiff
path: root/stream
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-12-18 17:35:58 +0100
committermetamuffin <metamuffin@disroot.org>2023-12-18 17:35:58 +0100
commitaf16c274aa28886f9f8a839e756ba932f9369187 (patch)
treee2f520943a5b7b6f21ef6a12d6f9bf06c826eca1 /stream
parent19fb2e9d0996fc72dc370709111829fcf11811f3 (diff)
downloadjellything-af16c274aa28886f9f8a839e756ba932f9369187.tar
jellything-af16c274aa28886f9f8a839e756ba932f9369187.tar.bz2
jellything-af16c274aa28886f9f8a839e756ba932f9369187.tar.zst
about to refactor sub transcode
Diffstat (limited to 'stream')
-rw-r--r--stream/src/webvtt.rs39
1 files changed, 26 insertions, 13 deletions
diff --git a/stream/src/webvtt.rs b/stream/src/webvtt.rs
index 74a12a5..246b1ed 100644
--- a/stream/src/webvtt.rs
+++ b/stream/src/webvtt.rs
@@ -1,4 +1,4 @@
-use anyhow::{anyhow, Context, Result};
+use anyhow::{anyhow, bail, Context, Result};
use jellybase::CONF;
use jellycommon::{stream::StreamSpec, LocalTrack, Node};
use jellyremuxer::extract::extract_track;
@@ -13,25 +13,38 @@ pub async fn webvtt_stream(
) -> Result<()> {
// TODO cache
+ // TODO should use snippets too? big films take too long...
+
+ let tracki = *spec.tracks.get(0).ok_or(anyhow!("no track selected"))?;
let local_track = track_sources
- .get(*spec.tracks.get(0).ok_or(anyhow!("no track selected"))?)
+ .get(tracki)
.ok_or(anyhow!("track does not exist"))?
.clone();
+ let track = &node.public.media.unwrap().tracks[tracki];
- let codec_private = local_track
- .codec_private
- .clone()
- .ok_or(anyhow!("ASS is missing required codec private data"))?;
+ match track.codec.as_str() {
+ "S_TEXT/UTF8" => bail!("no subrip yet"),
+ "S_VOBSUB" => bail!("no vobsub yet"),
+ "S_TEXT/ASS" => {
+ 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))
+ 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")?;
+ 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;
+ });
+ }
- tokio::task::spawn(async move {
- let _ = b.write_all(webvtt.as_bytes()).await;
- });
+ _ => bail!("unknown sub codec"),
+ };
Ok(())
}