aboutsummaryrefslogtreecommitdiff
path: root/stream/src/webvtt.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-01-28 17:55:11 +0100
committermetamuffin <metamuffin@disroot.org>2024-01-28 17:55:11 +0100
commit727be96686a2c6c5747b26be15933e11c9cab9c6 (patch)
tree817accf6c4965e814cc8736fdbd17b423fae0669 /stream/src/webvtt.rs
parent5b587f2914908daa804bb643ac216001290077ab (diff)
downloadjellything-727be96686a2c6c5747b26be15933e11c9cab9c6.tar
jellything-727be96686a2c6c5747b26be15933e11c9cab9c6.tar.bz2
jellything-727be96686a2c6c5747b26be15933e11c9cab9c6.tar.zst
clean up some code + subrip support?
Diffstat (limited to 'stream/src/webvtt.rs')
-rw-r--r--stream/src/webvtt.rs71
1 files changed, 15 insertions, 56 deletions
diff --git a/stream/src/webvtt.rs b/stream/src/webvtt.rs
index e720800..3c9ec41 100644
--- a/stream/src/webvtt.rs
+++ b/stream/src/webvtt.rs
@@ -3,13 +3,11 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2024 metamuffin <metamuffin.org>
*/
-use anyhow::{anyhow, bail, Context, Result};
+use anyhow::{anyhow, Context, Result};
use jellybase::CONF;
-use jellycommon::{jhls::SubtitleCue, stream::StreamSpec, LocalTrack, Node};
+use jellycommon::{stream::StreamSpec, LocalTrack, Node};
use jellyremuxer::extract::extract_track;
-use jellytranscoder::subtitles::{
- parse_ass_blocks, parse_pgs_blocks, parse_webvtt_blocks, write_webvtt,
-};
+use jellytranscoder::subtitles::{parse_subtitles, write_webvtt};
use tokio::io::{AsyncWriteExt, DuplexStream};
pub async fn vtt_stream(
@@ -26,60 +24,21 @@ pub async fn vtt_stream(
let tracki = *spec.tracks.get(0).ok_or(anyhow!("no track selected"))?;
let local_track = local_tracks.get(0).ok_or(anyhow!("no tracks"))?.clone();
let track = &node.public.media.unwrap().tracks[tracki];
+ let cp = local_track.codec_private.clone();
- 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_HDMV/PGS" => {
- let webvtt_blocks = tokio::task::spawn_blocking(move || {
- extract_track(CONF.media_path.clone(), local_track)
- })
+ let blocks =
+ tokio::task::spawn_blocking(move || extract_track(CONF.media_path.clone(), local_track))
.await??;
- let subtitles = parse_pgs_blocks(webvtt_blocks).context("parsing subtitles")?;
- write(subtitles)?;
- }
- "S_HDMV/TEXTST" => bail!("no HDMV/PGSs yet"),
- "S_ARISUB" => bail!("no arisub yet"),
- "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.media_path.clone(), local_track)
- })
- .await??;
-
- let subtitles =
- parse_ass_blocks(codec_private, ass_blocks).context("parsing subtitles")?;
- write(subtitles)?;
- }
-
- x => bail!("unknown sub codec {x:?}"),
+ let subtitles = parse_subtitles(&track.codec, cp, blocks)?;
+ let output = if json {
+ serde_json::to_string(&subtitles)?
+ } else {
+ write_webvtt(node.public.title.clone().unwrap_or_default(), subtitles)
+ .context("writing webvtt")?
};
+ tokio::task::spawn(async move {
+ let _ = b.write_all(output.as_bytes()).await;
+ });
Ok(())
}