This commit is contained in:
2026-07-13 12:30:05 +08:00
parent 7d61aadc5d
commit 81075ad481
661 changed files with 5468 additions and 872 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

+436
View File
@@ -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-файла |
+116
View File
@@ -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
```
+38
View File
@@ -0,0 +1,38 @@
---
icon: material/book-open-page-variant-outline
---
# :material-book-open-page-variant-outline: Об этой документации
!!! warning "Актуальность документации может отставать от текущей версии сервиса, его исходных кодов и инфраструктуры"
Поддерживать содержимое в актуальном состоянии большой труд.
Прошу отнестись с пониманием, а лучше — [помочь делом](support.md#participate).
!!! danger "Тем не менее, прошу прочесть её!"
Потому что очень часто и мне, и в общий чат поступают одинаковые вопросы, на которые уже просто нет сил отвечать персонально.
Если у тебя возникает вопрос, на который уже есть ответ на одной из этих страниц, то ты рискуешь
* либо быть посланным сюда;
* либо быть посланным далеко не сюда;
* либо остаться в игноре.
## Навигация
К твоим услугам:
1. в заголовке сайта — глобальный поиск;
2. над заголовком страницы — метки страницы (полный список ниже);
3. слева — общее содержание;
4. справа — содержание конкретной страницы.
??? info end "На мобильниках содержание страницы спрятано за этой кнопкой в боковом меню:"
![Скриншот бокового меню с мобильной версии](_assets/mobile-toc-btn.jpg)
## Связанные статьи
Эти статьи пролинкованы между собой и сгруппированы про темам (меткам).
---
<!-- material/tags -->
+111
View File
@@ -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)
+135
View File
@@ -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)
+23
View File
@@ -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>
+60
View File
@@ -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" }
Ссылка на источник (страницу сайта), откуда был взят плейлист (необязательно).
По умолчанию: пусто.
+16
View File
@@ -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>
+294
View File
@@ -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/>
Универсальный плеер практически для любого мультимедиа-контента.
??? quote "[Скриншот] Главное окно"
![](_assets/players/vlc/main.jpg)
??? quote "[Скриншот] Добавление плейлиста на десктопе"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/vlc/add1.jpg)
![](_assets/players/vlc/add2.jpg)
??? quote "[Скриншот] Добавление плейлиста на андроиде"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/vlc/add1-mob.jpg)
![](_assets/players/vlc/add2-mob.jpg)
### :thumbsup: IPTVnator
* Веб-версия: <https://iptvnator.vercel.app>
* Скачать: <https://github.com/4gray/iptvnator/releases/latest>
Простой рабочий плеер, который можно открыть в браузере.
Поддерживает подгрузку множества плейлистов по ссылкам, субтитры, группировку каналов, избранное.
Имеет тёмную и светлую темы.
Если использовать веб-версию, то настройки сохраняются в браузере.
??? quote "[Скриншот] Главное окно"
![](_assets/players/iptvnator/main.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/iptvnator/add1.jpg)
![](_assets/players/iptvnator/add2.jpg)
### IPTV Web Player
* Веб-версия: <http://iptv.apiweb.uz>
Простой и удобный веб-плеер.
Загрузка плейлиста по ссылкам или из файла, но только одного.
Подгрузка и отображение телепрограммы (используется https://cdn.epg.one/epg2.xml).
??? quote "[Скриншот] Главное окно"
![](_assets/players/iptv-web-player/main.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! success "Указание протокола `https://` необязательно!"
![](_assets/players/iptv-web-player/add.jpg)
### 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.
Поддерживает плейлисты по ссылкам, сторонние телепрограммы, группировку каналов, изменение плейлистов и многое другое.
??? quote "[Скриншот] Главное окно"
![](_assets/players/yuki-iptv/main.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/yuki-iptv/add.jpg)
---
## 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)
??? quote "[Скриншот] Главный экран"
![](_assets/players/televizo/main1.jpg)
![](_assets/players/televizo/main2.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/televizo/add1.jpg)
![](_assets/players/televizo/add2.jpg)
Из настроек:
![](_assets/players/televizo/add21.jpg)
![](_assets/players/televizo/add22.jpg)
И дальше те же шаги 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), из плейлиста не тянет.
??? quote "[Скриншот] Главный экран"
![](_assets/players/m3u/main.jpg)
??? quote "[Скриншот] Добавление плейлиста"
!!! warning "Указание протокола `https://` обязательно!"
![](_assets/players/m3u/add1.jpg)
![](_assets/players/m3u/add2.jpg)
??? quote "[Скриншот] Установка User-Agent"
![](_assets/players/m3u/ua1.jpg)
![](_assets/players/m3u/ua2.jpg)
#### 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)
---
+59
View File
@@ -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 для принятия в основную ветку.
Это может быть новый функционал, исправления ошибок или опечаток.
Если есть идеи и желание для расширения функционала проекта, можем обсудить создание нового репозитория с выдачей необходимых прав.