Files
iptvc/AGENTS.md
2026-07-20 12:33:32 +08:00

16 KiB
Raw Permalink Blame History

Инструкции для работы с репозиторием

Обзор проекта

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.

Основные команды:

# Показать доступные цели 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.

Основные команды:

# Собрать и запустить сервисы в фоне
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 может быть строкой или массивом строк; при массиве выбирается случайное значение.

Веб-команда поддерживает как минимум следующие сценарии:

# Сервер без фоновой проверки
./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 или конфигурации запускайте:

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-флагов.