Переработка под iptvc

This commit is contained in:
2025-05-12 00:07:43 +08:00
parent f43843bb07
commit 252af50239
29 changed files with 1662 additions and 1268 deletions

190
README.md
View File

@@ -1,163 +1,71 @@
# Основной бэкенд iptv.axenov.dev
# Веб-сервис iptv.axenov.dev
> **Web-версия**: https://iptv.axenov.dev
> **FAQ**: https://iptv.axenov.dev/faq
> **Исходный код**: https://git.axenov.dev/IPTV
Содержит исходный код веб-сервиса и консольные инструменты проверки плейлистов и каналов.
Проект, содержащий в себе инструменты для работы с IPTV-плейлистами:
Использует [playlists.ini](https://git.axenov.dev/IPTV/playlists) с описанием плейлистов для своей работы.
* список автообновляемых плейлистов, которые найдены в открытых источниках;
* скрипты для поиска каналов в этом списке, создания своего плейлиста;
* веб-сервис, предоставляющий короткие ссылки на эти плейлисты и отображающий список каналов.
> **Веб-сайт:** [iptv.axenov.dev](https://iptv.axenov.dev)
> **Зеркало:** [m3u.su](https://m3u.su)
> Исходный код: [git.axenov.dev/IPTV/web](https://git.axenov.dev/IPTV/web)
> Telegram-канал: [@iptv_aggregator](https://t.me/iptv_aggregator)
> Обсуждение: [@iptv_aggregator_chat](https://t.me/iptv_aggregator_chat)
> Дополнительные сведения: [git.axenov.dev/IPTV/.profile](https://git.axenov.dev/IPTV/.profile)
Плейлисты подбираются преимущественно для РФ и любых стран бывшего СНГ, но этими странами список не ограничивается.
## О веб-сервисе
Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник.
Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
Решает две задачи:
* отображение списка плейлистов, которые можно использовать в своём плеере;
* сокращение длинных ссылок для удобства ввода с пульта на ТВ и лёгкого запоминания.
Они бесплатны для использования.
Список проверяется и обновляется мной вручную.
Гарантию работоспособности никто не даёт.
## Установка и настройка
* [Как использовать этот список?](#как-использовать-этот-список)
* [Формат `playlists.ini`](#формат-playlistsini)
* [API](#api)
* [Развёртывание проекта](#развёртывание-проекта)
* [Apache](#apache)
* [Nginx](#nginx)
* [Расширенные возможности](#расширенные-возможности)
* [Собственный код html/css/js](#собственный-код-htmlcssjs)
* [Очистка кеша twig](#очистка-кеша-twig)
* [Скачать все плейлисты](#скачать-все-плейлисты)
* [Проверить каналы плейлиста](#проверить-каналы-плейлиста)
* [Поиск каналов в одном плейлисте](#поиск-каналов-в-одном-плейлисте)
* [Поиск каналов во всех плейлистах](#поиск-каналов-во-всех-плейлистах)
* [Создать плейлист из нужных каналов](#создать-плейлист-из-нужных-каналов)
* [Как создать свой собственный плейлист?](#как-создать-свой-собственный-плейлист)
* [Использованный стек](#использованный-стек)
* [Лицензия](#лицензия)
1. Развернуть [docker-среду](https://git.axenov.dev/IPTV/docker)
2. `cd iptv-docker; cp .env.example .env`
3. В файле `.env` поменять необходимые значения
4. `cd ..; docker compose up -d --build`
## API
### Описание переменных окружения
Можно получать состояние плейлистов из этого сборника при помощи метода:
* `APP_URL` -- адрес, на котором расположен сервис: используется для генерации ссылок на плейлисты;
* `APP_DEBUG` -- признак отладки сервиса (включает служебный вывод в некоторых местах);
* `APP_ENV` -- окружение (см. ниже);
* `APP_TITLE` -- название сервиса: используется для вывода на страницах сайта и в их заголовках;
* `APP_TIMEZONE` -- часовой пояс, в котором расположен сервер;
* `PAGE_SIZE` -- размер страницы для постраничной навигации на главной странице;
* `USER_AGENT` -- user-agent для http-клиента, котоырй будет использоваться при подключении к внешним ресурсам;
* `CACHE_HOST`, `CACHE_PORT`, `CACHE_PASSWORD`, `CACHE_DB` -- реквизиты подключения к cache/keydb;
* `CACHE_TTL` -- количество часов для кэширования информации;
* `TWIG_USE_CACHE` -- признак использования кэша компиляции шаблонов Twig.
```
GET https://iptv.axenov.dev/<ID>/json
```
У каждой переменной есть умолчание на случай отсутствия файла `.env` или её отсутствия в нём.
Но некорректные значения некоторых переменных могут привести к фатальным ошибкам.
где `ID` -- один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
### Перегрузка переменных окружения
В случае успеха вернётся JSON следующего содержания:
В разных средах можно использовать разные env-файлы для своего удобства.
```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
}
```
Для этого следует:
1. в файле `.env` переменной `APP_ENV` указать значение, например, `custom` или любое другое;
2. скопировать файл `.env` в файл `.env.custom`;
3. в файле `.env.custom` указать все или только необходимые переменные со произвольными значениями.
где:
Отсутствие файла `.env.custom` не вызовет ошибку.
* `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
## Расширенные возможности
### Собственный код 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
```
При подгрузке файла `.env.custom` будут перегружены только те переменные окружения, которые в нём объявлены.
## Использованный стек
* [php8.3-fpm](https://www.php.net/releases/8.3/ru.php)
* [php8.4-fpm](https://www.php.net/releases/8.4/ru.php)
* [SlimPHP v4](https://www.slimframework.com/docs/v4/)
* [Bootstrap 5](https://getbootstrap.com/docs/5.0/getting-started/introduction/)
* [Guzzle v7](https://docs.guzzlephp.org/en/latest/)
* [Twig v3](https://twig.symfony.com/doc/3.x/)
* [symfony/console](https://symfony.com/doc/current/components/console.html)
* [focusim/php-qrcode](https://github.com/Focusim/php-qrcode)
* [Bootstrap v5.2](https://getbootstrap.com/docs/5.2/getting-started/introduction/)
* [Ionicons](https://ionic.io/ionicons)
* [List.js](https://listjs.com)
## Лицензия
[The MIT License](LICENSE)
Исходный код распространяется на условиях лицензии MIT.
См. файл [LICENSE](LICENSE) для подробностей.