Большое обновление

- проект переписан на flight + twig, laravel-like хелперы
- docker-окружение
- новая страница с подробностями о плейлисте
- улучшен json о плейлисте
- нормальный роутинг
- нормальная статусная система
- попытка перекодировки при не utf-8 + предупреждение об этом
- дополнены FAQ + README
This commit is contained in:
2022-09-01 19:54:43 +08:00
parent 649ab85d79
commit c43439b9cc
37 changed files with 2566 additions and 860 deletions

245
README.md
View File

@@ -1,97 +1,200 @@
# Список самообновляемых плейлистов для IPTV
# Автообновляемые IPTV-плейлисты
- [Список самообновляемых плейлистов для IPTV](#список-самообновляемых-плейлистов-для-iptv)
- [Как использовать этот список?](#как-использовать-этот-список)
- [Как добавить плейлист в этот список?](#как-добавить-плейлист-в-этот-список)
- [API](#api)
- [Формат `playlists.ini`](#формат-playlistsini)
- [Дополнительные инструменты (`./tools`)](#дополнительные-инструменты-tools)
- [Как создать свой собственный плейлист](#как-создать-свой-собственный-плейлист)
- [Лицензия](#лицензия)
> **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
Проект, содержащий в себе инструменты для работы с IPTV-плейлистами:
* список автообновляемых плейлистов, которые найдены в открытых источниках;
* скрипты для поиска каналов в этом списке, создания своего плейлиста;
* веб-сервис, предоставляющий короткие ссылки на эти плейлисты и отображающий список каналов.
Плейлисты подбираются преимущественно для РФ и любых стран бывшего СНГ, но этими странами список не ограничивается.
Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник.
Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
Они бесплатны для использования.
Список проверяется и обновляется мной вручную.
Гарантию работоспособности никто не даёт.
## English description
> **Mirrored repo**: https://git.axenov.dev/anthony/iptv
This repo contains IPTV-playlists free to use with your media-player.
Most of them are in russian or CIS languages but you can find something interesting here for yourself.
Also there are some handy tools to make your own playlist or find channels you want in playlists listed here.
You can use this repo according to [LICENSE](LICENSE) conditions.
I'm too lazy to translate and support the whole project in ru and en, sorry, guys.
---
> **[Перейти на актуальную сраницу](https://iptv.axenov.dev/)**
## Содержание
Здесь собраны ссылки на IPTV-плейлисты, которые находятся в открытом доступе.
- [Как использовать этот список?](#howtouse)
- [Формат playlists.ini](#iniformat)
- [API](#api)
- [Развёртывание проекта](#deploy)
- [Дополнительные инструменты](#tools)
- [Как создать свой собственный плейлист](#howtomake)
- [Использованный стек](#stack)
- [Лицензия](#license)
Они бесплатны для использования. Список проверяется и обновляется мной вручную.
---
Поддержкой этих плейлистов занимаются сервисы и ресурсы, указанные как источник.
Вопросы работоспособности плейлистов адресуйте тем, кто несёт за них ответственность.
<a id="howtouse"></a>
## Как использовать этот список?
Чтобы подключить плейлист, нужно в настройках IPTV-плеера указать ссылку в следующем формате:
Чтобы подключить плейлист, нужно в настройках медиаплеера указать ссылку в следующем формате:
```
iptv.axenov.dev?ID
iptv.axenov.dev/<ID>
iptv.axenov.dev?<ID> (устаревший формат)
iptv.axenov.dev/?<ID> (устаревший формат)
```
где `ID` - один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
## Как добавить плейлист в этот список?
1) Склонировать себе репозиторий, создать ветку
2) Внести изменения в файл [`playlists.ini`](playlists.ini) как описано ниже
3) Сделать коммит, отправить изменения в свой репозиторий и создать merge-request
где `<ID>` - один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
Либо провернуть всё то же самое через браузер.
<a id="iniformat"></a>
## Формат `playlists.ini`
```ini
# В квадратных скобках - ID плейлиста в рамках этого
# конфига (обязателен). Для удобства ввода с пульта,
# для 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` приоритетен).
Плейлистов с редиректами может быть сколько угодно, но они не должны быть цикличными.
<a id="api"></a>
## API
Можно получать состояние плейлистов из этого сборника при помощи метода:
```
GET https://iptv.axenov.dev/?getinfo=<ID>
GET https://iptv.axenov.dev/<ID>/json
```
где `ID` - один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
где `ID` -- один из идентификаторов, указанных в [`playlists.ini`](playlists.ini) в квадратных скобках.
Ответом может быть JSON следующего содержания:
В случае успеха вернётся JSON следующего содержания:
```json
{
"is_online": true,
"count": 123,
"channels": [ ... ]
"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
}
```
где:
* `is_online` - `bool`, доступность плейлиста
* `count` - `uint|char[1]`, количество каналов >=0 либо `'-'` при `is_online === false`
* `channels` - `string[]`, массив строк с названиями каналов, может быть пустым.
Также ответ может быть пустым (вообще пустым, даже не `null`).
Такое я встречал с одним конкретном плейлисте с поехавшей кодировкой.
Лень разбираться, пофиг.
* `id` -- название плейлиста
* `name` -- краткое описание из источника или от себя
* `url` -- короткая ссылка, которую можно использовать для добавления плейлиста в плеер
* `desc` -- подробное описание плейлиста
* `pls` -- прямая ссылка на m3u/m3u8 плейлист
* `src` -- ссылка на источник, откуда взят плейлист
* `status` -- признак доступности плейлиста (`online`, `timeout`, `offline`, `unknown`)
* `encoding` -- данные о кодировке файла плейлиста
* `name` -- название кодировки (на данный момент определяются только `UTF-8` или `Windows-1251`)
* `alert` -- признак отличия кодировки от `UTF-8`, названия каналов сконвертированы в `UTF-8`
* `channels` -- массив названий каналов
* `count` -- количество каналов >= 0
## Формат `playlists.ini`
> Название кодировки `encoding.name` может определяться неточно!
```ini
; В квадратных скобках - ID плейлиста в рамках этого
; конфига (обязателен). Для удобства ввода с пульта,
; для ID рекомендуется число или короткая строка без
; пробелов и др. спецсимволов.
[p1]
; Название плейлиста (необязательно)
name='webarmen.com 18+'
; Краткое описание из источника или от себя (необязательно)
desc=''
; Прямая ссылка на m3u/m3u8 плейлист (обязательно)
pls='https://webarmen.com/my/iptv/auto.xxx.m3u'
; Ссылка на источник, откуда взят плейлист (необязательно)
src='https://webarmen.com/my/iptv/xxx.php'
В случае ошибки вернётся JSON в следующем формате:
[p2]
; ID другого плейлиста в этом списке, на который
; произойдёт редирект (нужно для мягкой смены ID).
; Необязателен, но если указан, то приоритетнее, чем pls.
redirect=p1
```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
<a id="deploy"></a>
## Развёртывание проекта
1. Выполнить `cp .env.example .env`, установить необходимые параметры
2. Выполнить `docker compose up -d --build`
3. Открыть `https://<APP_URL>:8080`
<a id="tools"></a>
## Дополнительные инструменты (`./tools`)
### `download-all.sh`
@@ -102,7 +205,7 @@ redirect=p1
Проверяет каждый канал в плейлисте на доступность и выводит результат проверки.
Поддерживаются \*.m3u и \*.m3u8; как локальные файлы, так по прямым ссылкам.
Поддерживаются `*.m3u` и `*.m3u8`; как локальные файлы, так по прямым ссылкам.
Коды ошибок доступны [здесь](https://everything.curl.dev/usingcurl/returns).
@@ -139,9 +242,9 @@ Check stats
### `find-in-pls.sh`
Находит каналы по заданному регулярному выражению в указанном плейлисте.
Находит каналы по заданному регулярному выражению в одном указанном плейлисте.
Поддерживаются \*.m3u и \*.m3u8; как локальные файлы, так по прямым ссылкам.
Поддерживаются `*.m3u` и `*.m3u8`; как локальные файлы, так по прямым ссылкам.
Пример:
@@ -165,7 +268,7 @@ Found: 2
### `find-in-all.sh`
Находит каналы по заданному регулярному выражению в плейлистах, скачанных через `download-all.sh`.
Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через `download-all.sh`.
Пример:
@@ -199,9 +302,10 @@ Nothing found
### `make-pls.sh`
Находит каналы по заданному регулярному выражению в плейлистах, скачанных через `download-all.sh`.
Находит каналы по заданному регулярному выражению во всех плейлистах, скачанных через `download-all.sh`.
Отличается от `find-in-all.sh` тем, что тот выводит результат в человекочитаемом формате, а этот -- в готовом m3u формате для сохранения в файл.
Отличается от `find-in-all.sh` тем, что тот выводит результат в человекочитаемом формате, а этот -- в готовом m3u
формате для сохранения в файл.
Пример:
@@ -222,6 +326,7 @@ http://live02-cdn.tv.ti.ru:80/dtv/id376_NBN_SG--Fox_HD/04/plst.m3u8
...
```
<a id="howtomake"></a>
## Как создать свой собственный плейлист?
1. Скачать все плейлисты, указанные в [`playlists.ini`](playlists.ini):
@@ -232,7 +337,8 @@ http://live02-cdn.tv.ti.ru:80/dtv/id376_NBN_SG--Fox_HD/04/plst.m3u8
```
$ ./tools/make-pls.sh "(fox|disney)" > my.m3u8
```
Так в плейлисте `./my.m3u8` окажутся все каналы из скачанных плейлистов, в названиях которых встрелись `fox` или `disney`.
Так в плейлисте `./my.m3u8` окажутся все каналы из скачанных плейлистов, в названиях которых встретились `fox`
или `disney`.
3. Проверить доступность каналов в полученном плейлисте:
```
$ ./tools/check-pls.sh my.m3u8
@@ -242,6 +348,19 @@ http://live02-cdn.tv.ti.ru:80/dtv/id376_NBN_SG--Fox_HD/04/plst.m3u8
4. Вручную: удалить нерабочие, мусорные и продублировавшиеся (по ссылкам) каналы.
5. Вручную: добавить плейлист в IPTV-плеер и перепроверить результат.
<a id="stack"></a>
## Использованный стек
* [docker compose](https://docs.docker.com/compose/)
* [php8.1-fpm](https://www.php.net/releases/8.1/en.php)
* [FlightPHP](https://flightphp.com/learn)
* [Bootstrap 5](https://getbootstrap.com/docs/5.0/getting-started/introduction/)
* [nginx](https://nginx.org/ru/)
* bash
<a id="license"></a>
## Лицензия
[The MIT License](LICENSE)