Release v2.10.3
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m13s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 31s

This commit is contained in:
2026-08-29 01:56:45 +01:00
parent 30814f3f46
commit 3f4f57020a
60 changed files with 1075 additions and 523 deletions
+18 -33
View File
@@ -1,41 +1,11 @@
<!-- Player page bootstrap and browser-side playback lifecycle. -->
<script>
const slug = {{SLUG_JSON}};
let initialData = {{INITIAL_DATA_JSON}};
window.slug = slug;
window.initialData = initialData;
const app = document.getElementById('app');
(function () {
var root = window;
var registry = root.pulsePlayerRegionTypes && typeof root.pulsePlayerRegionTypes === 'object' ? root.pulsePlayerRegionTypes : {};
function normalizeType(type) {
return String(type || '').trim().toLowerCase();
}
function register(type, definition) {
registry[normalizeType(type)] = definition || {};
return registry[normalizeType(type)];
}
function get(type) {
return registry[normalizeType(type)] || null;
}
function list() {
return Object.keys(registry).map(function (type) {
return {
type: type,
definition: registry[type] || {}
};
});
}
root.pulsePlayerRegionTypes = {
register: register,
get: get,
list: list
};
}());
let slides = Array.isArray(initialData && initialData.slides) ? initialData.slides.map(normalizeSlide) : [];
let currentPlaylistSignature = '';
let currentPlaylistEtag = '';
@@ -61,6 +31,7 @@
let viewportRenderTimer = null;
let refreshRetryTimer = null;
let refreshRetryDelayMs = 0;
let playlistRefreshTimer = null;
let commandClientId = null;
let screenWakeLock = null;
let screenWakeLockRequestPromise = null;
@@ -102,7 +73,12 @@
// Render the empty-state message into the player root.
function renderEmpty(message) {
app.innerHTML = '<div class="empty">' + escapeHtml(message) + '</div>';
var markup = '<div class="empty">' + escapeHtml(message) + '</div>';
if (currentPlaylistFadeBetweenSlides && typeof renderSlideMarkup === 'function') {
renderSlideMarkup(markup, true);
return;
}
app.innerHTML = markup;
}
// Announce the player to the command websocket.
@@ -204,10 +180,19 @@
showCurrent();
refresh();
} else {
if (initialPlaylistSnapshot && applyPlaylistSnapshot(initialPlaylistSnapshot)) {
currentPlaylistSkipUnavailableRtmp = Boolean(initialPlaylistSnapshot.skipUnavailableRtmp);
showCurrent();
}
syncBlackoutState();
refresh();
}
syncOfflineBanner();
syncScreenWakeLock();
playlistRefreshTimer = window.setInterval(function () {
if (document.visibilityState !== 'hidden') {
refresh();
}
}, 60 * 1000);
connectCommandSocket();
</script>