Автообновляемые IPTV-плейлисты
Web-версия: https://iptv.axenov.dev/
FAQ: https://iptv.axenov.dev/faq
Зеркало репозитория: https://git.axenov.dev/anthony/iptv
Проект, содержащий в себе инструменты для работы с IPTV-плейлистами:
- список автообновляемых плейлистов, которые найдены в открытых источниках;
- скрипты для поиска каналов в этом списке, создания своего плейлиста;
- веб-сервис, предоставляющий короткие ссылки на эти плейлисты и отображающий список каналов.
Плейлисты подбираются преимущественно для РФ и любых стран бывшего СНГ, но этими странами список не ограничивается.
Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник. Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
Они бесплатны для использования. Список проверяется и обновляется мной вручную. Гарантию работоспособности никто не даёт.
- Как использовать этот список?
- Формат
playlists.ini - API
- Развёртывание проекта
- Расширенные возможности
- Как создать свой собственный плейлист?
- Использованный стек
- Лицензия
Как использовать этот список?
Чтобы подключить плейлист, нужно в настройках медиаплеера указать ссылку в следующем формате:
iptv.axenov.dev/<ID>
где <ID> - один из идентификаторов, указанных в playlists.ini в квадратных скобках.
Либо провернуть всё то же самое через браузер.
Формат playlists.ini
# ID плейлиста в рамках этого конфига (обязательно)
[1]
# Название плейлиста (необязательно)
name = 'Рабочий и актуальный IPTV плейлист M3U'
# Краткое описание из источника или от себя (необязательно)
desc = 'В этом IPTV плейлисте вы найдете очень много каналов в HD качестве'
# Прямая ссылка на m3u/m3u8 плейлист (обязательно)
pls = 'https://example.com/pls.m3u'
# Ссылка на источник, откуда взят плейлист (необязательно)
src = 'https://example.com/super-duper-playlist'
[2]
# ID другого плейлиста в этом списке, на который
# произойдёт редирект. Нужен для мягкой смены ID.
redirect = 1
В описании любого плейлиста обязательны:
- ID в квадратных скобках
Для удобства ввода с пульта, рекомендуется задавать числом или короткой строкой без пробелов и др. спецсимволов.
- параметр
plsилиredirectЕсли указаны оба, то
redirectприоритетен.
Плейлистов с редиректами может быть сколько угодно, но они не должны быть цикличными.
API
Можно получать состояние плейлистов из этого сборника при помощи метода:
GET https://iptv.axenov.dev/<ID>/json
где ID -- один из идентификаторов, указанных в playlists.ini в квадратных скобках.
В случае успеха вернётся JSON следующего содержания:
{
"id": "p1",
"url": "localhost:8080/p1",
"name": "Каналы в SD и HD качестве (smarttvnews.ru)",
"desc": "Рабочий и актуальный IPTV плейлист M3U — на июнь 2022 года",
"pls": "https://smarttvnews.ru/apps/iptvchannels.m3u",
"src": "https://smarttvnews.ru/rabochiy-i-aktualnyiy-iptv-pleylist-m3u-kanalyi-v-sd-i-hd-kachestve/",
"status": "online",
"encoding": {
"name": "UTF-8",
"alert": false
},
"channels": [
"Channel1",
"Channel2",
"ChannelX"
],
"count": 3
}
где:
id-- идентификатор плейлистаname-- название плейлистаurl-- короткая ссылка, которую можно использовать для добавления плейлиста в плеерdesc-- краткое описаниеpls-- прямая ссылка на m3u/m3u8 плейлистsrc-- ссылка на источник, откуда взят плейлистstatus-- статус плейлиста ("online"|"timeout"|"offline"|"error")encoding-- данные о кодировке файла плейлистаname-- название кодировки ("UTF-8"|"Windows-1251")alert-- признак отличия кодировки отUTF-8, названия каналов сконвертированы вUTF-8, могут быть ошибки в отображении
channels-- массив названий каналовcount-- количество каналов >= 0
Название кодировки
encoding.nameможет определяться неточно!
В случае ошибки вернётся JSON в следующем формате:
{
"id": "p1",
"url": "localhost:8080/p1",
"name": "Каналы в SD и HD качестве (smarttvnews.ru)",
"desc": "Рабочий и актуальный IPTV плейлист M3U — на июнь 2022 года",
"pls": "https://smarttvnews.ru/apps/iptvchannels.m3u",
"src": "https://smarttvnews.ru/rabochiy-i-aktualnyiy-iptv-pleylist-m3u-kanalyi-v-sd-i-hd-kachestve/",
"status": "offline",
"error": {
"code": 22,
"message": "The requested URL returned error: 404 Not Found"
}
}
где:
id-- идентификатор плейлистаname-- название плейлистаurl-- короткая ссылка, которую можно использовать для добавления плейлиста в плеерdesc-- краткое описаниеpls-- прямая ссылка на m3u/m3u8 плейлистsrc-- ссылка на источник, откуда взят плейлистstatus-- статус плейлиста ("online"|"timeout"|"offline"|"error")error-- данные об ошибке при проверке плейлистаcode-- код ошибки curlmessage-- текст ошибки curl
Развёртывание проекта
Локально достаточно выполнить ./iptv init && ./iptv open.
На сервере опционально можно настроить реверс-прокси до контейнера, например, чтобы настроить доступ по доменному имени, изменить порт, подключить SSL-сертификаты или др.
Apache
Если на сервере, на котором запускаются контейнеры, стоит apache2, то, чтобы использовать его как реверс-прокси, нужно:
$ sudo a2enmod proxy proxy_http proxy_balancer lbmethod_byrequests
$ sudo nano /etc/apache2/sites-available/iptv.conf
# example.com заменить на свой адрес
<VirtualHost example.com:80>
ServerName example.com
# обязательно без SSL:
ProxyPreserveHost On
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
# обязательно для SSL:
# RewriteEngine on
# RewriteCond %{SERVER_NAME} =example.com
# RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
# обязательно для SSL:
#<IfModule mod_ssl.c>
#<VirtualHost example.com:443>
# ServerName example.com
# ProxyPreserveHost On
# ProxyPass / http://localhost:8080/
# ProxyPassReverse / http://localhost:8080/
# сертификаты можно получить через certbot
# SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
# SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# Include /etc/letsencrypt/options-ssl-apache.conf
#</VirtualHost>
#</IfModule>
# Ctrl+O
# Enter
# Ctrl+X
$ sudo a2ensite iptv
$ # для подгрузки включенных модулей выполнить именно restart, а не reload
$ sudo systemctl restart apache2
Nginx
$ sudo nano /etc/nginx/sites-available/iptv.conf
# example.com заменить на свой адрес
server {
listen 80;
listen [::]:80;
server_name example.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
# Ctrl+O
# Enter
# Ctrl+X
$ sudo ln -s /etc/nginx/sites-available/iptv.conf /etc/nginx/sites-enabled/iptv.conf
$ sudo systemctl reload apache2
Расширенные возможности
Собственный код html/css/js
В проекте есть директория src/views/custom.
Там можно размещать собственный код, который будет вставляться на каждой странице.
Для этого, в первую очередь, нужно выполнить:
cp src/views/custom/custom.twig.example src/views/custom/custom.twig
Между тегами {% block ... %} сюда {% endblock %} следует вставить желаемый код или текст.
Можно создавать новые twig-файлы рядом и подключать их внутри custom.twig.
Git будет их игнорировать, хотя можно убрать директорию из .gitignore и добавлять эти файлы репозиторий.
В общем случае, это можно выполнять на том сервере, на коем установлен и работает веб-сервис.
После всех правок следует очистить кеш twig (см. далее).
Очистка кеша twig
Если в файле ./src/.env параметр TWIG_CACHE=1, то макеты страниц компилируются однажды и потом переиспользуются.
Изменённые макеты не будут перекомпилироваться пока не будет очищен кеш прежних.
Для этого следует выполнить:
cd src && composer clear-views
Скачать все плейлисты
Команда: ./tools/download-all.sh
Скачивает все плейлисты из playlists.ini в локальную директорию ./tools/downloaded/.
Проверить каналы плейлиста
Команда: ./tools/check-pls.sh
Проверяет каждый канал в плейлисте на доступность и выводит результат проверки.
Поддерживаются *.m3u и *.m3u8; как локальные файлы, так по прямым ссылкам.
Коды ошибок доступны здесь.
Поиск каналов в одном плейлисте
Команда: ./tools/find-in-pls.sh
Находит каналы по заданному регулярному выражению в одном указанном плейлисте.
Поддерживаются *.m3u и *.m3u8; как локальные файлы, так по прямым ссылкам.
Поиск каналов во всех плейлистах
Команда: ./tools/find-in-all.sh
Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через download-all.sh.
Создать плейлист из нужных каналов
Команда: ./tools/make-pls.sh
Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через download-all.sh.
Отличается от find-in-all.sh тем, что тот выводит результат в человекочитаемом формате, а этот -- в готовом m3u
формате для сохранения в файл.
Для сохранения в файл следует добавить > myfile.m3u или >> myfile.m3u в конец команды.
Как создать свой собственный плейлист?
- Скачать все плейлисты, указанные в
playlists.ini:$ ./tools/download-all.sh - Вытащить из них нужные каналы и сохранить в отдельный файл:
Так в плейлисте
$ ./tools/make-pls.sh "(fox|disney)" > my.m3u8./my.m3u8окажутся все каналы из скачанных плейлистов, в названиях которых встретилисьfoxилиdisney. - Проверить доступность каналов в полученном плейлисте:
$ ./tools/check-pls.sh my.m3u8Результат
ОКне означает, что канал действительно работает и отдаёт видео/аудио потоки.
РезультатERRORс любыми кодами ошибок гарантированно означает, что канал не работает. - Вручную: удалить нерабочие, мусорные и продублировавшиеся (по ссылкам) каналы.
- Вручную: добавить плейлист в IPTV-плеер и перепроверить результат.