fix: inject hls_manager into routes module so preview endpoints work
This commit is contained in:
parent
b936647abb
commit
7e51da50c8
1 changed files with 16 additions and 28 deletions
|
|
@ -14,13 +14,12 @@ from .recorders.recorder import RecorderManager
|
|||
from .recorders.scte35 import SCTE35Manager
|
||||
from .utils.hls import HLSPreviewManager
|
||||
from .api.routes import router
|
||||
from .api import routes as routes_module # to set module-level globals
|
||||
from .api import routes as routes_module
|
||||
from .api.websocket import ConnectionManager
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
settings = Settings()
|
||||
|
||||
# Global manager instances
|
||||
recorder_manager: RecorderManager | None = None
|
||||
scte35_manager: SCTE35Manager | None = None
|
||||
hls_manager: HLSPreviewManager | None = None
|
||||
|
|
@ -29,10 +28,8 @@ connection_manager = ConnectionManager()
|
|||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
"""Initialize and cleanup application resources."""
|
||||
global recorder_manager, scte35_manager, hls_manager
|
||||
|
||||
# Startup
|
||||
logger.info("Starting Deltacast SDI Recorder...")
|
||||
|
||||
recorder_manager = RecorderManager(settings)
|
||||
|
|
@ -42,18 +39,17 @@ async def lifespan(app: FastAPI):
|
|||
|
||||
hls_manager = HLSPreviewManager(settings)
|
||||
|
||||
# Inject managers into routes module
|
||||
# Inject all managers into routes module
|
||||
routes_module.recorder_manager = recorder_manager
|
||||
routes_module.scte35_manager = scte35_manager
|
||||
routes_module.hls_manager = hls_manager
|
||||
|
||||
# Start background task for status broadcasting
|
||||
status_task = asyncio.create_task(broadcast_port_status())
|
||||
|
||||
logger.info("Deltacast SDI Recorder started successfully")
|
||||
logger.info(f"Deltacast SDI Recorder started — {settings.deltacast_port_count} ports")
|
||||
|
||||
yield # Application runs here
|
||||
yield
|
||||
|
||||
# Shutdown
|
||||
logger.info("Shutting down Deltacast SDI Recorder...")
|
||||
status_task.cancel()
|
||||
try:
|
||||
|
|
@ -61,7 +57,6 @@ async def lifespan(app: FastAPI):
|
|||
except asyncio.CancelledError:
|
||||
pass
|
||||
|
||||
# Stop all recorders and previews
|
||||
for port_index in range(settings.deltacast_port_count):
|
||||
await recorder_manager.stop_recording(port_index)
|
||||
await hls_manager.stop_preview(port_index)
|
||||
|
|
@ -70,7 +65,6 @@ async def lifespan(app: FastAPI):
|
|||
|
||||
|
||||
async def broadcast_port_status():
|
||||
"""Background task: broadcast port status to all WebSocket clients every 1 second."""
|
||||
while True:
|
||||
try:
|
||||
if recorder_manager is not None:
|
||||
|
|
@ -92,7 +86,6 @@ app = FastAPI(
|
|||
lifespan=lifespan
|
||||
)
|
||||
|
||||
# CORS - allow all origins for local network use
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
|
|
@ -101,18 +94,14 @@ app.add_middleware(
|
|||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
# Include API router
|
||||
app.include_router(router)
|
||||
|
||||
|
||||
@app.websocket("/ws")
|
||||
async def websocket_endpoint(websocket: WebSocket):
|
||||
"""WebSocket endpoint for real-time port status updates."""
|
||||
await connection_manager.connect(websocket)
|
||||
try:
|
||||
while True:
|
||||
# Keep connection alive, receive any messages
|
||||
# (not used but required to detect disconnect)
|
||||
data = await websocket.receive_text()
|
||||
except WebSocketDisconnect:
|
||||
connection_manager.disconnect(websocket)
|
||||
|
|
@ -120,7 +109,6 @@ async def websocket_endpoint(websocket: WebSocket):
|
|||
|
||||
@app.get("/hls/{filename}")
|
||||
async def serve_hls(filename: str):
|
||||
"""Serve HLS segment and playlist files."""
|
||||
hls_path = Path("/tmp/hls") / filename
|
||||
if not hls_path.exists():
|
||||
raise HTTPException(status_code=404, detail="HLS file not found")
|
||||
|
|
|
|||
Loading…
Reference in a new issue