Files
iptvc/AGENTS.md
T
2026-07-19 19:14:55 +08:00

207 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Инструкции для работы с репозиторием
## Обзор проекта
`iptvc` (IPTV Checker) — консольное приложение на Go для проверки IPTV-плейлистов в форматах M3U/M3U8. Программа умеет загружать плейлисты из локальных файлов, по URL и из ini-файла, проверять доступность плейлистов и отдельных каналов, выводить результаты в журнале или JSON, а также запускать встроенный веб-интерфейс.
Проект является частью экосистемы `m3u.su`. Исходный код размещается на Gitea: `https://git.axenov.dev/IPTV/iptvc`.
Основные технологии:
- Go 1.23.6 или новее согласно `go.mod` и README.
- Cobra для CLI-команд и флагов.
- YAML для конфигурации.
- INI для списка плейлистов.
- Redis/KeyDB через `github.com/redis/go-redis/v9` для кеширования результатов.
- `godotenv` для автоматической загрузки `.env`.
- Docker и Docker Compose для контейнерного запуска.
- Встроенный HTTP-веб-сервер для просмотра плейлистов и результатов проверки.
## Структура репозитория
- `main.go` — минимальная точка входа, передающая управление в пакет `cmd`.
- `cmd/` — CLI-слой на Cobra: корневая команда, команды `check` и `serve`, флаги, версия и тесты флагов.
- `app/` — прикладная логика приложения.
- `app/checker/` — подготовка и проверка плейлистов и каналов.
- `app/cache/` — абстракции и работа с кешем.
- `app/config/` — структуры конфигурации, значения по умолчанию, YAML и переменные окружения.
- `app/inifile/` — чтение ini-файлов со списками плейлистов.
- `app/playlist/` — модели и обработка IPTV-плейлистов.
- `app/tagfile/` — чтение файла тегов каналов.
- `app/web/` — веб-сервер, маршруты и отображение данных.
- `app/logger/` — настройка журналирования.
- `app/utils/` — вспомогательные функции.
- `cmd/keydb/` — вспомогательные материалы для KeyDB, если используются соответствующие компоненты.
- `docker/keydb/` — конфигурация и entrypoint для контейнера KeyDB.
- `channels.json` — пример или локальный файл тегов каналов.
- `config.yml.example` — пример конфигурации приложения.
- `.env.example` — пример переменных окружения.
- `compose.yml` — окружение из приложения, документации и KeyDB.
- `Dockerfile` — многоэтапная сборка бинарного файла и минимального Alpine-образа.
- `Makefile` — очистка, кросс-компиляция и сборка релизных архивов.
- `README.md` — пользовательская документация, команды запуска, конфигурация и API-маршруты.
- `LICENSE` — лицензия MIT.
## Архитектура и поток выполнения
1. `main.go` вызывает `cmd.Execute()`.
2. `cmd/root.go` регистрирует глобальные флаги и дочерние Cobra-команды.
3. Команда `check` инициализирует приложение, применяет CLI-переопределения, подключает кеш, получает плейлисты и запускает проверку.
4. Команда `serve` поднимает веб-сервер и при необходимости запускает фоновую проверку через флаг `--check` или настройку `check.start-on-serve`.
5. Конфигурация загружается со следующим приоритетом: встроенные значения по умолчанию, `config.yml`, переменные окружения и явно переданные CLI-флаги.
6. Результаты проверки могут сохраняться в KeyDB/Redis и отображаться веб-сервером. При недоступном кеше веб-интерфейс показывает неизвестный статус.
Не следует помещать бизнес-логику в `main.go` или CLI-команды, если её можно разместить в соответствующем пакете `app/`. CLI-слой должен отвечать за разбор аргументов, инициализацию и координацию прикладных компонентов.
## Сборка и запуск
Для локальной разработки требуется Go версии 1.23.6 или новее. В `Dockerfile` используется `golang:1.25-alpine`, поэтому контейнерная сборка ориентируется на Go 1.25.
Основные команды:
```bash
# Показать доступные цели Makefile
make help
# Быстро запустить приложение из исходников
go run .
# Запустить CLI-справку
go run . help
# Проверить локальный плейлист
go run . check -f mypls.m3u
# Проверить плейлист по URL
go run . check -u https://example.com/playlist.m3u
# Запустить веб-интерфейс на порту 8800
go run . serve -p 8800
# Запустить веб-интерфейс с фоновой проверкой
go run . serve -i playlists.ini -p 8800 --check
# Собрать текущую платформу
go build -o iptvc .
# Запустить тесты всех пакетов
go test ./...
# Проверить форматирование
gofmt -w .
```
В блоке выше команда форматирования приведена как ориентир: `gofmt` следует запускать по Go-файлам, например `gofmt -w main.go cmd app`, если оболочка или используемая версия инструмента не поддерживает обработку директорий так, как ожидается.
Цели Makefile:
- `make clear` — удалить результаты сборки и очистить кеш Go.
- `make linux GOARCH=amd64` — собрать Linux-бинарный файл и ZIP-архив.
- `make win GOARCH=amd64` — собрать Windows-бинарный файл и ZIP-архив.
- `make darwin GOARCH=amd64` — собрать macOS-бинарный файл и ZIP-архив.
- `make release` — собрать архивы для Linux, Windows и macOS под `amd64` и `arm64`.
Перед запуском приложения для конфигурации обычно следует скопировать `.env.example` в `.env`, а `config.yml.example` — в `config.yml`, после чего адаптировать значения под окружение. Не добавляйте реальные пароли, токены или локальные URL в Git.
## Docker
Для контейнерного окружения используется файл `compose.yml`, а не устаревшее имя `docker-compose.yml`.
Ожидаемые локальные файлы для сервиса `iptvc`:
- `playlists.ini` монтируется в `/app/playlists.ini`.
- `channels.json` монтируется в `/app/channels.json`.
- `config.yml` монтируется в `/app/config.yml`.
- `.env` передаётся через `env_file`.
Основные команды:
```bash
# Собрать и запустить сервисы в фоне
docker compose up -d --build
# Посмотреть логи приложения
docker compose logs -f iptvc
# Остановить окружение
docker compose down
```
В compose-окружение входят:
- `iptvc` — веб-интерфейс и фоновая проверка плейлистов.
- `keydb` — хранилище результатов проверки.
- `docs` — отдельный сервис документации, если его контекст доступен в окружении.
Обратите внимание: текущий `compose.yml` ссылается на контексты `./iptvc` и `./docs`, поэтому запуск из каталога, содержащего только этот репозиторий, может потребовать внешней структуры проекта или корректировки контекстов.
## Конфигурация
Поддерживаются `config.yml`, `.env` и CLI-флаги. CLI-флаги имеют наивысший приоритет только при явной передаче.
Ключевые группы настроек:
- `app` — часовой пояс, режим отладки, уровень журнала и пути к `playlists.ini` и `channels.json`.
- `server`/`site` — адрес и порт веб-сервера, базовый URL, размер страницы, ссылки сайта и заголовок.
- `check.playlists` — User-Agent, тайм-ауты, задержки и параллелизм проверки плейлистов.
- `check.channels` — User-Agent, тайм-аут, размер диапазона байтов, задержки и параллелизм проверки каналов.
- `cache` — включение KeyDB/Redis, адрес подключения, база и TTL.
Значения задержек и некоторых параметров могут задаваться как числом или диапазоном `[min, max]`. User-Agent может быть строкой или массивом строк; при массиве выбирается случайное значение.
Веб-команда поддерживает как минимум следующие сценарии:
```bash
# Сервер без фоновой проверки
./iptvc serve -i playlists.ini -p 8800
# Сервер с бесконечной фоновой проверкой каждые 60 секунд
./iptvc serve --check --repeat 0 --playlists-all-cooldown 60
```
Основные HTTP-маршруты описаны в README: `/`, `/page/{N}`, `/{code}`, `/{code}/details`, `/api/playlists/{code}`, `/api/version`, `/api/health` и `/api/stats`.
## Тестирование
Тесты находятся рядом с тестируемым кодом и используют стандартный пакет `testing`. Сейчас явно присутствуют тесты CLI-флагов в `cmd/flags_test.go`; они проверяют применение переопределений приложения, кеша и параметров проверки.
Перед изменением CLI или конфигурации запускайте:
```bash
go test ./...
go vet ./...
```
При обновлении конфигурационных структур синхронно проверяйте `config.yml.example`, `.env.example`, `README.md` и документацию в `docs/content/common/config/config.md`, `docs/content/iptvc/commands/check.md`, `docs/content/iptvc/commands/serve.md` и связанных страницах.
При добавлении флага желательно добавить тесты на:
- значение по умолчанию без флага;
- явное включение и выключение boolean-флага;
- переопределение значения из конфигурации;
- корректный разбор чисел, диапазонов и списков;
- взаимодействие с приоритетом `config.yml`, окружения и CLI.
Отдельных интеграционных тестов веб-сервера, KeyDB и сетевой проверки плейлистов в просмотренных файлах не обнаружено. Такие тесты требуют изолированных фикстур и не должны зависеть от случайных внешних IPTV-ресурсов.
## Стиль разработки
- Соблюдайте стандартный стиль Go и форматируйте изменённые Go-файлы через `gofmt`.
- Используйте имена пакетов и экспортируемых сущностей в соответствии с идиомами Go.
- Сохраняйте существующие заголовки лицензии в файлах, где они уже присутствуют.
- Комментарии к экспортируемым типам и функциям должны объяснять их назначение.
- Не добавляйте секреты, реальные данные доступа к KeyDB/Redis и рабочие плейлисты в репозиторий.
- Для ошибок и сетевых операций сохраняйте существующую практику явной обработки ошибок и логирования.
- Не меняйте формат CLI, конфигурации или API-маршрутов без обновления README и соответствующих тестов.
- При работе с конфигурацией учитывайте различие между отсутствующим CLI-флагом и флагом, переданным явно: в `cmd/serve.go` это используется для корректного переопределения порта и хоста.
- Избегайте сетевых запросов и зависимости от внешних сервисов в модульных тестах.
## Важные ограничения и наблюдения
- `channels.json`, `playlists.ini`, `config.yml` и `.env` могут быть локальными входными данными; проверяйте их наличие перед запуском сценариев из документации.
- Кеш по умолчанию отключён в конфигурации приложения, но compose-окружение запускает KeyDB и передаёт настройки через `.env`.
- Бинарные файлы и архивы сборки создаются в `bin/` и не должны вручную добавляться в исходный код.
- README указывает минимальную версию Go 1.23.6, а Dockerfile собирает проект на Go 1.25; при изменении зависимостей учитывайте обе среды.
- При обновлении конфигурационных структур синхронно проверяйте `config.yml.example`, `.env.example`, README и тесты CLI-флагов.