Make watch party worker stream more reliably

This commit is contained in:
MiTHRAL 2026-05-26 16:50:35 -04:00
parent 536ea2eff1
commit 926399502f
3 changed files with 22 additions and 1 deletions

View file

@ -28,4 +28,5 @@ WATCHPARTY_STREAM_BITRATE_KBPS=2000
WATCHPARTY_STREAM_MAX_BITRATE_KBPS=2500
WATCHPARTY_STREAM_CODEC=H264
WATCHPARTY_STREAM_PRESET=ultrafast
WATCHPARTY_STREAM_TYPE=camera
WATCHPARTY_STREAM_HARDWARE_ACCELERATION=false

View file

@ -30,4 +30,5 @@ WATCHPARTY_STREAM_BITRATE_KBPS=2000
WATCHPARTY_STREAM_MAX_BITRATE_KBPS=2500
WATCHPARTY_STREAM_CODEC=H264
WATCHPARTY_STREAM_PRESET=ultrafast
WATCHPARTY_STREAM_TYPE=camera
WATCHPARTY_STREAM_HARDWARE_ACCELERATION=false

View file

@ -28,6 +28,7 @@ const STREAM_BITRATE_KBPS = Number(process.env.WATCHPARTY_STREAM_BITRATE_KBPS ||
const STREAM_MAX_BITRATE_KBPS = Number(process.env.WATCHPARTY_STREAM_MAX_BITRATE_KBPS || "2500");
const STREAM_CODEC = String(process.env.WATCHPARTY_STREAM_CODEC || "H264").trim().toUpperCase();
const STREAM_PRESET = String(process.env.WATCHPARTY_STREAM_PRESET || "ultrafast").trim().toLowerCase();
const STREAM_TYPE = String(process.env.WATCHPARTY_STREAM_TYPE || "camera").trim().toLowerCase();
const STREAM_HARDWARE_ACCELERATION = ["1", "true", "yes", "on"].includes(
String(process.env.WATCHPARTY_STREAM_HARDWARE_ACCELERATION || "").trim().toLowerCase()
);
@ -152,6 +153,10 @@ function streamOptions() {
return options;
}
function playOptions() {
return STREAM_TYPE === "go-live" ? { type: "go-live" } : { type: "camera" };
}
function streamUrlAtOffset(url, startSeconds) {
const parsed = new URL(url);
parsed.searchParams.set("StartTimeTicks", String(Math.max(0, Math.floor(startSeconds)) * 10000000));
@ -331,6 +336,20 @@ async function startPlayback(session, playback, startSeconds = 0) {
session.workerStatus = "streaming";
session.manualStop = false;
session.lastError = "";
const playMode = playOptions();
console.log(
"[worker] starting playback",
JSON.stringify(
{
sessionId: session.workerSessionId,
title: session.currentTitle,
mode: playMode.type,
url: input,
},
null,
2,
),
);
const options = streamOptions();
const prepared = streamingStack.prepareStream(
@ -354,7 +373,7 @@ async function startPlayback(session, playback, startSeconds = 0) {
session.workerStatus = "error";
});
streamingStack.playStream(output, runtime.streamer, undefined, abortController.signal)
streamingStack.playStream(output, runtime.streamer, playMode, abortController.signal)
.then(() => {
if (session.manualStop || abortController.signal.aborted) {
return;