wip5
|
After Width: | Height: | Size: 72 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 70 KiB |
@@ -0,0 +1,436 @@
|
||||
---
|
||||
title: config.yml
|
||||
icon: material/file-cog
|
||||
tags: ["iptvc", "конфигурация"]
|
||||
---
|
||||
|
||||
# :material-file-cog: Конфигурация config.yml
|
||||
|
||||
Программа читает настройки из YAML-файла `config.yml` в корне проекта.
|
||||
Путь к файлу можно задать через глобальный флаг `--config`.
|
||||
|
||||
## Приоритет настроек
|
||||
|
||||
От низшего к высшему:
|
||||
|
||||
1. **Значения по умолчанию** — встроены в код;
|
||||
2. **`config.yml`** — YAML-файл;
|
||||
3. **Переменные окружения** — переопределяют `config.yml` (если заданы);
|
||||
4. **CLI-флаги** — переопределяют переменные окружения и `config.yml` (если заданы явно).
|
||||
|
||||
Файл `.env` загружается автоматически, переменные из него применяются как переменные окружения.
|
||||
|
||||
## Структура файла
|
||||
|
||||
```yaml
|
||||
app:
|
||||
timezone: GMT
|
||||
debug: false
|
||||
log_level: info
|
||||
playlists: ./playlists.ini
|
||||
tags: ./channels.json
|
||||
|
||||
server:
|
||||
host: localhost
|
||||
port: 8080
|
||||
|
||||
site:
|
||||
base-url: http://localhost:8080
|
||||
repo-url: https://git.axenov.dev/IPTV
|
||||
page-size: 0
|
||||
favicon:
|
||||
header:
|
||||
title: IPTV Checker
|
||||
navigation:
|
||||
- title: Документация
|
||||
url: /docs
|
||||
icon: document-text-outline
|
||||
- title: Telegram
|
||||
icon: paper-plane-outline
|
||||
children:
|
||||
- title: Канал
|
||||
url: https://t.me/iptv_aggregator
|
||||
icon: megaphone-outline
|
||||
footer-links:
|
||||
- title: Исходники
|
||||
url: https://git.axenov.dev/IPTV
|
||||
icon: code-slash-outline
|
||||
|
||||
check:
|
||||
start-on-serve: false
|
||||
playlists:
|
||||
user-agent:
|
||||
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
|
||||
timeout: 10000
|
||||
all-cooldown: 0
|
||||
one-cooldown: 0
|
||||
max-routines: 5
|
||||
per-routine: 1
|
||||
channels:
|
||||
user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
|
||||
timeout: 10000
|
||||
byte-range: 512
|
||||
cooldown: 0
|
||||
max-routines: 50
|
||||
per-routine: 10
|
||||
|
||||
cache:
|
||||
enabled: false
|
||||
host: localhost
|
||||
port: 6379
|
||||
username:
|
||||
password:
|
||||
db: 0
|
||||
ttl: 1800
|
||||
```
|
||||
|
||||
## Секция `app`
|
||||
|
||||
| Параметр | Тип | По умолчанию | Описание |
|
||||
| ----------- | ------ | ----------------- | ---------------------- |
|
||||
| `timezone` | string | `GMT` | Часовой пояс |
|
||||
| `debug` | bool | `false` | Режим отладки |
|
||||
| `log_level` | string | `info` | Уровень логирования |
|
||||
| `playlists` | string | `./playlists.ini` | Путь к `playlists.ini` |
|
||||
| `tags` | string | `./channels.json` | Путь к `channels.json` |
|
||||
|
||||
## Секция `server`
|
||||
|
||||
| Параметр | Тип | По умолчанию | Описание |
|
||||
| -------- | ------ | ------------ | ----------------- |
|
||||
| `host` | string | (пусто) | Хост для привязки |
|
||||
| `port` | uint | `8080` | Порт веб-сервера |
|
||||
|
||||
## Секция `site`
|
||||
|
||||
Настройки сайта: ссылки, заголовок, навигация, пагинация.
|
||||
|
||||
| Параметр | Тип | По умолчанию | Описание |
|
||||
| ----------- | ------ | ----------------------------- | ----------------------------------- |
|
||||
| `base-url` | string | `http://localhost:8080` | Базовый URL для формирования ссылок |
|
||||
| `repo-url` | string | `https://git.axenov.dev/IPTV` | Ссылка на репозиторий |
|
||||
| `page-size` | uint | `0` | Размер страницы (0 — без пагинации) |
|
||||
| `favicon` | string | (пусто) | Путь к иконке сайта |
|
||||
|
||||
### `site.header`
|
||||
|
||||
Настройки шапки сайта.
|
||||
|
||||
| Параметр | Тип | По умолчанию | Описание |
|
||||
| ------------ | ------ | -------------- | -------------------------------------- |
|
||||
| `title` | string | `IPTV Checker` | Заголовок сайта (в navbar и `<title>`) |
|
||||
| `navigation` | [Link] | (см. ниже) | Ссылки в шапке сайта |
|
||||
|
||||
### `site.footer-links`
|
||||
|
||||
Ссылки в подвале сайта. Массив элементов `Link`.
|
||||
|
||||
### Тип `Link`
|
||||
|
||||
Элемент навигации или подвала. Если задано `children`, рендерится как выпадающее меню.
|
||||
|
||||
| Параметр | Тип | Описание |
|
||||
| ---------- | ------ | ----------------------------------------------------------- |
|
||||
| `title` | string | Текст ссылки |
|
||||
| `url` | string | URL ссылки (можно опустить, если есть `children`) |
|
||||
| `icon` | string | Имя иконки |
|
||||
| `children` | [Link] | Дочерние ссылки (выпадающее меню, один уровень вложенности) |
|
||||
|
||||
--8<-- "ionicons-name.md"
|
||||
|
||||
Пример:
|
||||
|
||||
```yaml
|
||||
site:
|
||||
header:
|
||||
navigation:
|
||||
- title: Документация
|
||||
url: /docs
|
||||
icon: document-text-outline
|
||||
- title: Telegram
|
||||
icon: paper-plane-outline
|
||||
children:
|
||||
- title: Канал
|
||||
url: https://t.me/iptv_aggregator
|
||||
icon: megaphone-outline
|
||||
- title: Чат
|
||||
url: https://t.me/iptv_aggregator_chat
|
||||
icon: chatbubbles-outline
|
||||
footer-links:
|
||||
- title: Исходники
|
||||
url: https://git.axenov.dev/IPTV
|
||||
icon: code-slash-outline
|
||||
- title: axenov.dev
|
||||
url: https://axenov.dev
|
||||
icon: person-outline
|
||||
```
|
||||
|
||||
## Секция `check`
|
||||
|
||||
Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы.
|
||||
|
||||
### `check.start-on-serve`
|
||||
|
||||
| Параметр | Тип | По умолчанию | Описание |
|
||||
| ---------------- | ---- | ------------ | ---------------------------------------------------------- |
|
||||
| `start-on-serve` | bool | `false` | Запустить фоновую проверку при `serve` без флага `--check` |
|
||||
|
||||
### Типы значений
|
||||
|
||||
!!! info "timeout, max-routines, per-routine, byte-range"
|
||||
Эти параметры — всегда целые числа, не массивы.
|
||||
|
||||
!!! info "cooldown (all-cooldown, one-cooldown, channels.cooldown)"
|
||||
Эти параметры могут быть заданы:
|
||||
|
||||
- **скаляром** — фиксированное значение, например `all-cooldown: 10`;
|
||||
- **массивом `[min, max]`** — случайное значение в диапазоне при каждой проверке, например `all-cooldown: [5, 15]`.
|
||||
|
||||
!!! info "user-agent"
|
||||
Параметр `user-agent` может быть задан:
|
||||
|
||||
- **строкой** — используется всегда одно значение;
|
||||
- **массивом строк** — случайный выбор при каждом запросе.
|
||||
|
||||
!!! info "byte-range"
|
||||
Параметр `byte-range` — всегда целое число (не массив).
|
||||
|
||||
### `check.playlists`
|
||||
|
||||
Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС).
|
||||
|
||||
| Параметр | Тип | По умолчанию | Единица | Описание |
|
||||
| -------------- | ------------------ | ----------------- | ------- | ------------------------------------------------ |
|
||||
| `user-agent` | string \| string[] | `Mozilla/5.0 ...` | — | User-Agent для HTTP-запросов |
|
||||
| `timeout` | int | `10000` | мс | Таймаут запроса плейлиста |
|
||||
| `all-cooldown` | int \| int[] | `0` | мс | Задержка после проверки всех плейлистов |
|
||||
| `one-cooldown` | int \| int[] | `0` | мс | Задержка после проверки каждого плейлиста |
|
||||
| `max-routines` | int | `5` | шт | Максимум одновременно проверяемых плейлистов |
|
||||
| `per-routine` | int | `1` | шт | Количество плейлистов на одну процедуру проверки |
|
||||
|
||||
### `check.channels`
|
||||
|
||||
Параметры проверки каналов внутри плейлиста.
|
||||
|
||||
| Параметр | Тип | По умолчанию | Единица | Описание |
|
||||
| -------------- | ------------------ | ----------------- | ------- | --------------------------------------------- |
|
||||
| `user-agent` | string \| string[] | `Mozilla/5.0 ...` | — | User-Agent для HTTP-запросов |
|
||||
| `timeout` | int | `10000` | мс | Таймаут запроса канала |
|
||||
| `byte-range` | int | `512` | байт | Объём данных для загрузки от сервера |
|
||||
| `cooldown` | int \| int[] | `0` | мс | Задержка после проверки каждого канала |
|
||||
| `max-routines` | int | `50` | шт | Максимум одновременно проверяемых каналов |
|
||||
| `per-routine` | int | `10` | шт | Количество каналов на одну процедуру проверки |
|
||||
|
||||
## Секция `cache`
|
||||
|
||||
| Параметр | Тип | По умолчанию | Описание |
|
||||
| ---------- | ------ | ------------ | ---------------------------------- |
|
||||
| `enabled` | bool | `false` | Включить кеширование (KeyDB/Redis) |
|
||||
| `host` | string | `localhost` | Хост KeyDB/Redis |
|
||||
| `port` | uint | `6379` | Порт KeyDB/Redis |
|
||||
| `username` | string | (пусто) | Логин |
|
||||
| `password` | string | (пусто) | Пароль |
|
||||
| `db` | uint | `0` | Номер БД |
|
||||
| `ttl` | uint | `1800` | TTL записей (сек) |
|
||||
|
||||
## Валидация
|
||||
|
||||
При запуске конфигурация валидируется.
|
||||
Некорректные значения исправляются автоматически, каждое исправление логируется:
|
||||
|
||||
| Проверка | Действие |
|
||||
| ---------------------------------------------------- | --------------------------------------- |
|
||||
| `server.port` = 0 или > 65535 | сброс в `8080` |
|
||||
| `site.base-url` пусто | автогенерация `http://localhost:{port}` |
|
||||
| `cache.host` пусто (если cache включён) | `localhost` |
|
||||
| `cache.port` = 0 (если cache включён) | `6379` |
|
||||
| `cache.ttl` = 0 (если cache включён) | `1800` |
|
||||
| `check.playlists.timeout` <= 0 | `10000` |
|
||||
| `check.channels.timeout` <= 0 | `10000` |
|
||||
| `check.*.cooldown` — `min > max` | swap |
|
||||
| `check.*.cooldown` — выход за границы `[0, 3600000]` | clamp |
|
||||
| `check.playlists.max-routines` < 1 | `5` |
|
||||
| `check.channels.max-routines` < 1 | `50` |
|
||||
| `check.playlists.per-routine` < 1 | `1` |
|
||||
| `check.channels.per-routine` < 1 | `10` |
|
||||
| `check.channels.byte-range` <= 0 | `512` |
|
||||
| `check.*.user-agent` пусто | дефолтный User-Agent |
|
||||
|
||||
## Переменные окружения
|
||||
|
||||
Переменные окружения переопределяют значения из `config.yml`.
|
||||
|
||||
### Приложение
|
||||
|
||||
| Переменная | Соответствует в `config.yml` |
|
||||
| --------------- | ---------------------------- |
|
||||
| `APP_DEBUG` | `app.debug` |
|
||||
| `APP_LOG_LEVEL` | `app.log_level` |
|
||||
| `APP_TIMEZONE` | `app.timezone` |
|
||||
| `APP_PLAYLISTS` | `app.playlists` |
|
||||
| `APP_TAGS` | `app.tags` |
|
||||
|
||||
### Веб-сервер и сайт
|
||||
|
||||
| Переменная | Соответствует в `config.yml` |
|
||||
| -------------- | ---------------------------- |
|
||||
| `WEB_PORT` | `server.port` |
|
||||
| `WEB_HOST` | `server.host` |
|
||||
| `APP_URL` | `site.base-url` |
|
||||
| `PAGE_SIZE` | `site.page-size` |
|
||||
| `REPO_URL` | `site.repo-url` |
|
||||
| `SITE_FAVICON` | `site.favicon` |
|
||||
| `APP_TITLE` | `site.header.title` |
|
||||
|
||||
### Проверка
|
||||
|
||||
| Переменная | Соответствует в `config.yml` |
|
||||
| ---------------------- | ---------------------------- |
|
||||
| `CHECK_START_ON_SERVE` | `check.start-on-serve` |
|
||||
|
||||
#### `check.playlists`
|
||||
|
||||
| Переменная | Соответствует в `config.yml` |
|
||||
| ---------------------------------- | --------------------------------------------------- |
|
||||
| `CHECK_PLAYLISTS_TIMEOUT` | `check.playlists.timeout` |
|
||||
| `CHECK_PLAYLISTS_ALL_COOLDOWN` | `check.playlists.all-cooldown` (скаляр) |
|
||||
| `CHECK_PLAYLISTS_ALL_COOLDOWN_MIN` | `check.playlists.all-cooldown` (минимум диапазона) |
|
||||
| `CHECK_PLAYLISTS_ALL_COOLDOWN_MAX` | `check.playlists.all-cooldown` (максимум диапазона) |
|
||||
| `CHECK_PLAYLISTS_ONE_COOLDOWN` | `check.playlists.one-cooldown` (скаляр) |
|
||||
| `CHECK_PLAYLISTS_ONE_COOLDOWN_MIN` | `check.playlists.one-cooldown` (минимум диапазона) |
|
||||
| `CHECK_PLAYLISTS_ONE_COOLDOWN_MAX` | `check.playlists.one-cooldown` (максимум диапазона) |
|
||||
| `CHECK_PLAYLISTS_MAX_ROUTINES` | `check.playlists.max-routines` |
|
||||
| `CHECK_PLAYLISTS_PER_ROUTINE` | `check.playlists.per-routine` |
|
||||
| `CHECK_PLAYLISTS_USER_AGENT_1` | `check.playlists.user-agent` (первый элемент) |
|
||||
| `CHECK_PLAYLISTS_USER_AGENT_2` | `check.playlists.user-agent` (второй элемент) |
|
||||
| `CHECK_PLAYLISTS_USER_AGENT_N` | `check.playlists.user-agent` (N-й элемент) |
|
||||
|
||||
#### `check.channels`
|
||||
|
||||
| Переменная | Соответствует в `config.yml` |
|
||||
| ----------------------------- | ---------------------------------------------- |
|
||||
| `CHECK_CHANNELS_TIMEOUT` | `check.channels.timeout` |
|
||||
| `CHECK_CHANNELS_BYTE_RANGE` | `check.channels.byte-range` |
|
||||
| `CHECK_CHANNELS_COOLDOWN` | `check.channels.cooldown` (скаляр) |
|
||||
| `CHECK_CHANNELS_COOLDOWN_MIN` | `check.channels.cooldown` (минимум диапазона) |
|
||||
| `CHECK_CHANNELS_COOLDOWN_MAX` | `check.channels.cooldown` (максимум диапазона) |
|
||||
| `CHECK_CHANNELS_MAX_ROUTINES` | `check.channels.max-routines` |
|
||||
| `CHECK_CHANNELS_PER_ROUTINE` | `check.channels.per-routine` |
|
||||
| `CHECK_CHANNELS_USER_AGENT_1` | `check.channels.user-agent` (первый элемент) |
|
||||
| `CHECK_CHANNELS_USER_AGENT_2` | `check.channels.user-agent` (второй элемент) |
|
||||
| `CHECK_CHANNELS_USER_AGENT_N` | `check.channels.user-agent` (N-й элемент) |
|
||||
|
||||
!!! info "Диапазоны cooldown через env"
|
||||
Если заданы обе переменные `_MIN` и `_MAX` — используется диапазон.
|
||||
Если задана только скалярная переменная (без `_MIN`/`_MAX`) — используется фиксированное значение.
|
||||
Если задана только одна из `_MIN`/`_MAX` — переменная игнорируется.
|
||||
|
||||
!!! info "Массивы user-agent через env"
|
||||
Переменные читаются последовательно: `_1`, `_2`, `_3`, …
|
||||
Первая отсутствующая переменная останавливает чтение.
|
||||
Пустые значения пропускаются.
|
||||
|
||||
### Кеш
|
||||
|
||||
| Переменная | Соответствует в `config.yml` |
|
||||
| ---------------- | ---------------------------- |
|
||||
| `CACHE_ENABLED` | `cache.enabled` |
|
||||
| `CACHE_HOST` | `cache.host` |
|
||||
| `CACHE_PORT` | `cache.port` |
|
||||
| `CACHE_USERNAME` | `cache.username` |
|
||||
| `CACHE_PASSWORD` | `cache.password` |
|
||||
| `CACHE_DB` | `cache.db` |
|
||||
| `CACHE_TTL` | `cache.ttl` |
|
||||
|
||||
## CLI-флаги
|
||||
|
||||
CLI-флаги имеют наивысший приоритет и переопределяют значения из `config.yml` и переменных окружения. Все флаги используют zero-value по умолчанию: переопределение срабатывает, только если флаг задан явно (через `cmd.Flags().Changed()`).
|
||||
|
||||
Порядок применения в обработчиках команд:
|
||||
|
||||
```
|
||||
app.Init() → defaults → config.yml → env → logger
|
||||
applyAppOverrides(cmd) → app.* через Changed()
|
||||
applyCacheOverrides(cmd) → cache.* через Changed()
|
||||
applyCheckOverrides(cmd) → check.* через Changed()
|
||||
app.InitCache() → подключение к KeyDB/Redis
|
||||
```
|
||||
|
||||
### Глобальные флаги
|
||||
|
||||
### Флаги путей
|
||||
|
||||
Доступны для `check` и `serve`.
|
||||
|
||||
| Флаг | Тип | Соответствует в `config.yml` | Описание |
|
||||
| -------------- | ------ | ---------------------------- | ---------------------- |
|
||||
| `-i`, `--ini` | string | `app.playlists` | Путь к `playlists.ini` |
|
||||
| `-t`, `--tags` | string | `app.tags` | Путь к `channels.json` |
|
||||
|
||||
### Флаги итерации
|
||||
|
||||
Доступны для `check` и `serve`.
|
||||
|
||||
| Флаг | Тип | По умолчанию | Описание |
|
||||
| ---------------- | ---- | ------------------------------ | --------------------------------------------- |
|
||||
| `-r`, `--random` | uint | `0` | Проверить N случайных плейлистов из ini-файла |
|
||||
| `--repeat` | uint | `1` (`check`) / `0` (`serve`) | Количество циклов (0 = бесконечно) |
|
||||
| `--every` | uint | `5` (`check`) / `60` (`serve`) | Секунд между циклами |
|
||||
|
||||
### Флаги проверки плейлистов
|
||||
|
||||
Доступны для `check` и `serve`. Переопределяют секцию `check.playlists`.
|
||||
|
||||
| Флаг | Тип | Соответствует в `config.yml` | Единица | Описание |
|
||||
| -------------------------- | -------- | ------------------------------ | ------- | -------------------------------- |
|
||||
| `--playlists-timeout` | int | `check.playlists.timeout` | мс | Таймаут запроса плейлиста |
|
||||
| `--playlists-all-cooldown` | int | `check.playlists.all-cooldown` | мс | Задержка после всех плейлистов |
|
||||
| `--playlists-one-cooldown` | int | `check.playlists.one-cooldown` | мс | Задержка после каждого плейлиста |
|
||||
| `--playlists-max-routines` | int | `check.playlists.max-routines` | шт | Максимум параллельных проверок |
|
||||
| `--playlists-per-routine` | int | `check.playlists.per-routine` | шт | Плейлистов на процедуру |
|
||||
| `--playlists-user-agent` | string[] | `check.playlists.user-agent` | — | User-Agent (можно несколько) |
|
||||
|
||||
### Флаги проверки каналов
|
||||
|
||||
Доступны для `check` и `serve`. Переопределяют секцию `check.channels`.
|
||||
|
||||
| Флаг | Тип | Соответствует в `config.yml` | Единица | Описание |
|
||||
| ------------------------- | -------- | ----------------------------- | ------- | ------------------------------ |
|
||||
| `--channels-timeout` | int | `check.channels.timeout` | мс | Таймаут запроса канала |
|
||||
| `--channels-byte-range` | int | `check.channels.byte-range` | байт | Объём данных от сервера |
|
||||
| `--channels-cooldown` | int | `check.channels.cooldown` | мс | Задержка после каждого канала |
|
||||
| `--channels-max-routines` | int | `check.channels.max-routines` | шт | Максимум параллельных проверок |
|
||||
| `--channels-per-routine` | int | `check.channels.per-routine` | шт | Каналов на процедуру |
|
||||
| `--channels-user-agent` | string[] | `check.channels.user-agent` | — | User-Agent (можно несколько) |
|
||||
|
||||
### Флаги кеша
|
||||
|
||||
Доступны для `check` и `serve`. Переопределяют секцию `cache`.
|
||||
|
||||
| Флаг | Тип | Соответствует в `config.yml` | Описание |
|
||||
| ------------------ | ------ | ---------------------------- | ----------------- |
|
||||
| `--cache-enabled` | bool | `cache.enabled` | Включить кеш |
|
||||
| `--cache-host` | string | `cache.host` | Хост KeyDB/Redis |
|
||||
| `--cache-port` | uint | `cache.port` | Порт KeyDB/Redis |
|
||||
| `--cache-username` | string | `cache.username` | Логин |
|
||||
| `--cache-password` | string | `cache.password` | Пароль |
|
||||
| `--cache-db` | uint | `cache.db` | Номер БД |
|
||||
| `--cache-ttl` | uint | `cache.ttl` | TTL записей (сек) |
|
||||
|
||||
### Флаги только для `serve`
|
||||
|
||||
| Флаг | Тип | Соответствует в `config.yml` | Описание |
|
||||
| -------------- | ------ | ---------------------------- | ------------------------- |
|
||||
| `-p`, `--port` | uint | `server.port` | Порт веб-сервера |
|
||||
| `--host` | string | `server.host` | Хост привязки |
|
||||
| `--check` | bool | — | Включить фоновую проверку |
|
||||
|
||||
### Флаги только для `check`
|
||||
|
||||
| Флаг | Тип | Описание |
|
||||
| --------------- | -------- | -------------------------- |
|
||||
| `-j`, `--json` | bool | Вывод результатов в JSON |
|
||||
| `-q`, `--quiet` | bool | Подавить логи |
|
||||
| `-f`, `--file` | string[] | Локальный m3u-файл |
|
||||
| `-u`, `--url` | string[] | URL удалённого плейлиста |
|
||||
| `-c`, `--code` | string[] | Код плейлиста из ini-файла |
|
||||
@@ -0,0 +1,116 @@
|
||||
---
|
||||
icon: simple/dotenv
|
||||
tags: ["iptvc", "переменные окружения"]
|
||||
---
|
||||
|
||||
# :simple-dotenv: Переменные окружения
|
||||
|
||||
Переменные окружения переопределяют значения из [`config.yml`](config.md).
|
||||
Файл `.env` загружается автоматически при запуске.
|
||||
|
||||
Приоритет: **defaults → config.yml → env → CLI-флаги**.
|
||||
|
||||
## Приложение
|
||||
|
||||
| Имя | Тип | Умолчание | Назначение |
|
||||
| ---------------- | ------ | ----------------------- | ----------------------------------------- |
|
||||
| `APP_DEBUG` | bool | `false` | Режим отладки |
|
||||
| `APP_LOG_LEVEL` | string | `info` | Уровень логирования (`debug`, `info`, `warn`, `error`) |
|
||||
| `APP_TIMEZONE` | string | `GMT` | Часовой пояс |
|
||||
| `APP_PLAYLISTS` | string | `./playlists.ini` | Путь к `playlists.ini` |
|
||||
| `APP_TAGS` | string | `./channels.json` | Путь к `channels.json` |
|
||||
|
||||
## Веб-сервер и сайт
|
||||
|
||||
| Имя | Тип | Умолчание | Назначение |
|
||||
| ---------------- | ------ | ----------------------------- | ----------------------------------- |
|
||||
| `WEB_PORT` | uint | `8080` | Порт веб-сервера |
|
||||
| `WEB_HOST` | string | (пусто) | Хост для привязки |
|
||||
| `APP_URL` | string | `http://localhost:8080` | Базовый URL для ссылок |
|
||||
| `PAGE_SIZE` | uint | `0` | Размер страницы (0 — без пагинации) |
|
||||
| `REPO_URL` | string | `https://git.axenov.dev/IPTV` | Ссылка на репозиторий |
|
||||
| `SITE_FAVICON` | string | (пусто) | Путь к иконке сайта |
|
||||
| `APP_TITLE` | string | `IPTV Checker` | Заголовок сайта |
|
||||
|
||||
## Проверка
|
||||
|
||||
| Имя | Тип | Умолчание | Назначение |
|
||||
| ----------------------- | --- | --------- | ------------------------------------------------------- |
|
||||
| `CHECK_START_ON_SERVE` | bool | `false` | Запустить фоновую проверку при `serve` без флага `--check` |
|
||||
|
||||
### `check.playlists`
|
||||
|
||||
| Имя | Тип | Умолчание | Назначение |
|
||||
| --- | --- | --- | --- |
|
||||
| `CHECK_PLAYLISTS_TIMEOUT` | int | `10000` | Таймаут запроса плейлиста (мс) |
|
||||
| `CHECK_PLAYLISTS_ALL_COOLDOWN` | int | `0` | Задержка после всех плейлистов (мс, скаляр) |
|
||||
| `CHECK_PLAYLISTS_ALL_COOLDOWN_MIN` | int | `0` | Минимум задержки после всех плейлистов (мс) |
|
||||
| `CHECK_PLAYLISTS_ALL_COOLDOWN_MAX` | int | `0` | Максимум задержки после всех плейлистов (мс) |
|
||||
| `CHECK_PLAYLISTS_ONE_COOLDOWN` | int | `0` | Задержка после каждого плейлиста (мс, скаляр) |
|
||||
| `CHECK_PLAYLISTS_ONE_COOLDOWN_MIN` | int | `0` | Минимум задержки после каждого плейлиста (мс) |
|
||||
| `CHECK_PLAYLISTS_ONE_COOLDOWN_MAX` | int | `0` | Максимум задержки после каждого плейлиста (мс) |
|
||||
| `CHECK_PLAYLISTS_MAX_ROUTINES` | int | `5` | Максимум параллельных проверок плейлистов |
|
||||
| `CHECK_PLAYLISTS_PER_ROUTINE` | int | `1` | Плейлистов на процедуру |
|
||||
| `CHECK_PLAYLISTS_USER_AGENT_1` | string | `Mozilla/5.0 …` | Первый User-Agent для запросов плейлистов |
|
||||
| `CHECK_PLAYLISTS_USER_AGENT_2` | string | — | Второй User-Agent (и т.д.) |
|
||||
|
||||
### `check.channels`
|
||||
|
||||
| Имя | Тип | Умолчание | Назначение |
|
||||
| --- | --- | --- | --- |
|
||||
| `CHECK_CHANNELS_TIMEOUT` | int | `10000` | Таймаут запроса канала (мс) |
|
||||
| `CHECK_CHANNELS_BYTE_RANGE` | int | `512` | Объём данных от сервера (байт) |
|
||||
| `CHECK_CHANNELS_COOLDOWN` | int | `0` | Задержка после каждого канала (мс, скаляр) |
|
||||
| `CHECK_CHANNELS_COOLDOWN_MIN` | int | `0` | Минимум задержки после каждого канала (мс) |
|
||||
| `CHECK_CHANNELS_COOLDOWN_MAX` | int | `0` | Максимум задержки после каждого канала (мс) |
|
||||
| `CHECK_CHANNELS_MAX_ROUTINES` | int | `50` | Максимум параллельных проверок каналов |
|
||||
| `CHECK_CHANNELS_PER_ROUTINE` | int | `10` | Каналов на процедуру |
|
||||
| `CHECK_CHANNELS_USER_AGENT_1` | string | `Mozilla/5.0 …` | Первый User-Agent для запросов каналов |
|
||||
| `CHECK_CHANNELS_USER_AGENT_2` | string | — | Второй User-Agent (и т.д.) |
|
||||
|
||||
## Кеширование
|
||||
|
||||
Кеш хранится в СУБД redis или keydb.
|
||||
|
||||
| Имя | Тип | Умолчание | Назначение |
|
||||
| ---------------- | ------ | ----------- | ---------------------------------- |
|
||||
| `CACHE_ENABLED` | bool | `false` | Включает кеширование |
|
||||
| `CACHE_HOST` | string | `localhost` | Имя хоста СУБД |
|
||||
| `CACHE_PORT` | uint | `6379` | Порт СУБД |
|
||||
| `CACHE_USERNAME` | string | (пусто) | Логин пользователя в СУБД |
|
||||
| `CACHE_PASSWORD` | string | (пусто) | Пароль пользователя в СУБД |
|
||||
| `CACHE_DB` | uint | `0` | Номер БД в СУБД для кеша |
|
||||
| `CACHE_TTL` | uint | `1800` | Время жизни ключей кеша в секундах |
|
||||
|
||||
## Правила
|
||||
|
||||
### Диапазоны cooldown
|
||||
|
||||
Поля `all-cooldown`, `one-cooldown` и `channels.cooldown` поддерживают скаляр и диапазон `[min, max]`.
|
||||
|
||||
Через env-переменные:
|
||||
|
||||
- Заданы **обе** `_MIN` и `_MAX` → диапазон (случайное значение при каждой проверке).
|
||||
- Задана только **скалярная** переменная (без суффикса) → фиксированное значение.
|
||||
- Задана только **одна** из `_MIN` / `_MAX` → переменная игнорируется.
|
||||
|
||||
```shell title="Скаляр"
|
||||
CHECK_PLAYLISTS_ALL_COOLDOWN=500
|
||||
```
|
||||
|
||||
```shell title="Диапазон"
|
||||
CHECK_PLAYLISTS_ALL_COOLDOWN_MIN=100
|
||||
CHECK_PLAYLISTS_ALL_COOLDOWN_MAX=2000
|
||||
```
|
||||
|
||||
### Массивы user-agent
|
||||
|
||||
Поля `user-agent` поддерживают массив строк. Через env задаются индексированными переменными `_1`, `_2`, `_3`, …
|
||||
|
||||
- Чтение останавливается на первой отсутствующей переменной.
|
||||
- Пустые значения пропускаются.
|
||||
|
||||
```shell title="Два User-Agent"
|
||||
CHECK_PLAYLISTS_USER_AGENT_1=Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
|
||||
CHECK_PLAYLISTS_USER_AGENT_2=curl/8.0
|
||||
```
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
icon: material/book-open-page-variant-outline
|
||||
---
|
||||
|
||||
# :material-book-open-page-variant-outline: Об этой документации
|
||||
|
||||
!!! warning "Актуальность документации может отставать от текущей версии сервиса, его исходных кодов и инфраструктуры"
|
||||
Поддерживать содержимое в актуальном состоянии большой труд.
|
||||
Прошу отнестись с пониманием, а лучше — [помочь делом](support.md#participate).
|
||||
|
||||
<!--
|
||||
!!! danger "Тем не менее, прошу прочесть её!"
|
||||
Потому что очень часто и мне, и в общий чат поступают одинаковые вопросы, на которые уже просто нет сил отвечать персонально.
|
||||
-->
|
||||
|
||||
Если у тебя возникает вопрос, на который уже есть ответ на одной из этих страниц, то ты рискуешь
|
||||
|
||||
* либо быть посланным сюда;
|
||||
* либо быть посланным далеко не сюда;
|
||||
* либо остаться в игноре.
|
||||
|
||||
## Навигация
|
||||
|
||||
К твоим услугам:
|
||||
|
||||
1. в заголовке сайта — глобальный поиск;
|
||||
2. над заголовком страницы — метки страницы (полный список ниже);
|
||||
3. слева — общее содержание;
|
||||
4. справа — содержание конкретной страницы.
|
||||
|
||||
??? info end "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:"
|
||||

|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
---
|
||||
title: channels.json
|
||||
icon: material/code-json
|
||||
tags: ["iptvc", "теги", "каналы"]
|
||||
---
|
||||
|
||||
# :material-code-json: Формат файла `channels.json`
|
||||
|
||||
Категории каналов указываются в файле `channels.json` в следующем формате:
|
||||
|
||||
```json
|
||||
[
|
||||
{
|
||||
"tvg-id": "регулярное выражение для значения атрибута tvg-id",
|
||||
"tvg-name": "регулярное выражение для значения атрибута tvg-name",
|
||||
"title": "регулярное выражение для названия канала",
|
||||
"tags": [
|
||||
"список",
|
||||
"тегов",
|
||||
"(см. ниже)"
|
||||
]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Приоритет параметров:
|
||||
|
||||
* `tvg-id`
|
||||
* `tvg-name`
|
||||
* `title`
|
||||
|
||||
Если указаны все или несколько, то применится только тот один, который по приоритету выше.
|
||||
|
||||
Параметр `tags` обязателен, список может быть (не)пустым.
|
||||
Категории в списке указываются в двойных кавычках.
|
||||
После каждой категории, кроме последней, ставится запятая.
|
||||
|
||||
Регулярные выражения должны быть PCRE-совместимыми.
|
||||
|
||||
Каналы сопоставляются в нижнем регистре.
|
||||
|
||||
## Рекомендации и предостережения { id="warnings" }
|
||||
|
||||
1. Если хочешь написать новое правило, будь осторожен с регулярками.
|
||||
Старайся не охватывать несколько каналов сразу.
|
||||
Если канал попадёт в несколько регулярок, то его **теги могут оказаться неожиданными** и найти проблему может быть сложно.
|
||||
2. Указывай внутри `{}` только `tags` и один из параметров `tvg-id`, `tvg-name` или `title`.
|
||||
Множество параметров на точность не влияет, зато будет проще уместить всё правило в одну строку и grep-ать файл.
|
||||
3. Не забывай, что название на кириллице не всегда означает, что это российский канал или вещание на русском языке.
|
||||
4. Разные каналы могут быть названы одинаково или похоже.
|
||||
Например, `Первый канал`, `Первый Тульский`, `Первый городской`.
|
||||
5. Один канал может быть назван по-разному.
|
||||
Например, `Ю` или `Ю!`, `Россия 1 +5` или `Россия-1`.
|
||||
6. Важно учитывать холдинги.
|
||||
Например, российские Матч, ТНТ и НТВ имеют множество разных каналов, и тупо искать `^нтв$` — тупо.
|
||||
7. У всех каналов есть `title`.
|
||||
Не все каналы имеют `tvg-id`.
|
||||
Некоторые каналы имеют `tvg-name`.
|
||||
Все три параметра могут оказаться на кириллице.
|
||||
|
||||
## Доступные теги { id="доступные-теги" }
|
||||
|
||||
| Ключевое слово | Описание |
|
||||
| -------------- | ----------------------------------------------------------- |
|
||||
| `untagged` | Неизвестно (ставится по умолчанию, если нет иных) |
|
||||
| `unstable` | Нестабильные каналы |
|
||||
| `hd` | Каналы в высоком качестве |
|
||||
| `4k` | Каналы в супервысоком качестве |
|
||||
| `8k` | Каналы в гигавысоком качестве (а вдруг?) |
|
||||
| `adult` | Контент для взрослых 18+ |
|
||||
| `army` | Каналы военные, об оружии, технике, армии, боевых действиях |
|
||||
| `central` | Центральное ТВ (гос. каналы, федеральные) |
|
||||
| `child` | Детские и подростковые каналы |
|
||||
| `culture` | Каналы о культуре, театре |
|
||||
| `crime` | Каналы с детективами и о преступлениях (true-crime) |
|
||||
| `cyber` | Киберспортивные |
|
||||
| `docs` | Каналы с документальными фильмами |
|
||||
| `fashion` | Мода и стиль |
|
||||
| `film` | Каналы с фильмами |
|
||||
| `finance` | Бизнес, финансы, капитал |
|
||||
| `food` | Кулинарные каналы |
|
||||
| `fun` | Развлекательные каналы и шоу |
|
||||
| `garden` | Сад, огород, фермерство, домашнее хозяйство |
|
||||
| `health` | Каналы о здоровье |
|
||||
| `history` | Исторические каналы |
|
||||
| `house` | О строительстве, ремонте, интерьере и жилье |
|
||||
| `humor` | Юмористические каналы, комедии |
|
||||
| `hunt-fish` | Охота и рыбалка |
|
||||
| `local` | Местные региональные каналы |
|
||||
| `music` | Музыкальные |
|
||||
| `mystic` | Каналы о мистике, потустороннем, НЛО и прочей пиздаболии |
|
||||
| `nature` | Каналы о природе, животных |
|
||||
| `news` | Новостные каналы |
|
||||
| `politic` | Каналы политические, партийные, правительстенные |
|
||||
| `radio` | Радиоканалы (радиостанции, подкасты, аудиоспектакли...) |
|
||||
| `religion` | Религиозные каналы |
|
||||
| `retro` | Ностальгия и ретро, музыка, старые передачи |
|
||||
| `sci` | Научные и познавательные |
|
||||
| `series` | Каналы с сериалами |
|
||||
| `shopping` | Телемагазины |
|
||||
| `sport` | Спортивные |
|
||||
| `tech` | Каналы о технологиях |
|
||||
| `transport` | Каналы о транспорте (авто, мото, ЖД...) |
|
||||
| `travel` | Каналы о путешествиях |
|
||||
| `webcam` | Уличные веб-камеры |
|
||||
|
||||
Также в категориях можно указывать страну вещания.
|
||||
Это должен быть буквенный код АЛЬФА-2 из общероссийского классификатора стран мира (ОКСМ):
|
||||
|
||||
* [normativ.kontur.ru](https://normativ.kontur.ru/document?moduleId=1&documentId=22668#h1296)
|
||||
* [classifikators.ru](https://classifikators.ru/oksm)
|
||||
@@ -0,0 +1,135 @@
|
||||
---
|
||||
title: "*.m3u (*.m3u8)"
|
||||
icon: material/playlist-play
|
||||
tags: ["плейлисты", "каналы"]
|
||||
---
|
||||
|
||||
# :material-playlist-play: Формат файлов `*.m3u` (`*.m3u8`)
|
||||
|
||||
Формат применяется для составления мультимедиа плейлистов, как оффлайн, так и онлайн.
|
||||
|
||||
Разница между m3u и m3u8 уже давно отсутствует, но исторически так сложилось, то m3u8 должен был быть только в формате UTF-8.
|
||||
|
||||
Директивы начинаются с новой строки и символа `#`.
|
||||
У каждой директивы могут (не) быть атрибуты, которые следуют в одну строку.
|
||||
|
||||
После директив с новой строки указывается ссылка на канал (или путь к файлу).
|
||||
|
||||
В свою чередь, по этой ссылке может быть:
|
||||
|
||||
* либо текстовое представление контента в формате m3u/m3u8/XMLTV/MPD с описанием непосредственно участки трансляции;
|
||||
* либо непосредственно сама потоковая трансляция mp4 или т. п.
|
||||
|
||||
Рассмотрим на выдуманном примере плейлиста IPTV:
|
||||
|
||||
```m3u
|
||||
#EXTM3U url-tvg="https://iptvx.one/EPG" catchup="append" catchup-days="3" catchup-source="?offset=-${offset}&utcstart=${timestamp}"
|
||||
|
||||
#EXTINF:-1 tvg-id="ntv" tvg-logo="http://epg.it999.ru/img2/2001.png",НТВ HD
|
||||
#EXTGRP:🇷🇺 Эфирные
|
||||
http://example.com/play-ntv.m3u
|
||||
|
||||
#EXTINF:-1 tvg-logo="http://tvoetv.space/tvoetv.png" tvg-id="tvoetv",Твоё ТВ HD v8 с VPN
|
||||
http://example.com/play-tvoetv.m3u
|
||||
|
||||
#EXTINF:0 tvg-name="BBC" audio-track="eng" tvg-logo="http://mylogos.domain/BBC.png", BBC World
|
||||
http://example.com/play-bbc.m3u
|
||||
|
||||
#EXTINF:-1 tvg-id="5TV.am" tvg-country="AM" tvg-language="Armenian" tvg-logo="https://i.imgur.com/yigw9dr.png" user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148" group-title="General",5-րդ ալիք (480p)
|
||||
#EXTVLCOPT:http-user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 12_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
|
||||
#EXTVLCOPT:http-caching=1200
|
||||
http://example.com/play-am.m3u8
|
||||
```
|
||||
|
||||
### Директива `#EXTM3U` { id="EXTM3U" }
|
||||
|
||||
Заголовок файла (обязателен).
|
||||
|
||||
#### Атрибут `url-tvg` (он же `x-tvg-url`) { id="url-tvg" }
|
||||
|
||||
Ссылка программу передач в формате `*.xml` или `*.xml.gz`.
|
||||
|
||||
#### Атрибуты `catchup*` { id="catchup" }
|
||||
|
||||
Читай здесь: [Архив телепрограмм (SS IPTV)](https://ss-iptv.com/ru/operators/catchup)
|
||||
|
||||
### Директива `#EXTGRP` { id="EXTGRP" }
|
||||
|
||||
Название группы, к которой относится контент (звуковая дорожка или канал).
|
||||
|
||||
Указывается в формате `#EXTGRP:XXX`, где: `XXX` — название группы.
|
||||
|
||||
### Директива `#EXTINF` { id="EXTINF" }
|
||||
|
||||
Описывает контент (звуковую дорожку или канал).
|
||||
|
||||
Указывается в формате `#EXTINF:XXX YYY,ZZZ`, где:
|
||||
* `XXX` — длительность в секундах (обязательно, но может быть `-1` или `0`);
|
||||
* `YYY` — атрибуты (см. ниже);
|
||||
* `ZZZ` — название контента;
|
||||
|
||||
#### Атрибут `tvg-shift` { id="tvg-shift" }
|
||||
|
||||
Cмещение телепрограммы в часах относительно указанного в программе.
|
||||
|
||||
#### Атрибуты `tvg-id` и `tvg-name` { id="tvg-id" }
|
||||
<a id="tvg-name"></a>
|
||||
|
||||
Идентификатор телепрограммы канала.
|
||||
По нему телепрограмма привязывается к трансляции с учётом смещения времени.
|
||||
|
||||
#### Атрибут `tvg-logo` { id="tvg-logo" }
|
||||
|
||||
Ссылка на логотип канала.
|
||||
|
||||
#### Атрибут `tvg-country` { id="tvg-country" }
|
||||
|
||||
Код Alpha-2 страны вещания согласно ISO 3166-1 или ОКСМ.
|
||||
|
||||
#### Атрибут `tvg-language` { id="tvg-language" }
|
||||
|
||||
Название языка телепередачи согласно ISO 639-2.
|
||||
|
||||
#### Атрибут `group-title` { id="group-title" }
|
||||
|
||||
Название группы.
|
||||
По функционалу идентичен директиве `#EXTGRP`.
|
||||
|
||||
#### Атрибут `user-agent` { id="user-agent" }
|
||||
|
||||
Значение заголовка `User-Agent` для обращения к контенту по http.
|
||||
|
||||
#### Атрибут `audio-track` { id="audio-track" }
|
||||
|
||||
Языковой код (ISO 639-2) аудио дорожки канала, например: "eng,rus".
|
||||
|
||||
Допускается указание нескольких аудио дорожек через запятую: "rus,ukr,eng".
|
||||
|
||||
Дорожкой по умолчанию устанавливается первая указанная в списке.
|
||||
|
||||
#### Атрибут `aspect-ratio` { id="aspect-ratio" }
|
||||
|
||||
Определяет пропорции экрана (может быть недоступно для некоторых моделей телевизоров).
|
||||
|
||||
Допустимые значения: 16:9, 3:2, 4:3, 1,85:1, 2,39:1 (наиболее распространенное значение для фильмов)
|
||||
|
||||
### Директива `#EXTVLCOPT` { id="EXTVLCOPT" }
|
||||
|
||||
Специфична для VLC Player.
|
||||
Директив может быть множество для одной дорожки (канала).
|
||||
|
||||
Указывается в формате `#EXTVLCOPT:XXX` или `#EXTVLCOPT--XXX=YYY`, где:
|
||||
* `XXX` — параметр командной строки VLC Player ([полный список](https://wiki.videolan.org/VLC_command-line_help/));
|
||||
* `YYY` — значения параметра.
|
||||
|
||||
## Дополнительные материалы
|
||||
|
||||
* [Инструкция по формату M3U (SS IPTV)](https://ss-iptv.com/ru/users/documents/m3u)
|
||||
* [Архив телепрограмм (SS IPTV)](https://ss-iptv.com/ru/operators/catchup)
|
||||
* [VLC command-line help](https://wiki.videolan.org/VLC_command-line_help/)
|
||||
* [ISO 639-2 Codes for the Representation of Names of Languages](https://www.loc.gov/standards/iso639-2/php/code_list.php)
|
||||
* [ISO 3166-1 Wikipedia](https://en.wikipedia.org/wiki/ISO_3166-1)
|
||||
* ОКСМ:
|
||||
* [normativ.kontur.ru](https://normativ.kontur.ru/document?moduleId=1&documentId=22668#h1296)
|
||||
* [classifikators.ru](https://classifikators.ru/oksm)
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
icon: material/file-code-outline
|
||||
hide: [toc]
|
||||
---
|
||||
|
||||
# :material-file-code-outline: Форматы файлов
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
- [:material-code-brackets: Формат файла `playlists.ini`](playlists.md)
|
||||
|
||||
---
|
||||
Список плейлистов, которые отображаются на сайте и периодически проверяются
|
||||
|
||||
- [:material-code-json: Формат файла `channels.json`](channels.md)
|
||||
|
||||
---
|
||||
Список правил для применения тегов к разным каналам
|
||||
|
||||
- [:material-playlist-play: Формат файлов `*.m3u` (`*.m3u8`)](m3u.md)
|
||||
|
||||
---
|
||||
Плейлист — это вообще что?
|
||||
</div>
|
||||
@@ -0,0 +1,60 @@
|
||||
---
|
||||
title: playlists.ini
|
||||
icon: material/code-brackets
|
||||
tags: ["плейлисты"]
|
||||
---
|
||||
|
||||
# :material-code-brackets: Формат файла `playlists.ini`
|
||||
|
||||
Рассмотрим на примере:
|
||||
|
||||
```ini
|
||||
[code]
|
||||
name = Рабочий автообновляемый IPTV плейлист M3U
|
||||
desc = "В этом IPTV плейлисте есть каналы в высоком качестве"
|
||||
pls = 'https://example.com/pls.m3u'
|
||||
src = 'https://example.com/super-duper-playlist'
|
||||
# комментарий 1
|
||||
; ещё один комментарий
|
||||
```
|
||||
|
||||
Перенос строк невозможен.
|
||||
Комментарии игнорируются.
|
||||
|
||||
Для значений можно (не) использовать 'одинарные' или "двойные" кавычки.
|
||||
Ради единообразия рекомендуется использовать 'одинарные'.
|
||||
|
||||
## `code` { id="code" }
|
||||
|
||||
Код плейлиста в рамках этого конфига (**обязательно**).
|
||||
|
||||
Должен быть коротким и уникальным.
|
||||
|
||||
Подставляется в короткую ссылку, по которой произойдёт переадресация на прямой адрес `pls`.
|
||||
|
||||
!!! note
|
||||
Для удобства ввода с пульта, код рекомендуется задавать числом или короткой строкой без пробелов и др. спецсимволов.
|
||||
Чем короче, тем лучше.
|
||||
|
||||
## `name` { id="name" }
|
||||
|
||||
Название плейлиста (необязательно).
|
||||
|
||||
По умолчанию: `Playlist #<code>`.
|
||||
|
||||
## `desc` { id="desc" }
|
||||
|
||||
Краткое описание из источника или от себя (необязательно).
|
||||
|
||||
По умолчанию: пусто.
|
||||
|
||||
## `pls` { id="pls" }
|
||||
|
||||
Прямая ссылка на m3u/m3u8 плейлист (**обязательно**).
|
||||
|
||||
## `src` { id="src" }
|
||||
|
||||
Ссылка на источник (страницу сайта), откуда был взят плейлист (необязательно).
|
||||
|
||||
По умолчанию: пусто.
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
icon: material/file-document
|
||||
hide: [toc]
|
||||
---
|
||||
|
||||
# Общая информация
|
||||
|
||||
<div class="grid cards" markdown>
|
||||
- [:material-cogs: Как работает сервис](../aggregator/overview.md)
|
||||
- [:material-file-eye-outline: Как отбираются плейлисты](../aggregator/selection.md)
|
||||
- [:material-file-refresh-outline: Проверки и статусы](../aggregator/checks.md)
|
||||
- [:fontawesome-solid-list-check: Список плейлистов](../iptvc/site/list.md)
|
||||
- [:material-table-eye: Страница плейлиста](../iptvc/site/details.md)
|
||||
- [:material-television-play: Как подключить плейлист](../iptvc/site/connect.md)
|
||||
- [:material-multimedia: IPTV плееры](players.md)
|
||||
</div>
|
||||
@@ -0,0 +1,294 @@
|
||||
---
|
||||
icon: material/multimedia
|
||||
tags: ["плееры"]
|
||||
---
|
||||
|
||||
# :material-multimedia: IPTV плееры
|
||||
|
||||
Здесь указаны **не все** плееры, существующие на этой планете, и такой цели нет.
|
||||
|
||||
В списке ниже только те плееры, которые широко известны и популярны у зрителей IPTV, а также рекомендуются специализированными сайтами.
|
||||
|
||||
Некоторые из них помечены значком :thumbsup: — значит, он уже зарекомендовал себя как стабильный и удобный, с ним меньше всего хлопот.
|
||||
|
||||
Список для удобства разбит по платформам и ОС.
|
||||
Обращайся к содержанию справа для быстрой навигации.
|
||||
|
||||
!!! info "Здесь не хватает очень много подробностей"
|
||||
Если ты имел дело с каким-то плеером, знаешь как его настроить или какие-то другие детали, я прошу тебя помочь [актуализировать эту страницу](support.md#participate), чтобы через это помочь другим пользователям с выбором и настройкой плеера под свои цели.
|
||||
|
||||
## Кроссплатформенные
|
||||
|
||||
!!! info
|
||||
Эти плееры разрабатываются для множества платформ одновременно и/или существуют в виде веб-приложения.
|
||||
Их можно устанавливать и открывать почти на любом подходящем устройстве.
|
||||
|
||||
!!! warning "Веб-приложения могут не работать со сторонними плейлистами из-за ошибок CORS"
|
||||
Исправить эту ошибку может выдача разрешения на загрузку небезопасного контента в настройках сайта в браузере, но гарантий нет.
|
||||
|
||||
### :thumbsup: VLC Media Player
|
||||
|
||||
* Скачать: <https://www.videolan.org/vlc/>
|
||||
|
||||
Универсальный плеер практически для любого мультимедиа-контента.
|
||||
|
||||
??? image "Главное окно"
|
||||

|
||||
|
||||
??? image "Добавление плейлиста на десктопе"
|
||||
!!! warning "Указание протокола `https://` обязательно!"
|
||||

|
||||

|
||||
|
||||
??? image "Добавление плейлиста на андроиде"
|
||||
!!! warning "Указание протокола `https://` обязательно!"
|
||||

|
||||

|
||||
|
||||
### :thumbsup: IPTVnator
|
||||
|
||||
* Веб-версия: <https://iptvnator.vercel.app>
|
||||
* Скачать: <https://github.com/4gray/iptvnator/releases/latest>
|
||||
|
||||
Простой рабочий плеер, который можно открыть в браузере.
|
||||
|
||||
Поддерживает подгрузку множества плейлистов по ссылкам, субтитры, группировку каналов, избранное.
|
||||
Имеет тёмную и светлую темы.
|
||||
|
||||
Если использовать веб-версию, то настройки сохраняются в браузере.
|
||||
|
||||
??? image "Главное окно"
|
||||

|
||||
|
||||
??? image "Добавление плейлиста"
|
||||
!!! warning "Указание протокола `https://` обязательно!"
|
||||

|
||||

|
||||
|
||||
### IPTV Web Player
|
||||
|
||||
* Веб-версия: <http://iptv.apiweb.uz>
|
||||
|
||||
Простой и удобный веб-плеер.
|
||||
Загрузка плейлиста по ссылкам или из файла, но только одного.
|
||||
|
||||
Подгрузка и отображение телепрограммы (используется https://cdn.epg.one/epg2.xml).
|
||||
|
||||
??? image "Главное окно"
|
||||

|
||||
|
||||
??? image "Добавление плейлиста"
|
||||
!!! success "Указание протокола `https://` необязательно!"
|
||||

|
||||
|
||||
### Kodi
|
||||
|
||||
* Скачать: <https://kodi.tv>
|
||||
* [Простая настройка IPTV на Kodi за 5 минут](https://prodigtv.ru/iptv/software/nastrojka-na-kodi)
|
||||
|
||||
Полноценный медиацентр.
|
||||
Ориентирован на большие экраны и ТВ с пультами.
|
||||
Имеет богатый функционал, который наращивается дополнениями, не выходя из приложения.
|
||||
|
||||
### KMPlayer
|
||||
|
||||
* Скачать: <https://www.kmplayer.com/home>
|
||||
|
||||
### OttPlayer
|
||||
|
||||
* Веб-версия: <http://widget.ottplayer.tv>
|
||||
* Скачать: <https://ottplayer.tv/soft>
|
||||
|
||||
!!! warning "Требует учётную запись сервиса ottplayer.tv"
|
||||
|
||||
### Ott-Play
|
||||
|
||||
* Веб-версия: <https://ottp.eu.org/f/pc/>
|
||||
* Скачать: <https://ottp.eu.org/www/install/>
|
||||
|
||||
!!! warning "Ошибка CORS"
|
||||
Она может не уйти даже если менять [плеер в настройках](https://ottp.eu.org/www/faq/#q4003).
|
||||
|
||||
---
|
||||
|
||||
!!! info "Ниже перечислено ПО, специфичное только для конкретных платформ"
|
||||
|
||||
## Десктопные
|
||||
|
||||
### Windows
|
||||
|
||||
#### :thumbsup: IP-TV Player
|
||||
|
||||
* Скачать: <https://borpas.info/iptvplayer>
|
||||
|
||||
---
|
||||
|
||||
### Linux
|
||||
|
||||
#### :thumbsup: yuki-iptv
|
||||
|
||||
* Скачать: <https://codeberg.org/liya/yuki-iptv/releases/latest>
|
||||
|
||||
Продолжение развития Astroncia IPTV.
|
||||
|
||||
Визуально очень похож на IP-TV Player для Windows.
|
||||
|
||||
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
|
||||
|
||||
??? image "Главное окно"
|
||||

|
||||
|
||||
??? image "Добавление плейлиста"
|
||||
!!! warning "Указание протокола `https://` обязательно!"
|
||||

|
||||
|
||||
---
|
||||
|
||||
## SmartTV
|
||||
|
||||
### :thumbsup: SS IPTV
|
||||
|
||||
* Сайт: <https://ss-iptv.com/ru/>
|
||||
* Веб-версия: <https://app.ss-iptv.com> (скорее всего, не заработает)
|
||||
* Редактор плейлистов: <https://ss-iptv.com/ru/users/playlist>
|
||||
* Установить: <https://ss-iptv.com/ru/users/documents/installing>
|
||||
|
||||
Плеер, который предустанавливается в ПО некоторых телевизоров и некоторых приставок.
|
||||
|
||||
### Forkplayer
|
||||
|
||||
---
|
||||
|
||||
## Мобильные
|
||||
|
||||
### Кроссплатформенные
|
||||
|
||||
#### GSE SMART IPTV
|
||||
|
||||
---
|
||||
|
||||
### Android
|
||||
|
||||
#### :thumbsup: Televizo
|
||||
|
||||
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.ottplay.ottplay)
|
||||
|
||||
??? image "Главный экран"
|
||||

|
||||

|
||||
|
||||
??? image "Добавление плейлиста"
|
||||
!!! warning "Указание протокола `https://` обязательно!"
|
||||

|
||||

|
||||
|
||||
Из настроек:
|
||||
|
||||

|
||||

|
||||
|
||||
И дальше те же шаги 3-5 на скриншотах выше.
|
||||
|
||||
??? quote "Установка User-Agent"
|
||||
На экране добавления/редактирования плейлиста снять галочку "User-Agent по умолчанию" и ввести необходимый.
|
||||
Например, для [Wink](../aggregator/faq.md#wink).
|
||||
|
||||
#### :thumbsup: M3U
|
||||
|
||||
* Скачать: <https://f-droid.org/ru/packages/com.m3u.androidApp>
|
||||
|
||||
Умеет показывать картинку-в-картинке, отображать группы и сортировать каналы.
|
||||
|
||||
Программу передач нужно [подключать отдельной ссылкой](../aggregator/faq.md#epg), из плейлиста не тянет.
|
||||
|
||||
??? image "Главный экран"
|
||||

|
||||
|
||||
??? image "Добавление плейлиста"
|
||||
!!! warning "Указание протокола `https://` обязательно!"
|
||||

|
||||

|
||||
|
||||
??? image "Установка User-Agent"
|
||||

|
||||

|
||||
|
||||
#### IPTV (Александр Софронов)
|
||||
|
||||
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=ru.iptvremote.android.iptv)
|
||||
|
||||
#### IPTV# (IPTV Sharp)
|
||||
|
||||
* Скачать: [play.google.com](https://play.google.com/store/apps/details?id=com.iptvsharp.app)
|
||||
|
||||
#### Lazy IPTV
|
||||
|
||||
#### Lazy IPTV Deluxe
|
||||
|
||||
#### Perfect Player
|
||||
|
||||
#### TiviMate
|
||||
|
||||
#### OTT Navigator
|
||||
|
||||
#### IPTV Player Live
|
||||
|
||||
---
|
||||
|
||||
### macOS, iOS, AppleTV
|
||||
|
||||
#### GoodPlayer
|
||||
|
||||
#### ProgTV
|
||||
|
||||
#### microiptv
|
||||
|
||||
#### Xtream IPTV
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/xtream-iptv-tv-player-ip-pro/id1583776992)
|
||||
|
||||
#### Nplayer
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/nplayer/id1116905928)
|
||||
|
||||
#### Nplayer Lite
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/nplayer-lite/id1078835991)
|
||||
|
||||
#### IPTV плеер
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/iptv/id1598794264)
|
||||
|
||||
#### Peers.TV
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/peers-tv/id540754699)
|
||||
|
||||
#### SPB TV Россия
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/spb-tv/id1056140537)
|
||||
|
||||
#### Русское TV
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%BE%D0%B5-%D1%82%D0%B2-hd-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D1%82%D0%B2/id594760614)
|
||||
|
||||
#### Tviz
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/%D1%82%D0%B5%D0%BB%D0%B5%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0-tviz-%D1%82%D0%B2-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD/id816291886)
|
||||
|
||||
#### Лайм HD TV
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/%D0%BB%D0%B0%D0%B9%D0%BC-hd-tv-%D1%82%D0%B2-%D0%BA%D0%B8%D0%BD%D0%BE-%D0%B8-%D1%81%D0%B5%D1%80%D0%B8%D0%B0%D0%BB%D1%8B/id998832333)
|
||||
|
||||
#### TV+
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/tv-%D0%BF%D0%BB%D1%8E%D1%81-hd-%D1%82%D0%B5%D0%BB%D0%B5%D0%B2%D0%B8%D0%B7%D0%BE%D1%80-%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD/id1141924092?l=en)
|
||||
|
||||
#### UniPlayer
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/uniplayer-iptv-ott-solution/id1208562731)
|
||||
|
||||
#### ProgTV
|
||||
|
||||
* Скачать: [apps.apple.com](https://apps.apple.com/ru/app/progtv/id1447796133)
|
||||
|
||||
---
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
icon: material/hand-heart-outline
|
||||
---
|
||||
|
||||
# :material-hand-heart-outline: Поддержка проекта
|
||||
|
||||
Проект держится только на сугубо техническом интересе одного разработчика в свободное от работы время.
|
||||
|
||||
Проект сознательно не монетизируется: это неправильно по отношению к пользователям и правообладателям.
|
||||
|
||||
Ниже перечислены минимально доступные вам способы — от самых простых к более сложным.
|
||||
|
||||
## :simple-telegram: Подписаться в Telegram
|
||||
|
||||
У проекта есть два публичных ресурса для прямой связи с пользователями.
|
||||
Там можно ставить **платные реакции** к постам и/или **дарить голоса** (бусты):
|
||||
|
||||
* канал: [@iptv_aggregator](https://t.me/iptv_aggregator) ([boost](https://t.me/iptv_aggregator?boost)) — в нём новости о проекте (общие объявления и проведённые доработки);
|
||||
* чат: [@iptv_aggregator_chat](../tg/chat.md) ([boost](https://t.me/iptv_aggregator_chat?boost)) — комментарии к каналу, общение по теме проекта и IPTV.
|
||||
|
||||
## :material-wallet: Внести пожертвование
|
||||
|
||||
Вы можете внести прямое денежное **пожертвование** с банковской карты на виртуальный кошелёк ЮMoney:
|
||||
|
||||
!!! yoomoney "[yoomoney.ru/to/41001685237530](https://yoomoney.ru/to/41001685237530)"
|
||||
Разовый платёж, без подписок, на любую сумму.
|
||||
|
||||
Также вы можете оформить подписку на Boosty:
|
||||
|
||||
!!! boosty "[boosty.to/anthonyaxenov](https://boosty.to/anthonyaxenov)"
|
||||
Разовый платёж или платная подписка.
|
||||
|
||||
Пожертвования добровольны.
|
||||
Они не дают права на эксклюзивный доступ к чему-либо и не рассматриваются как способ обогащения.
|
||||
Это лишь попытка компенсировать затраты на содержание проекта.
|
||||
|
||||
На пожертвования [был приобретён](https://t.me/iptv_aggregator/30) домен `m3u.su`, который сейчас используется в качестве основного адреса.
|
||||
|
||||
## :simple-git: Принять участие в разработке { id="participate" }
|
||||
|
||||
Весь исходный код проекта хранится в репозиториях организации: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
|
||||
|
||||
Чтобы принять участие в разработке, необходимо [зарегистрироваться на сайте git.axenov.dev](https://git.axenov.dev/user/sign_up) и **активировать** учётную запись по e-mail.
|
||||
|
||||
!!! info "Это бесплатно, но неактивированные учётки периодически удаляются."
|
||||
|
||||
### :octicons-issue-opened-16: Создать задачу
|
||||
|
||||
Любое ПО неидеально, как и документация к нему.
|
||||
|
||||
Если вы нашли ошибку, опечатку, неожиданное поведение ПО или есть предложение по улучшению — можете создать задачу в соответствующем репозитории организации.
|
||||
|
||||
### :octicons-git-pull-request-16: Прислать изменения
|
||||
|
||||
Вы можете внести исправления в код самостоятельно и прислать pull-request для принятия в основную ветку.
|
||||
|
||||
Это может быть новый функционал, исправления ошибок или опечаток.
|
||||
|
||||
Если есть идеи и желание для расширения функционала проекта, можем обсудить создание нового репозитория с выдачей необходимых прав.
|
||||