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
+10 -1
View File
@@ -4,6 +4,7 @@ const vm = require('node:vm');
const assert = require('node:assert/strict');
const listeners = {}, documentListeners = {}, elements = [];
let clock = 0, interval, starts = 0, stops = 0, osd = 0, returned = 0, readyState = 0, remote = false, currentTime = 0, paused = false;
let startupTimeoutSeconds;
let phase = 'checking_stream', progressCalls = 0, languageQueries = [], progressDeferred;
const catalogue = JSON.parse(fs.readFileSync(__dirname + '/Jellyfin.Plugin.Enigma2/Localization/startup-messages.json', 'utf8'));
const video = { get readyState() { return readyState; }, get currentTime() { return currentTime; }, get paused() { return paused; }, currentSrc: 'stream' };
@@ -29,7 +30,7 @@ const window = {
ajax: async options => {
if (options.url.startsWith('DecoderIntegration/StartupMessages')) {
const language = new URLSearchParams(options.url.split('?')[1]).get('language'); languageQueries.push(language);
return { Language: language.split('-')[0], Texts: catalogue[language.split('-')[0]] };
return { Language: language.split('-')[0], Texts: catalogue[language.split('-')[0]], StartupTimeoutSeconds: startupTimeoutSeconds };
}
if (options.url.startsWith('DecoderIntegration/PlaybackProgress')) {
++progressCalls; if (progressDeferred) return progressDeferred;
@@ -112,6 +113,14 @@ const flush = async () => { for (let i = 0; i < 20; i++) await Promise.resolve()
paused = false;
listeners.keydown({ key: 'Escape', preventDefault() {}, stopImmediatePropagation() {} }); await flush();
assert.equal(elements.length, 0); pending[2](); await flush();
startupTimeoutSeconds = 135; clock = 0; currentTime = 0; readyState = 0;
const stoppedBefore = stops; click(); await flush();
clock = 90000; interval(); await flush();
assert.equal(stops, stoppedBefore, 'configured metadata budget must survive the old web deadline');
clock = 135001; interval(); await flush();
assert.equal(stops, stoppedBefore + 1, 'configured web startup remains bounded');
pending[3](); await flush();
console.log('PASS provider startup budget extends web waiting without disabling timeout or cancellation');
console.log('PASS per-device UI locale, real progress, first frame, later buffering and pause');
console.log('PASS default channels, explicit programmes, one start, native OSD, Escape, late completion and startup timeout');
})().catch(error => { console.error(error); process.exitCode = 1; });