437 lines
24 KiB
Markdown
437 lines
24 KiB
Markdown
---
|
|
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-файла |
|