From df3c972342486d79e7cc91d001c7c9fb09ed90b9 Mon Sep 17 00:00:00 2001 From: nadja Date: Tue, 1 Sep 2026 23:13:15 +0200 Subject: [PATCH] fix Youtube --- app.js | 64 ++++++++++++++++++---------------------- fetch_videos.py | 16 ++++++---- index.html | 1 + videos.json => videos.js | 5 ++-- 4 files changed, 43 insertions(+), 43 deletions(-) rename videos.json => videos.js (60%) diff --git a/app.js b/app.js index 5d21914..991af03 100644 --- a/app.js +++ b/app.js @@ -3,38 +3,18 @@ var TWITCH_CHANNEL = "duda_xd"; - /* ------------------------------------------------------------------ - * YouTube: Liest die Datei videos.json, die auf dem Server von - * fetch_videos.py (einmal am Tag per Cron) mit den aktuellen - * Video-IDs deines Kanals aktualisiert wird. - * - * Dein API-Key ist dabei NIE im Browser - er bleibt komplett auf - * dem Server versteckt (siehe fetch_videos.py). - * ------------------------------------------------------------------ */ - function loadYouTube() { - var grid = document.getElementById("yt-grid"); - if (!grid) return; - - fetch("videos.json", { cache: "no-cache" }) - .then(function (r) { - if (!r.ok) throw new Error("HTTP " + r.status); - return r.json(); - }) - .then(function (ids) { - if (!Array.isArray(ids) || !ids.length) { - grid.innerHTML = '
Noch keine Videos vorhanden.
'; - return; - } - renderYouTubeGrid(ids); - }) - .catch(function () { - grid.innerHTML = - '
Videos konnten nicht geladen werden.
'; - }); - } - + /* Rendert die Video-IDs aus videos.js als iframes. + * Standard-iframe laut YouTube-Empfehlung. Bewusst OHNE + * referrerpolicy und OHNE ?si-Parameter: Dann sendet der Browser + * immer einen Referer (auch bei HTTP-Seite), den YouTube braucht, + * um den Embedder zu erkennen (sonst Fehler 152/153). */ function renderYouTubeGrid(videoIds) { var grid = document.getElementById("yt-grid"); + if (!grid) return; + if (!videoIds || !videoIds.length) { + grid.innerHTML = '
Noch keine Videos vorhanden.
'; + return; + } var html = ""; for (var i = 0; i < videoIds.length; i++) { var id = String(videoIds[i]).trim(); @@ -42,17 +22,31 @@ html += '
' + '
' + - '' + + '' + '
' + '
'; } grid.innerHTML = html || '
Keine Videos gefunden.
'; } + /* ------------------------------------------------------------------ + * YouTube: Liest die Video-IDs aus videos.js, die auf dem Server + * von fetch_videos.py (einmal am Tag per Cron) mit den aktuellen + * Video-IDs deines Kanals aktualisiert wird. + * + * Dein API-Key ist dabei NIE im Browser - er bleibt komplett auf + * dem Server versteckt (siehe fetch_videos.py). + * ------------------------------------------------------------------ */ + function loadYouTube() { + var ids = (typeof DUDA17_VIDEOS !== "undefined") ? DUDA17_VIDEOS : []; + renderYouTubeGrid(ids); + } + /* ------------------------------------------------------------------ * Twitch: Live-Player einbetten. * ------------------------------------------------------------------ */ diff --git a/fetch_videos.py b/fetch_videos.py index f4d082c..230ccc2 100644 --- a/fetch_videos.py +++ b/fetch_videos.py @@ -6,8 +6,8 @@ Dieses Skript laeuft auf deinem Server (einmal am Tag per Cron) und holt automatisch die aktuellen Video-IDs deines YouTube-Kanals ueber die offizielle YouTube Data API v3. -Es schreibt die Video-IDs in die Datei "videos.json", die deine -Webseite dann einfach liest und anzeigt. So bleibt dein API-Key +Es schreibt die Video-IDs in die Datei "videos.js", die deine +Webseite dann per Script-Tag laedt und anzeigt. So bleibt dein API-Key auf dem Server versteckt und ist NICHT im Browser/DevTools sichtbar. EINRICHTUNG: @@ -102,14 +102,18 @@ def main(): # hier nach Erscheinungsdatum sortieren, um sicherzugehen) items.sort(key=lambda x: x.get("published") or "", reverse=True) - # Nur die IDs in die Datei schreiben - schlank fuer die Webseite, - # die nur die Embed-URLs braucht. + # Nur die Video-IDs in die Datei "videos.js" schreiben. + # videos.js wird per Script-Tag geladen - dadurch gibt es KEINE + # CORS-/fetch-Probleme und die Seite funktioniert ueberall. video_ids = [v["id"] for v in items] os.makedirs(OUT_DIR, exist_ok=True) - out_path = os.path.join(OUT_DIR, "videos.json") + out_path = os.path.join(OUT_DIR, "videos.js") with open(out_path, "w", encoding="utf-8") as f: - json.dump(video_ids, f, ensure_ascii=False, indent=2) + f.write("/* Automatisch generiert von fetch_videos.py - nicht manuell editieren. */\n") + f.write("var DUDA17_VIDEOS = ") + json.dump(video_ids, f, ensure_ascii=False, indent=4) + f.write(";\n") print(f"Erfolgreich. {len(video_ids)} Videos geschrieben nach {out_path}") diff --git a/index.html b/index.html index 1970d77..d9bae5c 100644 --- a/index.html +++ b/index.html @@ -162,6 +162,7 @@ + diff --git a/videos.json b/videos.js similarity index 60% rename from videos.json rename to videos.js index ad37231..20cd17a 100644 --- a/videos.json +++ b/videos.js @@ -1,4 +1,5 @@ -[ +/* Automatisch generiert von fetch_videos.py - nicht manuell editieren. */ +var DUDA17_VIDEOS = [ "HPEbsIInMEg", "4I8ay7l4Gfk", "AZycMlj2FJc", @@ -7,4 +8,4 @@ "8TJGbSExWTc", "KIpWKm5puIw", "HPKnQa6Dv4k" -] +]; \ No newline at end of file