Плейлист и XMLTV¶
Не всякий абонент смотрит в витрине: кто-то предпочитает свой плеер на компьютере, приставке или телефоне. Для этого Catena отдаёт то же самое двумя файлами — список каналов в M3U и программу передач в XMLTV.
Оба файла содержат ровно те каналы, которые доступны этому подписчику по формуле доступа. Канал, у которого не назначен стрим, в выгрузку не попадает: играть в нём нечего.
Адреса¶
| Что | Адрес |
|---|---|
| Список каналов | /playback/tv/playlist.m3u8?token=<токен> |
| Список каналов для IPTV-плееров | /playback/tv/iptv.m3u8?token=<токен> |
| Программа передач | /playback/tv/xmltv.xml?token=<токен> |
Адреса относительны корню установки: если витрина открывается как https://tv.example.com/tv/, то обычный плейлист лежит по https://tv.example.com/playback/tv/playlist.m3u8, а IPTV — по https://tv.example.com/playback/tv/iptv.m3u8.
Токеном годится любой из двух:
- токен плейбека подписчика — тот, что виден оператору в карточке подписчика, поле Токен плейбека;
- токен устройства, полученный при входе в витрину.
Разница только в отзыве: отозвав устройство, оператор гасит и его ссылку, а токен плейбека живёт с самим подписчиком.
Что внутри плейлиста¶
Строка канала выглядит так:
#EXTINF:-1 tvg-id="ch_992YXaVtjYS" tvg-chno="1",News 24
/playback/tv/channels/ch_992YXaVtjYS/play?token=<токен>
tvg-id— идентификатор канала в Catena. Он же стоит идентификатором канала в XMLTV, так что плеер сам сводит расписание с каналом.tvg-chno— номер канала: по нему плеер строит привычный абоненту порядок.
Адрес записан относительно корня сервера, и плеер достраивает его от адреса, по которому скачал плейлист.
Сам адрес — ссылка на выдачу, а не готовый адрес потока. Открыв её, плеер получает переадресацию на воспроизведение со свежим допуском. Сделано это ради срока жизни: скачанный файл живёт у абонента неделями, а допуск к просмотру — часы, и плейлист с зашитым допуском перестал бы играть в первый же вечер.
Отсюда следствие: плеер должен уметь ходить по переадресации. Все распространённые умеют.
Плейлист для IPTV-плееров¶
Обычный плейлист рассчитан на плееры, которые принимают относительный адрес и ходят по переадресации. Часть IPTV-плееров при импорте M3U оставляет только абсолютные адреса http:// и https:// и ждёт сразу живой HLS вида /{stream}/index.m3u8. Ссылку на выдачу они каналом не считают — список приходит пустым.
Для них Catena отдаёт второй файл по /playback/tv/iptv.m3u8. Это формат плейлиста, совместимый с Flussonic: любой плеер, который умел работать со схемой Flussonic, продолжит работу и с iptv.m3u8. Охват каналов тот же, строки другие:
#EXTINF:-1 tvg-id="ch_992YXaVtjYS" tvg-name="News 24" tvg-chno="1",News 24
http://tv.example.com/news/index.m3u8?token=<допуск>
- Адрес абсолютный: плеер видит канал, не достраивая путь.
- Хвост — живой HLS
index.m3u8. Catena принимает этот путь и переадресует на воспроизведение. - В URL зашит допуск к просмотру, а не токен подписчика: файл живёт часы, а не недели. Абонент, у которого ссылки перестали играть, перекачивает плейлист.
- Если у стрима есть архив, запись несёт
catchup="fs"иcatchup-days— плеер сам строит окно догона по живому адресу. Без архива этих атрибутов нет.
Программа передач для обоих плейлистов одна: тот же XMLTV.
Что внутри XMLTV¶
Файл содержит объявления каналов и их передачи. Окно по умолчанию — сутки назад и шесть вперёд: прошедшие сутки нужны догону, который плеер строит по этому же файлу, а шесть суток — предел выдачи сетки.
Окно можно задать явно параметрами from и to — моментами в формате RFC 3339, например ?from=2026-08-20T00:00:00Z&to=2026-08-22T00:00:00Z.
Время передач всегда приводится к UTC и записывается в форме XMLTV YYYYMMDDHHMMSS +0000. Передача, у которой границы не разбираются, пропускается: плеер с одной битой датой рисует пустой сеткой весь файл, а не одну строку.
Расписание берётся из программы передач. Если сетка пуста, XMLTV приедет с объявлениями каналов, но без передач — и чинится это на стороне источника, а не выгрузки.
Ограничения¶
- Потолок экранов действует и здесь. Просмотр из стороннего плеера занимает экран так же, как просмотр в витрине; уперевшись в потолок, плеер получит отказ (Сколько экранов одновременно).
- Догон в обычном плейлисте плеер строит сам, по границам передачи из XMLTV. В IPTV-плейлисте окно объявлено в записи, если у стрима есть архив. Что записано, определяет архив стрима: за его пределами воспроизведения не будет.
- Файл не обновляется сам. Появился новый канал в подписке — абонент перекачивает плейлист. IPTV-файл перекачивают ещё и когда кончился допуск в ссылках.
Сценарий: выдать абоненту ссылку на плейлист¶
- Откройте карточку подписчика и скопируйте поле Токен плейбека.
- Соберите адрес:
https://<адрес установки>/playback/tv/playlist.m3u8?token=<токен>. - Проверьте его в браузере: должен скачаться текстовый файл, начинающийся с
#EXTM3U. - Той же парой соберите адрес XMLTV и передайте абоненту обе ссылки — плееру нужны обе.
Если файл пришёл пустым (только #EXTM3U), у подписчика нет ни одного канала с назначенным стримом: смотрите блок Доступные каналы в его карточке.
Сценарий: плеер скачал список, но каналов нет¶
- Тем же токеном соберите адрес IPTV:
https://<адрес установки>/playback/tv/iptv.m3u8?token=<токен>. - Проверьте его в браузере: в файле должны быть абсолютные адреса
http://…/index.m3u8. - XMLTV не меняется — абоненту по-прежнему нужна та же ссылка на программу передач.
Что дальше¶
- Витрина — то же самое в приложении зрителя.
- Программа передач — откуда берётся расписание в XMLTV.
- Подписчики — токен плейбека и доступные каналы.