This commit is contained in:
2026-08-03 12:53:34 +08:00
parent 89b303fed3
commit c91ff4c103
26 changed files with 396 additions and 362 deletions
+7
View File
@@ -23,3 +23,10 @@
- При изменениях структуры проекта и только при корректной сборке (без предупреждений и ошибок) всегда актуализируй `./AGENTS.md`
- При доработке или расширении функционала этого проекта или синтаксиса всегда актуализируй скилл `./.agents/skills/koda-zensical`
- Аргументы `iptvc` должны быть в lower-kebab-case с префиксом `--` (`--playlists-all-cooldown`)
- Параметры конфига `iptvc`, состоящие из нескольких слов, должны быть в camelCase (check.playlists.allCooldown)
- Переменные окружения `iptvc` должны быть в UPPER_SNAKE_CASE (`CHECK_PLAYLISTS_ALL_COOLDOWN`)
- Заголовки документации и шорткоды `<!-- md:... ... -->` должны содержать описываемые сущности как есть
- ID заголовоков должны быть в lower-kebab-case, точки и `_` заменяются на `-` (## `check.playlists.all-cooldown` { id=check-playlists-all-cooldown })
- Обязательно используй шорткоды `<!-- md:config ... -->` для ссылок на документацию параметров конфига
+10 -10
View File
@@ -46,8 +46,8 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## Откуда берутся логотипы каналов и программы передач?
Всё это (не) [указывается](../ref/formats/m3u.md#tvg-logo) внутри плейлиста его авторами.
Но в некоторых [плеерах](../ref/players.md) можно вручную указывать программу передач (см. ниже).
Всё это (не) [указывается](../reference/formats/m3u.md#tvg-logo) внутри плейлиста его авторами.
Но в некоторых [плеерах](../reference/players.md) можно вручную указывать программу передач (см. ниже).
## У канала нет логотипа!
@@ -55,7 +55,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## У **канала** нет программы передач (EPG), что делать?
Фига в том, что EPG может быть и [указан](../ref/formats/m3u.md#url-tvg) в плейлисте, но у конкретного канала могут быть указаны некорректные [`tvg-id`](../ref/formats/m3u.md#tvg-id) или [`tvg-name`](../ref/formats/m3u.md#tvg-name).
Фига в том, что EPG может быть и [указан](../reference/formats/m3u.md#url-tvg) в плейлисте, но у конкретного канала могут быть указаны некорректные [`tvg-id`](../reference/formats/m3u.md#tvg-id) или [`tvg-name`](../reference/formats/m3u.md#tvg-name).
Может, его дёрнули из другого листа и не подогнали под другую EPG.
Так что вариантов масса:
@@ -74,17 +74,17 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
* не все плееры вообще поддерживают работу с телепрограммой;
* в плейлисте она просто может не быть указана.
Но если [плеер](../ref/players.md) позволяет, можно указать ссылку на сторонную телепрограмму.
Но если [плеер](../reference/players.md) позволяет, можно указать ссылку на сторонную телепрограмму.
И это целое дело.
Надо чтобы совпадали [`tvg-id`](../ref/formats/m3u.md#tvg-id) или [`tvg-name`](../ref/formats/m3u.md#tvg-name) каналов с теми, которые указываются в EPG.
Надо чтобы совпадали [`tvg-id`](../reference/formats/m3u.md#tvg-id) или [`tvg-name`](../reference/formats/m3u.md#tvg-name) каналов с теми, которые указываются в EPG.
Так что не всякая телепрограмма подойдёт, не ко всякому плейлисту и не ко всем каналам.
Надо подбирать и то, и то.
## А где взять программу передач (EPG)? { id="epg" }
1. Из самого плейлиста.
Часто в атрибут [`url-tvg`](../ref/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`.
Часто в атрибут [`url-tvg`](../reference/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`.
Их можно использовать отдельно, например, если плеер не может корректно обработать такое значение.
2. Взять одну из этих ссылок:
@@ -133,7 +133,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Но вообще, это зависит от:
* автора плейлиста (дохлые каналы почти всегда есть даже в свежайших листах, но если лист не обновлялся год, что ты вряд-ли узнаешь, то рабочих каналов там не ищи);
* твоего [плеера](../ref/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером);
* твоего [плеера](../reference/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером);
* ширины твоего интернет-канала (не надо пытаться врубать FHD/4K трансляции с мобильного интернета на самом дешёвом тарифе в лесу);
* ретроградности Меркурия и магнитных бурь (а вдруг);
* настроек твоей сети, твоего интернет-провайдера, VPN (подумай хорошенько, хочешь ли ты смотреть российские каналы из РФ через Уганду или США);
@@ -190,7 +190,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Например, ты на своём компе:
* открываешь любой текстовый редактор;
* оформляешь текст в формате [m3u](../ref/formats/m3u.md);
* оформляешь текст в формате [m3u](../reference/formats/m3u.md);
* сохраняешь в файл `pls.m3u`.
Получился плейлист `pls.m3u`.
@@ -251,7 +251,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Нет, и не планируется.
Ищи [плеер](../ref/players.md) и добавляй плейлист туда по ссылке.
Ищи [плеер](../reference/players.md) и добавляй плейлист туда по ссылке.
## На канале отображается заглушка { id="заглушка" }
@@ -308,7 +308,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
**Решение 3:** если IP не российский, то сделать его российским (любыми способами).
**Решение 4:** использовать [плеер](../ref/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих:
**Решение 4:** использовать [плеер](../reference/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих:
```
Mozilla/5.0 WINK/1.28.2 (AndroidTV/9) HlsWinkPlayer
+1 -1
View File
@@ -12,5 +12,5 @@ hide: [toc]
- [: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 плееры](../ref/players.md)
- [:material-multimedia: IPTV плееры](../reference/players.md)
</div>
+2 -2
View File
@@ -50,7 +50,7 @@ hero:
Полное описание `config.yml`, переменных окружения и CLI-флагов
[Подробнее :octicons-arrow-right-24:](ref/config.md){ .md-button .md-button--primary }
[Подробнее :octicons-arrow-right-24:](reference/config.md){ .md-button .md-button--primary }
- :material-book-open-page-variant-outline:{ .lg .middle } **Об этой документации**
@@ -58,7 +58,7 @@ hero:
Подборка плееров для всех платформ — найдите и настройте плеер для себя
[Подробнее :octicons-arrow-right-24:](ref/players.md){ .md-button .md-button--primary }
[Подробнее :octicons-arrow-right-24:](reference/players.md){ .md-button .md-button--primary }
- :material-hand-heart:{ .lg .middle } **Поддержка проекта**
+25 -25
View File
@@ -13,7 +13,7 @@ tags: [iptvc]
## `-i`, `--ini` { id=ini }
Указывает путь к локальному [ini-файлу](../../ref/formats/playlists.md) с описанием плейлистов.
Указывает путь к локальному [ini-файлу](../../reference/formats/playlists.md) с описанием плейлистов.
Можно указать только однажды.
@@ -27,7 +27,7 @@ tags: [iptvc]
## `-t`, `--tags` { id=tags }
Указывает путь к локальному [json-файлу](../../ref/formats/channels.md) с описанием тегов каналов.
Указывает путь к локальному [json-файлу](../../reference/formats/channels.md) с описанием тегов каналов.
Можно указать только однажды.
@@ -64,7 +64,7 @@ tags: [iptvc]
## `-c`, `--code` { id=code }
Указывает код плейлиста из файла [playlists.ini](../../ref/formats/playlists.md).
Указывает код плейлиста из файла [playlists.ini](../../reference/formats/playlists.md).
Можно указать несколько разных.
@@ -104,11 +104,11 @@ tags: [iptvc]
## `--playlists-all-cooldown` { id=playlists-all-cooldown }
Указывает паузу между полными циклами проверки в секундах. Параметр переопределяет `check.playlists.all-cooldown` из конфигурации.
Указывает паузу между полными циклами проверки в секундах. Параметр переопределяет `check.playlists.allCooldown` из конфигурации.
Пауза применяется после завершения полного цикла и перед началом следующего. Внутри цикла этот параметр не используется: для задержки между плейлистами применяется [`check.playlists.one-cooldown`](#playlists-one-cooldown).
Пауза применяется после завершения полного цикла и перед началом следующего. Внутри цикла этот параметр не используется: для задержки между плейлистами применяется [`check.playlists.oneCooldown`](#playlists-one-cooldown).
Значение по умолчанию: значение `check.playlists.all-cooldown` из конфигурации, обычно `1800` (30 минут).
Значение по умолчанию: значение `check.playlists.allCooldown` из конфигурации, обычно `1800` (30 минут).
```shell title="Пример"
# проверить 5 раз с паузой 5 секунд между циклами
@@ -175,7 +175,7 @@ tags: [iptvc]
### `--log-level` { id=log-level }
Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`.
Устанавливает уровень логирования. Переопределяет `app.logLevel` из `config.yml`.
Доступные значения: `debug`, `info`, `warn`, `error`.
@@ -209,7 +209,7 @@ tags: [iptvc]
Задержка в секундах после проверки всех плейлистов.
Переопределяет `check.playlists.all-cooldown` (по умолчанию `1800`).
Переопределяет `check.playlists.allCooldown` (по умолчанию `1800`).
```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-all-cooldown 10
@@ -219,7 +219,7 @@ tags: [iptvc]
Задержка в секундах после проверки каждого плейлиста.
Переопределяет `check.playlists.one-cooldown` (по умолчанию `2`).
Переопределяет `check.playlists.oneCooldown` (по умолчанию `2`).
```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-one-cooldown 2
@@ -229,7 +229,7 @@ tags: [iptvc]
Максимум одновременно проверяемых плейлистов.
Переопределяет `check.playlists.max-routines` (по умолчанию `1`).
Переопределяет `check.playlists.maxRoutines` (по умолчанию `1`).
```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-max-routines 10
@@ -239,7 +239,7 @@ tags: [iptvc]
Количество плейлистов на одну процедуру проверки.
Переопределяет `check.playlists.per-routine` (по умолчанию `1`).
Переопределяет `check.playlists.perRoutine` (по умолчанию `1`).
```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-per-routine 3
@@ -249,7 +249,7 @@ tags: [iptvc]
User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.playlists.user-agent`.
Переопределяет `check.playlists.userAgent`.
```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-user-agent "Mozilla/5.0" "curl/8.0"
@@ -273,7 +273,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
Объём данных в байтах для загрузки от сервера при проверке канала.
Переопределяет `check.channels.byte-range` (по умолчанию `512`).
Переопределяет `check.channels.byteRange` (по умолчанию `512`).
```shell title="Пример"
./iptvc check -i ~/my.ini --channels-byte-range 1024
@@ -293,7 +293,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
Максимум одновременно проверяемых каналов.
Переопределяет `check.channels.max-routines` (по умолчанию `50`).
Переопределяет `check.channels.maxRoutines` (по умолчанию `50`).
```shell title="Пример"
./iptvc check -i ~/my.ini --channels-max-routines 100
@@ -303,7 +303,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
Количество каналов на одну процедуру проверки.
Переопределяет `check.channels.per-routine` (по умолчанию `10`).
Переопределяет `check.channels.perRoutine` (по умолчанию `10`).
```shell title="Пример"
./iptvc check -i ~/my.ini --channels-per-routine 20
@@ -313,7 +313,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.channels.user-agent`.
Переопределяет `check.channels.userAgent`.
```shell title="Пример"
./iptvc check -i ~/my.ini --channels-user-agent "Mozilla/5.0" "VLC/3.0"
@@ -325,9 +325,9 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-enabled` { id=cache-enabled }
Включает кеширование результатов в KeyDB/Redis.
Включает кеширование результатов.
Переопределяет `cache.enabled` (по умолчанию `false`).
Переопределяет `cache.enabled` (по умолчанию `true`).
```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled
@@ -335,9 +335,9 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-host` { id=cache-host }
Хост KeyDB/Redis.
Хост кеша.
Переопределяет `cache.host` (по умолчанию `localhost`).
Переопределяет `cache.host` (по умолчанию `cache`).
```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled --cache-host 192.168.1.10
@@ -345,7 +345,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-port` { id=cache-port }
Порт KeyDB/Redis.
Порт кеша.
Переопределяет `cache.port` (по умолчанию `6379`).
@@ -355,7 +355,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-username` { id=cache-username }
Логин для подключения к KeyDB/Redis.
Логин для подключения к кешу.
Переопределяет `cache.username`.
@@ -365,7 +365,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-password` { id=cache-password }
Пароль для подключения к KeyDB/Redis.
Пароль для подключения к кешу.
Переопределяет `cache.password`.
@@ -375,7 +375,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-db` { id=cache-db }
Номер базы данных KeyDB/Redis.
Номер базы данных кеша.
Переопределяет `cache.db` (по умолчанию `0`).
@@ -387,7 +387,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
TTL записей кеша в секундах.
Переопределяет `cache.ttl` (по умолчанию `30`).
Переопределяет `cache.ttl` (по умолчанию `3600`).
```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled --cache-ttl 3600
+1 -1
View File
@@ -18,6 +18,6 @@ hide: [toc]
| ----------------- | ------ | ---------------------------- | ----------------------------------------------------- |
| `--config` | string | — | Путь к файлу конфигурации (по умолчанию `config.yml`) |
| `--debug` | bool | `app.debug` | Включить режим отладки |
| `--log-level` | string | `app.log_level` | Уровень логирования: `debug`, `info`, `warn`, `error` |
| `--log-level` | string | `app.logLevel` | Уровень логирования: `debug`, `info`, `warn`, `error` |
| `-v`, `--verbose` | bool | — | Подробное логирование |
+36 -32
View File
@@ -53,7 +53,7 @@ iptvc serve --check
### `-i`, `--ini` { id="ini" }
Путь к локальному [ini-файлу](../../ref/formats/playlists.md) с описанием плейлистов.
Путь к локальному [ini-файлу](../../reference/formats/playlists.md) с описанием плейлистов.
Значение по умолчанию: `./playlists.ini`
@@ -63,7 +63,7 @@ iptvc serve --check -i ~/my.ini
### `-t`, `--tags` { id="tags" }
Путь к [json-файлу](../../ref/formats/channels.md) с описанием тегов каналов.
Путь к [json-файлу](../../reference/formats/channels.md) с описанием тегов каналов.
Значение по умолчанию: `./channels.json`
@@ -73,9 +73,9 @@ iptvc serve --check -t ~/tags.json
### `--playlists-all-cooldown` { id=playlists-all-cooldown }
Пауза между полными циклами фоновой проверки в секундах. Параметр переопределяет `check.playlists.all-cooldown` из конфигурации.
Пауза между полными циклами фоновой проверки в секундах. Параметр переопределяет `check.playlists.allCooldown` из конфигурации.
Значение по умолчанию: значение `check.playlists.all-cooldown` из конфигурации, обычно `1800` (30 минут).
Значение по умолчанию: значение `check.playlists.allCooldown` из конфигурации, обычно `1800` (30 минут).
```bash
# пауза 2 минуты между циклами
@@ -115,7 +115,9 @@ iptvc serve --config /etc/iptvc/config.yml
### `--debug` { id="debug" }
Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`.
Включает режим отладки.
Переопределяет <!-- md:config app.debug --> из `config.yml` и переменную `APP_DEBUG`.
```bash
iptvc serve --debug
@@ -123,7 +125,9 @@ iptvc serve --debug
### `--log-level` { id="log-level" }
Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`.
Устанавливает уровень логирования.
Переопределяет <!-- md:config app.logLevel --> из `config.yml`.
Доступные значения: `debug`, `info`, `warn`, `error`.
@@ -137,13 +141,13 @@ iptvc serve --log-level debug
## Флаги проверки плейлистов
Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`. Имеют смысл только при включённой фоновой проверке (`--check` или `check.start-on-serve: true`).
Эти флаги переопределяют параметры секции `check.playlists` из `config.yml`. Доступны для команд `check` и `serve`. Имеют смысл только при включённой фоновой проверке (`--check` или `check.startOnServe: true`).
### `--playlists-timeout` { id="playlists-timeout" }
Таймаут HTTP-запроса плейлиста в секундах.
Переопределяет `check.playlists.timeout` (по умолчанию `10`).
Переопределяет <!-- md:config check.playlists.timeout --> (по умолчанию `10`).
```bash
iptvc serve --check --playlists-timeout 5
@@ -153,7 +157,7 @@ iptvc serve --check --playlists-timeout 5
Задержка в секундах после проверки всех плейлистов.
Переопределяет `check.playlists.all-cooldown` (по умолчанию `1800`).
Переопределяет <!-- md:config check.playlists.allCooldown --> (по умолчанию `1800`).
```bash
iptvc serve --check --playlists-all-cooldown 10
@@ -163,7 +167,7 @@ iptvc serve --check --playlists-all-cooldown 10
Задержка в секундах после проверки каждого плейлиста.
Переопределяет `check.playlists.one-cooldown` (по умолчанию `2`).
Переопределяет <!-- md:config check.playlists.oneCooldown --> (по умолчанию `2`).
```bash
iptvc serve --check --playlists-one-cooldown 2
@@ -173,7 +177,7 @@ iptvc serve --check --playlists-one-cooldown 2
Максимум одновременно проверяемых плейлистов.
Переопределяет `check.playlists.max-routines` (по умолчанию `1`).
Переопределяет <!-- md:config check.playlists.maxRoutines --> (по умолчанию `1`).
```bash
iptvc serve --check --playlists-max-routines 10
@@ -183,7 +187,7 @@ iptvc serve --check --playlists-max-routines 10
Количество плейлистов на одну процедуру проверки.
Переопределяет `check.playlists.per-routine` (по умолчанию `1`).
Переопределяет <!-- md:config check.playlists.perRoutine --> (по умолчанию `1`).
```bash
iptvc serve --check --playlists-per-routine 3
@@ -193,7 +197,7 @@ iptvc serve --check --playlists-per-routine 3
User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.playlists.user-agent`.
Переопределяет <!-- md:config check.playlists.userAgent -->.
```bash
iptvc serve --check --playlists-user-agent "Mozilla/5.0" "curl/8.0"
@@ -207,7 +211,7 @@ iptvc serve --check --playlists-user-agent "Mozilla/5.0" "curl/8.0"
Таймаут HTTP-запроса канала в секундах.
Переопределяет `check.channels.timeout` (по умолчанию `10`).
Переопределяет <!-- md:config check.channels.timeout --> (по умолчанию `10`).
```bash
iptvc serve --check --channels-timeout 8
@@ -217,7 +221,7 @@ iptvc serve --check --channels-timeout 8
Объём данных в байтах для загрузки от сервера при проверке канала.
Переопределяет `check.channels.byte-range` (по умолчанию `512`).
Переопределяет <!-- md:config check.channels.byteRange --> (по умолчанию `512`).
```bash
iptvc serve --check --channels-byte-range 1024
@@ -227,7 +231,7 @@ iptvc serve --check --channels-byte-range 1024
Задержка в секундах после проверки каждого канала.
Переопределяет `check.channels.cooldown` (по умолчанию `0`).
Переопределяет <!-- md:config check.channels.cooldown --> (по умолчанию `0`).
```bash
iptvc serve --check --channels-cooldown 1
@@ -237,7 +241,7 @@ iptvc serve --check --channels-cooldown 1
Максимум одновременно проверяемых каналов.
Переопределяет `check.channels.max-routines` (по умолчанию `50`).
Переопределяет <!-- md:config check.channels.maxRoutines --> (по умолчанию `50`).
```bash
iptvc serve --check --channels-max-routines 100
@@ -247,7 +251,7 @@ iptvc serve --check --channels-max-routines 100
Количество каналов на одну процедуру проверки.
Переопределяет `check.channels.per-routine` (по умолчанию `10`).
Переопределяет <!-- md:config check.channels.perRoutine --> (по умолчанию `10`).
```bash
iptvc serve --check --channels-per-routine 20
@@ -257,7 +261,7 @@ iptvc serve --check --channels-per-routine 20
User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.channels.user-agent`.
Переопределяет <!-- md:config check.channels.userAgent -->.
```bash
iptvc serve --check --channels-user-agent "Mozilla/5.0" "VLC/3.0"
@@ -269,9 +273,9 @@ iptvc serve --check --channels-user-agent "Mozilla/5.0" "VLC/3.0"
### `--cache-enabled` { id="cache-enabled" }
Включает кеширование результатов в KeyDB/Redis.
Включает кеширование результатов redis-совместимым сервисом.
Переопределяет `cache.enabled` (по умолчанию `false`).
Переопределяет <!-- md:config cache.enabled --> (по умолчанию `true`).
```bash
iptvc serve --cache-enabled
@@ -279,9 +283,9 @@ iptvc serve --cache-enabled
### `--cache-host` { id="cache-host" }
Хост KeyDB/Redis.
Хост сервиса кеша.
Переопределяет `cache.host` (по умолчанию `localhost`).
Переопределяет <!-- md:config cache.host --> (по умолчанию `cache`).
```bash
iptvc serve --cache-enabled --cache-host 192.168.1.10
@@ -289,9 +293,9 @@ iptvc serve --cache-enabled --cache-host 192.168.1.10
### `--cache-port` { id="cache-port" }
Порт KeyDB/Redis.
Порт сервиса кеша.
Переопределяет `cache.port` (по умолчанию `6379`).
Переопределяет <!-- md:config cache.port --> (по умолчанию `6379`).
```bash
iptvc serve --cache-enabled --cache-port 6380
@@ -299,9 +303,9 @@ iptvc serve --cache-enabled --cache-port 6380
### `--cache-username` { id="cache-username" }
Логин для подключения к KeyDB/Redis.
Логин для подключения к сервису кеша.
Переопределяет `cache.username`.
Переопределяет <!-- md:config cache.username -->.
```bash
iptvc serve --cache-enabled --cache-username myuser
@@ -309,9 +313,9 @@ iptvc serve --cache-enabled --cache-username myuser
### `--cache-password` { id="cache-password" }
Пароль для подключения к KeyDB/Redis.
Пароль для подключения к сервису кеша.
Переопределяет `cache.password`.
Переопределяет <!-- md:config cache.password -->.
```bash
iptvc serve --cache-enabled --cache-password secret
@@ -319,9 +323,9 @@ iptvc serve --cache-enabled --cache-password secret
### `--cache-db` { id="cache-db" }
Номер базы данных KeyDB/Redis.
Номер базы данных кеша.
Переопределяет `cache.db` (по умолчанию `0`).
Переопределяет <!-- md:config cache.db --> (по умолчанию `0`).
```bash
iptvc serve --cache-enabled --cache-db 2
@@ -331,7 +335,7 @@ iptvc serve --cache-enabled --cache-db 2
TTL записей кеша в секундах.
Переопределяет `cache.ttl` (по умолчанию `30`).
Переопределяет <!-- md:config cache.ttl --> (по умолчанию `3600`).
```bash
iptvc serve --cache-enabled --cache-ttl 3600
+16 -16
View File
@@ -16,7 +16,7 @@ tags: ["iptvc", "разработка", "архитектура"]
- `github.com/spf13/cobra` — CLI-фреймворк;
- `gopkg.in/yaml.v3` — парсинг `config.yml`;
- `github.com/joho/godotenv` — загрузка `.env`;
- `github.com/redis/go-redis/v9` — клиент KeyDB/Redis.
- `github.com/redis/go-redis/v9` — клиент кеша.
## Структура проекта
@@ -46,7 +46,7 @@ iptvc/
│ ├── tagfile/
│ │ └── tagfile.go # чтение channels.json, назначение тегов
│ ├── cache/
│ │ └── cache.go # подключение к KeyDB/Redis
│ │ └── cache.go # подключение к кешу
│ ├── logger/
│ │ └── logger.go # настройка логирования
│ ├── utils/
@@ -76,9 +76,9 @@ iptvc/
### `app`
Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (Redis-клиент).
Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (кеш-клиент).
`Init()` загружает конфигурацию и инициализирует логгер.
`InitCache()` подключается к KeyDB/Redis, если кеш включён.
`InitCache()` подключается к кешу, если кеш включён.
### `app.config`
@@ -98,10 +98,10 @@ iptvc/
Содержит логику проверки:
- **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла.
- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `max-routines`), загрузка, парсинг, вызов `CheckChannels` для каждого.
- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `max-routines`), HTTP-запрос с `Range` header.
- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `maxRoutines`), загрузка, парсинг, вызов `CheckChannels` для каждого.
- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `maxRoutines`), HTTP-запрос с `Range` header.
- **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша.
- **`cachePlaylist(pls)`** — сохранение результата в Redis (если включён).
- **`cachePlaylist(pls)`** — сохранение результата в кеш (если включён).
Параметры проверки берутся из `app.Config.Check.Playlists` и `app.Config.Check.Channels`.
@@ -141,7 +141,7 @@ GET /{path...} — все остальные маршру
Catch-all `/{path...}` используется для избежания конфликтов паттернов в Go 1.22 mux.
In-memory кеш (`memCache`) обновляется через `OnPlaylistChecked` callback.
Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без Redis.
Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без внешнего кеша.
ini-файл кешируется на 30 секунд, кеш сбрасывается при каждом обновлении `memCache`.
@@ -155,16 +155,16 @@ StartBackgroundChecker:
runCheckerOnce()
→ checker.PrepareListsToCheck()
→ checker.CheckPlaylists()
→ for each playlist (parallel, per-routine):
→ for each playlist (parallel, perRoutine):
→ Download() / ReadFromFs()
→ Parse()
→ CheckChannels()
→ for each channel (parallel, per-routine):
→ for each channel (parallel, perRoutine):
→ HTTP GET with Range header
→ check status + content type
→ OnPlaylistChecked(pls) → memCache update
→ one-cooldown sleep
→ all-cooldown sleep
→ oneCooldown sleep
→ allCooldown sleep
if repeat > 0 && iteration >= repeat: stop
```
@@ -211,7 +211,7 @@ StartBackgroundChecker:
## Конфигурация
Подробное описание параметров — в разделе [config.yml](../../ref/config.md).
Подробное описание параметров — в разделе [config.yml](../../reference/config.md).
Приоритет: Defaults < `config.yml` < Env < CLI-флаги.
@@ -235,7 +235,7 @@ SVG-логотипы каналов передаются через `encodeURICo
Два уровня кеша:
1. **Redis/KeyDB** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`.
2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует Redis.
1. **Внешний кеш** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`.
2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует внешнего кеша.
In-memory кеш приоритетнее Redis при отображении в веб-интерфейсе.
In-memory кеш приоритетнее внешнего кеша при отображении в веб-интерфейсе.
+4 -4
View File
@@ -53,13 +53,13 @@ make release
Для работы `iptvc` нужны два файла рядом с бинарником:
- `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../ref/formats/playlists.md).
- `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../ref/formats/channels.md).
- `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../ref/config.md).
- `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../reference/formats/playlists.md).
- `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../reference/formats/channels.md).
- `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../reference/config.md).
## Полное Docker-окружение
Полная инфраструктура проекта (nginx, KeyDB, checker, docs) развёртывается через Docker.
Полная инфраструктура проекта (nginx, кеш, checker, docs) развёртывается через Docker.
Подробнее — в разделе [Развёртывание](../site/deploy.md).
+1 -1
View File
@@ -49,7 +49,7 @@ hide: [toc]
[start]: quickstart.md "Перейти к разделу"
[site]: site/first-steps.md "Перейти к разделу"
[cli]: commands/index.md "Перейти к разделу"
[cfg]: ../ref/config.md "Перейти к разделу"
[cfg]: ../reference/config.md "Перейти к разделу"
<!--
## :material-cog-sync-outline: Как работает `iptvc`
+2 -2
View File
@@ -25,7 +25,7 @@ tags: ["iptvc"]
./iptvc check --file /home/user/pls.m3u
```
## Проверить плейлист по короткому коду из [`playlists.ini`](../ref/formats/playlists.md)
## Проверить плейлист по короткому коду из [`playlists.ini`](../reference/formats/playlists.md)
```
./iptvc check -c X
@@ -44,7 +44,7 @@ tags: ["iptvc"]
## Присвоить каналам тематические теги
Для этого рядом с `iptvc` должен лежать файл [channels.json](../ref/formats/channels.md).
Для этого рядом с `iptvc` должен лежать файл [channels.json](../reference/formats/channels.md).
Если файл лежит в другой директории, то можно указать её явно:
+3 -3
View File
@@ -53,7 +53,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
!!! info "Обрати внимание"
1. Пропорции рабочих и нерабочих каналов в плейлистах могут меняться от проверки к проверке.
Это нормально, таковы технические особенности проверки.
2. Работа архива и программы передач зависит от выбранного [плеера](../../ref/players.md).
2. Работа архива и программы передач зависит от выбранного [плеера](../../reference/players.md).
Некоторые это просто не поддерживают.
## Статусы каналов { id="channels" }
@@ -82,7 +82,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
Если при проверке плейлиста обнаружен хотя бы один канал для взрослых, то этот канал и весь плейлист помечается значком <span class="badge adult">18+</span>.
Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../../ref/formats/channels.md).
Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../../reference/formats/channels.md).
Они применяются к названиям каналов и их атрибутам (`tvg-id`, `tvg-name`), которые описывают канал в плейлисте.
Для каналов со взрослым контентом применяется тег `adult`.
@@ -90,7 +90,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
!!! warning "Обрати внимание"
Далеко не все каналы могут быть помечены таким тегом.
Хотя набор правил для тегов очень богат, но невозможно угадать все каналы с приемлемой точностью.
Почему — читай [здесь](../../ref/formats/channels.md#warnings).
Почему — читай [здесь](../../reference/formats/channels.md#warnings).
---
+2 -2
View File
@@ -5,10 +5,10 @@ tags: ["плееры", "плейлисты"]
# :material-television-play: Как подключить плейлист
1. Найти какой-нибудь [плеер](../../ref/players.md)
1. Найти какой-нибудь [плеер](../../reference/players.md)
2. Узнать как в него добавить плейлист по ссылке
3. Найти желаемый плелист из [списка](./list.md)
4. Найти на странице ["Ссылку для ТВ"](details.md#shortlink) и ввести (скопировать) её в поле ввода адреса в плеере
Для некоторых [плееров](../../ref/players.md) уже есть информация как добавить плейлист.
Для некоторых [плееров](../../reference/players.md) уже есть информация как добавить плейлист.
+133 -116
View File
@@ -1,11 +1,11 @@
---
icon: material/upload-network
tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
tags: ["iptvc", "docker", "deploy", "nginx", "apache", "caddy", "ssl"]
---
# :material-upload-network: Развёртывание сайта
В этом разделе описан фактический порядок настройки `iptvc`, хранилищем KeyDB и документацией.
В этом разделе описан фактический порядок настройки `iptvc`, кеша и документации.
## :material-flag-checkered: Базовый вариант развёртывания сервиса { id="local" }
@@ -31,7 +31,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
### Список плейлистов — `playlists.ini` { id="playlists" }
!!! info "Синтаксис описан в [этом разделе документации](../../ref/formats/playlists.md)"
!!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/playlists.md)"
Без этого файла нет смысла запускать веб-сервис.
@@ -41,7 +41,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
Вы должны увидеть список плейлистов на главной странице.
Но все они будут серого цвета и будет доступна только базовая информация о них.
Зато будут работать короткие ссылки и их уже можно будет казывать в своём любимом [плеере](../../ref/players.md).
Зато будут работать короткие ссылки и их уже можно будет казывать в своём любимом [плеере](../../reference/players.md).
Чтобы плейлисты позеленели, нужно запустить приложение в режиме активной проверки плейлистов:
@@ -55,7 +55,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
### Список правил — `channels.json` { id="channels" }
!!! info "Синтаксис описан в [этом разделе документации](../../ref/formats/channels.md)"
!!! info "Синтаксис описан в [этом разделе документации](../../reference/formats/channels.md)"
Без этого файла можно жить: веб-сервис будет работать, плейлисты и каналы будут проверяться, короткие ссылки в вашем распоряжении.
@@ -86,7 +86,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
### Конфигурация приложения — `config.yml`
!!! info "Синтаксис описан в [этом разделе документации](../../ref/config.md)"
!!! info "Синтаксис описан в [этом разделе документации](../../reference/config.md)"
Теперь можете приступить к конфигурации приложения.
@@ -102,7 +102,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
## :simple-docker: Развёртывание через Docker { id="docker" }
Установка docker осуществляется согласно официальной документации.
Установка docker осуществляется через [brew](https://formulae.brew.sh/formula/docker) или согласно [официальной документации](https://docs.docker.com/engine/).
??? tip "Для MacOS вместо Docker Desktop рекомендую [OrbStack](https://orbstack.dev)"
Он быстрый, лёгкий, бесплатный и не жрёт столько ресурсов, как официальное приложение.
@@ -110,94 +110,55 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
К сожалению, иначе на маке докер работать в фоне не может из-за политик безопасности.
Либо может, но это потребует кучу гемора на ровном месте.
Для этого нужно будет скачать ещё один файл из репозитория: [compose.yml](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/compose.yml)
Для работы `iptvc` нужно будет скачать ещё один файл из репозитория: [compose.yml](https://git.axenov.dev/IPTV/iptvc/raw/branch/master/compose.yml).
Это конфигурация связки контейнеров, и `iptvc` будет запускаться в одном из них.
Скачивайте и кладите в ту же директорию, где остальные файлы.
Для теста запустите команду:
---
---
---
## Подготовка репозитория { id="repository" }
Клонируйте основной репозиторий и перейдите в его каталог:
```bash
git clone https://git.axenov.dev/IPTV/.git
cd IPTV
```
В корне проекта должны находиться `compose.yml`, `.env`, `config.yml`, `playlists.ini`, `channels.json` и каталог `docker/keydb`.
Исходный код приложения располагается в `iptvc/`, а документации — в `docs/`.
## Настройка файлов { id="configuration" }
Создайте файлы локальной конфигурации на основе примеров:
```bash
cp .env.example .env
cp iptvc/config.yml.example config.yml
```
Отредактируйте `config.yml`.
В контейнере `iptvc` он подключается как `/app/config.yml`.
Минимально проверьте следующие параметры:
- `app.playlists` — путь к файлу плейлистов;
- `app.tags` — путь к файлу тегов каналов;
- `server.host` и `server.port` — адрес и порт веб-интерфейса;
- `cache.enabled` и параметры `cache` — использование KeyDB;
- `site.base-url` — внешний адрес приложения.
Скопируйте входные данные плейлистов в корень окружения:
```bash
cp /path/to/playlists.ini ./playlists.ini
cp /path/to/channels.json ./channels.json
```
Эти файлы монтируются в контейнер как `/app/playlists.ini` и `/app/channels.json`.
В `.env` задаются параметры приложения из `iptvc/.env.example`, включая `SITE_BASE_URL`, `SERVER_PORT`, `CACHE_ENABLED`, `CACHE_HOST`, `CACHE_PORT`, `CACHE_DB` и `CACHE_TTL`.
Для подключения к KeyDB из контейнера укажите имя сервиса `keydb` в `CACHE_HOST`, а не `localhost`.
## Состав окружения { id="services" }
Файл `compose.yml` запускает три сервиса:
| Сервис | Образ | Назначение |
| ------- | -------------------------------------- | ------------------------------------------- |
| `iptvc` | `git.axenov.dev/iptv/iptvc:latest` | Веб-интерфейс и фоновая проверка плейлистов |
| `keydb` | `eqalpha/keydb:latest` | Кеш результатов проверки |
| `docs` | `git.axenov.dev/iptv/iptv-docs:latest` | Сайт документации |
Сервис `iptvc` публикует порт `8800`, а `docs` — порт `8801`.
KeyDB публикует порт, заданный `KEYDB_PORT`, по умолчанию `6379`.
Сервис `iptvc` зависит от `keydb` и запускается с командой `serve --check --repeat 0`.
Это поднимает веб-сервер и запускает бесконечную фоновую проверку.
## Запуск { id="start" }
После подготовки файлов соберите и запустите окружение из корня проекта:
```bash
```shell
docker compose up -d --build
```
Она скачает образы, создаст контейнеры и запустит их.
В результате вы сможете открыть в браузере <http://localhost:8800/> и увидеть то же самое, что в прошлый раз.
Теперь подключим кэш.
### Кэширование результатов { id="cache" }
Для этого в compose используется [Valkey](https://valkey.io).
Это открытый форк Redis, продолжающий развитие за счёт сообщества и полностью поддерживающий его протокол.
Чтобы запустить связку `iptvc` + `valkey`, нужно выполнить два простых шага:
- создать директорию cache рядом с `iptvc`
- внести несколько правок в файл `config.yml` приложения как показано ниже:
```yaml title="config.yml" linenums="1" hl_lines="3 4"
cache:
enabled: true #(1)!
host: cache #(2)!
port: 6379
username:
password:
db: 0
ttl: 30
```
1. О параметре: [`cache.enabled`](../../reference/config.md#cache-enabled)
2. О параметре: [`cache.host`](../../reference/config.md#cache-host)
Остановите связку контейнеров и запустите вновь, чтобы применить обновлённую конфигурацию:
```shell
docker compose down; docker compose up -d --build
```
Проверьте состояние контейнеров и журналы:
```bash
```shell
docker compose ps
docker compose logs -f iptvc
```
@@ -208,7 +169,7 @@ docker compose logs -f iptvc
Для остановки окружения выполните:
```bash
```shell
docker compose down
```
@@ -216,22 +177,24 @@ docker compose down
Для публикации приложения на домене с HTTPS настроим реверс-прокси, который будет терминировать SSL и проксировать запросы на контейнеры `iptvc` (порт `8800`) и `docs` (порт `8801`).
Ниже рассмотрены два варианта: nginx и Apache2.
!!! tip "site.base-url"
!!! tip "site.baseUrl"
После настройки домена укажите внешний адрес в `config.yml` или `.env`:
```yaml
site:
base-url: https://example.com
baseUrl: https://example.com
```
Или через переменную окружения:
```bash
```shell
SITE_BASE_URL=https://example.com
```
О параметре: [`site.baseUrl`](../../reference/config.md#site-base-url)
Ниже рассмотрены три варианта: nginx, Apache2 и Caddy.
### Подготовка { id="reverse-proxy-prep" }
Убедитесь, что:
@@ -241,11 +204,11 @@ docker compose down
- Docker-окружение запущено (`docker compose up -d`);
- порты `8800` и `8801` доступны локально (проверьте `curl -I http://localhost:8800`).
### nginx { id="reverse-proxy-nginx" }
#### nginx { id="reverse-proxy-nginx" }
Установите nginx и Certbot:
```bash
```shell
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
```
@@ -286,7 +249,7 @@ server {
Включите конфигурации и проверьте синтаксис:
```bash
```shell
sudo ln -s /etc/nginx/sites-available/iptvc /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/iptv-docs /etc/nginx/sites-enabled/
sudo nginx -t
@@ -295,7 +258,7 @@ sudo systemctl reload nginx
Получите SSL-сертификат через Certbot:
```bash
```shell
sudo certbot --nginx -d example.com -d docs.example.com
```
@@ -303,22 +266,22 @@ Certbot автоматически изменит конфигурацию nginx
Проверьте автоматическое продление:
```bash
```shell
sudo certbot renew --dry-run
```
### Apache2 { id="reverse-proxy-apache" }
#### Apache2 { id="reverse-proxy-apache" }
Установите Apache2 и Certbot:
```bash
```shell
sudo apt update
sudo apt install -y apache2 certbot python3-certbot-apache
```
Включите необходимые модули:
```bash
```shell
sudo a2enmod proxy proxy_http ssl rewrite headers
sudo systemctl restart apache2
```
@@ -355,7 +318,7 @@ sudo systemctl restart apache2
Включите конфигурации и проверьте синтаксис:
```bash
```shell
sudo a2ensite iptvc iptv-docs
sudo apache2ctl configtest
sudo systemctl reload apache2
@@ -363,7 +326,7 @@ sudo systemctl reload apache2
Получите SSL-сертификат через Certbot:
```bash
```shell
sudo certbot --apache -d example.com -d docs.example.com
```
@@ -371,11 +334,65 @@ Certbot автоматически создаст HTTPS-виртуальные
Проверьте автоматическое продление:
```bash
```shell
sudo certbot renew --dry-run
```
### Проверка { id="reverse-proxy-check" }
#### Caddy { id="reverse-proxy-caddy" }
[Caddy](https://caddyserver.com) — современный веб-сервер с автоматическим управлением HTTPS-сертификатами через Let's Encrypt и ZeroSSL.
В отличие от nginx и Apache2, Caddy не требует Certbot: сертификаты запрашиваются и продлеваются автоматически при старте.
??? tip "Почему Caddy?"
Caddy единственный из рассмотренных серверов получает и продлевает TLS-сертификаты без внешних инструментов.
Достаточно указать доменное имя — и Caddy сам запросит сертификат, настроит редирект с HTTP на HTTPS и будет продлевать его до истечения.
Это сильно упрощает эксплуатацию: меньше движущихся частей, меньше шагов настройки, меньше поводов для ошибок.
Установите Caddy согласно [официальной документации](https://caddyserver.com/docs/install):
```shell
sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install -y caddy
```
Создайте или отредактируйте конфигурационный файл `Caddyfile`:
```caddyfile title="/etc/caddy/Caddyfile" linenums="1"
example.com {
reverse_proxy 127.0.0.1:8800
}
docs.example.com {
reverse_proxy 127.0.0.1:8801
}
```
Проверьте конфигурацию и перезапустите Caddy:
```shell
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
```
При первом запуске Caddy автоматически запросит SSL-сертификаты для указанных доменов, настроит редирект с HTTP на HTTPS и будет продлевать сертификаты до истечения срока действия.
Проверьте статус сервиса:
```shell
sudo systemctl status caddy
```
Если потребуется просмотреть журналы:
```shell
sudo journalctl -u caddy -f
```
#### Проверка { id="reverse-proxy-check" }
После настройки откройте в браузере:
@@ -392,7 +409,7 @@ sudo certbot renew --dry-run
Для сборки и публикации образа используйте цели Makefile в каталоге `iptvc/`:
```bash
```shell
cd iptvc
# Сборка одноархитектурного образа (linux/amd64 по умолчанию)
@@ -407,7 +424,7 @@ make image IMAGE_TAG=v1.2.3
Для публикации multi-arch манифеста (linux/amd64 + linux/arm64):
```bash
```shell
make image-all
```
@@ -415,7 +432,7 @@ make image-all
Перед публикацией войдите в registry, если это требуется вашей настройкой:
```bash
```shell
docker login git.axenov.dev
```
@@ -427,27 +444,27 @@ docker login git.axenov.dev
После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы:
```bash
```shell
docker compose up -d --build
```
Чтобы пересобрать только приложение `iptvc`:
```bash
```shell
docker compose build iptvc
docker compose up -d iptvc
```
Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис:
```bash
```shell
docker compose pull iptvc
docker compose up -d iptvc
```
Обновление документации выполняется пересборкой сервиса `docs`:
```bash
```shell
docker compose build docs
docker compose up -d docs
```
@@ -456,16 +473,16 @@ docker compose up -d docs
Для просмотра журналов отдельных сервисов используйте:
```bash
```shell
docker compose logs -f iptvc
docker compose logs -f keydb
docker compose logs -f cache
docker compose logs -f docs
```
Для проверки конфигурации Compose выполните:
```bash
```shell
docker compose config
```
Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `keydb`, а сервис `keydb` запущен.
Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `cache`, а сервис `cache` запущен.
+7 -7
View File
@@ -7,7 +7,7 @@ tags: ["сайт", "статусы", "каналы"]
Страница содержит подробности об одном конкретном плейлисте.
В её заголовке указано [название плейлиста](../../ref/formats/playlists.md#name).
В её заголовке указано [название плейлиста](../../reference/formats/playlists.md#name).
Ниже страница разделена на две части: слева две вкладки с информацией и список каналов справа.
@@ -19,16 +19,16 @@ tags: ["сайт", "статусы", "каналы"]
На этой вкладке выводится таблица со следующими строками:
* **Код** — короткий уникальный [код плейлиста](../../ref/formats/playlists.md#code);
* **Описание** — [описание плейлиста](../../ref/formats/playlists.md#desc) (при наличии);
* **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code);
* **Описание** — [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии);
* **Ccылка для ТВ** — короткая ссылка, которую можно использовать для [подключения плейлиста](connect.md), подробнее о ней см. ниже;
* **Источник** — [ссылка на ресурс](../../ref/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
* **Источник** — [ссылка на ресурс](../../reference/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
* **Наполнение**:
* группы — количество групп, на которые поделены каналы;
* каналы — количества каналов общее, онлайн и оффлайн;
(всё по нулям, если плейлист <span class="badge offline">offline</span>)
* **Возможности** — наличие программы передач и перемотки каналов;
* **M3U** — [прямая ссылка](../../ref/formats/playlists.md#pls) на плейлист;
* **M3U** — [прямая ссылка](../../reference/formats/playlists.md#pls) на плейлист;
* **Проверка плейлиста** — дата и время последней [проверки](checks.md) плейлиста с помощью [iptvc](../overview.md);
* **Ошибка проверки** — текст ошибки, которая возникла при проверке
(только если плейлист <span class="badge offline">offline</span>)
@@ -82,7 +82,7 @@ tags: ["сайт", "статусы", "каналы"]
Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**.
Справа — **кнопка сброса** для отображения всех каналов.
Под строкой поиска есть [**облако тегов**](../../ref/formats/channels.md#доступные-теги).
Под строкой поиска есть [**облако тегов**](../../reference/formats/channels.md#доступные-теги).
!!! question inline end "Про теги"
Откуда они там появляются, можешь прочесть [здесь](../../common/index.md) и [здесь](../overview.md).
@@ -128,7 +128,7 @@ m3u.su/ru
По идее, можешь использовать любую ссылку из подобных, т. к. технически они отработают одинаково.
А вот твой [плеер](../../ref/players.md) может не принять какую-то из них.
А вот твой [плеер](../../reference/players.md) может не принять какую-то из них.
Так что, если не подойдёт один формат, используй другой — добавь префикс или суффикс.
Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет — а ссылку ли мне вообще предоставил пользователь?
+54 -53
View File
@@ -36,7 +36,7 @@ tags: ["iptvc", "serve", "сайт"]
## Шаг 2. Добавляем плейлисты
Список плейлистов описывается в файле [`playlists.ini`](../../ref/formats/playlists.md).
Список плейлистов описывается в файле [`playlists.ini`](../../reference/formats/playlists.md).
Создадим его рядом с `iptvc`:
```ini title="playlists.ini"
@@ -66,7 +66,7 @@ pls = 'https://example.com/movies.m3u'
Чтобы статусы появились, нужно включить фоновую проверку.
!!! tip "Путь к ini-файлу"
Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../../ref/config.md) → `app.playlists`.
Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../../reference/config.md) → `app.playlists`.
---
@@ -92,11 +92,11 @@ pls = 'https://example.com/movies.m3u'
./iptvc serve --check --repeat 1
```
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../ref/config.md):
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../reference/config.md):
```yaml title="config.yml"
check:
start-on-serve: true
startOnServe: true
```
Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку.
@@ -106,14 +106,14 @@ check:
## Шаг 4. Настраиваем внешний вид сайта
Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале.
Всё это — в секции [`site`](../../ref/config.md) файла `config.yml`.
Всё это — в секции [`site`](../../reference/config.md) файла `config.yml`.
```yaml title="config.yml"
site:
base-url: http://localhost:8800
baseUrl: http://localhost:8800
repo-url: https://git.axenov.dev/IPTV
page-size: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
favicon: /favicon.ico # путь к иконке
pageSize: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
favicon: ./favicon.ico # путь к иконке
header:
title: Мой IPTV # заголовок в шапке и вкладке браузера
menu:
@@ -141,8 +141,8 @@ site:
--8<-- "icons.md"
!!! note "base-url"
Параметр `base-url` используется для формирования внутренних ссылок.
!!! note "baseUrl"
Параметр `baseUrl` используется для формирования внутренних ссылок.
Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`.
---
@@ -150,7 +150,7 @@ site:
## Шаг 5. Добавляем теги каналам
Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее.
Правила описываются в файле [`channels.json`](../../ref/formats/channels.md).
Правила описываются в файле [`channels.json`](../../reference/formats/channels.md).
```json title="channels.json"
[
@@ -169,30 +169,30 @@ site:
]
```
Путь к файлу указывается в [`config.yml`](../../ref/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
Путь к файлу указывается в [`config.yml`](../../reference/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
```bash
./iptvc serve --check -t /path/to/channels.json
```
Полный список доступных тегов — в [справочнике по channels.json](../../ref/formats/channels.md#доступные-теги).
Полный список доступных тегов — в [справочнике по channels.json](../../reference/formats/channels.md#доступные-теги).
---
## Шаг 6. Подключаем кеш (KeyDB/Redis)
## Шаг 6. Подключаем кеш Valkey
По умолчанию результаты проверки хранятся только в оперативной памяти.
Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки.
Кеш решает эту проблему: результаты сохраняются в KeyDB (или Redis) и переживают перезапуск.
Включается одной строкой в [`config.yml`](../../ref/config.md):
Кеш решает эту проблему: результаты сохраняются в кеше и переживают перезапуск.
Включается в [`config.yml`](../../reference/config.md):
```yaml title="config.yml"
cache:
enabled: true
host: localhost
host: cache
port: 6379
ttl: 1800 # секунды (по умолчанию 30)
ttl: 3600 # секунды (по умолчанию 3600)
```
Или через переменные окружения:
@@ -204,11 +204,12 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
Или через флаги:
```bash
./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 3600
./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 1800
```
!!! tip "KeyDB или Redis"
KeyDB — это форк Redis, полностью совместимый по протоколу.
!!! tip "Valkey, KeyDB или Redis"
Valkey — это открытый форк Redis, а KeyDB — ещё один форк.
Все они полностью совместимы по протоколу.
Подойдёт любой из них.
Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования.
@@ -217,18 +218,18 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
## Шаг 7. Тонкая настройка проверки
Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками.
Все параметры — в секции [`check`](../../ref/config.md) файла `config.yml`.
Все параметры — в секции [`check`](../../reference/config.md) файла `config.yml`.
### Параллелизм
```yaml title="config.yml"
check:
playlists:
max-routines: 10 # сколько плейлистов проверять одновременно
per-routine: 5 # сколько плейлистов в одной процедуре
maxRoutines: 10 # сколько плейлистов проверять одновременно
perRoutine: 5 # сколько плейлистов в одной процедуре
channels:
max-routines: 100 # сколько каналов проверять одновременно
per-routine: 20 # сколько каналов в одной процедуре
maxRoutines: 100 # сколько каналов проверять одновременно
perRoutine: 20 # сколько каналов в одной процедуре
```
Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть.
@@ -242,11 +243,11 @@ check:
timeout: 10 # секунд на загрузку плейлиста
channels:
timeout: 10 # секунд на проверку одного канала
byte-range: 512 # сколько байт скачать от сервера канала
byteRange: 512 # сколько байт скачать от сервера канала
```
Если плейлисты или каналы медленные, увеличьте `timeout`.
Если сервер блокирует большие запросы — уменьшите `byte-range`.
Если сервер блокирует большие запросы — уменьшите `byteRange`.
### Задержки (cooldown)
@@ -256,8 +257,8 @@ check:
```yaml title="config.yml"
check:
playlists:
all-cooldown: 5 # 5 секунд после всех плейлистов
one-cooldown: [1, 3] # 1–3 секунды после каждого плейлиста
allCooldown: 5 # 5 секунд после всех плейлистов
oneCooldown: [1, 3] # 1–3 секунды после каждого плейлиста
channels:
cooldown: 0 # 0 секунд после каждого канала
```
@@ -270,14 +271,14 @@ check:
```yaml title="config.yml"
check:
playlists:
user-agent:
userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
channels:
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
userAgent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
```
Все эти параметры можно также задавать через [переменные окружения](../../ref/config.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
Все эти параметры можно также задавать через [переменные окружения](../../reference/config.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
---
@@ -289,7 +290,7 @@ check:
app:
timezone: GMT+3
debug: false
log_level: info
logLevel: info
playlists: ./playlists.ini
tags: ./channels.json
@@ -298,10 +299,10 @@ server:
port: 8800
site:
base-url: https://my-iptv.ru
baseUrl: https://my-iptv.ru
repo-url: https://git.axenov.dev/IPTV
page-size: 20
favicon: /favicon.ico
pageSize: 20
favicon: ./favicon.ico
header:
title: Мой IPTV
menu:
@@ -330,27 +331,27 @@ site:
icon: person-outline
check:
start-on-serve: true
startOnServe: true
playlists:
user-agent:
userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10
all-cooldown: 5
one-cooldown: [1, 3]
max-routines: 10
per-routine: 5
allCooldown: 5
oneCooldown: [1, 3]
maxRoutines: 10
perRoutine: 5
channels:
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
userAgent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10
byte-range: 512
byteRange: 512
cooldown: 0
max-routines: 100
per-routine: 20
maxRoutines: 100
perRoutine: 20
cache:
enabled: true
host: localhost
host: cache
port: 6379
ttl: 3600
```
@@ -361,7 +362,7 @@ cache:
./iptvc serve
```
Поскольку `start-on-serve: true`, фоновая проверка запустится автоматически.
Поскольку `startOnServe: true`, фоновая проверка запустится автоматически.
Кеш включён, так что результаты переживут перезапуск.
Сайт доступен на `http://0.0.0.0:8800`.
@@ -385,11 +386,11 @@ services:
environment:
- CHECK_START_ON_SERVE=true
- CACHE_ENABLED=true
- CACHE_HOST=keydb
- CACHE_HOST=cache
- CACHE_PORT=6379
keydb:
image: eqalpha/keydb:latest
cache:
image: valkey/valkey:latest
restart: unless-stopped
```
@@ -414,4 +415,4 @@ docker compose up -d
| Пауза 2 минуты между циклами | `./iptvc serve --check --playlists-all-cooldown 120` |
| Подробные логи | `./iptvc serve --check --verbose` |
Полный список параметров — в [справочнике по `config.yml`](../../ref/config.md), [переменным окружения](../../ref/config.md) и [команде `serve`](../commands/serve.md).
Полный список параметров — в [справочнике по `config.yml`](../../reference/config.md), [переменным окружения](../../reference/config.md) и [команде `serve`](../commands/serve.md).
+2 -2
View File
@@ -5,9 +5,9 @@ tags: ["плейлисты", "каналы", "теги", "iptvc", "плееры"
# :material-cogs: Как работает сервис
1. В специальном файле [playlists.ini](../../ref/formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете.
1. В специальном файле [playlists.ini](../../reference/formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете.
Каждому плейлисту присваивается свой уникальный **короткий код**.
2. В специальном файле [channels.json](../../ref/formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы.
2. В специальном файле [channels.json](../../reference/formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы.
3. В фоновом режиме [работает ПО](../overview.md), которое периодически [проверяет все плейлисты](checks.md) из п. 1 и **присваивает теги** каналам из п. 2.
4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами.
5. Каждому плейлисту на сайте посвящена [своя страничка](details.md), где отображаются результаты его проверки, проверки его каналов (с присвоенными тегами) и пр.
+5 -5
View File
@@ -11,22 +11,22 @@ tags: ["сайт", "плейлисты"]
Наверху отображаются:
* дата последнего изменения файла [playlists.ini](../../ref/formats/playlists.md)
* дата последнего изменения файла [playlists.ini](../../reference/formats/playlists.md)
* общее количество плейлистов и с разделением по статусам.
Ниже — спиcок плейлистов.
## Из чего состоит список
* **Код** — короткий уникальный [код плейлиста](../../ref/formats/playlists.md#code)
* **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code)
* **Информация о плейлисте**
* [статус плейлиста](checks.md#playlists)
* может быть [значок 18+](checks.md#adult)
* [название плейлиста](../../ref/formats/playlists.md#name) — ссылка на [страницу плейлиста](details.md)
* [название плейлиста](../../reference/formats/playlists.md#name) — ссылка на [страницу плейлиста](details.md)
под ним:
* [иконки возможностей плейлиста](checks.md#extra) (только при статусе <span class="badge online">online</span>)
* [описание плейлиста](../../ref/formats/playlists.md#desc) (при наличии)
* [список тегов](../../ref/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
* [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии)
* [список тегов](../../reference/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
* ещё одна ссылка на [страницу плейлиста](details.md)
* **Каналов** — фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах)
* **Ссылка для ТВ** — [короткая ссылка](details.md#shortlink), которую можно использовать для [подключения плейлиста](connect.md).
@@ -26,7 +26,7 @@ tags: ["iptvc", "конфигурация"]
app:
timezone: GMT
debug: false
log_level: info
logLevel: info
playlists: ./playlists.ini
tags: ./channels.json
@@ -35,13 +35,13 @@ server:
port: 8800
site:
base-url: http://localhost:8800
baseUrl: http://localhost:8800
title: IPTV Checker
meta:
description: Самообновляемые бесплатные IPTV-плейлисты для домашнего просмотра
keywords: iptv,плейлисты,m3u
repo-url: https://git.axenov.dev/IPTV
page-size: 0
pageSize: 0
favicon:
header:
menu:
@@ -57,45 +57,45 @@ site:
raw:
visible: true
legal:
visible: true
visible: false
text: |
<p>Юридический текст с <a href="/terms">условиями использования</a>.</p>
check:
start-on-serve: false
startOnServe: false
playlists:
user-agent:
userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10 # секунды
all-cooldown: 1800 # секунды
one-cooldown: 2 # секунды
max-routines: 1
per-routine: 1
timeout: 10
allCooldown: 1800
oneCooldown: 2
maxRoutines: 1
perRoutine: 1
channels:
user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10 # секунды
byte-range: 512
cooldown: 0 # секунды
max-routines: 50
per-routine: 10
userAgent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10
byteRange: 512
cooldown: 0
maxRoutines: 50
perRoutine: 10
cache:
enabled: false
host: localhost
enabled: true
host: cache
port: 6379
username:
password:
db: 0
ttl: 30 # секунды
ttl: 3600
```
Каждый параметр ниже описан отдельной секцией с указанием значения по умолчанию, переменной окружения и соответствующего CLI-флага.
---
## Секция `app` { id=app }
## Секция `app` { id="app" }
### `app.timezone` { id=app-timezone }
### `app.timezone` { id="app-timezone" }
<!-- md:default GMT -->
<!-- md:env APP_TIMEZONE -->
@@ -104,7 +104,7 @@ cache:
---
### `app.debug` { id=app-debug }
### `app.debug` { id="app-debug" }
<!-- md:default false -->
<!-- md:env APP_DEBUG -->
@@ -115,7 +115,7 @@ cache:
---
### `app.log_level` { id=app-log-level }
### `app.logLevel` { id="app-log-level" }
<!-- md:default info -->
<!-- md:env APP_LOG_LEVEL -->
@@ -126,7 +126,7 @@ cache:
---
### `app.playlists` { id=app-playlists }
### `app.playlists` { id="app-playlists" }
<!-- md:default ./playlists.ini -->
<!-- md:env APP_PLAYLISTS -->
@@ -138,7 +138,7 @@ cache:
---
### `app.tags` { id=app-tags }
### `app.tags` { id="app-tags" }
<!-- md:default ./channels.json -->
<!-- md:env APP_TAGS -->
@@ -150,9 +150,9 @@ cache:
---
## Секция `server` { id=server }
## Секция `server` { id="server" }
### `server.host` { id=server-host }
### `server.host` { id="server-host" }
<!-- md:default -->
<!-- md:env SERVER_HOST -->
@@ -165,7 +165,7 @@ cache:
---
### `server.port` { id=server-port }
### `server.port` { id="server-port" }
<!-- md:default 8800 -->
<!-- md:env SERVER_PORT -->
@@ -177,11 +177,11 @@ cache:
---
## Секция `site` { id=site }
## Секция `site` { id="site" }
Настройки внешнего вида и ссылок сайта: заголовок, навигация, пагинация, иконка.
### `site.base-url` { id=site-base-url }
### `site.baseUrl` { id="site-base-url" }
<!-- md:default http://localhost:8800 -->
<!-- md:env SITE_BASE_URL -->
@@ -191,7 +191,7 @@ cache:
---
### `site.repo-url` { id=site-repo-url }
### `site.repo-url` { id="site-repo-url" }
<!-- md:default https://git.axenov.dev/IPTV -->
<!-- md:env SITE_REPO_URL -->
@@ -200,7 +200,7 @@ cache:
---
### `site.page-size` { id=site-page-size }
### `site.pageSize` { id="site-page-size" }
<!-- md:default 0 -->
<!-- md:env SITE_PAGE_SIZE -->
@@ -210,7 +210,7 @@ cache:
---
### `site.favicon` { id=site-favicon }
### `site.favicon` { id="site-favicon" }
<!-- md:default -->
<!-- md:env SITE_FAVICON -->
@@ -219,7 +219,7 @@ cache:
---
### `site.meta` { id=site-meta }
### `site.meta` { id="site-meta" }
Мета-теги `<meta name="description">` и `<meta name="keywords">` для HTML-шаблонов.
@@ -230,7 +230,7 @@ cache:
---
### `site.title` { id=site-title }
### `site.title` { id="site-title" }
<!-- md:default IPTV Checker -->
<!-- md:env SITE_TITLE -->
@@ -239,19 +239,19 @@ cache:
---
### `site.header.menu` { id=site-header-menu }
### `site.header.menu` { id="site-header-menu" }
Массив элементов [`Link`](#link) в шапке сайта.
---
### `site.footer.links` { id=site-footer-links }
### `site.footer.links` { id="site-footer-links" }
Массив элементов [`Link`](#link) в подвале сайта.
---
### `site.tabs.raw.visible` { id=site-tabs-raw-visible }
### `site.tabs.raw.visible` { id="site-tabs-raw-visible" }
<!-- md:default true -->
@@ -259,15 +259,15 @@ cache:
---
### `site.tabs.legal.visible` { id=site-tabs-legal-visible }
### `site.tabs.legal.visible` { id="site-tabs-legal-visible" }
<!-- md:default true -->
<!-- md:default false -->
Отображать вкладку «Юридическая информация».
---
### `site.tabs.legal.text` { id=site-tabs-legal-text }
### `site.tabs.legal.text` { id="site-tabs-legal-text" }
HTML-контент вкладки «Юридическая информация».
@@ -275,7 +275,7 @@ HTML-контент вкладки «Юридическая информация
---
### Тип `Link` { id=link }
### Тип `Link` { id="link" }
Элемент навигации или подвала.
Если задано `children`, рендерится как выпадающее меню.
@@ -329,13 +329,13 @@ site:
---
## Секция `check` { id=check }
## Секция `check` { id="check" }
Параметры проверки плейлистов и каналов. Поддерживаются скаляры и массивы.
---
### `check.start-on-serve` { id=check-start-on-serve }
### `check.startOnServe` { id="check-start-on-serve" }
<!-- md:default false -->
<!-- md:env CHECK_START_ON_SERVE -->
@@ -346,13 +346,13 @@ site:
---
### `check.playlists` { id=check-playlists }
### `check.playlists` { id="check-playlists" }
Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС).
---
#### `check.playlists.user-agent` { id=check-playlists-user-agent }
#### `check.playlists.userAgent` { id="check-playlists-user-agent" }
<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->
@@ -377,7 +377,7 @@ User-Agent для HTTP-запросов плейлистов.
---
#### `check.playlists.timeout` { id=check-playlists-timeout }
#### `check.playlists.timeout` { id="check-playlists-timeout" }
<!-- md:default 10 -->
<!-- md:env CHECK_PLAYLISTS_TIMEOUT -->
@@ -389,7 +389,7 @@ User-Agent для HTTP-запросов плейлистов.
---
#### `check.playlists.all-cooldown` { id=check-playlists-all-cooldown }
#### `check.playlists.allCooldown` { id="check-playlists-all-cooldown" }
<!-- md:default 1800 -->
<!-- md:env CHECK_PLAYLISTS_ALL_COOLDOWN -->
@@ -406,7 +406,7 @@ User-Agent для HTTP-запросов плейлистов.
---
#### `check.playlists.one-cooldown` { id=check-playlists-one-cooldown }
#### `check.playlists.oneCooldown` { id="check-playlists-one-cooldown" }
<!-- md:default 2 -->
<!-- md:env CHECK_PLAYLISTS_ONE_COOLDOWN -->
@@ -423,7 +423,7 @@ User-Agent для HTTP-запросов плейлистов.
---
#### `check.playlists.max-routines` { id=check-playlists-max-routines }
#### `check.playlists.maxRoutines` { id="check-playlists-max-routines" }
<!-- md:default 1 -->
<!-- md:env CHECK_PLAYLISTS_MAX_ROUTINES -->
@@ -435,7 +435,7 @@ User-Agent для HTTP-запросов плейлистов.
---
#### `check.playlists.per-routine` { id=check-playlists-per-routine }
#### `check.playlists.perRoutine` { id="check-playlists-per-routine" }
<!-- md:default 1 -->
<!-- md:env CHECK_PLAYLISTS_PER_ROUTINE -->
@@ -447,13 +447,13 @@ User-Agent для HTTP-запросов плейлистов.
---
### `check.channels` { id=check-channels }
### `check.channels` { id="check-channels" }
Параметры проверки каналов внутри плейлиста.
---
#### `check.channels.user-agent` { id=check-channels-user-agent }
#### `check.channels.userAgent` { id="check-channels-user-agent" }
<!-- md:default Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer -->
@@ -478,7 +478,7 @@ User-Agent для HTTP-запроса каждого канала каждого
---
#### `check.channels.timeout` { id=check-channels-timeout }
#### `check.channels.timeout` { id="check-channels-timeout" }
<!-- md:default 10 -->
<!-- md:env CHECK_CHANNELS_TIMEOUT -->
@@ -490,7 +490,7 @@ User-Agent для HTTP-запроса каждого канала каждого
---
#### `check.channels.byte-range` { id=check-channels-byte-range }
#### `check.channels.byteRange` { id="check-channels-byte-range" }
<!-- md:default 512 -->
<!-- md:env CHECK_CHANNELS_BYTE_RANGE -->
@@ -506,7 +506,7 @@ User-Agent для HTTP-запроса каждого канала каждого
---
#### `check.channels.cooldown` { id=check-channels-cooldown }
#### `check.channels.cooldown` { id="check-channels-cooldown" }
<!-- md:default 0 -->
<!-- md:env CHECK_CHANNELS_COOLDOWN -->
@@ -523,7 +523,7 @@ User-Agent для HTTP-запроса каждого канала каждого
---
#### `check.channels.max-routines` { id=check-channels-max-routines }
#### `check.channels.maxRoutines` { id="check-channels-max-routines" }
<!-- md:default 50 -->
<!-- md:env CHECK_CHANNELS_MAX_ROUTINES -->
@@ -535,7 +535,7 @@ User-Agent для HTTP-запроса каждого канала каждого
---
#### `check.channels.per-routine` { id=check-channels-per-routine }
#### `check.channels.perRoutine` { id="check-channels-per-routine" }
<!-- md:default 10 -->
<!-- md:env CHECK_CHANNELS_PER_ROUTINE -->
@@ -547,15 +547,15 @@ User-Agent для HTTP-запроса каждого канала каждого
---
## Секция `cache` { id=cache }
## Секция `cache` { id="cache" }
Параметры подключения к KeyDB/Redis для хранения результатов проверок.
Параметры подключения к кешу для хранения результатов проверок.
---
### `cache.enabled` { id=cache-enabled }
### `cache.enabled` { id="cache-enabled" }
<!-- md:default false -->
<!-- md:default true -->
<!-- md:env CACHE_ENABLED -->
<!-- md:arg --cache-enabled -->
@@ -565,31 +565,31 @@ User-Agent для HTTP-запроса каждого канала каждого
---
### `cache.host` { id=cache-host }
### `cache.host` { id="cache-host" }
<!-- md:default localhost -->
<!-- md:default cache -->
<!-- md:env CACHE_HOST -->
<!-- md:arg --cache-host -->
Хост KeyDB/Redis.
Хост кеша.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.port` { id=cache-port }
### `cache.port` { id="cache-port" }
<!-- md:default 6379 -->
<!-- md:env CACHE_PORT -->
<!-- md:arg --cache-port -->
Порт KeyDB/Redis.
Порт кеша.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.username` { id=cache-username }
### `cache.username` { id="cache-username" }
<!-- md:default -->
<!-- md:env CACHE_USERNAME -->
@@ -601,7 +601,7 @@ User-Agent для HTTP-запроса каждого канала каждого
---
### `cache.password` { id=cache-password }
### `cache.password` { id="cache-password" }
<!-- md:default -->
<!-- md:env CACHE_PASSWORD -->
@@ -613,21 +613,21 @@ User-Agent для HTTP-запроса каждого канала каждого
---
### `cache.db` { id=cache-db }
### `cache.db` { id="cache-db" }
<!-- md:default 0 -->
<!-- md:env CACHE_DB -->
<!-- md:arg --cache-db -->
Номер логической базы данных в KeyDB/Redis.
Номер логической базы данных в кеше.
!!! info "Аргумент работает только для команд `check` и `serve --check`."
---
### `cache.ttl` { id=cache-ttl }
### `cache.ttl` { id="cache-ttl" }
<!-- md:default 30 -->
<!-- md:default 3600 -->
<!-- md:env CACHE_TTL -->
<!-- md:arg --cache-ttl -->
+1 -1
View File
@@ -15,7 +15,7 @@ SHORTCODE_RE = re.compile(r"<!--\s*md:(env|arg|config|version|default|beta)\s*(.
# нет страницы `/iptvc/config` — соответствующий раздел живёт в
# `content/common/config/config.md`. С `use_directory_urls = false` конечные
# ссылки должны включать `.html`.
CONFIG_PAGE = "/ref/config.html"
CONFIG_PAGE = "/reference/config.html"
class BadgePreprocessor(Preprocessor):
+10 -5
View File
@@ -1,5 +1,10 @@
# https://zensical.org/docs/setup/basics
# https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/
# https://pictogrammers.com/library/mdi/
# https://simpleicons.org
# https://fontawesome.com/search?ip=classic&s=regular&ic=free-collection
# https://primer.style/octicons/
# https://microsoft.github.io/vscode-codicons/dist/codicon.html
[project]
site_name = "Документация m3u.su"
@@ -57,16 +62,16 @@ nav = [
]},
]},
{"Справочник" = [
"ref/config.md",
"ref/players.md",
"reference/config.md",
"reference/players.md",
# {"Для документации" = [
# "iptvc/dev/docs/components.md",
# "iptvc/dev/docs/codicons.md",
# ]},
{"Форматы файлов" = [
"ref/formats/playlists.md",
"ref/formats/channels.md",
"ref/formats/m3u.md",
"reference/formats/playlists.md",
"reference/formats/channels.md",
"reference/formats/m3u.md",
]},
]},
{"Дополнительно" = [