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.rs32
1 files changed, 25 insertions, 7 deletions
diff --git a/stream/src/webvtt.rs b/stream/src/webvtt.rs
index e9d03bf..b29c7c5 100644
--- a/stream/src/webvtt.rs
+++ b/stream/src/webvtt.rs
@@ -4,7 +4,7 @@
Copyright (C) 2024 metamuffin <metamuffin.org>
*/
use anyhow::{anyhow, Context, Result};
-use jellybase::CONF;
+use jellybase::{cache::async_cache_memory, CONF};
use jellycommon::{stream::StreamSpec, LocalTrack, Node};
use jellyremuxer::extract::extract_track;
use jellytranscoder::subtitles::{parse_subtitles, write_webvtt};
@@ -26,16 +26,34 @@ pub async fn vtt_stream(
let track = &node.public.media.unwrap().tracks[tracki];
let cp = local_track.codec_private.clone();
- let blocks =
- tokio::task::spawn_blocking(move || extract_track(CONF.media_path.clone(), local_track))
+ let subtitles = async_cache_memory(
+ &[
+ "vtt",
+ &format!(
+ "{} {}",
+ local_track.path.to_str().unwrap(),
+ local_track.track
+ ),
+ ],
+ move || async move {
+ let blocks = tokio::task::spawn_blocking(move || {
+ extract_track(CONF.media_path.clone(), local_track)
+ })
.await??;
+ let subtitles = parse_subtitles(&track.codec, cp, blocks)?;
+ Ok(subtitles)
+ },
+ )
+ .await?;
- let subtitles = parse_subtitles(&track.codec, cp, blocks)?;
let output = if json {
- serde_json::to_string(&subtitles)?
+ serde_json::to_string(subtitles.as_ref())?
} else {
- write_webvtt(node.public.title.clone().unwrap_or_default(), subtitles)
- .context("writing webvtt")?
+ write_webvtt(
+ node.public.title.clone().unwrap_or_default(),
+ subtitles.as_ref(),
+ )
+ .context("writing webvtt")?
};
tokio::task::spawn(async move {
let _ = b.write_all(output.as_bytes()).await;