diff options
| author | yum <yum.food.vr@gmail.com> | 2025-10-14 21:09:16 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-10-28 17:19:36 -0700 |
| commit | fb7997c4773dc81414baadbfbfa5b171cd6f7eb2 (patch) | |
| tree | b9d486ad0c8c4f622b80acc9f91a4d34b9e72884 | |
| parent | 32f304df0f463c08c93a22d67da6335bec2b3fbe (diff) | |
add better logging
| -rwxr-xr-x | opt/obsproxy/server.py | 46 |
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: |
