use anyhow::Result; use jellybase::CONF; use jellycommon::{ jhls::{JhlsMetadata, JhlsTrack}, stream::StreamSpec, LocalTrack, Node, }; use tokio::io::{AsyncWriteExt, DuplexStream}; pub async fn jhls_stream( node: Node, track_sources: Vec, _spec: StreamSpec, mut b: DuplexStream, ) -> Result<()> { let media = node.public.media.clone().unwrap(); let tracks = tokio::task::spawn_blocking(move || { media .tracks .iter() .enumerate() .filter_map(|(i, t)| { if matches!(t.kind, jellycommon::SourceTrackKind::Subtitles) { return None; } match jellyremuxer::snippet::snippet_index( &CONF.library_path, &node.public, &track_sources, i, ) { Ok(segments) => Some(Ok::<_, anyhow::Error>(JhlsTrack { info: t.to_owned(), segments, })), Err(e) => Some(Err(e)), } }) .try_collect::>() }) .await??; let out = serde_json::to_string(&JhlsMetadata { tracks, extra_profiles: CONF.transcoding_profiles.clone(), duration: media.duration, })?; tokio::spawn(async move { b.write_all(out.as_bytes()).await }); Ok(()) }