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)