fix: force subtitle burn-in via SubtitleMethod=Encode and always seek via local FFmpeg -ss

This commit is contained in:
MiTHRAL 2026-05-26 18:52:17 -04:00
parent 3531c044cd
commit 315e3268c4
2 changed files with 3 additions and 9 deletions

View file

@ -306,6 +306,7 @@ def jellyfin_stream_url(base_url: str, item_id: str, api_key: str, subtitle_inde
params = {"api_key": api_key} params = {"api_key": api_key}
if subtitle_index is not None: if subtitle_index is not None:
params["SubtitleStreamIndex"] = str(subtitle_index) params["SubtitleStreamIndex"] = str(subtitle_index)
params["SubtitleMethod"] = "Encode"
else: else:
params["static"] = "true" params["static"] = "true"
query = urllib.parse.urlencode(params) query = urllib.parse.urlencode(params)

View file

@ -192,12 +192,6 @@ function playOptions() {
return STREAM_TYPE === "go-live" ? { type: "go-live" } : { type: "camera" }; 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));
return parsed.toString();
}
function sessionPlaybackPosition(session) { function sessionPlaybackPosition(session) {
if (session.playbackState !== "playing") { if (session.playbackState !== "playing") {
return session.positionSeconds; return session.positionSeconds;
@ -400,13 +394,12 @@ async function startPlayback(session, playback, startSeconds = 0) {
); );
const options = streamOptions(); const options = streamOptions();
const isJellyfinTranscode = input.includes("SubtitleStreamIndex="); if (session.positionSeconds > 0) {
if (session.positionSeconds > 0 && !isJellyfinTranscode) {
options.customInputOptions = ["-ss", String(session.positionSeconds)]; options.customInputOptions = ["-ss", String(session.positionSeconds)];
} }
console.log(`[worker] Calling prepareStream with options:`, JSON.stringify(options, null, 2)); console.log(`[worker] Calling prepareStream with options:`, JSON.stringify(options, null, 2));
const prepared = streamingStack.prepareStream( const prepared = streamingStack.prepareStream(
session.positionSeconds > 0 ? streamUrlAtOffset(input, session.positionSeconds) : input, input,
options, options,
abortController.signal, abortController.signal,
); );