Preserve native broadcast video and add patient shared stream startup

This commit is contained in:
2026-10-25 16:59:56 +01:00
parent bd7395f045
commit 11a34a5195
27 changed files with 708 additions and 139 deletions
+5 -3
View File
@@ -52,7 +52,7 @@ window.DecoderChannelPlayback = async () => class DecoderChannelPlayback {
api.ajax({ type: 'GET', dataType: 'json', url: api.getUrl('DecoderIntegration/StartupMessages', { language }) }),
new Promise(resolve => { timer = setTimeout(() => resolve(null), 1000); })
]);
return response?.Texts ? { ...fallback, ...response.Texts } : fallback;
return response?.Texts ? { ...fallback, ...response.Texts, StartupTimeoutSeconds: response.StartupTimeoutSeconds } : fallback;
} catch { return fallback; } finally { clearTimeout(timer); }
};
let generation = 0, starting = null, cancelButton = null, watcher = null, statusPanel = null, statusText = null, elapsedText = null, playbackSequence = 0;
@@ -97,9 +97,11 @@ window.DecoderChannelPlayback = async () => class DecoderChannelPlayback {
cancelButton.style.cssText = 'position:fixed;right:16px;top:72px;z-index:2147483647;background:#252525;color:white;border:1px solid #aaa;border-radius:6px;padding:12px;font:16px system-ui;cursor:pointer';
cancelButton.onclick = () => void leave(); document.body.append(cancelButton);
showStatus(item.Name);
// Allow the bounded metadata probe (25 s) plus HLS startup (20 s).
// Use this provider's bounded startup budget; retain compatibility with older DLLs.
let opened = false, opening = false, hasPlayed = false, polling = false, pollFailures = 0, lastPoll = -Infinity;
const began = Date.now(), deadline = began + 45000, initialVideo = document.querySelector('video'), initialSource = initialVideo?.currentSrc, initialSequence = playbackSequence;
const configuredWait = Number(messages.StartupTimeoutSeconds);
const waitMs = Number.isFinite(configuredWait) && configuredWait >= 45 && configuredWait <= 225 ? configuredWait * 1000 : 45000;
const began = Date.now(), deadline = began + waitMs, initialVideo = document.querySelector('video'), initialSource = initialVideo?.currentSrc, initialSequence = playbackSequence;
watcher = setInterval(() => {
if (ticket !== generation) return;
const video = document.querySelector('video');