function switchSectionTab(btn, panelId) { document.querySelectorAll('.section-tab').forEach(function(t) { t.classList.remove('is-selected'); }); document.querySelectorAll('.section-panel').forEach(function(p) { p.classList.remove('active'); }); btn.classList.add('is-selected'); var panel = document.getElementById(panelId); if (panel) panel.classList.add('active'); history.replaceState(null, '', '#' + panelId); } (function() { var hash = window.location.hash.replace('#', ''); if (hash) { var panel = document.getElementById(hash); var tab = document.querySelector('[data-tab="' + hash + '"]'); if (panel && tab) switchSectionTab(tab, hash); } })(); (function() { var cfg = document.getElementById('page-item-2-cfg'); var itemId = cfg.dataset.itemId; var player = document.getElementById('item-player'); if (player) { var loaded = false; player.addEventListener('play', function loadSrc() { if (!loaded) { loaded = true; player.pause(); fetch('/api/stream/' + itemId) .then(function(r) { if (!r.ok) throw new Error('Stream unavailable'); return r.json(); }) .then(function(data) { player.src = data.stream_url; player.play(); }) .catch(function(err) { showToast(err.message || 'Could not load video'); }); } }, { once: true }); } })();