From 7fdb2a569dce21df122cf9787f3444c6045b7d02 Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Wed, 1 Jul 2026 09:25:46 +0000 Subject: [PATCH] Live HLS streams za vseh 6 kanalov (hls.js za deep live-edge), promo fallback v zanki, logo overlay pri nalaganju, Folx barva #C43651, channel hover animacije, random-btn barva --- public/app.js | 261 +++++++++++++++++++++++++++++++++++++--------- public/index.html | 1 + public/styles.css | 7 ++ 3 files changed, 219 insertions(+), 50 deletions(-) diff --git a/public/app.js b/public/app.js index 2a7c21f..c01673c 100644 --- a/public/app.js +++ b/public/app.js @@ -6,12 +6,12 @@ const JW_HLS = id => `https://cdn.jwplayer.com/manifests/${id}.m3u8`; const JW_POSTER = id => `https://cdn.jwplayer.com/v2/media/${id}/poster.jpg?width=1280`; const CHANNELS = [ - { key: 'one', name: 'One Music TV', color: '#a84d7e', logo: '/logos/one_mt_neg_b.png', alt: 'logo of One', jw: 'CBM2fSnV' }, - { key: 'zwei', name: 'Zwei Music TV', color: '#f36700', logo: '/logos/zwei_neg_b.png', alt: 'logo of Zwei', jw: 'LZVUn3Qy' }, - { key: 'mt', name: 'Folx Music TV', color: '#dc1d1d', logo: '/logos/mt_neg_b.png', alt: 'logo of Folx Music',jw: 'UYU6dx3Q' }, - { key: 'adria', name: 'Adria Music TV', color: '#30a6d1', logo: '/logos/adria_neg_b.png', alt: 'logo of Adria', jw: 'lI4SC7Do' }, - { key: 'folx-slo', name: 'Folx Slovenija', color: '#a8b539', logo: '/logos/folx_slo_neg_b.png', alt: 'logo of Folx Slovenija', jw: 'aoCWwwSg' }, - { key: 'one-adria', name: 'One Adria Music TV', color: '#a84d7e', logo: '/logos/one_neg_b.png', alt: 'logo of One Adria', jw: 'IGOSgmvW' }, + { key: 'one', name: 'One Music TV', color: '#a84d7e', logo: '/logos/one_mt_neg_b.png', alt: 'logo of One', jw: 'CBM2fSnV', live: 'https://oneapp.b-cdn.net/master.m3u8' }, + { key: 'zwei', name: 'Zwei Music TV', color: '#f36700', logo: '/logos/zwei_neg_b.png', alt: 'logo of Zwei', jw: 'LZVUn3Qy', live: 'https://zweiapp.b-cdn.net/master.m3u8' }, + { key: 'mt', name: 'Folx Music TV', color: '#C43651', logo: '/logos/mt_neg_b.png', alt: 'logo of Folx Music',jw: 'UYU6dx3Q', live: 'https://folxapp.b-cdn.net/master.m3u8' }, + { key: 'adria', name: 'Adria Music TV', color: '#30a6d1', logo: '/logos/adria_neg_b.png', alt: 'logo of Adria', jw: 'lI4SC7Do', live: 'https://adriaapp.b-cdn.net/master.m3u8' }, + { key: 'folx-slo', name: 'Folx Slovenija', color: '#a8b539', logo: '/logos/folx_slo_neg_b.png', alt: 'logo of Folx Slovenija', jw: 'aoCWwwSg', live: 'https://folxsloapp.b-cdn.net/master.m3u8' }, + { key: 'one-adria', name: 'One Adria Music TV', color: '#a84d7e', logo: '/logos/one_neg_b.png', alt: 'logo of One Adria', jw: 'IGOSgmvW', live: 'https://oneadriaapp.b-cdn.net/master.m3u8' }, ]; const ABOUT = [ @@ -100,6 +100,9 @@ function render(path) { // ===== HOME ===== let shakaInstance = null; let currentChannel = null; +let playToken = 0; // invalidates async work when channel changes +let liveRetryTimer = null; // background timer that re-checks the live stream +let promoFallbackActive = false; function renderHome() { const main = document.getElementById('main'); @@ -157,18 +160,78 @@ function showSelectChannelBox() { } function showVideoPlayer(ch) { - const poster = ch ? ` poster="${JW_POSTER(ch.jw)}"` : ''; + const bg = ch ? ch.color : '#000'; + const logo = ch ? ch.logo : ''; document.getElementById('player-area').innerHTML = ` -
- +
+ +
+ +
`; } +// Hide the channel-logo loading overlay once real playback starts. +function hideLoadingOverlay() { + const el = document.getElementById('video-loading'); + if (el) { el.style.opacity = '0'; setTimeout(() => { if (el) el.style.display = 'none'; }, 400); } +} +// Show it again (e.g. when switching channel / falling back). +function showLoadingOverlay(ch) { + const el = document.getElementById('video-loading'); + if (!el) return; + if (ch) { el.style.background = ch.color; const img = el.querySelector('img'); if (img) img.src = ch.logo; } + el.style.display = 'flex'; el.style.opacity = '1'; +} + +// Load an HLS url into the