diff --git a/server/player/index.html b/server/player/index.html index 317bbe2..e00a0f8 100644 --- a/server/player/index.html +++ b/server/player/index.html @@ -1720,7 +1720,19 @@ function groupScheduleTick() { if (!groupSync || playlist.length === 0) return; const t = groupScheduleTarget(); - if (!t) return; + if (!t) { + // period === 0 means every item is currently outside its daypart. Solo playback routes the + // same condition into showNothingScheduled(); group playback just returned, so nothing was + // watching — group members are scheduleDriven, so renderContent arms no advanceTimer, and + // a group-rendered video is created with loop = !!groupSync. Out of hours the whole group + // therefore kept displaying (or looping) whatever had been in-window last, while an + // identical ungrouped screen correctly showed the idle card. + if (isPlaying) { + teardownCurrentMedia(); + showNothingScheduled(); + } + return; + } // Double buffer: warm the next clip ~6s before the boundary (once per boundary). if (t.nextIndex !== t.index && t.secToBoundary >= 0 && t.secToBoundary <= 6 && groupPreloadIdx !== t.nextIndex) { groupPreloadNext(t.nextIndex); diff --git a/tizen/js/player.js b/tizen/js/player.js index 0bffe4b..2f0b526 100644 --- a/tizen/js/player.js +++ b/tizen/js/player.js @@ -1323,7 +1323,15 @@ GroupSyncController.prototype.target = function () { }; GroupSyncController.prototype.tick = function () { if (!this.groupId || !this.player.items.length) return; - var t = this.target(); if (!t) return; + // No target means every item is currently outside its daypart. Returning here left the whole + // group displaying (or looping) whatever was in-window last, out of hours — while an identical + // ungrouped screen correctly showed the idle card. Group members are schedule-driven, so no + // renderer arms a timer and nothing else was watching for this. + var t = this.target(); + if (!t) { + if (this.player.hasContentOnScreen()) this.player.nothingScheduled(); + return; + } // Double buffer: warm the next clip ~6s before the boundary (once per boundary). if (t.nextIndex !== t.index && t.secToBoundary >= 0 && t.secToBoundary <= 6) { this.player.preloadVideo(t.nextIndex); // warm next clip (video-only; no-ops otherwise)