Web IPTV Player


Выберите канал из списка

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();

    Прокрутить вверх