diff options
Diffstat (limited to 'stream')
| -rw-r--r-- | stream/src/webvtt.rs | 71 | 
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(())  } | 
