Внешний источник конфигурации стримов (config_external)¶
Catena SE может получать список телеканалов (стримов) из внешнего сервиса провижининга вместо ручной настройки. Такой сервис вы реализуете сами: Catena SE обращается к нему по протоколу config_external и синхронизирует конфигурацию со своим состоянием.
Ключевой метод, который обязан предоставлять ваш сервис — streams_list (GET /streams). По этому методу Catena SE выгружает полный список стримов и принудительно приводит свою конфигурацию к этому списку (добавляет, обновляет и при необходимости удаляет каналы).
Что должен реализовать ваш сервис¶
Внешний сервис должен реализовать HTTP API, совместимый с описанием в приложенном файле catena-se.yaml (OpenAPI 3.1). В первую очередь нужен метод:
- GET /streams (operationId:
streams_list) — возвращает список стримов в форматеstreams_list.
Формат ответа:
- Тело ответа — JSON-объект с полем
streams: массив элементов типаstream_config. - Опционально поддерживаются поля постраничной навигации из
collection_response:next,prev,estimated_count,timing. Catena SE может передавать query-параметрыlimitиcursorдля постраничной выборки.
Каждый элемент в streams — конфигурация одного стрима: name, inputs, template, dvr, labels, таймауты, backup, on_play и прочие поля, описанные в схеме stream_config в catena-se.yaml. Имя стрима (name) уникально и после создания не меняется.
Как Catena SE использует список стримов¶
Алгоритм синхронизации со стороны Catena SE:
- Catena SE запрашивает у внешнего сервиса список стримов (GET
/streams, при необходимости сcursor/limit). - Все стримы из ответа добавляются в Catena SE или обновляются: если канал уже есть, его настройки полностью перезаписываются данными из ответа. Существующие лейблы канала заменяются теми, что пришли от внешнего сервиса.
- Каналы, которые есть в Catena SE, но отсутствуют в списке от внешнего сервиса, удаляются — кроме каналов с лейблом
manual. - Каналы с лейблом
manualне удаляются и не перезаписываются этим механизмом.
Чтобы какой-то канал не управлялся внешним провижинингом, ему нужно выдать лейбл manual (например, в labels.manual). Если во внешнем сервисе позже появится стрим с тем же именем, при следующей синхронизации лейбл будет перезаписан и канал перейдёт под автоматическое управление.
Синхронизация списка передач¶
Middleware может отдавать абонентам информацию о статусе записи каждой телепередачи для корректного проигрывания.
Статус записи телепередачи можно получить с Catena SE, запросив передачи за указанное время методом episodes_get. Catena SE при необходимости запрашивает список передач с сервера по протоколу config_external для недостающих диапазонов времени, дообогащает его и отдаёт.
Механизм рассчитан на то, что границы передач не меняются, т.е. кеширование выполняется один раз.
Пример: один файл и HTTP-сервер¶
Минимальный вариант — один статический файл streams с JSON в формате central_streams_list. В этой папке лежит пример такого файла с одним стримом (демо-источник fake://fake).
Запуск отдачи файла через встроенный HTTP-сервер Python:
python3 -m http.server 8000
После запуска список стримов будет доступен по адресу http://localhost:8000/streams. В настройках Catena SE укажите URL вашего сервера (например, http://HOST:8000), чтобы метод config_external запрашивал http://HOST:8000/streams.
Содержимое примера файла streams:
{
"streams": [
{
"name": "channel1",
"title": "Тестовый канал",
"comment": "Демо-стрим из внешнего конфига",
"inputs": [
{
"url": "fake://fake"
}
]
}
]
}
Для продакшена нужен сервис, который отдаёт ответ с Content-Type: application/json и при необходимости обрабатывает параметр cursor.
Как включить config external¶
Для этого надо в файле настройки инсталяции добавить секцию config_external:
config_external:
url: "https://auth@middleware.myservice.com"
Технические детали протокола config_external¶
Полное описание API приведено в формате OpenAPI 3.1 в файле catena-se.yaml в этой же папке. Там заданы схемы streams_list, stream_config, типы входов стримов (stream_input_*), параметры DVR, лейблы и остальные поля, которые ваш сервис может возвращать в streams_list для провижининга стримов в Catena SE.