wip7
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 57 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 61 KiB |
@@ -0,0 +1,14 @@
|
||||
---
|
||||
icon: material/television-play
|
||||
tags: ["плееры", "плейлисты"]
|
||||
---
|
||||
|
||||
# :material-television-play: Как подключить плейлист
|
||||
|
||||
1. Найти какой-нибудь [плеер](../../common/players.md)
|
||||
2. Узнать как в него добавить плейлист по ссылке
|
||||
3. Найти желаемый плелист из [списка](./list.md)
|
||||
4. Найти на странице ["Ссылку для ТВ"](details.md#shortlink) и ввести (скопировать) её в поле ввода адреса в плеере
|
||||
|
||||
Для некоторых [плееров](../../common/players.md) уже есть информация как добавить плейлист.
|
||||
|
||||
@@ -0,0 +1,191 @@
|
||||
---
|
||||
icon: material/upload-network
|
||||
tags: ["iptvc", "docker", "deploy"]
|
||||
---
|
||||
|
||||
# :material-upload-network: Развёртывание и доставка обновлений
|
||||
|
||||
В этом разделе описан фактический порядок настройки окружения `iptv` с приложением `iptvc`, хранилищем KeyDB и сайтом документации.
|
||||
|
||||
## Требования { id="requirements" }
|
||||
|
||||
- [Docker](https://docs.docker.com/engine/install/) с плагином `docker compose` версии 2
|
||||
- Git и доступ к репозиторию `git.axenov.dev/IPTV`
|
||||
- Права на запись в каталог данных KeyDB
|
||||
- Доступ к registry `git.axenov.dev`, если вы публикуете образ `iptvc`
|
||||
|
||||
!!! warning "Только docker compose v2"
|
||||
Используйте команду `docker compose`.
|
||||
Устаревшая команда `docker-compose` в этом сценарии не поддерживается.
|
||||
|
||||
## Подготовка репозитория { 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`, включая `APP_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
|
||||
```
|
||||
|
||||
Проверьте состояние контейнеров и журналы:
|
||||
|
||||
```bash
|
||||
docker compose ps
|
||||
docker compose logs -f iptvc
|
||||
```
|
||||
|
||||
Веб-интерфейс приложения доступен на `http://localhost:8800`.
|
||||
|
||||
Документация доступна на `http://localhost:8801`.
|
||||
|
||||
Для остановки окружения выполните:
|
||||
|
||||
```bash
|
||||
docker compose down
|
||||
```
|
||||
|
||||
## Сборка образа iptvc { id="image" }
|
||||
|
||||
Для публикации образа используйте скрипт `iptvc/build-docker-image.sh`.
|
||||
|
||||
Скрипт вычисляет версию из Git, собирает образы с тегами `iptvc:<тег>` и `git.axenov.dev/iptv/iptvc:<тег>`, а затем отправляет registry-тег в registry:
|
||||
|
||||
```bash
|
||||
cd iptvc
|
||||
./build-docker-image.sh latest
|
||||
```
|
||||
|
||||
Для публикации релизного тега:
|
||||
|
||||
```bash
|
||||
./build-docker-image.sh v1.2.3
|
||||
```
|
||||
|
||||
По умолчанию скрипт собирает Linux-образ для `amd64`.
|
||||
|
||||
Платформу можно изменить переменными окружения:
|
||||
|
||||
```bash
|
||||
GOOS=linux GOARCH=arm64 ./build-docker-image.sh v1.2.3
|
||||
```
|
||||
|
||||
Перед публикацией войдите в registry, если это требуется вашей настройкой:
|
||||
|
||||
```bash
|
||||
docker login git.axenov.dev
|
||||
```
|
||||
|
||||
!!! warning "Рабочее дерево Git"
|
||||
Скрипт переключается на Git-тег, переданный первым аргументом, или на тег, возвращённый `git describe`.
|
||||
Перед запуском сохраните локальные изменения и убедитесь, что нужный тег существует.
|
||||
|
||||
## Обновление { id="update" }
|
||||
|
||||
После изменения конфигурации или исходного кода пересоберите и перезапустите сервисы:
|
||||
|
||||
```bash
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Чтобы пересобрать только приложение `iptvc`:
|
||||
|
||||
```bash
|
||||
docker compose build iptvc
|
||||
docker compose up -d iptvc
|
||||
```
|
||||
|
||||
Чтобы использовать опубликованный образ вместо локальной сборки, загрузите его и пересоздайте сервис:
|
||||
|
||||
```bash
|
||||
docker compose pull iptvc
|
||||
docker compose up -d iptvc
|
||||
```
|
||||
|
||||
Обновление документации выполняется пересборкой сервиса `docs`:
|
||||
|
||||
```bash
|
||||
docker compose build docs
|
||||
docker compose up -d docs
|
||||
```
|
||||
|
||||
## Диагностика { id="diagnostics" }
|
||||
|
||||
Для просмотра журналов отдельных сервисов используйте:
|
||||
|
||||
```bash
|
||||
docker compose logs -f iptvc
|
||||
docker compose logs -f keydb
|
||||
docker compose logs -f docs
|
||||
```
|
||||
|
||||
Для проверки конфигурации Compose выполните:
|
||||
|
||||
```bash
|
||||
docker compose config
|
||||
```
|
||||
|
||||
Если `iptvc` не подключается к кешу, проверьте, что в `.env` параметр `CACHE_HOST` имеет значение `keydb`, а сервис `keydb` запущен.
|
||||
@@ -0,0 +1,136 @@
|
||||
---
|
||||
icon: material/table-eye
|
||||
tags: ["сайт", "статусы", "каналы"]
|
||||
---
|
||||
|
||||
# :material-table-eye: Страница плейлиста
|
||||
|
||||
Страница содержит подробности об одном конкретном плейлисте.
|
||||
|
||||
В её заголовке указано [название плейлиста](../../common/formats/playlists.md#name).
|
||||
|
||||
Ниже страница разделена на две части: слева две вкладки с информацией и список каналов справа.
|
||||
|
||||
Рассмотрим всё это подробнее.
|
||||
|
||||
## Вкладка "Основная информация"
|
||||
|
||||

|
||||
|
||||
На этой вкладке выводится таблица со следующими строками:
|
||||
|
||||
* **Код** — короткий уникальный [код плейлиста](../../common/formats/playlists.md#code);
|
||||
* **Описание** — [описание плейлиста](../../common/formats/playlists.md#desc) (при наличии);
|
||||
* **Ccылка для ТВ** — короткая ссылка, которую можно использовать для [подключения плейлиста](connect.md), подробнее о ней см. ниже;
|
||||
* **Источник** — [ссылка на ресурс](../../common/formats/playlists.md#src), где была найдена ссылка на плейлист (при наличии);
|
||||
* **Наполнение**:
|
||||
* группы — количество групп, на которые поделены каналы;
|
||||
* каналы — количества каналов общее, онлайн и оффлайн;
|
||||
(всё по нулям, если плейлист <span class="badge offline">offline</span>)
|
||||
* **Возможности** — наличие программы передач и перемотки каналов;
|
||||
* **M3U** — [прямая ссылка](../../common/formats/playlists.md#pls) на плейлист;
|
||||
* **Проверка плейлиста** — дата и время последней [проверки](../../aggregator/checks.md) плейлиста с помощью [iptvc](../overview.md);
|
||||
* **Ошибка проверки** — текст ошибки, которая возникла при проверке
|
||||
(только если плейлист <span class="badge offline">offline</span>)
|
||||
|
||||
Если при проверке плейлиста возникла ошибка, то она будет отображена красным цветом сразу под заголовком:
|
||||
|
||||
??? quote "Скриншот страницы с ошибкой"
|
||||

|
||||
|
||||
!!! info
|
||||
Если в тексте ошибки фигурирует слово `Timeout` и плейлист <span class="badge offline">offline</span> — это ерунда.
|
||||
Скорее всего, при следующей проверке статус позеленеет.
|
||||
Просто в момент проверки сервер не получил файл плейлиста вовремя, а т. к. долго ждать он не может, поэтому плюнул и пошёл проверять другие.
|
||||
|
||||
!!! info "Обрати внимание"
|
||||
Независимо от статуса плейлиста на сайте, его можно добавить в свой плеер по "Ссылке для ТВ" и проверить самостоятельно.
|
||||
Проверка плейлиста не влияет на его работоспособность.
|
||||
|
||||
## Вкладка "Исходный текст"
|
||||
|
||||

|
||||
|
||||
Здесь выводится плейлист как он есть.
|
||||
Над этим текстом — две кнопки:
|
||||
|
||||
* зелёная с кодом плейлиста для скачивания файла;
|
||||
* нажатие на **QR-код** покажет, внезапно, QR-код, в который закодирована "Ссылка для ТВ".
|
||||
|
||||
## Список каналов
|
||||
|
||||
В заголовке пишется их общее количество.
|
||||
|
||||

|
||||
|
||||
В списке всегда отображается не более 100 каналов.
|
||||
|
||||
Воспользуйтесь поиском, чтобы найти интересующий.
|
||||
|
||||
### Поиск каналов
|
||||
|
||||
Количество плейлистов в заголовке над списком учитывает найденные с помощью фильтров каналы.
|
||||
|
||||
Под заголовком есть **выпадающий список групп**.
|
||||
Он отображается только если плейлист поделён на группы.
|
||||
Справа — **кнопка сброса** для отображения всех каналов.
|
||||
|
||||
Под списком групп расположилась **строка поиска**.
|
||||
Она есть вообще всегда.
|
||||
Туда можно начать вводить название канала, и по мере ввода список будет сужаться.
|
||||
|
||||
Справа от строки поиска есть **кнопки фильтрации каналов по их статусу**.
|
||||
Справа — **кнопка сброса** для отображения всех каналов.
|
||||
|
||||
Под строкой поиска есть [**облако тегов**](../../common/formats/channels.md#доступные-теги).
|
||||
|
||||
!!! question inline end "Про теги"
|
||||
Откуда они там появляются, можешь прочесть [здесь](../../common/index.md) и [здесь](../overview.md).
|
||||
|
||||
На любой из них можно нажать, и тогда в списке останутся каналы только с выбранными тегами.
|
||||
Выбранные теги подсвечиваются серым.
|
||||
**Сбросить** выбор можно повторным нажатием на каждый, либо кнопкой сброса у строки поиска.
|
||||
|
||||
??? quote "Пример фильтрации"
|
||||

|
||||
|
||||
## Ссылка для ТВ { id="shortlink" }
|
||||
|
||||
Она может быть задана в нескольких форматах.
|
||||
Поясню базовые принципы формирования адреса:
|
||||
|
||||
1. необязателен префикс протокола `http://` или `https://` перед доменом
|
||||
2. обязателен домен `m3u.su`
|
||||
3. обязателен `/код` плейлиста после домена
|
||||
4. необязателен суффикс расширения после кода `.m3u` или `.m3u8`
|
||||
|
||||
На примере ниже я наглядно покажу все возможные ссылки на один и тот же плейлист с кодом `ru`:
|
||||
|
||||
```
|
||||
https://m3u.su/ru.m3u8
|
||||
https://m3u.su/ru.m3u
|
||||
https://m3u.su/ru
|
||||
http://m3u.su/ru.m3u8
|
||||
http://m3u.su/ru.m3u
|
||||
http://m3u.su/ru
|
||||
m3u.su/ru.m3u8
|
||||
m3u.su/ru.m3u
|
||||
m3u.su/ru
|
||||
```
|
||||
|
||||
!!! info "Адрес может быть любым"
|
||||
Смотря как будет развёрнут сайт, ты можешь заходить на localhost, либо по прямому IP-адресу или доменному имения.
|
||||
См. раздел [**Развёртывание**](deploy.md) для подробностей.
|
||||
|
||||
По идее, можешь использовать любую ссылку из подобных, т. к. технически они отработают одинаково.
|
||||
|
||||
А вот твой [плеер](../../common/players.md) может не принять какую-то из них.
|
||||
Так что, если не подойдёт один формат, используй другой — добавь префикс или суффикс.
|
||||
|
||||
Префикс плееру требуется чаще всего, потому что он при добавлении плейлиста проверяет — а ссылку ли мне вообще предоставил пользователь?
|
||||
|
||||
По наличию суффикса плеер может определить — а прямая ли это ссылка на файл плейлиста?
|
||||
Технически — нет, непрямая, потому что файла плейлиста у меня на сервере нет физически и сервер должен сделать редирект уже на сам плейлист.
|
||||
Но благодаря такой обманке плеер его наверняка подгрузит.
|
||||
|
||||
Или нет.
|
||||
@@ -0,0 +1,415 @@
|
||||
---
|
||||
title: Первые шаги
|
||||
icon: material/rocket-launch
|
||||
tags: ["iptvc", "serve", "сайт"]
|
||||
---
|
||||
|
||||
# :material-rocket-launch: Первые шаги для запуска сайта
|
||||
|
||||
В этой статье мы шаг за шагом запустим собственный сайт-агрегатор IPTV-плейлистов — от простейшего варианта до полной конфигурации с кешем и тонкой настройкой проверки.
|
||||
|
||||
Программа `iptvc` уже должна быть [установлена](../install.md).
|
||||
Все команды ниже выполняются в терминале из директории, где лежит бинарник.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 1. Запускаем пустой сайт
|
||||
|
||||
Минимальный запуск — одна команда:
|
||||
|
||||
```bash
|
||||
./iptvc serve
|
||||
```
|
||||
|
||||
Сайт откроется на `http://localhost:8080`.
|
||||
Это пустая страница: нет ни одного плейлиста, потому что программе пока неоткуда их взять.
|
||||
|
||||
Чтобы изменить порт или хост, не трогая файл конфигурации:
|
||||
|
||||
```bash
|
||||
./iptvc serve -p 3000 --host 0.0.0.0
|
||||
```
|
||||
|
||||
Подробнее об этих флагах — в [документации команды `serve`](../commands/serve.md).
|
||||
|
||||
---
|
||||
|
||||
## Шаг 2. Добавляем плейлисты
|
||||
|
||||
Список плейлистов описывается в файле [`playlists.ini`](../../common/formats/playlists.md).
|
||||
Создадим его рядом с `iptvc`:
|
||||
|
||||
```ini title="playlists.ini"
|
||||
[ru]
|
||||
name = Российские каналы
|
||||
desc = Основные федеральные каналы
|
||||
pls = 'https://example.com/ru.m3u'
|
||||
src = 'https://example.com/ru-playlist'
|
||||
|
||||
[movies]
|
||||
name = Фильмы
|
||||
pls = 'https://example.com/movies.m3u'
|
||||
```
|
||||
|
||||
Каждая секция `[code]` — это плейлист.
|
||||
Код используется в коротких ссылках вида `http://localhost:8080/ru`.
|
||||
Параметр `pls` обязателен, остальные — по желанию.
|
||||
|
||||
Теперь запустим:
|
||||
|
||||
```bash
|
||||
./iptvc serve
|
||||
```
|
||||
|
||||
Сайт покажет оба плейлиста, но их статус — `unknown` (неизвестно).
|
||||
Это нормально: программа знает о них, но ещё не проверяла.
|
||||
Чтобы статусы появились, нужно включить фоновую проверку.
|
||||
|
||||
!!! tip "Путь к ini-файлу"
|
||||
Если файл лежит не рядом с программой, укажите путь через флаг [`-i`](../commands/serve.md#ini) или в [`config.yml`](../../common/config/config.md) → `app.playlists`.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 3. Включаем фоновую проверку
|
||||
|
||||
Без проверки сайт просто показывает список.
|
||||
Чтобы плейлисты и каналы проверялись автоматически, добавим флаг `--check`:
|
||||
|
||||
```bash
|
||||
./iptvc serve --check
|
||||
```
|
||||
|
||||
Теперь программа в фоне загружает каждый плейлист, парсит каналы и проверяет их доступность.
|
||||
Результаты сразу попадают в оперативную память и отображаются на сайте.
|
||||
|
||||
Можно настроить интервал между циклами проверки:
|
||||
|
||||
```bash
|
||||
# пауза 120 секунд между циклами, бесконечно
|
||||
./iptvc serve --check --playlists-all-cooldown 120000
|
||||
|
||||
# проверить один раз и остановить
|
||||
./iptvc serve --check --repeat 1
|
||||
```
|
||||
|
||||
Если не хочется каждый раз писать `--check`, можно включить проверку через [`config.yml`](../../common/config/config.md):
|
||||
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
start-on-serve: true
|
||||
```
|
||||
|
||||
Тогда обычный `./iptvc serve` автоматически запустит фоновую проверку.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 4. Настраиваем внешний вид сайта
|
||||
|
||||
Сайт можно настроить под себя: заголовок, иконку, навигацию в шапке и ссылки в подвале.
|
||||
Всё это — в секции [`site`](../../common/config/config.md) файла `config.yml`.
|
||||
|
||||
```yaml title="config.yml"
|
||||
site:
|
||||
base-url: http://localhost:8080
|
||||
repo-url: https://git.axenov.dev/IPTV
|
||||
page-size: 20 # пагинация по 20 плейлистов на страницу (0 — без пагинации)
|
||||
favicon: /favicon.ico # путь к иконке
|
||||
header:
|
||||
title: Мой IPTV # заголовок в шапке и вкладке браузера
|
||||
navigation:
|
||||
- title: Документация
|
||||
url: /docs
|
||||
icon: document-text-outline
|
||||
- title: Telegram
|
||||
icon: paper-plane-outline
|
||||
children:
|
||||
- title: Канал
|
||||
url: https://t.me/my_channel
|
||||
icon: megaphone-outline
|
||||
- title: Чат
|
||||
url: https://t.me/my_chat
|
||||
icon: chatbubbles-outline
|
||||
footer-links:
|
||||
- title: Исходники
|
||||
url: https://git.axenov.dev/IPTV
|
||||
icon: code-slash-outline
|
||||
- title: Мой сайт
|
||||
url: https://example.com
|
||||
icon: person-outline
|
||||
```
|
||||
|
||||
--8<-- "ionicons-name.md"
|
||||
|
||||
!!! note "base-url"
|
||||
Параметр `base-url` используется для формирования внутренних ссылок.
|
||||
Если публикуете сайт на домене, укажите его здесь, например `https://my-iptv.ru`.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 5. Добавляем теги каналам
|
||||
|
||||
Теги помогают посетителям находить каналы по темам: спорт, фильмы, музыка и так далее.
|
||||
Правила описываются в файле [`channels.json`](../../common/formats/channels.md).
|
||||
|
||||
```json title="channels.json"
|
||||
[
|
||||
{
|
||||
"tvg-id": "^ru-",
|
||||
"tags": ["russian"]
|
||||
},
|
||||
{
|
||||
"title": "спорт",
|
||||
"tags": ["sport"]
|
||||
},
|
||||
{
|
||||
"title": "кино|фильм",
|
||||
"tags": ["film"]
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
Путь к файлу указывается в [`config.yml`](../../common/config/config.md) → `app.tags` или через флаг [`-t`](../commands/serve.md#tags):
|
||||
|
||||
```bash
|
||||
./iptvc serve --check -t /path/to/channels.json
|
||||
```
|
||||
|
||||
Полный список доступных тегов — в [справочнике по channels.json](../../common/formats/channels.md#доступные-теги).
|
||||
|
||||
---
|
||||
|
||||
## Шаг 6. Подключаем кеш (KeyDB/Redis)
|
||||
|
||||
По умолчанию результаты проверки хранятся только в оперативной памяти.
|
||||
Если программу перезапустить — все результаты пропадут, и плейлисты снова станут `unknown` до следующей проверки.
|
||||
|
||||
Кеш решает эту проблему: результаты сохраняются в KeyDB (или Redis) и переживают перезапуск.
|
||||
Включается одной строкой в [`config.yml`](../../common/config/config.md):
|
||||
|
||||
```yaml title="config.yml"
|
||||
cache:
|
||||
enabled: true
|
||||
host: localhost
|
||||
port: 6379
|
||||
ttl: 1800 # секунды (30 минут)
|
||||
```
|
||||
|
||||
Или через переменные окружения:
|
||||
|
||||
```bash
|
||||
CACHE_ENABLED=true CACHE_TTL=3600 ./iptvc serve --check
|
||||
```
|
||||
|
||||
Или через флаги:
|
||||
|
||||
```bash
|
||||
./iptvc serve --check --cache-enabled --cache-host 192.168.1.10 --cache-ttl 3600
|
||||
```
|
||||
|
||||
!!! tip "KeyDB или Redis"
|
||||
KeyDB — это форк Redis, полностью совместимый по протоколу.
|
||||
Подойдёт любой из них.
|
||||
Если кеш включён, но сервер недоступен — сайт продолжит работать, просто без кеширования.
|
||||
|
||||
---
|
||||
|
||||
## Шаг 7. Тонкая настройка проверки
|
||||
|
||||
Когда плейлистов много, полезно управлять параллелизмом, таймаутами и задержками.
|
||||
Все параметры — в секции [`check`](../../common/config/config.md) файла `config.yml`.
|
||||
|
||||
### Параллелизм
|
||||
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
playlists:
|
||||
max-routines: 10 # сколько плейлистов проверять одновременно
|
||||
per-routine: 5 # сколько плейлистов в одной процедуре
|
||||
channels:
|
||||
max-routines: 100 # сколько каналов проверять одновременно
|
||||
per-routine: 20 # сколько каналов в одной процедуре
|
||||
```
|
||||
|
||||
Чем больше значения — тем быстрее проверка, но выше нагрузка на процессор и сеть.
|
||||
Начните со значений по умолчанию и увеличивайте при необходимости.
|
||||
|
||||
### Таймауты
|
||||
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
playlists:
|
||||
timeout: 10000 # мс на загрузку плейлиста
|
||||
channels:
|
||||
timeout: 10000 # мс на проверку одного канала
|
||||
byte-range: 512 # сколько байт скачать от сервера канала
|
||||
```
|
||||
|
||||
Если плейлисты или каналы медленные, увеличьте `timeout`.
|
||||
Если сервер блокирует большие запросы — уменьшите `byte-range`.
|
||||
|
||||
### Задержки (cooldown)
|
||||
|
||||
Чтобы не перегружать серверы-источники, между проверками можно делать паузы.
|
||||
Параметры поддерживают как фиксированное значение, так и диапазон `[min, max]` — тогда пауза будет случайной при каждом проходе:
|
||||
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
playlists:
|
||||
all-cooldown: 5000 # 5 секунд после всех плейлистов
|
||||
one-cooldown: [1000, 3000] # 1–3 секунды после каждого плейлиста
|
||||
channels:
|
||||
cooldown: [100, 500] # 100–500 мс после каждого канала
|
||||
```
|
||||
|
||||
### User-Agent
|
||||
|
||||
Некоторые серверы блокируют запросы без правильного User-Agent.
|
||||
Можно указать один или несколько — тогда при каждом запросе будет выбран случайный:
|
||||
|
||||
```yaml title="config.yml"
|
||||
check:
|
||||
playlists:
|
||||
user-agent:
|
||||
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
|
||||
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
channels:
|
||||
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
```
|
||||
|
||||
Все эти параметры можно также задавать через [переменные окружения](../../common/config/config.md) или [CLI-флаги](../commands/serve.md) — они имеют наивысший приоритет.
|
||||
|
||||
---
|
||||
|
||||
## Полный пример
|
||||
|
||||
Соберём всё вместе в одном `config.yml`:
|
||||
|
||||
```yaml title="config.yml"
|
||||
app:
|
||||
timezone: GMT+3
|
||||
debug: false
|
||||
log_level: info
|
||||
playlists: ./playlists.ini
|
||||
tags: ./channels.json
|
||||
|
||||
server:
|
||||
host: 0.0.0.0
|
||||
port: 8080
|
||||
|
||||
site:
|
||||
base-url: https://my-iptv.ru
|
||||
repo-url: https://git.axenov.dev/IPTV
|
||||
page-size: 20
|
||||
favicon: /favicon.ico
|
||||
header:
|
||||
title: Мой IPTV
|
||||
navigation:
|
||||
- title: Статус
|
||||
url: https://status.my-iptv.ru
|
||||
icon: pulse-outline
|
||||
- title: Документация
|
||||
url: /docs
|
||||
icon: document-text-outline
|
||||
- title: Telegram
|
||||
icon: paper-plane-outline
|
||||
children:
|
||||
- title: Канал
|
||||
url: https://t.me/my_channel
|
||||
icon: megaphone-outline
|
||||
- title: Чат
|
||||
url: https://t.me/my_chat
|
||||
icon: chatbubbles-outline
|
||||
footer-links:
|
||||
- title: Исходники
|
||||
url: https://git.axenov.dev/IPTV
|
||||
icon: code-slash-outline
|
||||
- title: Контакты
|
||||
url: https://example.com
|
||||
icon: person-outline
|
||||
|
||||
check:
|
||||
start-on-serve: true
|
||||
playlists:
|
||||
user-agent:
|
||||
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
|
||||
- Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
timeout: 10000
|
||||
all-cooldown: 5000
|
||||
one-cooldown: [1000, 3000]
|
||||
max-routines: 10
|
||||
per-routine: 5
|
||||
channels:
|
||||
user-agent: Mozilla/5.0 (Linux; Android 11) AppleWebKit/537.36
|
||||
timeout: 10000
|
||||
byte-range: 512
|
||||
cooldown: [100, 500]
|
||||
max-routines: 100
|
||||
per-routine: 20
|
||||
|
||||
cache:
|
||||
enabled: true
|
||||
host: localhost
|
||||
port: 6379
|
||||
ttl: 3600
|
||||
```
|
||||
|
||||
Запуск:
|
||||
|
||||
```bash
|
||||
./iptvc serve
|
||||
```
|
||||
|
||||
Поскольку `start-on-serve: true`, фоновая проверка запустится автоматически.
|
||||
Кеш включён, так что результаты переживут перезапуск.
|
||||
Сайт доступен на `http://0.0.0.0:8080`.
|
||||
|
||||
---
|
||||
|
||||
## Docker
|
||||
|
||||
Удобно запускать сайт в контейнере. Образ `iptvc` уже включает бинарник:
|
||||
|
||||
```yaml title="compose.yml"
|
||||
services:
|
||||
iptvc:
|
||||
image: git.axenov.dev/iptv/iptvc:latest
|
||||
command: [serve]
|
||||
ports:
|
||||
- "8080:8080"
|
||||
volumes:
|
||||
- ./config.yml:/app/config.yml:ro
|
||||
- ./playlists.ini:/app/playlists.ini:ro
|
||||
- ./channels.json:/app/channels.json:ro
|
||||
environment:
|
||||
- CHECK_START_ON_SERVE=true
|
||||
- CACHE_ENABLED=true
|
||||
- CACHE_HOST=keydb
|
||||
- CACHE_PORT=6379
|
||||
|
||||
keydb:
|
||||
image: eqalpha/keydb:latest
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Подробнее об установке образа — в [документации по установке](../install.md).
|
||||
|
||||
---
|
||||
|
||||
## Краткая шпаргалка
|
||||
|
||||
| Задача | Как |
|
||||
| ----------------------------- | ------------------------------------------------------- |
|
||||
| Запустить сайт | `./iptvc serve` |
|
||||
| С проверкой плейлистов | `./iptvc serve --check` |
|
||||
| На другом порту | `./iptvc serve -p 3000` |
|
||||
| С ini-файлом из другого места | `./iptvc serve -i /path/to/playlists.ini` |
|
||||
| С кешем | `./iptvc serve --check --cache-enabled` |
|
||||
| Один цикл проверки | `./iptvc serve --check --repeat 1` |
|
||||
| Пауза 2 минуты между циклами | `./iptvc serve --check --playlists-all-cooldown 120000` |
|
||||
| Подробные логи | `./iptvc serve --check --verbose` |
|
||||
|
||||
Полный список параметров — в [справочнике по `config.yml`](../../common/config/config.md), [переменным окружения](../../common/config/config.md) и [команде `serve`](../commands/serve.md).
|
||||
@@ -0,0 +1,16 @@
|
||||
---
|
||||
icon: material/cogs
|
||||
tags: ["плейлисты", "каналы", "теги", "iptvc", "плееры", "сайт"]
|
||||
---
|
||||
|
||||
# :material-cogs: Как работает сервис
|
||||
|
||||
1. В специальном файле [playlists.ini](../../common/formats/playlists.md) описываются плейлисты, которые кем-то опубликованы в интернете.
|
||||
Каждому плейлисту присваивается свой уникальный **короткий код**.
|
||||
2. В специальном файле [channels.json](../../common/formats/channels.md) описываются **ключевые слова** (метки, теги), которые характеризуют каналы.
|
||||
3. В фоновом режиме [работает ПО](../overview.md), которое периодически [проверяет все плейлисты](../../aggregator/checks.md) из п. 1 и **присваивает теги** каналам из п. 2.
|
||||
4. На главной странице сайта выводится [весь список плейлистов](list.md), которые описаны в п. 1: с тегами, описаниями и короткими кодами.
|
||||
5. Каждому плейлисту на сайте посвящена [своя страничка](details.md), где отображаются результаты его проверки, проверки его каналов (с присвоенными тегами) и пр.
|
||||
6. Когда пользователь [обращается к плейлисту](connect.md) по короткому коду (например, `https://m3u.su/xyz`), то происходит **переадресация** на исходный плейлист.
|
||||
|
||||
Более подробную информацию ты можешь прочесть в соответствующих разделах документации.
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
icon: fontawesome/solid/list-check
|
||||
tags: ["сайт", "плейлисты"]
|
||||
---
|
||||
|
||||
# :fontawesome-solid-list-check: Список плейлистов
|
||||
|
||||
Это главная страница сайта.
|
||||
|
||||

|
||||
|
||||
Наверху отображаются:
|
||||
|
||||
* дата последнего изменения файла [playlists.ini](../../common/formats/playlists.md)
|
||||
* общее количество плейлистов и с разделением по статусам.
|
||||
|
||||
Ниже — спиcок плейлистов.
|
||||
|
||||
## Из чего состоит список
|
||||
|
||||
* **Код** — короткий уникальный [код плейлиста](../../common/formats/playlists.md#code)
|
||||
* **Информация о плейлисте**
|
||||
* [статус плейлиста](../../aggregator/checks.md#playlists)
|
||||
* может быть [значок 18+](../../aggregator/checks.md#adult)
|
||||
* [название плейлиста](../../common/formats/playlists.md#name) — ссылка на [страницу плейлиста](details.md)
|
||||
под ним:
|
||||
* [иконки возможностей плейлиста](../../aggregator/checks.md#extra) (только при статусе <span class="badge online">online</span>)
|
||||
* [описание плейлиста](../../common/formats/playlists.md#desc) (при наличии)
|
||||
* [список тегов](../../common/formats/channels.md#доступные-теги), собранный со всех каналов после их проверки (только при статусе <span class="badge online">online</span>)
|
||||
* ещё одна ссылка на [страницу плейлиста](details.md)
|
||||
* **Каналов** — фактическое количество каналов в плейлисте (только при статусе <span class="badge online">online</span>) или 0 (при других статусах)
|
||||
* **Ссылка для ТВ** — [короткая ссылка](details.md#shortlink), которую можно использовать для [подключения плейлиста](connect.md).
|
||||
|
||||
В зависимости от ширины экрана, для экономии места может быть скрыто описание с иконками возможностей и короткая ссылка.
|
||||
|
||||

|
||||