summaryrefslogtreecommitdiffstats
path: root/opt/obsproxy
diff options
context:
space:
mode:
Diffstat (limited to 'opt/obsproxy')
-rwxr-xr-xopt/obsproxy/server.py46
1 files changed, 40 insertions, 6 deletions
diff --git a/opt/obsproxy/server.py b/opt/obsproxy/server.py
index 0c32979..d7d3eac 100755
--- a/opt/obsproxy/server.py
+++ b/opt/obsproxy/server.py
@@ -5,6 +5,7 @@ import secrets
import subprocess
import threading
import shutil
+import time
from pathlib import Path
from flask import Flask, request
import logging
@@ -62,6 +63,29 @@ def reset_stream_path():
STREAM_PATH.mkdir(parents=True, exist_ok=True)
+def _log_playlist_availability(playlist_path: Path, timeout: float = 30.0, poll_interval: float = 0.5) -> None:
+ """Log when the HLS playlist becomes available (or if it never does)."""
+ start = time.monotonic()
+ while time.monotonic() - start <= timeout:
+ if playlist_path.exists():
+ elapsed = time.monotonic() - start
+ segments = sorted(seg.name for seg in playlist_path.parent.glob('segment-*.ts'))
+ logger.info(
+ "HLS playlist materialized after %.2fs at %s; segments=%s",
+ elapsed,
+ playlist_path,
+ segments,
+ )
+ return
+ time.sleep(poll_interval)
+
+ logger.warning(
+ "HLS playlist still missing after %.2fs at %s",
+ timeout,
+ playlist_path,
+ )
+
+
def start_ffmpeg_process():
"""Start FFmpeg to convert RTMP ingest into HLS."""
global ffmpeg_process, stream_active
@@ -193,9 +217,12 @@ def on_publish():
global stream_active
stream_key = request.form.get('name')
+ logger.info("on_publish received for key=%s", stream_key)
+
+ old_playlist = STREAM_PATH / 'stream.m3u8'
if not stream_key or stream_key != INGEST_PSK:
- logger.warning("Unauthorized stream key attempted to publish")
+ logger.warning("Unauthorized stream key attempted to publish: %s", stream_key)
return "Unauthorized", 403
if stream_active:
@@ -205,11 +232,16 @@ def on_publish():
if not start_ffmpeg_process():
return "Failed to start stream", 500
- logger.info(
- "Stream active; playlist available at https://%s%s/stream.m3u8",
- SERVER_DOMAIN,
- HLS_ROUTE_PREFIX
- )
+ playlist_path = STREAM_PATH / 'stream.m3u8'
+ if playlist_path.exists():
+ logger.info("Existing playlist found at %s", playlist_path)
+ else:
+ logger.info('Stream active; waiting for playlist to appear')
+ threading.Thread(
+ target=_log_playlist_availability,
+ args=(playlist_path,),
+ daemon=True,
+ ).start()
return "OK"
@@ -220,8 +252,10 @@ def on_publish_done():
global stream_active
stream_key = request.form.get('name')
+ logger.info("on_publish_done received for key=%s", stream_key)
if not stream_key or stream_key != INGEST_PSK:
+ logger.warning("on_publish_done received for unknown key: %s", stream_key)
return "Bad request", 400
if stream_active: