diff --git a/services/mam-api/src/scheduler.js b/services/mam-api/src/scheduler.js index a929bc1..6787dd9 100644 --- a/services/mam-api/src/scheduler.js +++ b/services/mam-api/src/scheduler.js @@ -135,6 +135,24 @@ async function tick() { } } + // Orphaned live assets: recorder stopped but asset still 'live'. + // Happens when the capture sidecar crashes before finalize() runs. + // Mark error immediately so the library doesn't show "Recording" forever. + const orphanResult = await client.query( + `UPDATE assets a + SET status = 'error', updated_at = NOW() + FROM recorders r + WHERE a.status = 'live' + AND a.display_name = r.current_session_id + AND r.status = 'stopped' + RETURNING a.id, a.display_name` + ); + if (orphanResult.rows.length > 0) { + for (const row of orphanResult.rows) { + console.warn(`[scheduler] orphaned live asset (recorder stopped): ${row.id} (${row.display_name})`); + } + } + const LIVE_TIMEOUT_MINUTES = parseInt(process.env.LIVE_ASSET_TIMEOUT_MINUTES || '120', 10); const staleResult = await client.query( `UPDATE assets