aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/src/stream.rs72
1 files changed, 66 insertions, 6 deletions
diff --git a/common/src/stream.rs b/common/src/stream.rs
index 46f6abc..0e8f810 100644
--- a/common/src/stream.rs
+++ b/common/src/stream.rs
@@ -4,22 +4,23 @@
Copyright (C) 2025 metamuffin <metamuffin.org>
*/
use serde::{Deserialize, Serialize};
+use std::fmt::Display;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub enum StreamSpec {
Whep {
- track: u64,
+ track: usize,
seek: u64,
},
WhepControl {
token: String,
},
Remux {
- track: Vec<u64>,
+ tracks: Vec<usize>,
container: StreamContainer,
},
Original {
- track: u64,
+ track: usize,
},
HlsSuperMultiVariant {
container: StreamContainer,
@@ -30,7 +31,7 @@ pub enum StreamSpec {
},
HlsVariant {
segment: u64,
- track: u64,
+ track: usize,
container: StreamContainer,
format: usize,
},
@@ -39,11 +40,11 @@ pub enum StreamSpec {
},
FragmentIndex {
segment: u64,
- track: u64,
+ track: usize,
},
Fragment {
segment: u64,
- track: u64,
+ track: usize,
index: u64,
container: StreamContainer,
format: usize,
@@ -58,3 +59,62 @@ pub enum StreamContainer {
WebVTT,
JVTT,
}
+
+impl StreamSpec {
+ pub fn to_query(&self) -> String {
+ match self {
+ StreamSpec::Whep { track, seek } => format!("?whep&track={track}&seek={seek}"),
+ StreamSpec::WhepControl { token } => format!("?whepcontrol&token={token}"),
+ StreamSpec::Remux { tracks, container } => {
+ format!(
+ "?remux&tracks={}&container={container}",
+ tracks
+ .iter()
+ .map(|t| t.to_string())
+ .collect::<Vec<String>>()
+ .join(",")
+ )
+ }
+ StreamSpec::Original { track } => format!("?original&track={track}"),
+ StreamSpec::HlsSuperMultiVariant { container } => {
+ format!("?hlssupermultivariant&container={container}")
+ }
+ StreamSpec::HlsMultiVariant { segment, container } => {
+ format!("?hlsmultivariant&segment={segment}&container={container}")
+ }
+ StreamSpec::HlsVariant {
+ segment,
+ track,
+ container,
+ format,
+ } => format!(
+ "?hlsvariant&segment={segment}&track={track}&container={container}&format={format}"
+ ),
+ StreamSpec::Info {
+ segment: Some(segment),
+ } => format!("?info&segment={segment}"),
+ StreamSpec::Info { segment: None } => format!("?info"),
+ StreamSpec::FragmentIndex { segment, track } => {
+ format!("?fragmentindex&segment={segment}&track={track}")
+ }
+ StreamSpec::Fragment {
+ segment,
+ track,
+ index,
+ container,
+ format,
+ } => format!("?fragment&segment={segment}&track={track}&index={index}&container={container}&format={format}"),
+ }
+ }
+}
+
+impl Display for StreamContainer {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.write_str(match self {
+ StreamContainer::WebM => "webm",
+ StreamContainer::Matroska => "matroska",
+ StreamContainer::WebVTT => "webvtt",
+ StreamContainer::JVTT => "jvtt",
+ })
+ }
+}