From 940470a97dd9ec6f6b258373c966e6b7afa2f442 Mon Sep 17 00:00:00 2001 From: Jos Vooges | STH Date: Tue, 15 Sep 2026 20:49:37 +0200 Subject: [PATCH] Add admin button to force-refresh IPTV EPG caches. Clears global XMLTV and derived caches, re-fetches XUI plus configured feeds, so XUI mapping changes show up without waiting for SWR TTL. --- apps/admin-ui/src/app/settings/page.tsx | 46 ++++++++++++++++-- apps/master-api/src/iptv/xtream.ts | 22 +++++++++ apps/master-api/src/settings/routes.ts | 8 ++- apps/master-api/src/viewer/iptv-client.ts | 59 +++++++++++++++++++++++ 4 files changed, 131 insertions(+), 4 deletions(-) diff --git a/apps/admin-ui/src/app/settings/page.tsx b/apps/admin-ui/src/app/settings/page.tsx index d265380..eff7d4d 100644 --- a/apps/admin-ui/src/app/settings/page.tsx +++ b/apps/admin-ui/src/app/settings/page.tsx @@ -149,6 +149,7 @@ export default function SettingsPage() { Array<{ id: string; name: string; channelCount: number }> >([]); const [tvBusy, setTvBusy] = useState(false); + const [tvRefreshBusy, setTvRefreshBusy] = useState(false); const [tvMsg, setTvMsg] = useState(null); const [tvErr, setTvErr] = useState(null); @@ -518,6 +519,33 @@ export default function SettingsPage() { } } + async function refreshTvEpg() { + setTvRefreshBusy(true); + setTvMsg(null); + setTvErr(null); + try { + const res = await fetch("/api/v1/admin/settings/iptv/refresh-epg", { + method: "POST", + credentials: "include", + }); + const data = await res.json().catch(() => ({})); + if (!res.ok) { + setTvErr(data.error?.message ?? "EPG vernieuwen mislukt"); + return; + } + const ok = data.xmltvOk ?? 0; + const fail = data.xmltvFailed ?? 0; + setTvMsg( + fail > 0 + ? `EPG vernieuwd (${ok} ok, ${fail} mislukt) — open TV in de app opnieuw` + : `EPG vernieuwd (${ok} lijn${ok === 1 ? "" : "en"}) — open TV in de app opnieuw` + ); + if (Array.isArray(data.categories)) setTvCategories(data.categories); + } finally { + setTvRefreshBusy(false); + } + } + return ( <>