for (let line of lines) { line = line.trim(); if (line.startsWith('#EXTINF:')) { const commaIndex = line.lastIndexOf(','); if (commaIndex !== -1) { currentTitle = line.substring(commaIndex + 1).trim(); } } else if (line && !line.startsWith('#')) { allChannels.push({ title: currentTitle, url: line }); currentTitle = "Канал без названия"; } }
renderChannels(allChannels); }
// Отрисовка списка каналов на экране function renderChannels(channels) { channelListEl.innerHTML = ""; if (channels.length === 0) { channelListEl.innerHTML = `
`; return; }
// Ограничим вывод первыми 500 элементами для скорости отрисовки DOM, // либо выводим все (браузер справляется, но с поиском быстрее) channels.forEach((channel, index) => { const li = document.createElement('li'); li.className = 'channel-item'; li.textContent = `${index + 1}. ${channel.title}`; li.onclick = () => playChannel(channel.url, li); channelListEl.appendChild(li); }); }
// Запуск выбранного канала function playChannel(url, element) { // Подсветка активного канала document.querySelectorAll('.channel-item').forEach(el => el.classList.remove('active')); element.classList.add('active');
loadingEl.style.display = 'block'; loadingEl.textContent = "Подключение к потоку...";
if (Hls.isSupported()) { if (hls) { hls.destroy(); } hls = new Hls(); hls.loadSource(url); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED, () => { loadingEl.style.display = 'none'; video.play(); }); hls.on(Hls.Events.ERROR, (event, data) => { if (data.fatal) { loadingEl.style.display = 'block'; loadingEl.textContent = "Ошибка воспроизведения потока"; } }); } else if (video.canPlayType('application/vnd.apple.mpegurl')) { video.src = url; video.addEventListener('loadedmetadata', () => { loadingEl.style.display = 'none'; video.play(); }); } }
// Живой поиск по 4000 каналам searchBox.addEventListener('input', (e) => { const query = e.target.value.toLowerCase(); const filtered = allChannels.filter(ch => ch.title.toLowerCase().includes(query)); renderChannels(filtered); });
// Запуск загрузки при открытии страницы loadPlaylist();