This commit is contained in:
2026-07-13 12:28:59 +08:00
parent 6c3de4b2ef
commit 5e3c1f7353
51 changed files with 9239 additions and 225 deletions
+215 -21
View File
@@ -5,30 +5,46 @@
Консольная программа для проверки IPTV-плейлистов в формате m3u или m3u8.
> **Веб-сайт:** [m3u.su](https://m3u.su)
> **Документация:** [m3u.su/docs](https://m3u.su/docs)
> Исходный код: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
> Документация: [m3u.su/docs](https://m3u.su/docs)
> Telegram-канал: [@iptv_aggregator](https://t.me/iptv_aggregator)
> Обсуждение: [@iptv_aggregator_chat](https://t.me/iptv_aggregator_chat)
> Бот: [@iptv_aggregator_bot](https://t.me/iptv_aggregator_bot)
> Исходный код: [git.axenov.dev/IPTV](https://git.axenov.dev/IPTV)
## Установка
Достаточно скачать и распаковать архив с подходящим исполняемым файлом [со страницы последнего релиза](https://git.axenov.dev/IPTV/iptvc/releases/latest):
| ОС | Скачать для `amd64` | Скачать для `arm64` |
| ------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| Linux | [linux_amd64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_amd64.zip) | [linux_arm64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_arm64.zip) |
| MacOS | [darwin_amd64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_amd64.zip) | [darwin_arm64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_arm64.zip) |
| Windows | [windows_amd64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_amd64.zip) | [windows_arm64.zip](https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_arm64.zip) |
| ОС | Скачать для `amd64` | Скачать для `arm64` |
| ------- | ---------------------------------- | ---------------------------------- |
| Linux | [linux_amd64.zip][linux_amd64] | [linux_arm64.zip][linux_arm64] |
| MacOS | [darwin_amd64.zip][darwin_amd64] | [darwin_arm64.zip][darwin_arm64] |
| Windows | [windows_amd64.zip][windows_amd64] | [windows_arm64.zip][windows_arm64] |
[linux_amd64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_amd64.zip
[darwin_amd64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_amd64.zip
[windows_amd64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_amd64.zip
[linux_arm64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/linux_arm64.zip
[darwin_arm64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/darwin_arm64.zip
[windows_arm64]: https://git.axenov.dev/IPTV/iptvc/releases/download/latest/windows_arm64.zip
## Компиляция
Для сборки потребуется golang v1.23.6 и выше.
На версиях ниже не проверялось.
Для сборки потребуется Go версии 1.23.6 или выше. Контейнерная сборка выполняется на Go 1.25.
1. Склонировать репозиторий
2. Находясь в корне репозитория, следует выполнить `make` или `make help` для получения справки.
3. Другой способ — выполнить `go run .` для быстрого запуска.
```bash
git clone https://git.axenov.dev/IPTV/iptvc.git
cd iptvc
make help
go build -o iptvc .
```
Для быстрого запуска из исходников используйте `go run .`. Для запуска тестов и статического анализа:
```bash
go test ./...
go vet ./...
```
Кросс-компиляция и упаковка релизов выполняются целями `make linux`, `make win`, `make darwin` и `make release`. Архивы создаются в каталоге `bin/`; архитектура задаётся переменной `GOARCH`, например `make linux GOARCH=arm64`.
## Быстрый старт
@@ -36,7 +52,7 @@
Выполнить `./iptvc help` для получения краткой справки.
Если был клонирован репозиторий, то вместо `./iptvc` можно запустить `go run .`
Если был клонирован репозиторий, то вместо `./iptvc` можно запустить `go run .` или `make help`.
Ниже рассмотрены простые примеры использования программы для проверки плейлистов.
@@ -66,13 +82,26 @@
Аргумент `-i` можно указывать только однажды, но его можно комбинировать с `-f` и `-u`.
### Другие возможности команды `check`
### Флаги команды `check`
* `--random|-r X` — проверить X случайных плейлистов из ini-файла
* `--json|-j` — вывести результаты проверки в формате JSON
* `--quiet|-q` — полностью подавить вывод лога (включая отладочную информацию)
* `--verbose|-v` — добавить в лог более подробную отладочную информацию (значительно увеличит количество строк!)
* `--tags|-t` — файл с перечислением тегов (подробности см. [здесь](https://git.axenov.dev/IPTV/playlists#файл-channelsjson))
Источники плейлистов:
* `--file|-f PATH` — локальный файл плейлиста M3U/M3U8; флаг можно указывать несколько раз;
* `--url|-u URL` — удалённый плейлист по HTTP/HTTPS; флаг можно указывать несколько раз;
* `--code|-c CODE` — код плейлиста из ini-файла; флаг можно указывать несколько раз;
* `--ini|-i PATH` — путь к ini-файлу;
* `--tags|-t PATH` — путь к файлу тегов каналов.
Управление выводом и повторными проверками:
* `--json|-j` — вывести результаты проверки в формате JSON;
* `--quiet|-q` — подавить журналы, не отключая вывод JSON;
* `--verbose|-v` — включить подробный журнал;
* `--random|-r N` — выбрать N случайных плейлистов из ini-файла;
* `--repeat N` — повторить проверку N раз, значение `0` означает бесконечный цикл;
* `--playlists-all-cooldown N` — ждать N миллисекунд между полными циклами проверки; значение также можно задать через `check.playlists.all-cooldown`.
Параметры проверки и кеша также можно переопределить CLI-флагами. Полный список доступен через `./iptvc check --help`.
Например, можно получить только json с результатами, передать его в `jq` и, отфильтровав результат, вывести названия оффлайн каналов:
@@ -83,6 +112,171 @@
> [!NOTE]
> Набери `./iptvc help` для получения помощи.
## Веб-интерфейс
Программа включает встроенный веб-сервер для просмотра плейлистов и результатов их проверки.
### Запуск
```
./iptvc serve -i playlists.ini -p 8800
```
### Параметры команды `serve`
* `-p, --port` — порт для веб-сервера (переопределяет `config.yml` и `SERVER_PORT`);
* `--host` — хост для привязки (переопределяет `config.yml` и `SERVER_HOST`);
* `--check` — включить фоновую проверку плейлистов (по умолчанию выключена).
При указании `--check` доступны флаги проверки:
* `-i, --ini` — путь к ini-файлу (по умолчанию `./playlists.ini`);
* `-t, --tags` — путь к файлу тегов (по умолчанию `./channels.json`);
* `-r, --random` — проверить N случайных плейлистов из ini-файла;
* `--playlists-all-cooldown N` — пауза между полными циклами проверки в миллисекундах; если флаг не указан, используется `check.playlists.all-cooldown` из конфигурации;
* `--repeat` — количество циклов проверки (по умолчанию `0` — бесконечно).
### Конфигурация
Приоритет настроек (от низшего к высшему):
1. **Значения по умолчанию** — встроены в код;
2. **`config.yml`** — YAML-файл в корне проекта (путь можно задать через флаг `--config`);
3. **Переменные окружения** — переопределяют значения из `config.yml` (если заданы);
4. **CLI-флаги** — переопределяют значения из окружения и `config.yml` (если заданы явно).
Флаги `--port` и `--host` переопределяют конфигурацию только если переданы явно.
Если флаг не указан, используется значение из переменной окружения, затем из `config.yml`,
затем значение по умолчанию.
Файл `.env` загружается автоматически, переменные из него применяются как переменные окружения.
#### `config.yml`
```yaml
app:
title: IPTV Checker
timezone: GMT
debug: false
log_level: info
server:
host: localhost
port: 8800
site:
base-url: http://localhost:8800
repo-url: https://git.axenov.dev/IPTV/iptvc
page-size: 0
favicon:
header:
title: IPTV Checker
navigation: []
footer-links: []
check:
start-on-serve: false
playlists:
user-agent:
- Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10000 # ms, максимальное время ожидания запроса
all-cooldown: 60000 # ms, пауза между полными циклами проверки
one-cooldown: 0 # ms, задержка после каждого плейлиста
max-routines: 5 # максимальное количество параллельных проверок
per-routine: 1 # количество плейлистов на одну процедуру
channels:
user-agent: Mozilla/5.0 WINK/1.31.1 (AndroidTV/9) HlsWinkPlayer
timeout: 10000 # ms, максимальное время ожидания запроса
byte-range: 512 # байт, объём данных для получения от сервера
cooldown: 0 # ms, задержка после каждого канала
max-routines: 50 # максимальное количество параллельных проверок
per-routine: 10 # количество каналов на одну процедуру
cache:
enabled: false
host: localhost
port: 6379
username:
password:
db: 1
ttl: 1800
```
`check.playlists.all-cooldown` задаёт паузу между полными циклами проверки. Она используется командами `check` и `serve` и больше не применяется дополнительно внутри одного цикла. `check.playlists.one-cooldown` задаёт паузу между отдельными плейлистами, а `check.channels.cooldown` — между каналами одного плейлиста.
Параметры задержек могут быть заданы как число или диапазон `[min, max]` в миллисекундах. При диапазоне для каждой операции выбирается случайное значение. `user-agent` может быть строкой или массивом строк; при массиве выбирается случайное значение. Остальные параметры задаются скалярами.
#### Переменные окружения
| Переменная | Соответствует в `config.yml` | Описание |
| ---------------- | ---------------------------- | ----------------------------------- |
| `APP_DEBUG` | `app.debug` | Режим отладки |
| `APP_TITLE` | `site.header.title` | Заголовок сайта |
| `APP_TIMEZONE` | `app.timezone` | Часовой пояс |
| `APP_URL` | `site.base-url` | Базовый URL для ссылок |
| `CACHE_ENABLED` | `cache.enabled` | Включить кеш (KeyDB/Redis) |
| `CACHE_HOST` | `cache.host` | Хост KeyDB/Redis |
| `CACHE_PORT` | `cache.port` | Порт KeyDB/Redis |
| `CACHE_USERNAME` | `cache.username` | Имя пользователя KeyDB/Redis |
| `CACHE_PASSWORD` | `cache.password` | Пароль KeyDB/Redis |
| `CACHE_DB` | `cache.db` | Номер БД KeyDB/Redis |
| `CACHE_TTL` | `cache.ttl` | TTL записей в кеше (сек) |
| `WEB_PORT` | `server.port` | Порт веб-сервера |
| `WEB_HOST` | `server.host` | Хост для привязки |
| `CHECK_PLAYLISTS_ALL_COOLDOWN` | `check.playlists.all-cooldown` | Пауза между циклами проверки (мс) |
| `CHECK_PLAYLISTS_ONE_COOLDOWN` | `check.playlists.one-cooldown` | Пауза между плейлистами (мс) |
| `CHECK_CHANNELS_COOLDOWN` | `check.channels.cooldown` | Пауза между каналами (мс) |
| `PAGE_SIZE` | `site.page-size` | Размер страницы (0 — без пагинации) |
| `REPO_URL` | `site.repo-url` | Ссылка на репозиторий |
### Маршруты
| Метод | Путь | Описание |
| ----- | ----------------------- | ---------------------------------------- |
| GET | `/` | Главная страница со списком плейлистов |
| GET | `/page/{N}` | Страница N списка плейлистов |
| GET | `/{code}` | Редирект на прямую ссылку плейлиста |
| GET | `/{code}.m3u[8]` | Редирект на прямую ссылку плейлиста |
| GET | `/{code}/details` | Страница с описанием плейлиста |
| GET | `/api/playlists/{code}` | JSON: информация о плейлисте |
| GET | `/api/version` | JSON: версии компонентов |
| GET | `/api/health` | JSON: состояние сервиса |
| GET | `/api/stats` | JSON: статистика по плейлистам и каналам |
### Связь с проверкой
Веб-сервер отображает данные из кеша KeyDB/Redis, который заполняется командой `check`.
Если кеш недоступен, все плейлисты отображаются со статусом `unknown`.
Для обновления данных в фоне запустите `serve` с флагом `--check`:
```
./iptvc serve -i playlists.ini -p 8800 --check
```
Результаты проверок появляются на веб-страницах немедленно после проверки каждого
плейлиста, не дожидаясь завершения полного цикла. После завершения цикла приложение
ждёт значение `check.playlists.all-cooldown` и затем начинает следующий цикл.
Можно запускать `serve` и `check` отдельными процессами:
```
./iptvc check --repeat 0 --playlists-all-cooldown 60000 &
./iptvc serve
```
Или используйте Docker Compose. Перед запуском подготовьте `.env`, `config.yml`, `playlists.ini` и `channels.json` в рабочем каталоге:
```bash
cp .env.example .env
cp config.yml.example config.yml
docker compose up -d --build
docker compose logs -f iptvc
docker compose down
```
Compose запускает сервисы `iptvc`, `keydb` и `docs`. В текущем `compose.yml` контексты сборки указаны как `./iptvc` и `./docs`, поэтому запуск из одного только каталога этого репозитория может потребовать внешней структуры проекта или корректировки контекстов.
## Результаты проверки
Программа логирует процесс и результаты своей работы.