(function () { function loadScript(src) { return new Promise(function (resolve, reject) { if (window.Hls) return resolve(); var s = document.createElement("script"); s.src = src; s.async = true; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); } function ready(fn) { if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", fn, { once: true }); } else { fn(); } } function addDecorativeCaptionsTrack(video) { if (video.querySelector('track[data-ps-track="1"]')) return; var vtt = "WEBVTT\n\n" + "NOTE\n" + "This video has no spoken dialogue.\n\n" + "1\n" + "00:00:00.000 --> 00:00:00.001\n" + ".\n"; var track = document.createElement("track"); track.setAttribute("data-ps-track", "1"); track.kind = "captions"; track.label = "No speech"; track.srclang = "en"; track.src = "data:text/vtt;charset=utf-8," + encodeURIComponent(vtt); video.appendChild(track); if (video.textTracks && video.textTracks.length) { try { video.textTracks[0].mode = "hidden"; } catch (e) {} } } function applyVideoFlags(video) { video.muted = true; video.defaultMuted = true; video.autoplay = true; video.loop = true; video.playsInline = true; video.setAttribute("muted", ""); video.setAttribute("autoplay", ""); video.setAttribute("loop", ""); video.setAttribute("playsinline", ""); video.setAttribute("preload", "metadata"); } function startVideo(video) { addDecorativeCaptionsTrack(video); var url = video.getAttribute("data-hls-src") || video.getAttribute("data-src") || video.getAttribute("src") || ""; if (!url) return; if (video.dataset.hlsInit === "1") return; video.dataset.hlsInit = "1"; applyVideoFlags(video); var isHls = /\.m3u8(\?|#|$)/i.test(url); var isMp4 = /\.mp4(\?|#|$)/i.test(url); if (isMp4) { if (video.src !== url) video.src = url; video.play().catch(function () {}); return; } if (!isHls) return; if (video.canPlayType("application/vnd.apple.mpegurl")) { video.src = url; video.play().catch(function () {}); return; } if (window.Hls && Hls.isSupported()) { var hls = new Hls({ enableWorker: true, autoStartLoad: true }); hls.loadSource(url); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED, function () { video.play().catch(function () {}); }); hls.on(Hls.Events.ERROR, function (_, data) { if (data && data.fatal) { console.warn("HLS fatal:", data.type, data.details); } }); } } ready(function () { var videos = document.querySelectorAll("video"); var hasHls = Array.prototype.some.call(videos, function (video) { var url = video.getAttribute("data-hls-src") || video.getAttribute("data-src") || video.getAttribute("src") || ""; return /\.m3u8(\?|#|$)/i.test(url); }); var initAll = function () { videos.forEach(startVideo); }; if (hasHls) { loadScript("https://cdn.jsdelivr.net/npm/hls.js@latest") .then(initAll) .catch(function (e) { console.error("hls.js load error", e); initAll(); }); } else { initAll(); } }); })();