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.

-