Переезд в организацию на git.axenov.dev

- https://git.axenov.dev/IPTV/docker
- https://git.axenov.dev/IPTV/playlists
- https://git.axenov.dev/IPTV/svc-main
- https://git.axenov.dev/IPTV/tools
This commit is contained in:
2025-03-03 16:03:39 +08:00
parent 592504d2e0
commit 87760307a4
51 changed files with 14 additions and 6282 deletions

277
README.md
View File

@@ -1,171 +1,15 @@
# Автообновляемые IPTV-плейлисты
# Инфраструктурный слой проекта iptv.axenov.dev
> **Web-версия**: [https://iptv.axenov.dev/](https://iptv.axenov.dev/)
> **FAQ**: [https://iptv.axenov.dev/faq](https://iptv.axenov.dev/faq)
> **Зеркало репозитория**: https://git.axenov.dev/anthony/iptv
**Web-версия**: https://iptv.axenov.dev
**FAQ**: https://iptv.axenov.dev/faq
**Исходный код**: https://git.axenov.dev/IPTV
Проект, содержащий в себе инструменты для работы с IPTV-плейлистами:
## Использованный стек
* список автообновляемых плейлистов, которые найдены в открытых источниках;
* скрипты для поиска каналов в этом списке, создания своего плейлиста;
* веб-сервис, предоставляющий короткие ссылки на эти плейлисты и отображающий список каналов.
Плейлисты подбираются преимущественно для РФ и любых стран бывшего СНГ, но этими странами список не ограничивается.
Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник.
Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
Они бесплатны для использования.
Список проверяется и обновляется мной вручную.
Гарантию работоспособности никто не даёт.
* [Как использовать этот список?](#как-использовать-этот-список)
* [Формат `playlists.ini`](#формат-playlistsini)
* [API](#api)
* [Развёртывание проекта](#развёртывание-проекта)
* [Apache](#apache)
* [Nginx](#nginx)
* [Расширенные возможности](#расширенные-возможности)
* [Собственный код html/css/js](#собственный-код-htmlcssjs-)
* [Очистка кеша twig](#очистка-кеша-twig)
* [Скачать все плейлисты](#скачать-все-плейлисты)
* [Проверить каналы плейлиста](#проверить-каналы-плейлиста)
* [Поиск каналов в одном плейлисте](#поиск-каналов-в-одном-плейлисте)
* [Поиск каналов во всех плейлистах](#поиск-каналов-во-всех-плейлистах)
* [Создать плейлист из нужных каналов](#создать-плейлист-из-нужных-каналов)
* [Как создать свой собственный плейлист?](#как-создать-свой-собственный-плейлист)
* [Использованный стек](#использованный-стек)
* [Лицензия](#лицензия)
---
## Как использовать этот список?
Чтобы подключить плейлист, нужно в настройках медиаплеера указать ссылку в следующем формате:
```
iptv.axenov.dev/<ID>
```
где `<ID>` - один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
Либо провернуть всё то же самое через браузер.
## Формат `playlists.ini`
```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`](playlists.ini) в квадратных скобках.
В случае успеха вернётся JSON следующего содержания:
```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 в следующем формате:
```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` -- [код ошибки curl](https://curl.se/libcurl/c/libcurl-errors.html)
* `message` -- текст ошибки curl
* [docker compose](https://docs.docker.com/compose/)
* [php8.3-fpm](https://www.php.net/releases/8.3/ru.php)
* [nginx](https://nginx.org/ru/)
* bash
## Развёртывание проекта
@@ -253,109 +97,6 @@ $ sudo ln -s /etc/nginx/sites-available/iptv.conf /etc/nginx/sites-enabled/iptv.
$ 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`](playlists.ini) в локальную директорию `./tools/downloaded/`.
### Проверить каналы плейлиста
Команда: `./tools/check-pls.sh`
Проверяет каждый канал в плейлисте на доступность и выводит результат проверки.
Поддерживаются `*.m3u` и `*.m3u8`; как локальные файлы, так по прямым ссылкам.
Коды ошибок доступны [здесь](https://everything.curl.dev/usingcurl/returns).
### Поиск каналов в одном плейлисте
Команда: `./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` в конец команды.
## Как создать свой собственный плейлист?
1. Скачать все плейлисты, указанные в [`playlists.ini`](playlists.ini):
```
$ ./tools/download-all.sh
```
2. Вытащить из них нужные каналы и сохранить в отдельный файл:
```
$ ./tools/make-pls.sh "(fox|disney)" > my.m3u8
```
Так в плейлисте `./my.m3u8` окажутся все каналы из скачанных плейлистов, в названиях которых встретились `fox`
или `disney`.
3. Проверить доступность каналов в полученном плейлисте:
```
$ ./tools/check-pls.sh my.m3u8
```
> Результат `ОК` не означает, что канал действительно работает и отдаёт видео/аудио потоки.
> Результат `ERROR` с любыми кодами ошибок гарантированно означает, что канал не работает.
4. Вручную: удалить нерабочие, мусорные и продублировавшиеся (по ссылкам) каналы.
5. Вручную: добавить плейлист в IPTV-плеер и перепроверить результат.
## Использованный стек
* [docker compose](https://docs.docker.com/compose/)
* [php8.3-fpm](https://www.php.net/releases/8.3/ru.php)
* [SlimPHP v4](https://www.slimframework.com/docs/v4/)
* [Bootstrap 5](https://getbootstrap.com/docs/5.0/getting-started/introduction/)
* [nginx](https://nginx.org/ru/)
* bash
## Лицензия
[The MIT License](LICENSE)