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.md`
- При доработке или расширении функционала этого проекта или синтаксиса всегда актуализируй скилл `./.agents/skills/koda-zensical` - При доработке или расширении функционала этого проекта или синтаксиса всегда актуализируй скилл `./.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) внутри плейлиста его авторами. Всё это (не) [указывается](../reference/formats/m3u.md#tvg-logo) внутри плейлиста его авторами.
Но в некоторых [плеерах](../ref/players.md) можно вручную указывать программу передач (см. ниже). Но в некоторых [плеерах](../reference/players.md) можно вручную указывать программу передач (см. ниже).
## У канала нет логотипа! ## У канала нет логотипа!
@@ -55,7 +55,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
## У **канала** нет программы передач (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. Может, его дёрнули из другого листа и не подогнали под другую 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" } ## А где взять программу передач (EPG)? { id="epg" }
1. Из самого плейлиста. 1. Из самого плейлиста.
Часто в атрибут [`url-tvg`](../ref/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`. Часто в атрибут [`url-tvg`](../reference/formats/m3u.md#url-tvg) тега `#EXTM3U` указывают одну или две ссылки на EPG, разделяя их `;`.
Их можно использовать отдельно, например, если плеер не может корректно обработать такое значение. Их можно использовать отдельно, например, если плеер не может корректно обработать такое значение.
2. Взять одну из этих ссылок: 2. Взять одну из этих ссылок:
@@ -133,7 +133,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Но вообще, это зависит от: Но вообще, это зависит от:
* автора плейлиста (дохлые каналы почти всегда есть даже в свежайших листах, но если лист не обновлялся год, что ты вряд-ли узнаешь, то рабочих каналов там не ищи); * автора плейлиста (дохлые каналы почти всегда есть даже в свежайших листах, но если лист не обновлялся год, что ты вряд-ли узнаешь, то рабочих каналов там не ищи);
* твоего [плеера](../ref/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером); * твоего [плеера](../reference/players.md) (видеотрансляции могут использовать кодек, который просто не поддерживается плеером);
* ширины твоего интернет-канала (не надо пытаться врубать FHD/4K трансляции с мобильного интернета на самом дешёвом тарифе в лесу); * ширины твоего интернет-канала (не надо пытаться врубать FHD/4K трансляции с мобильного интернета на самом дешёвом тарифе в лесу);
* ретроградности Меркурия и магнитных бурь (а вдруг); * ретроградности Меркурия и магнитных бурь (а вдруг);
* настроек твоей сети, твоего интернет-провайдера, VPN (подумай хорошенько, хочешь ли ты смотреть российские каналы из РФ через Уганду или США); * настроек твоей сети, твоего интернет-провайдера, VPN (подумай хорошенько, хочешь ли ты смотреть российские каналы из РФ через Уганду или США);
@@ -190,7 +190,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Например, ты на своём компе: Например, ты на своём компе:
* открываешь любой текстовый редактор; * открываешь любой текстовый редактор;
* оформляешь текст в формате [m3u](../ref/formats/m3u.md); * оформляешь текст в формате [m3u](../reference/formats/m3u.md);
* сохраняешь в файл `pls.m3u`. * сохраняешь в файл `pls.m3u`.
Получился плейлист `pls.m3u`. Получился плейлист `pls.m3u`.
@@ -251,7 +251,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
Нет, и не планируется. Нет, и не планируется.
Ищи [плеер](../ref/players.md) и добавляй плейлист туда по ссылке. Ищи [плеер](../reference/players.md) и добавляй плейлист туда по ссылке.
## На канале отображается заглушка { id="заглушка" } ## На канале отображается заглушка { id="заглушка" }
@@ -308,7 +308,7 @@ tags: ["сайт", "каналы", "плейлисты", "epg", "плееры",
**Решение 3:** если IP не российский, то сделать его российским (любыми способами). **Решение 3:** если IP не российский, то сделать его российским (любыми способами).
**Решение 4:** использовать [плеер](../ref/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих: **Решение 4:** использовать [плеер](../reference/players.md), который позволяет указать **User-Agent**, и вставить туда какой-нибудь из этих:
``` ```
Mozilla/5.0 WINK/1.28.2 (AndroidTV/9) HlsWinkPlayer 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) - [:fontawesome-solid-list-check: Список плейлистов](../iptvc/site/list.md)
- [:material-table-eye: Страница плейлиста](../iptvc/site/details.md) - [:material-table-eye: Страница плейлиста](../iptvc/site/details.md)
- [:material-television-play: Как подключить плейлист](../iptvc/site/connect.md) - [:material-television-play: Как подключить плейлист](../iptvc/site/connect.md)
- [:material-multimedia: IPTV плееры](../ref/players.md) - [:material-multimedia: IPTV плееры](../reference/players.md)
</div> </div>
+2 -2
View File
@@ -50,7 +50,7 @@ hero:
Полное описание `config.yml`, переменных окружения и CLI-флагов Полное описание `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 } **Об этой документации** - :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 } **Поддержка проекта** - :material-hand-heart:{ .lg .middle } **Поддержка проекта**
+25 -25
View File
@@ -13,7 +13,7 @@ tags: [iptvc]
## `-i`, `--ini` { id=ini } ## `-i`, `--ini` { id=ini }
Указывает путь к локальному [ini-файлу](../../ref/formats/playlists.md) с описанием плейлистов. Указывает путь к локальному [ini-файлу](../../reference/formats/playlists.md) с описанием плейлистов.
Можно указать только однажды. Можно указать только однажды.
@@ -27,7 +27,7 @@ tags: [iptvc]
## `-t`, `--tags` { id=tags } ## `-t`, `--tags` { id=tags }
Указывает путь к локальному [json-файлу](../../ref/formats/channels.md) с описанием тегов каналов. Указывает путь к локальному [json-файлу](../../reference/formats/channels.md) с описанием тегов каналов.
Можно указать только однажды. Можно указать только однажды.
@@ -64,7 +64,7 @@ tags: [iptvc]
## `-c`, `--code` { id=code } ## `-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 } ## `--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="Пример" ```shell title="Пример"
# проверить 5 раз с паузой 5 секунд между циклами # проверить 5 раз с паузой 5 секунд между циклами
@@ -175,7 +175,7 @@ tags: [iptvc]
### `--log-level` { id=log-level } ### `--log-level` { id=log-level }
Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`. Устанавливает уровень логирования. Переопределяет `app.logLevel` из `config.yml`.
Доступные значения: `debug`, `info`, `warn`, `error`. Доступные значения: `debug`, `info`, `warn`, `error`.
@@ -209,7 +209,7 @@ tags: [iptvc]
Задержка в секундах после проверки всех плейлистов. Задержка в секундах после проверки всех плейлистов.
Переопределяет `check.playlists.all-cooldown` (по умолчанию `1800`). Переопределяет `check.playlists.allCooldown` (по умолчанию `1800`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-all-cooldown 10 ./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="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-one-cooldown 2 ./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="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-max-routines 10 ./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="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-per-routine 3 ./iptvc check -i ~/my.ini --playlists-per-routine 3
@@ -249,7 +249,7 @@ tags: [iptvc]
User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.playlists.user-agent`. Переопределяет `check.playlists.userAgent`.
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --playlists-user-agent "Mozilla/5.0" "curl/8.0" ./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="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-byte-range 1024 ./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="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-max-routines 100 ./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="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-per-routine 20 ./iptvc check -i ~/my.ini --channels-per-routine 20
@@ -313,7 +313,7 @@ User-Agent для HTTP-запросов плейлистов. Можно ука
User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.channels.user-agent`. Переопределяет `check.channels.userAgent`.
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --channels-user-agent "Mozilla/5.0" "VLC/3.0" ./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 } ### `--cache-enabled` { id=cache-enabled }
Включает кеширование результатов в KeyDB/Redis. Включает кеширование результатов.
Переопределяет `cache.enabled` (по умолчанию `false`). Переопределяет `cache.enabled` (по умолчанию `true`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled ./iptvc check -i ~/my.ini --cache-enabled
@@ -335,9 +335,9 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-host` { id=cache-host } ### `--cache-host` { id=cache-host }
Хост KeyDB/Redis. Хост кеша.
Переопределяет `cache.host` (по умолчанию `localhost`). Переопределяет `cache.host` (по умолчанию `cache`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled --cache-host 192.168.1.10 ./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 } ### `--cache-port` { id=cache-port }
Порт KeyDB/Redis. Порт кеша.
Переопределяет `cache.port` (по умолчанию `6379`). Переопределяет `cache.port` (по умолчанию `6379`).
@@ -355,7 +355,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-username` { id=cache-username } ### `--cache-username` { id=cache-username }
Логин для подключения к KeyDB/Redis. Логин для подключения к кешу.
Переопределяет `cache.username`. Переопределяет `cache.username`.
@@ -365,7 +365,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-password` { id=cache-password } ### `--cache-password` { id=cache-password }
Пароль для подключения к KeyDB/Redis. Пароль для подключения к кешу.
Переопределяет `cache.password`. Переопределяет `cache.password`.
@@ -375,7 +375,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
### `--cache-db` { id=cache-db } ### `--cache-db` { id=cache-db }
Номер базы данных KeyDB/Redis. Номер базы данных кеша.
Переопределяет `cache.db` (по умолчанию `0`). Переопределяет `cache.db` (по умолчанию `0`).
@@ -387,7 +387,7 @@ User-Agent для HTTP-запросов каналов. Можно указат
TTL записей кеша в секундах. TTL записей кеша в секундах.
Переопределяет `cache.ttl` (по умолчанию `30`). Переопределяет `cache.ttl` (по умолчанию `3600`).
```shell title="Пример" ```shell title="Пример"
./iptvc check -i ~/my.ini --cache-enabled --cache-ttl 3600 ./iptvc check -i ~/my.ini --cache-enabled --cache-ttl 3600
+1 -1
View File
@@ -18,6 +18,6 @@ hide: [toc]
| ----------------- | ------ | ---------------------------- | ----------------------------------------------------- | | ----------------- | ------ | ---------------------------- | ----------------------------------------------------- |
| `--config` | string | — | Путь к файлу конфигурации (по умолчанию `config.yml`) | | `--config` | string | — | Путь к файлу конфигурации (по умолчанию `config.yml`) |
| `--debug` | bool | `app.debug` | Включить режим отладки | | `--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 | — | Подробное логирование | | `-v`, `--verbose` | bool | — | Подробное логирование |
+36 -32
View File
@@ -53,7 +53,7 @@ iptvc serve --check
### `-i`, `--ini` { id="ini" } ### `-i`, `--ini` { id="ini" }
Путь к локальному [ini-файлу](../../ref/formats/playlists.md) с описанием плейлистов. Путь к локальному [ini-файлу](../../reference/formats/playlists.md) с описанием плейлистов.
Значение по умолчанию: `./playlists.ini` Значение по умолчанию: `./playlists.ini`
@@ -63,7 +63,7 @@ iptvc serve --check -i ~/my.ini
### `-t`, `--tags` { id="tags" } ### `-t`, `--tags` { id="tags" }
Путь к [json-файлу](../../ref/formats/channels.md) с описанием тегов каналов. Путь к [json-файлу](../../reference/formats/channels.md) с описанием тегов каналов.
Значение по умолчанию: `./channels.json` Значение по умолчанию: `./channels.json`
@@ -73,9 +73,9 @@ iptvc serve --check -t ~/tags.json
### `--playlists-all-cooldown` { id=playlists-all-cooldown } ### `--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 ```bash
# пауза 2 минуты между циклами # пауза 2 минуты между циклами
@@ -115,7 +115,9 @@ iptvc serve --config /etc/iptvc/config.yml
### `--debug` { id="debug" } ### `--debug` { id="debug" }
Включает режим отладки. Переопределяет `app.debug` из `config.yml` и переменную `APP_DEBUG`. Включает режим отладки.
Переопределяет <!-- md:config app.debug --> из `config.yml` и переменную `APP_DEBUG`.
```bash ```bash
iptvc serve --debug iptvc serve --debug
@@ -123,7 +125,9 @@ iptvc serve --debug
### `--log-level` { id="log-level" } ### `--log-level` { id="log-level" }
Устанавливает уровень логирования. Переопределяет `app.log_level` из `config.yml`. Устанавливает уровень логирования.
Переопределяет <!-- md:config app.logLevel --> из `config.yml`.
Доступные значения: `debug`, `info`, `warn`, `error`. Доступные значения: `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" } ### `--playlists-timeout` { id="playlists-timeout" }
Таймаут HTTP-запроса плейлиста в секундах. Таймаут HTTP-запроса плейлиста в секундах.
Переопределяет `check.playlists.timeout` (по умолчанию `10`). Переопределяет <!-- md:config check.playlists.timeout --> (по умолчанию `10`).
```bash ```bash
iptvc serve --check --playlists-timeout 5 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 ```bash
iptvc serve --check --playlists-all-cooldown 10 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 ```bash
iptvc serve --check --playlists-one-cooldown 2 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 ```bash
iptvc serve --check --playlists-max-routines 10 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 ```bash
iptvc serve --check --playlists-per-routine 3 iptvc serve --check --playlists-per-routine 3
@@ -193,7 +197,7 @@ iptvc serve --check --playlists-per-routine 3
User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов плейлистов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.playlists.user-agent`. Переопределяет <!-- md:config check.playlists.userAgent -->.
```bash ```bash
iptvc serve --check --playlists-user-agent "Mozilla/5.0" "curl/8.0" 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-запроса канала в секундах. Таймаут HTTP-запроса канала в секундах.
Переопределяет `check.channels.timeout` (по умолчанию `10`). Переопределяет <!-- md:config check.channels.timeout --> (по умолчанию `10`).
```bash ```bash
iptvc serve --check --channels-timeout 8 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 ```bash
iptvc serve --check --channels-byte-range 1024 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 ```bash
iptvc serve --check --channels-cooldown 1 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 ```bash
iptvc serve --check --channels-max-routines 100 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 ```bash
iptvc serve --check --channels-per-routine 20 iptvc serve --check --channels-per-routine 20
@@ -257,7 +261,7 @@ iptvc serve --check --channels-per-routine 20
User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе. User-Agent для HTTP-запросов каналов. Можно указать несколько — будет выбран случайный при каждом запросе.
Переопределяет `check.channels.user-agent`. Переопределяет <!-- md:config check.channels.userAgent -->.
```bash ```bash
iptvc serve --check --channels-user-agent "Mozilla/5.0" "VLC/3.0" 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" } ### `--cache-enabled` { id="cache-enabled" }
Включает кеширование результатов в KeyDB/Redis. Включает кеширование результатов redis-совместимым сервисом.
Переопределяет `cache.enabled` (по умолчанию `false`). Переопределяет <!-- md:config cache.enabled --> (по умолчанию `true`).
```bash ```bash
iptvc serve --cache-enabled iptvc serve --cache-enabled
@@ -279,9 +283,9 @@ iptvc serve --cache-enabled
### `--cache-host` { id="cache-host" } ### `--cache-host` { id="cache-host" }
Хост KeyDB/Redis. Хост сервиса кеша.
Переопределяет `cache.host` (по умолчанию `localhost`). Переопределяет <!-- md:config cache.host --> (по умолчанию `cache`).
```bash ```bash
iptvc serve --cache-enabled --cache-host 192.168.1.10 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" } ### `--cache-port` { id="cache-port" }
Порт KeyDB/Redis. Порт сервиса кеша.
Переопределяет `cache.port` (по умолчанию `6379`). Переопределяет <!-- md:config cache.port --> (по умолчанию `6379`).
```bash ```bash
iptvc serve --cache-enabled --cache-port 6380 iptvc serve --cache-enabled --cache-port 6380
@@ -299,9 +303,9 @@ iptvc serve --cache-enabled --cache-port 6380
### `--cache-username` { id="cache-username" } ### `--cache-username` { id="cache-username" }
Логин для подключения к KeyDB/Redis. Логин для подключения к сервису кеша.
Переопределяет `cache.username`. Переопределяет <!-- md:config cache.username -->.
```bash ```bash
iptvc serve --cache-enabled --cache-username myuser iptvc serve --cache-enabled --cache-username myuser
@@ -309,9 +313,9 @@ iptvc serve --cache-enabled --cache-username myuser
### `--cache-password` { id="cache-password" } ### `--cache-password` { id="cache-password" }
Пароль для подключения к KeyDB/Redis. Пароль для подключения к сервису кеша.
Переопределяет `cache.password`. Переопределяет <!-- md:config cache.password -->.
```bash ```bash
iptvc serve --cache-enabled --cache-password secret iptvc serve --cache-enabled --cache-password secret
@@ -319,9 +323,9 @@ iptvc serve --cache-enabled --cache-password secret
### `--cache-db` { id="cache-db" } ### `--cache-db` { id="cache-db" }
Номер базы данных KeyDB/Redis. Номер базы данных кеша.
Переопределяет `cache.db` (по умолчанию `0`). Переопределяет <!-- md:config cache.db --> (по умолчанию `0`).
```bash ```bash
iptvc serve --cache-enabled --cache-db 2 iptvc serve --cache-enabled --cache-db 2
@@ -331,7 +335,7 @@ iptvc serve --cache-enabled --cache-db 2
TTL записей кеша в секундах. TTL записей кеша в секундах.
Переопределяет `cache.ttl` (по умолчанию `30`). Переопределяет <!-- md:config cache.ttl --> (по умолчанию `3600`).
```bash ```bash
iptvc serve --cache-enabled --cache-ttl 3600 iptvc serve --cache-enabled --cache-ttl 3600
+16 -16
View File
@@ -16,7 +16,7 @@ tags: ["iptvc", "разработка", "архитектура"]
- `github.com/spf13/cobra` — CLI-фреймворк; - `github.com/spf13/cobra` — CLI-фреймворк;
- `gopkg.in/yaml.v3` — парсинг `config.yml`; - `gopkg.in/yaml.v3` — парсинг `config.yml`;
- `github.com/joho/godotenv` — загрузка `.env`; - `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/
│ │ └── tagfile.go # чтение channels.json, назначение тегов │ │ └── tagfile.go # чтение channels.json, назначение тегов
│ ├── cache/ │ ├── cache/
│ │ └── cache.go # подключение к KeyDB/Redis │ │ └── cache.go # подключение к кешу
│ ├── logger/ │ ├── logger/
│ │ └── logger.go # настройка логирования │ │ └── logger.go # настройка логирования
│ ├── utils/ │ ├── utils/
@@ -76,9 +76,9 @@ iptvc/
### `app` ### `app`
Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (Redis-клиент). Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (кеш-клиент).
`Init()` загружает конфигурацию и инициализирует логгер. `Init()` загружает конфигурацию и инициализирует логгер.
`InitCache()` подключается к KeyDB/Redis, если кеш включён. `InitCache()` подключается к кешу, если кеш включён.
### `app.config` ### `app.config`
@@ -98,10 +98,10 @@ iptvc/
Содержит логику проверки: Содержит логику проверки:
- **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла. - **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла.
- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `max-routines`), загрузка, парсинг, вызов `CheckChannels` для каждого. - **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `maxRoutines`), загрузка, парсинг, вызов `CheckChannels` для каждого.
- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `max-routines`), HTTP-запрос с `Range` header. - **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `maxRoutines`), HTTP-запрос с `Range` header.
- **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша. - **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша.
- **`cachePlaylist(pls)`** — сохранение результата в Redis (если включён). - **`cachePlaylist(pls)`** — сохранение результата в кеш (если включён).
Параметры проверки берутся из `app.Config.Check.Playlists` и `app.Config.Check.Channels`. Параметры проверки берутся из `app.Config.Check.Playlists` и `app.Config.Check.Channels`.
@@ -141,7 +141,7 @@ GET /{path...} — все остальные маршру
Catch-all `/{path...}` используется для избежания конфликтов паттернов в Go 1.22 mux. Catch-all `/{path...}` используется для избежания конфликтов паттернов в Go 1.22 mux.
In-memory кеш (`memCache`) обновляется через `OnPlaylistChecked` callback. In-memory кеш (`memCache`) обновляется через `OnPlaylistChecked` callback.
Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без Redis. Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без внешнего кеша.
ini-файл кешируется на 30 секунд, кеш сбрасывается при каждом обновлении `memCache`. ini-файл кешируется на 30 секунд, кеш сбрасывается при каждом обновлении `memCache`.
@@ -155,16 +155,16 @@ StartBackgroundChecker:
runCheckerOnce() runCheckerOnce()
→ checker.PrepareListsToCheck() → checker.PrepareListsToCheck()
→ checker.CheckPlaylists() → checker.CheckPlaylists()
→ for each playlist (parallel, per-routine): → for each playlist (parallel, perRoutine):
→ Download() / ReadFromFs() → Download() / ReadFromFs()
→ Parse() → Parse()
→ CheckChannels() → CheckChannels()
→ for each channel (parallel, per-routine): → for each channel (parallel, perRoutine):
→ HTTP GET with Range header → HTTP GET with Range header
→ check status + content type → check status + content type
→ OnPlaylistChecked(pls) → memCache update → OnPlaylistChecked(pls) → memCache update
→ one-cooldown sleep → oneCooldown sleep
→ all-cooldown sleep → allCooldown sleep
if repeat > 0 && iteration >= repeat: stop 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-флаги. Приоритет: Defaults < `config.yml` < Env < CLI-флаги.
@@ -235,7 +235,7 @@ SVG-логотипы каналов передаются через `encodeURICo
Два уровня кеша: Два уровня кеша:
1. **Redis/KeyDB** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`. 1. **Внешний кеш** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`.
2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует Redis. 2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует внешнего кеша.
In-memory кеш приоритетнее Redis при отображении в веб-интерфейсе. In-memory кеш приоритетнее внешнего кеша при отображении в веб-интерфейсе.
+4 -4
View File
@@ -53,13 +53,13 @@ make release
Для работы `iptvc` нужны два файла рядом с бинарником: Для работы `iptvc` нужны два файла рядом с бинарником:
- `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../ref/formats/playlists.md). - `playlists.ini` — список плейлистов. Формат описан в [справочнике форматов](../../reference/formats/playlists.md).
- `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../ref/formats/channels.md). - `channels.json` — правила тегов каналов. Формат описан в [справочнике форматов](../../reference/formats/channels.md).
- `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../ref/config.md). - `config.yml` — конфигурация программы. Описание — в [разделе config.yml](../../reference/config.md).
## Полное Docker-окружение ## Полное Docker-окружение
Полная инфраструктура проекта (nginx, KeyDB, checker, docs) развёртывается через Docker. Полная инфраструктура проекта (nginx, кеш, checker, docs) развёртывается через Docker.
Подробнее — в разделе [Развёртывание](../site/deploy.md). Подробнее — в разделе [Развёртывание](../site/deploy.md).
+1 -1
View File
@@ -49,7 +49,7 @@ hide: [toc]
[start]: quickstart.md "Перейти к разделу" [start]: quickstart.md "Перейти к разделу"
[site]: site/first-steps.md "Перейти к разделу" [site]: site/first-steps.md "Перейти к разделу"
[cli]: commands/index.md "Перейти к разделу" [cli]: commands/index.md "Перейти к разделу"
[cfg]: ../ref/config.md "Перейти к разделу" [cfg]: ../reference/config.md "Перейти к разделу"
<!-- <!--
## :material-cog-sync-outline: Как работает `iptvc` ## :material-cog-sync-outline: Как работает `iptvc`
+2 -2
View File
@@ -25,7 +25,7 @@ tags: ["iptvc"]
./iptvc check --file /home/user/pls.m3u ./iptvc check --file /home/user/pls.m3u
``` ```
## Проверить плейлист по короткому коду из [`playlists.ini`](../ref/formats/playlists.md) ## Проверить плейлист по короткому коду из [`playlists.ini`](../reference/formats/playlists.md)
``` ```
./iptvc check -c X ./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 "Обрати внимание" !!! info "Обрати внимание"
1. Пропорции рабочих и нерабочих каналов в плейлистах могут меняться от проверки к проверке. 1. Пропорции рабочих и нерабочих каналов в плейлистах могут меняться от проверки к проверке.
Это нормально, таковы технические особенности проверки. Это нормально, таковы технические особенности проверки.
2. Работа архива и программы передач зависит от выбранного [плеера](../../ref/players.md). 2. Работа архива и программы передач зависит от выбранного [плеера](../../reference/players.md).
Некоторые это просто не поддерживают. Некоторые это просто не поддерживают.
## Статусы каналов { id="channels" } ## Статусы каналов { id="channels" }
@@ -82,7 +82,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
Если при проверке плейлиста обнаружен хотя бы один канал для взрослых, то этот канал и весь плейлист помечается значком <span class="badge adult">18+</span>. Если при проверке плейлиста обнаружен хотя бы один канал для взрослых, то этот канал и весь плейлист помечается значком <span class="badge adult">18+</span>.
Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../../ref/formats/channels.md). Такие каналы определяются благодаря правилам, описанным в файле [channels.json](../../reference/formats/channels.md).
Они применяются к названиям каналов и их атрибутам (`tvg-id`, `tvg-name`), которые описывают канал в плейлисте. Они применяются к названиям каналов и их атрибутам (`tvg-id`, `tvg-name`), которые описывают канал в плейлисте.
Для каналов со взрослым контентом применяется тег `adult`. Для каналов со взрослым контентом применяется тег `adult`.
@@ -90,7 +90,7 @@ tags: ["статусы", "плейлисты", "каналы", "iptvc"]
!!! warning "Обрати внимание" !!! warning "Обрати внимание"
Далеко не все каналы могут быть помечены таким тегом. Далеко не все каналы могут быть помечены таким тегом.
Хотя набор правил для тегов очень богат, но невозможно угадать все каналы с приемлемой точностью. Хотя набор правил для тегов очень богат, но невозможно угадать все каналы с приемлемой точностью.
Почему — читай [здесь](../../ref/formats/channels.md#warnings). Почему — читай [здесь](../../reference/formats/channels.md#warnings).
--- ---
+2 -2
View File
@@ -5,10 +5,10 @@ tags: ["плееры", "плейлисты"]
# :material-television-play: Как подключить плейлист # :material-television-play: Как подключить плейлист
1. Найти какой-нибудь [плеер](../../ref/players.md) 1. Найти какой-нибудь [плеер](../../reference/players.md)
2. Узнать как в него добавить плейлист по ссылке 2. Узнать как в него добавить плейлист по ссылке
3. Найти желаемый плелист из [списка](./list.md) 3. Найти желаемый плелист из [списка](./list.md)
4. Найти на странице ["Ссылку для ТВ"](details.md#shortlink) и ввести (скопировать) её в поле ввода адреса в плеере 4. Найти на странице ["Ссылку для ТВ"](details.md#shortlink) и ввести (скопировать) её в поле ввода адреса в плеере
Для некоторых [плееров](../../ref/players.md) уже есть информация как добавить плейлист. Для некоторых [плееров](../../reference/players.md) уже есть информация как добавить плейлист.
+133 -116
View File
@@ -1,11 +1,11 @@
--- ---
icon: material/upload-network icon: material/upload-network
tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"] tags: ["iptvc", "docker", "deploy", "nginx", "apache", "caddy", "ssl"]
--- ---
# :material-upload-network: Развёртывание сайта # :material-upload-network: Развёртывание сайта
В этом разделе описан фактический порядок настройки `iptvc`, хранилищем KeyDB и документацией. В этом разделе описан фактический порядок настройки `iptvc`, кеша и документации.
## :material-flag-checkered: Базовый вариант развёртывания сервиса { id="local" } ## :material-flag-checkered: Базовый вариант развёртывания сервиса { id="local" }
@@ -31,7 +31,7 @@ tags: ["iptvc", "docker", "deploy", "nginx", "apache", "ssl"]
### Список плейлистов — `playlists.ini` { id="playlists" } ### Список плейлистов — `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" } ### Список правил — `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` ### Конфигурация приложения — `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" } ## :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)" ??? 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` будет запускаться в одном из них.
Скачивайте и кладите в ту же директорию, где остальные файлы.
Для теста запустите команду:
--- ```shell
---
---
## Подготовка репозитория { 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
docker compose up -d --build 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 ps
docker compose logs -f iptvc docker compose logs -f iptvc
``` ```
@@ -208,7 +169,7 @@ docker compose logs -f iptvc
Для остановки окружения выполните: Для остановки окружения выполните:
```bash ```shell
docker compose down docker compose down
``` ```
@@ -216,22 +177,24 @@ docker compose down
Для публикации приложения на домене с HTTPS настроим реверс-прокси, который будет терминировать SSL и проксировать запросы на контейнеры `iptvc` (порт `8800`) и `docs` (порт `8801`). Для публикации приложения на домене с HTTPS настроим реверс-прокси, который будет терминировать SSL и проксировать запросы на контейнеры `iptvc` (порт `8800`) и `docs` (порт `8801`).
Ниже рассмотрены два варианта: nginx и Apache2. !!! tip "site.baseUrl"
!!! tip "site.base-url"
После настройки домена укажите внешний адрес в `config.yml` или `.env`: После настройки домена укажите внешний адрес в `config.yml` или `.env`:
```yaml ```yaml
site: site:
base-url: https://example.com baseUrl: https://example.com
``` ```
Или через переменную окружения: Или через переменную окружения:
```bash ```shell
SITE_BASE_URL=https://example.com SITE_BASE_URL=https://example.com
``` ```
О параметре: [`site.baseUrl`](../../reference/config.md#site-base-url)
Ниже рассмотрены три варианта: nginx, Apache2 и Caddy.
### Подготовка { id="reverse-proxy-prep" } ### Подготовка { id="reverse-proxy-prep" }
Убедитесь, что: Убедитесь, что:
@@ -241,11 +204,11 @@ docker compose down
- Docker-окружение запущено (`docker compose up -d`); - Docker-окружение запущено (`docker compose up -d`);
- порты `8800` и `8801` доступны локально (проверьте `curl -I http://localhost:8800`). - порты `8800` и `8801` доступны локально (проверьте `curl -I http://localhost:8800`).
### nginx { id="reverse-proxy-nginx" } #### nginx { id="reverse-proxy-nginx" }
Установите nginx и Certbot: Установите nginx и Certbot:
```bash ```shell
sudo apt update sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx 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/iptvc /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/iptv-docs /etc/nginx/sites-enabled/ sudo ln -s /etc/nginx/sites-available/iptv-docs /etc/nginx/sites-enabled/
sudo nginx -t sudo nginx -t
@@ -295,7 +258,7 @@ sudo systemctl reload nginx
Получите SSL-сертификат через Certbot: Получите SSL-сертификат через Certbot:
```bash ```shell
sudo certbot --nginx -d example.com -d docs.example.com sudo certbot --nginx -d example.com -d docs.example.com
``` ```
@@ -303,22 +266,22 @@ Certbot автоматически изменит конфигурацию nginx
Проверьте автоматическое продление: Проверьте автоматическое продление:
```bash ```shell
sudo certbot renew --dry-run sudo certbot renew --dry-run
``` ```
### Apache2 { id="reverse-proxy-apache" } #### Apache2 { id="reverse-proxy-apache" }
Установите Apache2 и Certbot: Установите Apache2 и Certbot:
```bash ```shell
sudo apt update sudo apt update
sudo apt install -y apache2 certbot python3-certbot-apache sudo apt install -y apache2 certbot python3-certbot-apache
``` ```
Включите необходимые модули: Включите необходимые модули:
```bash ```shell
sudo a2enmod proxy proxy_http ssl rewrite headers sudo a2enmod proxy proxy_http ssl rewrite headers
sudo systemctl restart apache2 sudo systemctl restart apache2
``` ```
@@ -355,7 +318,7 @@ sudo systemctl restart apache2
Включите конфигурации и проверьте синтаксис: Включите конфигурации и проверьте синтаксис:
```bash ```shell
sudo a2ensite iptvc iptv-docs sudo a2ensite iptvc iptv-docs
sudo apache2ctl configtest sudo apache2ctl configtest
sudo systemctl reload apache2 sudo systemctl reload apache2
@@ -363,7 +326,7 @@ sudo systemctl reload apache2
Получите SSL-сертификат через Certbot: Получите SSL-сертификат через Certbot:
```bash ```shell
sudo certbot --apache -d example.com -d docs.example.com sudo certbot --apache -d example.com -d docs.example.com
``` ```
@@ -371,11 +334,65 @@ Certbot автоматически создаст HTTPS-виртуальные
Проверьте автоматическое продление: Проверьте автоматическое продление:
```bash ```shell
sudo certbot renew --dry-run 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/`: Для сборки и публикации образа используйте цели Makefile в каталоге `iptvc/`:
```bash ```shell
cd iptvc cd iptvc
# Сборка одноархитектурного образа (linux/amd64 по умолчанию) # Сборка одноархитектурного образа (linux/amd64 по умолчанию)
@@ -407,7 +424,7 @@ make image IMAGE_TAG=v1.2.3
Для публикации multi-arch манифеста (linux/amd64 + linux/arm64): Для публикации multi-arch манифеста (linux/amd64 + linux/arm64):
```bash ```shell
make image-all make image-all
``` ```
@@ -415,7 +432,7 @@ make image-all
Перед публикацией войдите в registry, если это требуется вашей настройкой: Перед публикацией войдите в registry, если это требуется вашей настройкой:
```bash ```shell
docker login git.axenov.dev docker login git.axenov.dev
``` ```
@@ -427,27 +444,27 @@ docker login git.axenov.dev
После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы: После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы:
```bash ```shell
docker compose up -d --build docker compose up -d --build
``` ```
Чтобы пересобрать только приложение `iptvc`: Чтобы пересобрать только приложение `iptvc`:
```bash ```shell
docker compose build iptvc docker compose build iptvc
docker compose up -d iptvc docker compose up -d iptvc
``` ```
Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис: Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис:
```bash ```shell
docker compose pull iptvc docker compose pull iptvc
docker compose up -d iptvc docker compose up -d iptvc
``` ```
Обновление документации выполняется пересборкой сервиса `docs`: Обновление документации выполняется пересборкой сервиса `docs`:
```bash ```shell
docker compose build docs docker compose build docs
docker compose up -d 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 iptvc
docker compose logs -f keydb docker compose logs -f cache
docker compose logs -f docs docker compose logs -f docs
``` ```
Для проверки конфигурации Compose выполните: Для проверки конфигурации Compose выполните:
```bash ```shell
docker compose config 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); * **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code);
* **Описание** — [описание плейлиста](../../ref/formats/playlists.md#desc) (при наличии); * **Описание** — [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии);
* **Ccылка для ТВ** — короткая ссылка, которую можно использовать для [подключения плейлиста](connect.md), подробнее о ней см. ниже; * **Ccылка для ТВ** — короткая ссылка, которую можно использовать для [подключения плейлиста](connect.md), подробнее о ней см. ниже;
* **Источник** — [ссылка на ресурс](../../ref/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии); * **Источник** — [ссылка на ресурс](../../reference/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
* **Наполнение**: * **Наполнение**:
* группы — количество групп, на которые поделены каналы; * группы — количество групп, на которые поделены каналы;
* каналы — количества каналов общее, онлайн и оффлайн; * каналы — количества каналов общее, онлайн и оффлайн;
(всё по нулям, если плейлист <span class="badge offline">offline</span>) (всё по нулям, если плейлист <span class="badge offline">offline</span>)
* **Возможности** — наличие программы передач и перемотки каналов; * **Возможности** — наличие программы передач и перемотки каналов;
* **M3U** — [прямая ссылка](../../ref/formats/playlists.md#pls) на плейлист; * **M3U** — [прямая ссылка](../../reference/formats/playlists.md#pls) на плейлист;
* **Проверка плейлиста** — дата и время последней [проверки](checks.md) плейлиста с помощью [iptvc](../overview.md); * **Проверка плейлиста** — дата и время последней [проверки](checks.md) плейлиста с помощью [iptvc](../overview.md);
* **Ошибка проверки** — текст ошибки, которая возникла при проверке * **Ошибка проверки** — текст ошибки, которая возникла при проверке
(только если плейлист <span class="badge offline">offline</span>) (только если плейлист <span class="badge offline">offline</span>)
@@ -82,7 +82,7 @@ tags: ["сайт", "статусы", "каналы"]
Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**. Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**.
Справа — **кнопка сброса** для отображения всех каналов. Справа — **кнопка сброса** для отображения всех каналов.
Под строкой поиска есть [**облако тегов**](../../ref/formats/channels.md#доступные-теги). Под строкой поиска есть [**облако тегов**](../../reference/formats/channels.md#доступные-теги).
!!! question inline end "Про теги" !!! question inline end "Про теги"
Откуда они там появляются, можешь прочесть [здесь](../../common/index.md) и [здесь](../overview.md). Откуда они там появляются, можешь прочесть [здесь](../../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. Добавляем плейлисты ## Шаг 2. Добавляем плейлисты
Список плейлистов описывается в файле [`playlists.ini`](../../ref/formats/playlists.md). Список плейлистов описывается в файле [`playlists.ini`](../../reference/formats/playlists.md).
Создадим его рядом с `iptvc`: Создадим его рядом с `iptvc`:
```ini title="playlists.ini" ```ini title="playlists.ini"
@@ -66,7 +66,7 @@ pls = 'https://example.com/movies.m3u'
Чтобы статусы появились, нужно включить фоновую проверку. Чтобы статусы появились, нужно включить фоновую проверку.
!!! tip "Путь к ini-файлу" !!! 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 ./iptvc serve --check --repeat 1
``` ```
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../ref/config.md): Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../reference/config.md):
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
start-on-serve: true startOnServe: true
``` ```
Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку. Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку.
@@ -106,14 +106,14 @@ check:
## Шаг 4. Настраиваем внешний вид сайта ## Шаг 4. Настраиваем внешний вид сайта
Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале. Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале.
Всё это — в секции [`site`](../../ref/config.md) файла `config.yml`. Всё это — в секции [`site`](../../reference/config.md) файла `config.yml`.
```yaml title="config.yml" ```yaml title="config.yml"
site: site:
base-url: http://localhost:8800 baseUrl: http://localhost:8800
repo-url: https://git.axenov.dev/IPTV repo-url: https://git.axenov.dev/IPTV
page-size: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации) pageSize: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
favicon: /favicon.ico # путь к иконке favicon: ./favicon.ico # путь к иконке
header: header:
title: Мой IPTV # заголовок в шапке и вкладке браузера title: Мой IPTV # заголовок в шапке и вкладке браузера
menu: menu:
@@ -141,8 +141,8 @@ site:
--8<-- "icons.md" --8<-- "icons.md"
!!! note "base-url" !!! note "baseUrl"
Параметр `base-url` используется для формирования внутренних ссылок. Параметр `baseUrl` используется для формирования внутренних ссылок.
Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`. Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`.
--- ---
@@ -150,7 +150,7 @@ site:
## Шаг 5. Добавляем теги каналам ## Шаг 5. Добавляем теги каналам
Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее. Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее.
Правила описываются в файле [`channels.json`](../../ref/formats/channels.md). Правила описываются в файле [`channels.json`](../../reference/formats/channels.md).
```json title="channels.json" ```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 ```bash
./iptvc serve --check -t /path/to/channels.json ./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` до следующей проверки. Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки.
Кеш решает эту проблему: результаты сохраняются в KeyDB (или Redis) и переживают перезапуск. Кеш решает эту проблему: результаты сохраняются в кеше и переживают перезапуск.
Включается одной строкой в [`config.yml`](../../ref/config.md): Включается в [`config.yml`](../../reference/config.md):
```yaml title="config.yml" ```yaml title="config.yml"
cache: cache:
enabled: true enabled: true
host: localhost host: cache
port: 6379 port: 6379
ttl: 1800 # секунды (по умолчанию 30) ttl: 3600 # секунды (по умолчанию 3600)
``` ```
Или через переменные окружения: Или через переменные окружения:
@@ -204,11 +204,12 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
Или через флаги: Или через флаги:
```bash ```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" !!! tip "Valkey, KeyDB или Redis"
KeyDB — это форк Redis, полностью совместимый по протоколу. Valkey — это открытый форк Redis, а KeyDB — ещё один форк.
Все они полностью совместимы по протоколу.
Подойдёт любой из них. Подойдёт любой из них.
Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования. Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования.
@@ -217,18 +218,18 @@ CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
## Шаг 7. Тонкая настройка проверки ## Шаг 7. Тонкая настройка проверки
Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками. Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками.
Все параметры — в секции [`check`](../../ref/config.md) файла `config.yml`. Все параметры — в секции [`check`](../../reference/config.md) файла `config.yml`.
### Параллелизм ### Параллелизм
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
playlists: playlists:
max-routines: 10 # сколько плейлистов проверять одновременно maxRoutines: 10 # сколько плейлистов проверять одновременно
per-routine: 5 # сколько плейлистов в одной процедуре perRoutine: 5 # сколько плейлистов в одной процедуре
channels: channels:
max-routines: 100 # сколько каналов проверять одновременно maxRoutines: 100 # сколько каналов проверять одновременно
per-routine: 20 # сколько каналов в одной процедуре perRoutine: 20 # сколько каналов в одной процедуре
``` ```
Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть. Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть.
@@ -242,11 +243,11 @@ check:
timeout: 10 # секунд на загрузку плейлиста timeout: 10 # секунд на загрузку плейлиста
channels: channels:
timeout: 10 # секунд на проверку одного канала timeout: 10 # секунд на проверку одного канала
byte-range: 512 # сколько байт скачать от сервера канала byteRange: 512 # сколько байт скачать от сервера канала
``` ```
Если плейлисты или каналы медленные, увеличьте `timeout`. Если плейлисты или каналы медленные, увеличьте `timeout`.
Если сервер блокирует большие запросы — уменьшите `byte-range`. Если сервер блокирует большие запросы — уменьшите `byteRange`.
### Задержки (cooldown) ### Задержки (cooldown)
@@ -256,8 +257,8 @@ check:
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
playlists: playlists:
all-cooldown: 5 # 5 секунд после всех плейлистов allCooldown: 5 # 5 секунд после всех плейлистов
one-cooldown: [1, 3] # 1–3 секунды после каждого плейлиста oneCooldown: [1, 3] # 1–3 секунды после каждого плейлиста
channels: channels:
cooldown: 0 # 0 секунд после каждого канала cooldown: 0 # 0 секунд после каждого канала
``` ```
@@ -270,14 +271,14 @@ check:
```yaml title="config.yml" ```yaml title="config.yml"
check: check:
playlists: playlists:
user-agent: userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 - Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
channels: 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: app:
timezone: GMT+3 timezone: GMT+3
debug: false debug: false
log_level: info logLevel: info
playlists: ./playlists.ini playlists: ./playlists.ini
tags: ./channels.json tags: ./channels.json
@@ -298,10 +299,10 @@ server:
port: 8800 port: 8800
site: site:
base-url: https://my-iptv.ru baseUrl: https://my-iptv.ru
repo-url: https://git.axenov.dev/IPTV repo-url: https://git.axenov.dev/IPTV
page-size: 20 pageSize: 20
favicon: /favicon.ico favicon: ./favicon.ico
header: header:
title: Мой IPTV title: Мой IPTV
menu: menu:
@@ -330,27 +331,27 @@ site:
icon: person-outline icon: person-outline
check: check:
start-on-serve: true startOnServe: true
playlists: playlists:
user-agent: userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 - Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10 timeout: 10
all-cooldown: 5 allCooldown: 5
one-cooldown: [1, 3] oneCooldown: [1, 3]
max-routines: 10 maxRoutines: 10
per-routine: 5 perRoutine: 5
channels: channels:
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36 userAgent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
timeout: 10 timeout: 10
byte-range: 512 byteRange: 512
cooldown: 0 cooldown: 0
max-routines: 100 maxRoutines: 100
per-routine: 20 perRoutine: 20
cache: cache:
enabled: true enabled: true
host: localhost host: cache
port: 6379 port: 6379
ttl: 3600 ttl: 3600
``` ```
@@ -361,7 +362,7 @@ cache:
./iptvc serve ./iptvc serve
``` ```
Поскольку `start-on-serve: true`, фоновая проверка запустится автоматически. Поскольку `startOnServe: true`, фоновая проверка запустится автоматически.
Кеш включён, так что результаты переживут перезапуск. Кеш включён, так что результаты переживут перезапуск.
Сайт доступен на `http://0.0.0.0:8800`. Сайт доступен на `http://0.0.0.0:8800`.
@@ -385,11 +386,11 @@ services:
environment: environment:
- CHECK_START_ON_SERVE=true - CHECK_START_ON_SERVE=true
- CACHE_ENABLED=true - CACHE_ENABLED=true
- CACHE_HOST=keydb - CACHE_HOST=cache
- CACHE_PORT=6379 - CACHE_PORT=6379
keydb: cache:
image: eqalpha/keydb:latest image: valkey/valkey:latest
restart: unless-stopped restart: unless-stopped
``` ```
@@ -414,4 +415,4 @@ docker compose up -d
| Пауза 2 минуты между циклами | `./iptvc serve --check --playlists-all-cooldown 120` | | Пауза 2 минуты между циклами | `./iptvc serve --check --playlists-all-cooldown 120` |
| Подробные логи | `./iptvc serve --check --verbose` | | Подробные логи | `./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: Как работает сервис # :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. 3. В фоновом режиме [работает ПО](../overview.md), которое периодически [проверяет все плейлисты](checks.md) из п. 1 и **присваивает теги** каналам из п. 2.
4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами. 4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами.
5. Каждому плейлисту на сайте посвящена [своя страничка](details.md), где отображаются результаты его проверки, проверки его каналов (с присвоенными тегами) и пр. 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ок плейлистов. Ниже — спиcок плейлистов.
## Из чего состоит список ## Из чего состоит список
* **Код** — короткий уникальный [код плейлиста](../../ref/formats/playlists.md#code) * **Код** — короткий уникальный [код плейлиста](../../reference/formats/playlists.md#code)
* **Информация о плейлисте** * **Информация о плейлисте**
* [статус плейлиста](checks.md#playlists) * [статус плейлиста](checks.md#playlists)
* может быть [значок 18+](checks.md#adult) * может быть [значок 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>) * [иконки возможностей плейлиста](checks.md#extra) (только при статусе <span class="badge online">online</span>)
* [описание плейлиста](../../ref/formats/playlists.md#desc) (при наличии) * [описание плейлиста](../../reference/formats/playlists.md#desc) (при наличии)
* [список тегов](../../ref/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>) * [список тегов](../../reference/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
* ещё одна ссылка на [страницу плейлиста](details.md) * ещё одна ссылка на [страницу плейлиста](details.md)
* **Каналов** — фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах) * **Каналов** — фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах)
* **Ссылка для ТВ** — [короткая ссылка](details.md#shortlink), которую можно использовать для [подключения плейлиста](connect.md). * **Ссылка для ТВ** — [короткая ссылка](details.md#shortlink), которую можно использовать для [подключения плейлиста](connect.md).
@@ -26,7 +26,7 @@ tags: ["iptvc", "конфигурация"]
app: app:
timezone: GMT timezone: GMT
debug: false debug: false
log_level: info logLevel: info
playlists: ./playlists.ini playlists: ./playlists.ini
tags: ./channels.json tags: ./channels.json
@@ -35,13 +35,13 @@ server:
port: 8800 port: 8800
site: site:
base-url: http://localhost:8800 baseUrl: http://localhost:8800
title: IPTV Checker title: IPTV Checker
meta: meta:
description: Самообновляемые бесплатные IPTV-плейлисты для домашнего просмотра description: Самообновляемые бесплатные IPTV-плейлисты для домашнего просмотра
keywords: iptv,плейлисты,m3u keywords: iptv,плейлисты,m3u
repo-url: https://git.axenov.dev/IPTV repo-url: https://git.axenov.dev/IPTV
page-size: 0 pageSize: 0
favicon: favicon:
header: header:
menu: menu:
@@ -57,45 +57,45 @@ site:
raw: raw:
visible: true visible: true
legal: legal:
visible: true visible: false
text: | text: |
<p>Юридический текст с <a href="/terms">условиями использования</a>.</p> <p>Юридический текст с <a href="/terms">условиями использования</a>.</p>
check: check:
start-on-serve: false startOnServe: false
playlists: playlists:
user-agent: userAgent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer - Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10 # секунды timeout: 10
all-cooldown: 1800 # секунды allCooldown: 1800
one-cooldown: 2 # секунды oneCooldown: 2
max-routines: 1 maxRoutines: 1
per-routine: 1 perRoutine: 1
channels: channels:
user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer userAgent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10 # секунды timeout: 10
byte-range: 512 byteRange: 512
cooldown: 0 # секунды cooldown: 0
max-routines: 50 maxRoutines: 50
per-routine: 10 perRoutine: 10
cache: cache:
enabled: false enabled: true
host: localhost host: cache
port: 6379 port: 6379
username: username:
password: password:
db: 0 db: 0
ttl: 30 # секунды ttl: 3600
``` ```
Каждый параметр ниже описан отдельной секцией с указанием значения по умолчанию, переменной окружения и соответствующего CLI-флага. Каждый параметр ниже описан отдельной секцией с указанием значения по умолчанию, переменной окружения и соответствующего CLI-флага.
--- ---
## Секция `app` { id=app } ## Секция `app` { id="app" }
### `app.timezone` { id=app-timezone } ### `app.timezone` { id="app-timezone" }
<!-- md:default GMT --> <!-- md:default GMT -->
<!-- md:env APP_TIMEZONE --> <!-- md:env APP_TIMEZONE -->
@@ -104,7 +104,7 @@ cache:
--- ---
### `app.debug` { id=app-debug } ### `app.debug` { id="app-debug" }
<!-- md:default false --> <!-- md:default false -->
<!-- md:env APP_DEBUG --> <!-- 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:default info -->
<!-- md:env APP_LOG_LEVEL --> <!-- 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:default ./playlists.ini -->
<!-- md:env APP_PLAYLISTS --> <!-- md:env APP_PLAYLISTS -->
@@ -138,7 +138,7 @@ cache:
--- ---
### `app.tags` { id=app-tags } ### `app.tags` { id="app-tags" }
<!-- md:default ./channels.json --> <!-- md:default ./channels.json -->
<!-- md:env APP_TAGS --> <!-- 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:default -->
<!-- md:env SERVER_HOST --> <!-- md:env SERVER_HOST -->
@@ -165,7 +165,7 @@ cache:
--- ---
### `server.port` { id=server-port } ### `server.port` { id="server-port" }
<!-- md:default 8800 --> <!-- md:default 8800 -->
<!-- md:env SERVER_PORT --> <!-- 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:default http://localhost:8800 -->
<!-- md:env SITE_BASE_URL --> <!-- 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:default https://git.axenov.dev/IPTV -->
<!-- md:env SITE_REPO_URL --> <!-- 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:default 0 -->
<!-- md:env SITE_PAGE_SIZE --> <!-- md:env SITE_PAGE_SIZE -->
@@ -210,7 +210,7 @@ cache:
--- ---
### `site.favicon` { id=site-favicon } ### `site.favicon` { id="site-favicon" }
<!-- md:default --> <!-- md:default -->
<!-- md:env SITE_FAVICON --> <!-- 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-шаблонов. Мета-теги `<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:default IPTV Checker -->
<!-- md:env SITE_TITLE --> <!-- 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) в шапке сайта. Массив элементов [`Link`](#link) в шапке сайта.
--- ---
### `site.footer.links` { id=site-footer-links } ### `site.footer.links` { id="site-footer-links" }
Массив элементов [`Link`](#link) в подвале сайта. Массив элементов [`Link`](#link) в подвале сайта.
--- ---
### `site.tabs.raw.visible` { id=site-tabs-raw-visible } ### `site.tabs.raw.visible` { id="site-tabs-raw-visible" }
<!-- md:default true --> <!-- 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-контент вкладки «Юридическая информация». HTML-контент вкладки «Юридическая информация».
@@ -275,7 +275,7 @@ HTML-контент вкладки «Юридическая информация
--- ---
### Тип `Link` { id=link } ### Тип `Link` { id="link" }
Элемент навигации или подвала. Элемент навигации или подвала.
Если задано `children`, рендерится как выпадающее меню. Если задано `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:default false -->
<!-- md:env CHECK_START_ON_SERVE --> <!-- md:env CHECK_START_ON_SERVE -->
@@ -346,13 +346,13 @@ site:
--- ---
### `check.playlists` { id=check-playlists } ### `check.playlists` { id="check-playlists" }
Параметры проверки плейлистов (загрузка m3u-файлов по URL или из ФС). Параметры проверки плейлистов (загрузка 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 --> <!-- 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:default 10 -->
<!-- md:env CHECK_PLAYLISTS_TIMEOUT --> <!-- 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:default 1800 -->
<!-- md:env CHECK_PLAYLISTS_ALL_COOLDOWN --> <!-- 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:default 2 -->
<!-- md:env CHECK_PLAYLISTS_ONE_COOLDOWN --> <!-- 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:default 1 -->
<!-- md:env CHECK_PLAYLISTS_MAX_ROUTINES --> <!-- 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:default 1 -->
<!-- md:env CHECK_PLAYLISTS_PER_ROUTINE --> <!-- 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 --> <!-- 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:default 10 -->
<!-- md:env CHECK_CHANNELS_TIMEOUT --> <!-- 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:default 512 -->
<!-- md:env CHECK_CHANNELS_BYTE_RANGE --> <!-- 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:default 0 -->
<!-- md:env CHECK_CHANNELS_COOLDOWN --> <!-- 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:default 50 -->
<!-- md:env CHECK_CHANNELS_MAX_ROUTINES --> <!-- 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:default 10 -->
<!-- md:env CHECK_CHANNELS_PER_ROUTINE --> <!-- 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:env CACHE_ENABLED -->
<!-- md:arg --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:env CACHE_HOST -->
<!-- md:arg --cache-host --> <!-- md:arg --cache-host -->
Хост KeyDB/Redis. Хост кеша.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! info "Аргумент работает только для команд `check` и `serve --check`."
--- ---
### `cache.port` { id=cache-port } ### `cache.port` { id="cache-port" }
<!-- md:default 6379 --> <!-- md:default 6379 -->
<!-- md:env CACHE_PORT --> <!-- md:env CACHE_PORT -->
<!-- md:arg --cache-port --> <!-- md:arg --cache-port -->
Порт KeyDB/Redis. Порт кеша.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! info "Аргумент работает только для команд `check` и `serve --check`."
--- ---
### `cache.username` { id=cache-username } ### `cache.username` { id="cache-username" }
<!-- md:default --> <!-- md:default -->
<!-- md:env CACHE_USERNAME --> <!-- md:env CACHE_USERNAME -->
@@ -601,7 +601,7 @@ User-Agent для HTTP-запроса каждого канала каждого
--- ---
### `cache.password` { id=cache-password } ### `cache.password` { id="cache-password" }
<!-- md:default --> <!-- md:default -->
<!-- md:env CACHE_PASSWORD --> <!-- 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:default 0 -->
<!-- md:env CACHE_DB --> <!-- md:env CACHE_DB -->
<!-- md:arg --cache-db --> <!-- md:arg --cache-db -->
Номер логической базы данных в KeyDB/Redis. Номер логической базы данных в кеше.
!!! info "Аргумент работает только для команд `check` и `serve --check`." !!! 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:env CACHE_TTL -->
<!-- md:arg --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` — соответствующий раздел живёт в # нет страницы `/iptvc/config` — соответствующий раздел живёт в
# `content/common/config/config.md`. С `use_directory_urls = false` конечные # `content/common/config/config.md`. С `use_directory_urls = false` конечные
# ссылки должны включать `.html`. # ссылки должны включать `.html`.
CONFIG_PAGE = "/ref/config.html" CONFIG_PAGE = "/reference/config.html"
class BadgePreprocessor(Preprocessor): class BadgePreprocessor(Preprocessor):
+10 -5
View File
@@ -1,5 +1,10 @@
# https://zensical.org/docs/setup/basics # https://zensical.org/docs/setup/basics
# https://squidfunk.github.io/mkdocs-material/reference/icons-emojis/ # 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] [project]
site_name = "Документация m3u.su" site_name = "Документация m3u.su"
@@ -57,16 +62,16 @@ nav = [
]}, ]},
]}, ]},
{"Справочник" = [ {"Справочник" = [
"ref/config.md", "reference/config.md",
"ref/players.md", "reference/players.md",
# {"Для документации" = [ # {"Для документации" = [
# "iptvc/dev/docs/components.md", # "iptvc/dev/docs/components.md",
# "iptvc/dev/docs/codicons.md", # "iptvc/dev/docs/codicons.md",
# ]}, # ]},
{"Форматы файлов" = [ {"Форматы файлов" = [
"ref/formats/playlists.md", "reference/formats/playlists.md",
"ref/formats/channels.md", "reference/formats/channels.md",
"ref/formats/m3u.md", "reference/formats/m3u.md",
]}, ]},
]}, ]},
{"Дополнительно" = [ {"Дополнительно" = [