(function () { "use strict"; 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.
'; }); } function renderYouTubeGrid(videoIds) { var grid = document.getElementById("yt-grid"); var html = ""; for (var i = 0; i < videoIds.length; i++) { var id = String(videoIds[i]).trim(); if (!id) continue; html += '
' + '
' + '' + '
' + '
'; } grid.innerHTML = html || '
Keine Videos gefunden.
'; } /* ------------------------------------------------------------------ * Twitch: Live-Player einbetten. * ------------------------------------------------------------------ */ function loadTwitch() { var wrap = document.getElementById("twitch-embed"); if (!wrap) return; var domain = window.location.hostname || "localhost"; var iframe = document.createElement("iframe"); iframe.src = "https://player.twitch.tv/?channel=" + TWITCH_CHANNEL + "&parent=" + domain + "&muted=true"; iframe.setAttribute("title", "Twitch Stream"); iframe.setAttribute("allowfullscreen", "true"); iframe.setAttribute("scrolling", "no"); iframe.setAttribute("allow", "autoplay; fullscreen"); wrap.appendChild(iframe); } document.addEventListener("DOMContentLoaded", function () { loadYouTube(); loadTwitch(); }); })();