aboutsummaryrefslogtreecommitdiff
path: root/stream/src/lib.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-04-14 13:41:42 +0200
committermetamuffin <metamuffin@disroot.org>2025-04-14 13:41:42 +0200
commita3afc2756a52f7d6fedc928b97c8ff3eb1ade338 (patch)
tree9bb043975a6b92e45bbc2f09e19641f1109950b1 /stream/src/lib.rs
parent48a57a52d85d387efe122fb4d9fb113f577a0a98 (diff)
downloadjellything-a3afc2756a52f7d6fedc928b97c8ff3eb1ade338.tar
jellything-a3afc2756a52f7d6fedc928b97c8ff3eb1ade338.tar.bz2
jellything-a3afc2756a52f7d6fedc928b97c8ff3eb1ade338.tar.zst
lots of rewriting and removing dumb code
Diffstat (limited to 'stream/src/lib.rs')
-rw-r--r--stream/src/lib.rs36
1 files changed, 23 insertions, 13 deletions
diff --git a/stream/src/lib.rs b/stream/src/lib.rs
index d09759f..a6faf54 100644
--- a/stream/src/lib.rs
+++ b/stream/src/lib.rs
@@ -5,17 +5,20 @@
*/
#![feature(iterator_try_collect)]
pub mod fragment;
+pub mod fragment_index;
pub mod hls;
-pub mod jhls;
pub mod webvtt;
use anyhow::{anyhow, Context, Result};
+use fragment::fragment_stream;
+use fragment_index::fragment_index_stream;
+use hls::{hls_master_stream, hls_variant_stream};
use jellybase::common::{
stream::{
StreamContainer, StreamFormatInfo, StreamInfo, StreamSegmentInfo, StreamSpec,
StreamTrackInfo, TrackKind,
},
- LocalTrack, Node,
+ Node,
};
use jellyremuxer::metadata::{matroska_metadata, MatroskaMetadata};
use std::{collections::BTreeSet, io::SeekFrom, ops::Range, path::PathBuf, sync::Arc};
@@ -75,22 +78,26 @@ pub async fn stream(
StreamSpec::Remux { tracks, container } => todo!(),
StreamSpec::Original { track } => original_stream(info, track, range, b).await?,
StreamSpec::HlsSuperMultiVariant { container } => todo!(),
- StreamSpec::HlsMultiVariant { segment, container } => todo!(),
+ StreamSpec::HlsMultiVariant { segment, container } => {
+ hls_master_stream(b, info, segment, container).await?
+ }
StreamSpec::HlsVariant {
segment,
track,
container,
format,
- } => todo!(),
- StreamSpec::Info { segment } => write_stream_info(info, b).await?,
- StreamSpec::FragmentIndex { segment, track } => todo!(),
+ } => hls_variant_stream(b, info, segment, track, format, container).await?,
+ StreamSpec::Info { segment: _ } => write_stream_info(info, b).await?,
+ StreamSpec::FragmentIndex { segment, track } => {
+ fragment_index_stream(b, info, segment, track).await?
+ }
StreamSpec::Fragment {
segment,
track,
index,
container,
format,
- } => todo!(),
+ } => fragment_stream(b, info, track, segment, index, format, container).await?,
}
Ok(a)
@@ -103,7 +110,7 @@ async fn async_matroska_metadata(path: PathBuf) -> Result<Arc<MatroskaMetadata>>
pub(crate) struct InternalStreamInfo {
pub paths: Vec<PathBuf>,
pub metadata: Vec<Arc<MatroskaMetadata>>,
- pub track_to_file: Vec<usize>,
+ pub track_to_file: Vec<(usize, u64)>,
}
async fn stream_info(info: Arc<SMediaInfo>) -> Result<(InternalStreamInfo, StreamInfo)> {
@@ -142,14 +149,19 @@ async fn stream_info(info: Arc<SMediaInfo>) -> Result<(InternalStreamInfo, Strea
},
formats,
});
- track_to_file.push(i);
+ track_to_file.push((i, t.track_number));
}
}
}
let segment = StreamSegmentInfo {
name: None,
- duration: 0,
+ duration: metadata[0]
+ .info
+ .as_ref()
+ .unwrap()
+ .duration
+ .unwrap_or_default(),
tracks,
};
Ok((
@@ -173,7 +185,6 @@ async fn write_stream_info(info: Arc<SMediaInfo>, mut b: DuplexStream) -> Result
async fn remux_stream(
node: Arc<Node>,
- local_tracks: Vec<LocalTrack>,
spec: StreamSpec,
range: Range<usize>,
b: DuplexStream,
@@ -202,8 +213,7 @@ async fn original_stream(
b: DuplexStream,
) -> Result<()> {
let (iinfo, _info) = stream_info(info).await?;
-
- let file_index = *iinfo
+ let (file_index, _) = *iinfo
.track_to_file
.get(track)
.ok_or(anyhow!("unknown track"))?;