aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-06-03 13:28:25 +0200
committermetamuffin <metamuffin@disroot.org>2025-06-03 13:28:25 +0200
commitd205173acdd721d581a88fe4788d1ec64b9c2055 (patch)
tree60091001cc36075bf18ed2411bac1663c4a45b17
parent0bfac6434601e8c4feac6d497df632ede15a7503 (diff)
downloadjellything-d205173acdd721d581a88fe4788d1ec64b9c2055.tar
jellything-d205173acdd721d581a88fe4788d1ec64b9c2055.tar.bz2
jellything-d205173acdd721d581a88fe4788d1ec64b9c2055.tar.zst
stream query short format
-rw-r--r--common/src/stream.rs83
-rw-r--r--stream/src/fragment.rs3
-rw-r--r--stream/src/lib.rs2
3 files changed, 65 insertions, 23 deletions
diff --git a/common/src/stream.rs b/common/src/stream.rs
index 81dd298..b60b349 100644
--- a/common/src/stream.rs
+++ b/common/src/stream.rs
@@ -13,13 +13,13 @@ pub type IndexNum = usize;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub enum StreamSpec {
- Whep {
- track: TrackNum,
- seek: u64,
- },
- WhepControl {
- token: String,
- },
+ // Whep {
+ // track: TrackNum,
+ // seek: u64,
+ // },
+ // WhepControl {
+ // token: String,
+ // },
Remux {
tracks: Vec<usize>,
container: StreamContainer,
@@ -117,8 +117,6 @@ pub enum StreamContainer {
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}",
@@ -160,22 +158,65 @@ impl StreamSpec {
} => format!("?fragment&segment={segment}&track={track}&index={index}&container={container}&format={format}"),
}
}
+ pub fn to_query_short(&self) -> String {
+ match self {
+ StreamSpec::Remux { tracks, container } => {
+ format!(
+ "?remux&ts={}&c={container}",
+ tracks
+ .iter()
+ .map(|t| t.to_string())
+ .collect::<Vec<String>>()
+ .join(",")
+ )
+ }
+ StreamSpec::Original { track } => format!("?original&t={track}"),
+ StreamSpec::HlsSuperMultiVariant { container } => {
+ format!("?hlssupermultivariant&c={container}")
+ }
+ StreamSpec::HlsMultiVariant { segment, container } => {
+ format!("?hlsmultivariant&s={segment}&c={container}")
+ }
+ StreamSpec::HlsVariant {
+ segment,
+ track,
+ container,
+ format,
+ } => format!("?hlsvariant&s={segment}&t={track}&c={container}&f={format}"),
+ StreamSpec::Info {
+ segment: Some(segment),
+ } => format!("?info&s={segment}"),
+ StreamSpec::Info { segment: None } => "?info".to_string(),
+ StreamSpec::FragmentIndex { segment, track } => {
+ format!("?fragmentindex&s={segment}&t={track}")
+ }
+ StreamSpec::Fragment {
+ segment,
+ track,
+ index,
+ container,
+ format,
+ } => format!("?fragment&s={segment}&t={track}&i={index}&c={container}&f={format}"),
+ }
+ }
pub fn from_query_kv(query: &BTreeMap<String, String>) -> Result<Self, &'static str> {
- let get_num = |k: &'static str| {
+ let get_num = |k: &'static str, ks: &'static str| {
query
.get(k)
+ .or(query.get(ks))
.ok_or(k)
.and_then(|a| a.parse().map_err(|_| "invalid number"))
};
let get_container = || {
query
.get("container")
+ .or(query.get("c"))
.ok_or("container")
.and_then(|s| s.parse().map_err(|()| "unknown container"))
};
if query.contains_key("info") {
Ok(Self::Info {
- segment: get_num("segment").ok(),
+ segment: get_num("segment", "s").ok(),
})
} else if query.contains_key("hlssupermultivariant") {
Ok(Self::HlsSuperMultiVariant {
@@ -183,28 +224,28 @@ impl StreamSpec {
})
} else if query.contains_key("hlsmultivariant") {
Ok(Self::HlsMultiVariant {
- segment: get_num("segment")? as SegmentNum,
+ segment: get_num("segment", "s")? as SegmentNum,
container: get_container()?,
})
} else if query.contains_key("hlsvariant") {
Ok(Self::HlsVariant {
- segment: get_num("segment")? as SegmentNum,
- track: get_num("track")? as TrackNum,
- format: get_num("format")? as FormatNum,
+ segment: get_num("segment", "s")? as SegmentNum,
+ track: get_num("track", "t")? as TrackNum,
+ format: get_num("format", "f")? as FormatNum,
container: get_container()?,
})
} else if query.contains_key("fragment") {
Ok(Self::Fragment {
- segment: get_num("segment")? as SegmentNum,
- track: get_num("track")? as TrackNum,
- format: get_num("format")? as FormatNum,
- index: get_num("index")? as IndexNum,
+ segment: get_num("segment", "s")? as SegmentNum,
+ track: get_num("track", "t")? as TrackNum,
+ format: get_num("format", "f")? as FormatNum,
+ index: get_num("index", "i")? as IndexNum,
container: get_container()?,
})
} else if query.contains_key("fragmentindex") {
Ok(Self::FragmentIndex {
- segment: get_num("segment")? as SegmentNum,
- track: get_num("track")? as TrackNum,
+ segment: get_num("segment", "s")? as SegmentNum,
+ track: get_num("track", "t")? as TrackNum,
})
} else {
Err("invalid stream spec")
diff --git a/stream/src/fragment.rs b/stream/src/fragment.rs
index 205c302..49817ca 100644
--- a/stream/src/fragment.rs
+++ b/stream/src/fragment.rs
@@ -84,6 +84,9 @@ pub async fn fragment_stream(
}
});
}
+ StreamContainer::JVTT => {
+
+ }
_ => bail!("not yet supported"),
}
} else {
diff --git a/stream/src/lib.rs b/stream/src/lib.rs
index 8352eaf..9c62ac8 100644
--- a/stream/src/lib.rs
+++ b/stream/src/lib.rs
@@ -75,8 +75,6 @@ pub fn stream_head(spec: &StreamSpec) -> StreamHead {
StreamContainer::MPEG4 => "video/mp4",
};
match spec {
- StreamSpec::Whep { .. } => cons("application/x-todo", false),
- StreamSpec::WhepControl { .. } => cons("application/x-todo", false),
StreamSpec::Remux { container, .. } => cons(container_ct(*container), true),
StreamSpec::Original { .. } => cons("video/x-matroska", true),
StreamSpec::HlsSuperMultiVariant { .. } => cons("application/vnd.apple.mpegurl", false),