From cbacf1af4186acd7b918e375087dca72a5e4460e Mon Sep 17 00:00:00 2001
From: Jos Vooges | STH
Date: Sat, 19 Sep 2026 00:39:03 +0200
Subject: [PATCH] Polish TV Live Events focus/playback and add per-viewer
provider access in admin/API.
Improves Android TV Events navigation and player UX, and gates schedule streams by viewer Live Events ACL plus prisma migration.
---
apps/admin-ui/src/app/settings/page.tsx | 66 +-
apps/admin-ui/src/app/viewers/page.tsx | 187 +++-
apps/android-tv/app/build.gradle.kts | 4 +-
.../mediacluster/tv/playback/PlayerFactory.kt | 6 +-
.../mediacluster/tv/ui/EventPlayerScreen.kt | 169 +++-
.../vonas/mediacluster/tv/ui/EventsScreen.kt | 869 +++++++++++++++---
.../java/nl/vonas/mediacluster/tv/ui/McNav.kt | 57 +-
.../migration.sql | 3 +
apps/master-api/prisma/schema.prisma | 7 +
apps/master-api/src/settings/iptv.ts | 31 +
apps/master-api/src/settings/routes.ts | 30 +-
apps/master-api/src/viewer/routes.ts | 31 +-
apps/master-api/src/viewer/schedule-events.ts | 237 ++++-
apps/master-api/src/viewer/service.ts | 27 +-
14 files changed, 1540 insertions(+), 184 deletions(-)
create mode 100644 apps/master-api/prisma/migrations/20260919010000_viewer_live_events_access/migration.sql
diff --git a/apps/admin-ui/src/app/settings/page.tsx b/apps/admin-ui/src/app/settings/page.tsx
index 4d946ff..a1c7075 100644
--- a/apps/admin-ui/src/app/settings/page.tsx
+++ b/apps/admin-ui/src/app/settings/page.tsx
@@ -164,6 +164,10 @@ export default function SettingsPage() {
const [tvLiveEventsUrl, setTvLiveEventsUrl] = useState(
"http://epg.faabserver.nl/api/export/live-events?horizon_days=3"
);
+ /** Providers die uit staan (denylist). Ontbrekende = aan. */
+ const [tvDisabledProviders, setTvDisabledProviders] = useState([]);
+ /** Ontdekt uit feed + bekende disabled. */
+ const [tvLiveEventProviders, setTvLiveEventProviders] = useState([]);
const [tvShowAlle, setTvShowAlle] = useState(true);
const [tvCategories, setTvCategories] = useState<
Array<{ id: string; name: string; channelCount: number }>
@@ -262,8 +266,18 @@ export default function SettingsPage() {
? s.liveEventsUrl
: "http://epg.faabserver.nl/api/export/live-events?horizon_days=3"
);
+ setTvDisabledProviders(
+ Array.isArray(s.liveEventsDisabledProviders)
+ ? s.liveEventsDisabledProviders.map((p: string) => String(p).toLowerCase())
+ : []
+ );
}
setTvCategories(Array.isArray(d.categories) ? d.categories : []);
+ setTvLiveEventProviders(
+ Array.isArray(d.liveEventProviders)
+ ? d.liveEventProviders.map((p: string) => String(p).toLowerCase())
+ : []
+ );
})
.catch(() => undefined);
}, []);
@@ -568,6 +582,7 @@ export default function SettingsPage() {
categoryOrder: tvCategories.map((c) => c.id),
showAlleZenders: tvShowAlle,
liveEventsUrl: tvLiveEventsUrl.trim(),
+ liveEventsDisabledProviders: tvDisabledProviders,
}),
});
const data = await res.json().catch(() => ({}));
@@ -586,8 +601,18 @@ export default function SettingsPage() {
? data.settings.liveEventsUrl
: ""
);
+ setTvDisabledProviders(
+ Array.isArray(data.settings.liveEventsDisabledProviders)
+ ? data.settings.liveEventsDisabledProviders.map((p: string) => String(p).toLowerCase())
+ : []
+ );
}
if (Array.isArray(data.categories)) setTvCategories(data.categories);
+ if (Array.isArray(data.liveEventProviders)) {
+ setTvLiveEventProviders(
+ data.liveEventProviders.map((p: string) => String(p).toLowerCase())
+ );
+ }
} finally {
setTvBusy(false);
}
@@ -936,7 +961,7 @@ export default function SettingsPage() {
JSON-export (FAAB) voor de Events-tab in Android TV. Leeg laten schakelt de tab uit.
Default: FAAB live-events met 3 dagen horizon.
-