16 KiB
Инструкции для работы с репозиторием
Обзор проекта
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.
Архитектура и поток выполнения
main.goвызываетcmd.Execute().cmd/root.goрегистрирует глобальные флаги и дочерние Cobra-команды.- Команда
checkинициализирует приложение, применяет CLI-переопределения, подключает кеш, получает плейлисты и запускает проверку. - Команда
serveподнимает веб-сервер и при необходимости запускает фоновую проверку через флаг--checkили настройкуcheck.start-on-serve. - Конфигурация загружается со следующим приоритетом: встроенные значения по умолчанию,
config.yml, переменные окружения и явно переданные CLI-флаги. - Результаты проверки могут сохраняться в 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-флагов.