Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
581c922
Add local config protection from origin/main
r0d8lsh0p Nov 28, 2025
0907a56
Add backend configuration structure (closes #236)
r0d8lsh0p Nov 28, 2025
d52d1a4
Add StreamingBackend abstraction layer (partial #237)
r0d8lsh0p Nov 28, 2025
0e7c57b
complete backend abstraction closes 237
r0d8lsh0p Nov 28, 2025
44f9a38
add notes for ai and cloudflare
r0d8lsh0p Nov 29, 2025
0f37cf9
Clarify warning check methodology to prevent AI confusion
r0d8lsh0p Nov 29, 2025
24dab0f
Add Cloudflare API discovery toolkit
r0d8lsh0p Nov 30, 2025
1abfa6a
Document validated Cloudflare API findings - NO HLS in Live Input
r0d8lsh0p Dec 1, 2025
3b79567
VALIDATE Cloudflare HLS architecture with live streaming test
r0d8lsh0p Dec 1, 2025
964b436
Refactor: Organize streaming backends as architectural peers (Issue #…
r0d8lsh0p Dec 1, 2025
0570151
initial draft of 3A to implement cloudflare incomplete but useful bre…
r0d8lsh0p Dec 1, 2025
7035f91
Add CloudflareBackend implementation with unit tests (Step 3A)
r0d8lsh0p Dec 1, 2025
7d1bd9c
first cut cloudflare webhooks for issue 239
r0d8lsh0p Dec 2, 2025
71942c1
first cut integration testing. some success but incomplete and needs …
r0d8lsh0p Dec 2, 2025
68faddf
separate billing from segment processing and move it into check strea…
r0d8lsh0p Dec 2, 2025
6bb9989
further integration testing for nostr relay publishing
r0d8lsh0p Dec 3, 2025
55af17f
fix storage of cloudflare uuid in db and use of that to get ingest ur…
r0d8lsh0p Dec 5, 2025
deae3a4
first cut fix for webhook lifecycle start regression test passed but …
r0d8lsh0p Dec 5, 2025
c543742
fix cloudflare backend webhook json passing and populate live_input_c…
r0d8lsh0p Dec 6, 2025
a7f6bc8
updated e2e testing scripts and display cf backend streams on homepag…
r0d8lsh0p Dec 8, 2025
81258d0
Refactor RML RTMP backend to use StreamManager for viewer counts
r0d8lsh0p Dec 8, 2025
6525f45
Implement Cloudflare viewer counts with unified stream cache
r0d8lsh0p Dec 8, 2025
141dbc5
make tos url configurable
r0d8lsh0p Dec 8, 2025
8efc91b
add check viewer count and check health methods and with cloudflare a…
r0d8lsh0p Dec 8, 2025
a69b0f3
implement video recording and thumbnail updates at end of stream and …
r0d8lsh0p Dec 9, 2025
5f0b85d
Make alt tag configurable (Closes #241) and tidy config file up
r0d8lsh0p Dec 10, 2025
a15ce2b
Tidy up cruft and remove logging
r0d8lsh0p Dec 10, 2025
b52e8bf
Add documentation and remove cruft
r0d8lsh0p Dec 10, 2025
41d8d72
Support custom ingest domain names (Closes #254)
r0d8lsh0p Dec 10, 2025
a43da94
Clean up scripts folder to finalise tests and remove discovery
r0d8lsh0p Dec 11, 2025
0711232
Add support for custom stream keys (Closes #250) AND fix a related bu…
r0d8lsh0p Dec 11, 2025
66b020b
Remove notes/ from git tracking, add to .gitignore
r0d8lsh0p Dec 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
**/target
.idea/
**/out/
**/out/
docs/deploy/data/
node_modules/

# local configuration
docs/deploy/compose-config.yaml
docs/deploy/docker-compose.override.yaml
docs/deploy/docker-compose.override.yml
*.local.yaml
*.local.yml

# Cloudflare API credentials and test output
scripts/.env
cloudflare-api-responses-*/

# AI development notes
notes/
53 changes: 53 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion crates/core/src/overseer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,13 @@ pub trait Overseer: Send + Sync {
async fn connect(&self, connection_info: &ConnectionInfo) -> Result<ConnectResult>;

/// Set up a new streaming pipeline
///
/// For local backends (e.g. RML RTMP), stream_info contains actual stream data.
/// For cloud backends (e.g. Cloudflare), stream_info is None as the stream is processed remotely.
async fn start_stream(
&self,
connection: &ConnectionInfo,
stream_info: &IngressInfo,
stream_info: Option<&IngressInfo>,
) -> Result<PipelineConfig>;

/// A new segment(s) (HLS etc.) was generated for a stream variant
Expand Down
4 changes: 2 additions & 2 deletions crates/core/src/pipeline/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ pub struct PipelineConfig {
pub variants: Vec<VariantStream>,
/// Output muxers
pub egress: Vec<EgressType>,
/// Source stream information for placeholder generation
pub ingress_info: IngressInfo,
/// Source stream information for placeholder generation (None for cloud backends)
pub ingress_info: Option<IngressInfo>,
/// Primary source video stream
pub video_src: usize,
/// Primary audio source stream
Expand Down
2 changes: 1 addition & 1 deletion crates/core/src/pipeline/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1004,7 +1004,7 @@ impl PipelineRunner {
};
let cfg = self.handle.block_on(async {
self.overseer
.start_stream(&mut self.connection, &i_info)
.start_stream(&mut self.connection, Some(&i_info))
.await
})?;

Expand Down
5 changes: 3 additions & 2 deletions crates/n94/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -302,8 +302,9 @@ impl Overseer for N94Overseer {
async fn start_stream(
&self,
_connection: &ConnectionInfo,
stream_info: &IngressInfo,
stream_info: Option<&IngressInfo>,
) -> Result<PipelineConfig> {
let stream_info = stream_info.ok_or_else(|| anyhow::anyhow!("N94 requires stream info"))?;
let cfg = get_variants_from_endpoint(stream_info, &self.capabilities)?;

if cfg.video_src.is_none() || cfg.variants.is_empty() {
Expand Down Expand Up @@ -349,7 +350,7 @@ impl Overseer for N94Overseer {
SegmentType::MPEGTS,
)],
variants: cfg.variants,
ingress_info: stream_info.clone(),
ingress_info: Some(stream_info.clone()),
video_src: cfg.video_src.unwrap().index,
audio_src: cfg.audio_src.map(|s| s.index),
})
Expand Down
5 changes: 5 additions & 0 deletions crates/zap-stream/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ tokio.workspace = true
tokio-util.workspace = true
async-trait.workspace = true
serde.workspace = true
serde_json = "1.0"
chrono.workspace = true
hex.workspace = true
reqwest = { version = "0.12", features = ["json"] }
url.workspace = true
m3u8-rs.workspace = true
data-encoding.workspace = true
Expand Down Expand Up @@ -64,3 +66,6 @@ tokio-stream = "0.1.17"
tiberius = "0.12.3"
sqlx = { version = "0.8.0", features = ["runtime-tokio-rustls", "mysql", "chrono", "uuid"] }
log = "0.4.28"

[dev-dependencies]
mockito = "1.6.1"
Loading