diff --git a/server/lib/player-media-health.js b/server/lib/player-media-health.js
index 4322fd8..b0bc2d9 100644
--- a/server/lib/player-media-health.js
+++ b/server/lib/player-media-health.js
@@ -13,8 +13,11 @@
//
// Dependency-free UMD: Node (require) + browser/Tizen (window.PlayerMediaHealth).
(function (root, factory) {
- if (typeof module === 'object' && module.exports) module.exports = factory();
- else root.PlayerMediaHealth = factory();
+ // BOTH, not either/or — see schedule-eval.js. Node integration in a BrightSign widget made the
+ // browser branch unreachable, so the player ran without its media-health decision there.
+ var api = factory();
+ if (typeof module === 'object' && module.exports) module.exports = api;
+ if (root) root.PlayerMediaHealth = api;
})(typeof self !== 'undefined' ? self : this, function () {
'use strict';
diff --git a/server/lib/schedule-eval.js b/server/lib/schedule-eval.js
index 79b76fa..01a8de2 100644
--- a/server/lib/schedule-eval.js
+++ b/server/lib/schedule-eval.js
@@ -22,8 +22,13 @@
// Dependency-free UMD: Node (require) + browser/Tizen (window.ScheduleEval).
(function (root, factory) {
- if (typeof module === 'object' && module.exports) module.exports = factory();
- else root.ScheduleEval = factory();
+ // BOTH, not either/or: a BrightSign widget runs with Node integration, so `module` exists in
+ // page scope and an `else` left root.ScheduleEval undefined there. The player falls back to
+ // "always active" when it is missing — i.e. per-item DAYPARTING silently stopped applying on
+ // that platform, and scheduled content played outside its window with nothing in any log.
+ var api = factory();
+ if (typeof module === 'object' && module.exports) module.exports = api;
+ if (root) root.ScheduleEval = api;
})(typeof self !== 'undefined' ? self : this, function () {
'use strict';
diff --git a/server/player/index.html b/server/player/index.html
index fb11b79..a695560 100644
--- a/server/player/index.html
+++ b/server/player/index.html
@@ -3152,12 +3152,36 @@
// the frame on screen now, as a texturable (CORS-clean) source: the live
, or — so a wipe can
// start FROM a playing clip — a snapshot canvas of the outgoing