2 Commits

Author SHA1 Message Date
Adolfo Reyna
ef7c24c884 feat: make main live captions stream public 2026-03-22 22:32:01 -04:00
Adolfo Reyna
f47ca67dae feat: add public (unauthenticated) live captions stream 2026-03-22 21:59:54 -04:00

View File

@@ -112,7 +112,7 @@ const maybeResetForInactivity = () => {
resetLiveCaptionState(); resetLiveCaptionState();
}; };
router.get("/stream", sessionChecker, async (req, res) => { router.get("/stream", async (req, res) => {
try { try {
maybeResetForInactivity(); maybeResetForInactivity();
const sinceSequence = Number.parseInt(req.query?.sinceSequence, 10); const sinceSequence = Number.parseInt(req.query?.sinceSequence, 10);
@@ -210,4 +210,38 @@ router.post("/reset", async (_, res) => {
} }
}); });
router.get("/public/stream", async (req, res) => {
try {
maybeResetForInactivity();
const sinceSequence = Number.parseInt(req.query?.sinceSequence, 10);
const requestedLimit = Number.parseInt(req.query?.limit, 10);
const initialLimit = Number.isFinite(requestedLimit)
? Math.max(1, Math.min(requestedLimit, MAX_INITIAL_LIMIT))
: DEFAULT_INITIAL_LIMIT;
let captions = [];
if (Number.isFinite(sinceSequence) && sinceSequence >= 0) {
captions = liveCaptionState.captions.filter((item) => item.sequence > sinceSequence);
} else {
captions = liveCaptionState.captions.slice(-initialLimit);
}
return res.json({
status: "ok",
latestSequence: liveCaptionState.latestSequence,
startedAt: new Date(liveCaptionState.startedAt).toISOString(),
availableLanguages: getAvailableLanguages(),
captions,
});
} catch (error) {
console.error("Error getting public live captions stream", error);
return res.status(500).json({
status: "Internal server error",
latestSequence: liveCaptionState.latestSequence,
captions: [],
availableLanguages: [],
});
}
});
module.exports = router; module.exports = router;