This commit is contained in:
2026-08-03 12:53:34 +08:00
parent 89b303fed3
commit c91ff4c103
26 changed files with 396 additions and 362 deletions
+16 -16
View File
@@ -16,7 +16,7 @@ tags: ["iptvc", "разработка", "архитектура"]
- `github.com/spf13/cobra` — CLI-фреймворк;
- `gopkg.in/yaml.v3` — парсинг `config.yml`;
- `github.com/joho/godotenv` — загрузка `.env`;
- `github.com/redis/go-redis/v9` — клиент KeyDB/Redis.
- `github.com/redis/go-redis/v9` — клиент кеша.
## Структура проекта
@@ -46,7 +46,7 @@ iptvc/
│ ├── tagfile/
│ │ └── tagfile.go # чтение channels.json, назначение тегов
│ ├── cache/
│ │ └── cache.go # подключение к KeyDB/Redis
│ │ └── cache.go # подключение к кешу
│ ├── logger/
│ │ └── logger.go # настройка логирования
│ ├── utils/
@@ -76,9 +76,9 @@ iptvc/
### `app`
Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (Redis-клиент).
Глобальный контейнер: `Args` (CLI-флаги), `Config` (конфигурация), `Cache` (кеш-клиент).
`Init()` загружает конфигурацию и инициализирует логгер.
`InitCache()` подключается к KeyDB/Redis, если кеш включён.
`InitCache()` подключается к кешу, если кеш включён.
### `app.config`
@@ -98,10 +98,10 @@ iptvc/
Содержит логику проверки:
- **`PrepareListsToCheck(files, urls, codes)`** — формирует список плейлистов из файлов, URL и кодов ini-файла.
- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `max-routines`), загрузка, парсинг, вызов `CheckChannels` для каждого.
- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `max-routines`), HTTP-запрос с `Range` header.
- **`CheckPlaylists(lists)`** — параллельная проверка плейлистов (семфор `maxRoutines`), загрузка, парсинг, вызов `CheckChannels` для каждого.
- **`CheckChannels(pls)`** — параллельная проверка каналов (семфор `maxRoutines`), HTTP-запрос с `Range` header.
- **`OnPlaylistChecked`** — глобальный callback, вызывается после проверки каждого плейлиста. Используется веб-сервером для обновления in-memory кеша.
- **`cachePlaylist(pls)`** — сохранение результата в Redis (если включён).
- **`cachePlaylist(pls)`** — сохранение результата в кеш (если включён).
Параметры проверки берутся из `app.Config.Check.Playlists` и `app.Config.Check.Channels`.
@@ -141,7 +141,7 @@ GET /{path...} — все остальные маршру
Catch-all `/{path...}` используется для избежания конфликтов паттернов в Go 1.22 mux.
In-memory кеш (`memCache`) обновляется через `OnPlaylistChecked` callback.
Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без Redis.
Это позволяет отображать результаты проверки в реальном времени без ожидания завершения цикла и без внешнего кеша.
ini-файл кешируется на 30 секунд, кеш сбрасывается при каждом обновлении `memCache`.
@@ -155,16 +155,16 @@ StartBackgroundChecker:
runCheckerOnce()
→ checker.PrepareListsToCheck()
→ checker.CheckPlaylists()
→ for each playlist (parallel, per-routine):
→ for each playlist (parallel, perRoutine):
→ Download() / ReadFromFs()
→ Parse()
→ CheckChannels()
→ for each channel (parallel, per-routine):
→ for each channel (parallel, perRoutine):
→ HTTP GET with Range header
→ check status + content type
→ OnPlaylistChecked(pls) → memCache update
→ one-cooldown sleep
→ all-cooldown sleep
→ oneCooldown sleep
→ allCooldown sleep
if repeat > 0 && iteration >= repeat: stop
```
@@ -211,7 +211,7 @@ StartBackgroundChecker:
## Конфигурация
Подробное описание параметров — в разделе [config.yml](../../ref/config.md).
Подробное описание параметров — в разделе [config.yml](../../reference/config.md).
Приоритет: Defaults < `config.yml` < Env < CLI-флаги.
@@ -235,7 +235,7 @@ SVG-логотипы каналов передаются через `encodeURICo
Два уровня кеша:
1. **Redis/KeyDB** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`.
2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует Redis.
1. **Внешний кеш** (опционально) — постоянный кеш результатов проверки. TTL из `cache.ttl`.
2. **In-memory** (`memCache`) — только при `serve --check`. Обновляется в реальном времени через callback. Не требует внешнего кеша.
In-memory кеш приоритетнее Redis при отображении в веб-интерфейсе.
In-memory кеш приоритетнее внешнего кеша при отображении в веб-интерфейсе.