Skip to content

Плейлист и 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-файл перекачивают ещё и когда кончился допуск в ссылках.

Сценарий: выдать абоненту ссылку на плейлист

  1. Откройте карточку подписчика и скопируйте поле Токен плейбека.
  2. Соберите адрес: https://<адрес установки>/playback/tv/playlist.m3u8?token=<токен>.
  3. Проверьте его в браузере: должен скачаться текстовый файл, начинающийся с #EXTM3U.
  4. Той же парой соберите адрес XMLTV и передайте абоненту обе ссылки — плееру нужны обе.

Если файл пришёл пустым (только #EXTM3U), у подписчика нет ни одного канала с назначенным стримом: смотрите блок Доступные каналы в его карточке.

Сценарий: плеер скачал список, но каналов нет

  1. Тем же токеном соберите адрес IPTV: https://<адрес установки>/playback/tv/iptv.m3u8?token=<токен>.
  2. Проверьте его в браузере: в файле должны быть абсолютные адреса http://…/index.m3u8.
  3. XMLTV не меняется — абоненту по-прежнему нужна та же ссылка на программу передач.

Что дальше