aboutsummaryrefslogtreecommitdiff
path: root/stream/src/hls.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-09-30 20:07:52 +0200
committermetamuffin <metamuffin@disroot.org>2023-09-30 20:07:52 +0200
commit215503287d2e835f5ae9bd9cbd4262188025b44c (patch)
treeff96753bbd53a5886fa9859652f3231a6fff0b29 /stream/src/hls.rs
parentb15fb338de55df177948a7fdf9704efa4374816b (diff)
downloadjellything-215503287d2e835f5ae9bd9cbd4262188025b44c.tar
jellything-215503287d2e835f5ae9bd9cbd4262188025b44c.tar.bz2
jellything-215503287d2e835f5ae9bd9cbd4262188025b44c.tar.zst
broken snippet generation and outputting something that looks like hls
Diffstat (limited to 'stream/src/hls.rs')
-rw-r--r--stream/src/hls.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/stream/src/hls.rs b/stream/src/hls.rs
index 6ddc2a4..81d0c8c 100644
--- a/stream/src/hls.rs
+++ b/stream/src/hls.rs
@@ -3,3 +3,67 @@
which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
Copyright (C) 2023 metamuffin <metamuffin.org>
*/
+
+use anyhow::{anyhow, Result};
+use jellybase::CONF;
+use jellycommon::{
+ stream::{StreamFormat, StreamSpec},
+ LocalTrack, Node,
+};
+use std::{fmt::Write, ops::Range};
+use tokio::io::{AsyncWriteExt, DuplexStream};
+
+pub async fn hls_master_stream(
+ _node: Node,
+ _track_sources: Vec<LocalTrack>,
+ spec: StreamSpec,
+ mut b: DuplexStream,
+) -> Result<()> {
+ let mut out = String::new();
+ writeln!(out, "#EXTM3U")?;
+ writeln!(out, "#EXT-X-VERSION:4")?;
+ writeln!(out, "#EXT-X-INDEPENDENT-SEGMENTS")?;
+ for t in spec.tracks {
+ let uri = format!(
+ "stream?{}",
+ StreamSpec {
+ tracks: vec![t],
+ format: StreamFormat::HlsVariant,
+ ..Default::default()
+ }
+ .to_query()
+ );
+ // writeln!(out,"#EXT-X-MEDIA:NAME=\"track {t}\", TYPE=AUDIO, GROUP-ID=\"track{t}\", DEFAULT=YES, AUTOSELECT=YES, URI=\"{uri}\"")?;
+ writeln!(out, "{uri}")?;
+ }
+ tokio::spawn(async move { b.write_all(out.as_bytes()).await });
+ Ok(())
+}
+
+pub async fn hls_variant_stream(
+ node: Node,
+ track_sources: Vec<LocalTrack>,
+ mut spec: StreamSpec,
+ mut b: DuplexStream,
+) -> Result<()> {
+ let track = *spec.tracks.get(0).ok_or(anyhow!("no track"))?;
+ let snips = jellyremuxer::snippet::snippet_index(
+ CONF.library_path.clone(),
+ node.public.clone(),
+ &track_sources,
+ track,
+ )?;
+ let mut out = String::new();
+ writeln!(out, "#EXTM3U")?;
+ writeln!(out, "#EXT-X-VERSION:4")?;
+
+ spec.format = StreamFormat::Segment;
+ for (i, Range { start, end }) in snips.iter().enumerate() {
+ writeln!(out, "#EXTINF:{},", end - start)?;
+ spec.index = Some(i);
+ writeln!(out, "stream?{}", spec.to_query())?;
+ }
+
+ tokio::spawn(async move { b.write_all(out.as_bytes()).await });
+ Ok(())
+}