diff options
-rw-r--r-- | common/src/config.rs | 4 | ||||
-rw-r--r-- | stream/src/hls.rs | 12 |
2 files changed, 13 insertions, 3 deletions
diff --git a/common/src/config.rs b/common/src/config.rs index 0b1c576..ff367c3 100644 --- a/common/src/config.rs +++ b/common/src/config.rs @@ -30,7 +30,9 @@ pub struct GlobalConfig { #[derive(Serialize, Deserialize, Debug)] pub struct SecretsConfig { + #[serde(default)] pub federation: HashMap<String, FederationAccount>, + #[serde(default)] pub api: ApiSecrets, #[serde(default)] pub cookie_key: Option<String>, @@ -47,7 +49,7 @@ pub struct FederationAccount { pub tls: bool, } -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Default)] pub struct ApiSecrets { pub tmdb: Option<String>, pub tvdb: Option<String>, diff --git a/stream/src/hls.rs b/stream/src/hls.rs index 4f83577..310c6b1 100644 --- a/stream/src/hls.rs +++ b/stream/src/hls.rs @@ -25,7 +25,7 @@ pub async fn hls_master_stream( let mut out = String::new(); writeln!(out, "#EXTM3U")?; writeln!(out, "#EXT-X-VERSION:4")?; - writeln!(out, "#EXT-X-INDEPENDENT-SEGMENTS")?; + // writeln!(out, "#EXT-X-INDEPENDENT-SEGMENTS")?; for t in spec.tracks { let uri = format!( "stream?{}", @@ -37,6 +37,7 @@ pub async fn hls_master_stream( .to_query() ); // writeln!(out,"#EXT-X-MEDIA:NAME=\"track {t}\", TYPE=AUDIO, GROUP-ID=\"track{t}\", DEFAULT=YES, AUTOSELECT=YES, URI=\"{uri}\"")?; + writeln!(out, "#EXT-X-STREAM-INF:BANDWIDTH=5000000")?; writeln!(out, "{uri}")?; } tokio::spawn(async move { b.write_all(out.as_bytes()).await }); @@ -51,6 +52,7 @@ pub async fn hls_variant_stream( ) -> Result<()> { let local_track = local_tracks.get(0).ok_or(anyhow!("no track"))?.to_owned(); let track_index = spec.tracks[0]; + let media_info = node.public.media.to_owned().ok_or(anyhow!("no media?"))?; let snips = spawn_blocking(move || { jellyremuxer::snippet::snippet_index( &CONF.media_path, @@ -60,17 +62,23 @@ pub async fn hls_variant_stream( ) }) .await??; + let mut out = String::new(); writeln!(out, "#EXTM3U")?; + writeln!(out, "#EXT-X-PLAYLIST-TYPE:VOD")?; + writeln!(out, "#EXT-X-TARGETDURATIION:{}", media_info.duration)?; writeln!(out, "#EXT-X-VERSION:4")?; + writeln!(out, "#EXT-X-MEDIA-SEQUENCE:0")?; spec.format = StreamFormat::Snippet; for (i, Range { start, end }) in snips.iter().enumerate() { - writeln!(out, "#EXTINF:{},", end - start)?; + writeln!(out, "#EXTINF:{:},", end - start)?; spec.index = Some(i); writeln!(out, "stream?{}", spec.to_query())?; } + writeln!(out, "#EXT-X-ENDLIST")?; + tokio::spawn(async move { b.write_all(out.as_bytes()).await }); Ok(()) } |