Полный справочник по формату XMLTV (EPG) для IPTV: каналы, передачи и все элементы
Полный справочник по формату программы передач XMLTV для IPTV: элементы channel и programme, все атрибуты, нумерация эпизодов, рейтинги и привязка программы передач к плейлисту M3U.
XMLTV — это открытый, описанный DTD формат XML, который де-факто служит форматом программы передач (EPG) для IPTV. Файл объявляет элементы <channel>, а затем элементы <programme>, у которых время выхода в эфир и канал заданы атрибутами; время записывается как YYYYMMDDHHMMSS ±HHMM и считается UTC, если смещение опущено. Каждая передача может нести заголовки, описания, состав съёмочной группы, номера эпизодов (xmltv_ns или onscreen), рейтинги, изображения и многое другое — всё в фиксированном порядке дочерних элементов, заданном DTD. Программа передач привязывается к плейлисту M3U атрибутом url-tvg (псевдоним x-tvg-url) и сопоставлением tvg-id каждого канала с <channel id>; UniPlayer также умеет откатываться к сопоставлению по имени. Отдавайте файл сжатым в gzip, проверяйте его по DTD и всегда используйте полные временные метки с явным часовым поясом.
Если плейлист M3U говорит, какие каналы существуют и откуда их транслировать, то XMLTV говорит, что идёт в эфире. Это открытый формат XML, стоящий практически за любой IPTV-программой передач: текстовый список каналов и передач, которые на них выходят. Здесь есть настоящая спецификация — опубликованный DTD, поддерживаемый проектом XMLTV, — что делает XMLTV куда более строгим, чем вольный конвенциональный формат M3U. Этот справочник разбирает каждый элемент и атрибут, точный формат даты, нумерацию эпизодов, рейтинги и изображения, а также то, как программа передач привязывается к вашему плейлисту.
UniPlayer загружает программы передач XMLTV и накладывает их на каналы вашего собственного плейлиста, поэтому изложенные ниже правила — ровно те же, что определяют, отобразится ли ваша программа передач корректно.
Главная идея: программа передач, написанная для зрителя
XMLTV создан в 1999 году Эдом Эвисом (Ed Avis) и поддерживается проектом XMLTV. Его определяющее проектное решение в том, что он написан с точки зрения зрителя, а не вещателя. Вместо того чтобы вкладывать передачи в каналы, а каналы — в дни, документ XMLTV представляет собой по сути плоский список: сначала каналы, затем все передачи вперемешку, причём каждая передача несёт время выхода в эфир и канал в виде атрибутов. Передачи одного канала даже не обязаны идти подряд. Именно поэтому формат чисто масштабируется до тысяч каналов и именно поэтому программы передач «просто объединяются».
Скелет документа
Каждый файл XMLTV — это корректно оформленный XML-документ такого вида:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv generator-info-name="MyGrabber 1.0" source-info-name="Example Source">
<!-- сначала каналы -->
<channel id="bbcone.uk">
<display-name>BBC One</display-name>
<icon src="https://example.com/logos/bbc1.png"/>
</channel>
<!-- затем передачи -->
<programme start="20260618200000 +0000" stop="20260618210000 +0000" channel="bbcone.uk">
<title lang="en">The Nine O'Clock News</title>
<desc lang="en">The day's headlines.</desc>
</programme>
</tv>
- Корневой элемент — всегда
<tv>, и его модель содержимого строга: сначала каналы, затем передачи. - Пролог XML с объявлением кодировки настоятельно рекомендуется; UTF‑8 — современное значение по умолчанию и единственный безопасный выбор для нелатинских названий каналов и передач.
- Файлы обычно отдают сжатыми. Обычный
.xmlи gzip (.xml.gz) поддерживаются почти всюду; некоторые источники также отдают архивы.zip,.tarили.xz, хотя.xz(LZMA2) сжимает сильнее, но распаковывается не каждым плеером. Держите программы передач сжатыми — XMLTV многословен и ужимается кардинально.
Формат даты и времени (прочитайте дважды)
Каждая временная метка в XMLTV использует один формат, вольно основанный на ISO 8601:
YYYYMMDDHHMMSS ±HHMM
например 20260618200000 +0000. Ключевые правила и вытекающие из них подводные камни:
- Частичные подстроки допустимы.
202606(год + месяц) или20260618(только дата) корректны там, где полная точность неизвестна. - Часовой пояс — это смещение в конце после пробела:
+0000,+0300,-0500. Именованные зоны вродеBSTвстречаются в старых данных, но не рекомендуются. - Отсутствие смещения означает UTC. Если вы опустите пояс, потребители сочтут время за UTC — и ваша программа передач молча сдвинется, если время на самом деле было местным.
- Лучшая практика: всегда пишите полную 14-значную временную метку с явным смещением. Это снимает всякую двусмысленность и именно этого ждут надёжные плееры. Если ваша программа передач и канал разъезжаются на фиксированное число часов, чините это на стороне плейлиста атрибутом
tvg-shift, а не переписыванием временных меток.
Корневой элемент <tv>
<tv> несёт необязательные метаданные о происхождении. Ни один из них не влияет на воспроизведение, но это хорошая гигиена и подспорье при отладке того, какой источник сформировал программу передач.
| Атрибут | Значение |
|---|---|
date |
Когда расписание было изначально сформировано (в формате даты XMLTV). |
source-info-name / source-info-url |
Человекочитаемое имя и URL источника данных. |
source-data-url |
URL собственно данных, которые были обработаны. |
generator-info-name / generator-info-url |
Программа, сгенерировавшая этот файл, и её домашняя страница. |
Элемент <channel>
Каналы объявляются один раз, и каждая передача ссылается на них по id.
<channel id="bbctwo.uk">
<display-name lang="en">BBC Two HD</display-name>
<display-name lang="en">BBC Two</display-name>
<display-name>102</display-name>
<icon src="https://example.com/logos/bbc2.png" width="240" height="240"/>
<url system="official">https://www.bbc.co.uk/bbctwo</url>
</channel>
| Часть | Правила |
|---|---|
id (атрибут, обязателен) |
Уникальный идентификатор. Спецификация предлагает форму, похожую на DNS-имя по RFC 2838 (например, bbcone.uk). Именно с этим значением должен совпадать tvg-id в вашем плейлисте. |
<display-name> (один или несколько) |
Имя (имена) для человека. Можно указать несколько — для разных языков (lang) или несколько имён для одного языка. Более ранние имена считаются более каноничными. Допустим и просто номер канала. |
<icon> |
Логотип канала: src (обязателен), необязательные width/height. |
<url> |
Информационная ссылка (официальный сайт, фан-страница). Необязательный system уточняет вид/источник. |
Порядок каналов в файле не имеет значения — каналы ищутся по id, а не по позиции (хотя сортировка по id делает диффы чище).
Элемент <programme>
Здесь и живёт расписание. Каждая передача — один слот вещания.
<programme start="20260618200000 +0000" stop="20260618210000 +0000" channel="bbctwo.uk">
...
</programme>
Атрибуты передачи
| Атрибут | Значение |
|---|---|
start (обязателен) |
Начало вещания, в формате даты XMLTV. |
stop |
Конец вещания. По спецификации необязателен, но настоятельно рекомендуется: без него сеточные интерфейсы не могут задать размер слота. |
channel (обязателен) |
Должен совпадать с id элемента <channel>. |
clumpidx |
Когда две передачи делят один слот («clump»), например 0/2 и 1/2. По умолчанию 0/1. |
pdc-start / vps-start |
Сигналы управления временем от вещателя (PDC/VPS) для точной записи. |
showview / videoplus |
Устаревшие коды записи ShowView/VideoPlus. |
Дочерние элементы передачи — и их порядок
DTD фиксирует порядок дочерних элементов. Если вы выдадите их не по порядку, строгие валидаторы отвергнут файл. Полная последовательность:
title+, sub-title*, desc*, credits?, date?, category*, keyword*,
language?, orig-language?, length?, icon*, url*, country*,
episode-num*, video?, audio?, previously-shown?, premiere?,
last-chance?, new?, subtitles*, rating*, star-rating*, review*, image*
Ниже — по назначению.
Описательное содержимое
| Элемент | Примечания |
|---|---|
<title> (один или несколько) |
Название передачи (например, «Симпсоны»). Повторяйте с разными lang для переводов. |
<sub-title> |
Название эпизода / «подзаголовок». |
<desc> |
Свободное текстовое описание (абзац). Допускаются несколько вариантов с разными lang. |
<category> |
Жанр (например, «News», «Drama»). Допускается несколько; плееры обычно используют первый. lang поддерживается. |
<keyword> |
Произвольные ключевые слова. lang поддерживается. |
<date> |
Год завершения передачи/фильма (часто год копирайта), например 2026 или 20260711. |
<language> / <orig-language> |
Язык звучания и язык оригинала. Используйте двухбуквенный код или название. |
<length> |
Реальный хронометраж без рекламы. Требует `units=“seconds |
<icon> |
Изображение/миниатюра передачи (src, необязательные width/height). |
<url> |
Информационная ссылка о передаче; необязательный system. |
<country> |
Страна производства. lang поддерживается. |
Состав (credits)
<credits> оборачивает актёров и съёмочную группу в этом фиксированном порядке: director, actor, writer, adapter, producer, composer, editor, presenter, commentator, guest. Каждый может встречаться несколько раз.
<credits>
<director>Jane Doe</director>
<actor role="Detective Smith">John Roe</actor>
<actor role="Narrator" guest="yes">Sam Lee</actor>
<presenter>Graham Norton</presenter>
</credits>
<actor> поддерживает атрибут role и guest="yes|no". Любой элемент состава может сам содержать <image> (фото человека или персонажа) и <url> (например, страницу профиля).
Нумерация эпизодов
<episode-num> несёт сезон/эпизод, а атрибут system задаёт систему (по умолчанию onscreen). Две предопределённые системы плюс самая распространённая сторонняя:
xmltv_ns— структурированная машиночитаемая схема. Три части через точку: сезон . эпизод . часть, каждая с отсчётом от нуля, и каждую можно записать какX/Y, чтобы выразить «X из Y всего». Неизвестную часть опускайте (но точки сохраняйте). Примеры:1 . 0 . 0/1→ сезон 2, эпизод 1, состоит из одной части. (Помните: отсчёт от нуля, поэтому «1» — это второй сезон.)0 . 12/13 . 0/3→ сезон 1, эпизод 13 из 13, часть 1 из 3.0 . .→ известно, что это сезон 1, эпизод и часть неизвестны.
onscreen— копируйте то, что показано на экране, напримерS01E02. Обрамляющие слова отбрасывайте: надпись на экране «Episode #FFEE» записывается как#FFEE.dd_progid— распространённая нестандартная система, несущая идентификатор передачи Schedules Direct / Gracenote (например,EP000000060087). В спецификацию не входит, но широко встречается в североамериканских программах передач.
<episode-num system="xmltv_ns">0 . 11 . 0/1</episode-num>
<episode-num system="onscreen">S01E12</episode-num>
Технические детали вещания
<video>содержитpresent(yes/no),colour(yes/no),aspect(например,16:9),quality(например,HDTV,1080p).<audio>содержитpresent(yes/no) иstereo, допустимые значения которого —mono,stereo,dolby,dolby digital,bilingual,surround. (bilingualздесь означает, что левый и правый каналы несут разные моноязыки.)<subtitles>имеетtype="teletext|onscreen|deaf-signed"и необязательный дочерний<language>. Может повторяться.
<video><colour>yes</colour><aspect>16:9</aspect><quality>HDTV</quality></video>
<audio><stereo>surround</stereo></audio>
<subtitles type="teletext"><language>en</language></subtitles>
Флаги жизненного цикла
<previously-shown>(пустой элемент) помечает повтор. Необязательныеstart(когда шло в прошлый раз) иchannel(где). Его отсутствие не гарантирует, что передача совершенно новая.<premiere>и<last-chance>— элементы-абзацы (с необязательнымlang); их точный смысл зависит от вещателя, поэтому они существуют в основном чтобы воспроизвести то, что было бы написано в печатной программе. Оба могут быть пустыми (<premiere/>).<new>(пустой элемент) отмечает первый выпуск совершенно нового шоу — такого, которое раньше никогда не выходило в эфир. Это не означает «новый эпизод» или «новый сезон»: после показа первого выпуска последующие уже не считаются<new>, а второй сезон давно идущего шоу не является<new>никогда.
Рейтинги, рецензии и изображения
<rating>— это возрастной/контентный рейтинг: обязательный<value>плюс необязательные<icon>, с атрибутомsystem(например,MPAA,BBFC, код страны).<star-rating>— оценка качества в виде<value>, записанного какN/M(например,3/5), с необязательнымиsystemи<icon>.<review>несёт рецензию критика;type="text|url"обязателен, плюс необязательныеsource,reviewer,lang.<image>(более позднее добавление) — более богатая ссылка на изображение, чем<icon>:type="poster|backdrop|still|person|character",size="1|2|3"(маленькое/среднее/большое по наибольшей стороне),orient="P|L"(портрет/ландшафт) иsystemдля указания источника (imdb,tmdb, …).
<rating system="MPAA"><value>PG-13</value></rating>
<star-rating><value>4/5</value></star-rating>
<image type="poster" size="3" orient="P" system="tmdb">https://image.tmdb.org/.../poster.jpg</image>
Расширение для IPTV-архива: catchup-id
Есть один широко используемый атрибут, который не входит в спецификацию XMLTV, но крайне важен для IPTV: catchup-id у <programme>. Некоторым провайдерам нужен идентификатор конкретной передачи, чтобы построить URL архива, и плееры считывают его в плейсхолдер {catchup-id}, применяемый в шаблонах catchup-source в M3U.
<programme start="20260618200000 +0000" channel="footv" catchup-id="episode-44871">
<title>The Match</title>
</programme>
Это мост к воспроизведению архива, описанному в справочнике по формату M3U: когда режим catch-up у канала равен vod, {catchup-id} из сопоставленной передачи подставляется в URL воспроизведения. Провайдерам, которые объявляют архив именно для UniPlayer, стоит следовать спецификации «Архив и Catch-up».
Многоязычные программы передач
XMLTV поддерживает локализацию почти везде через атрибут lang. Вы можете предоставить несколько элементов <title>, <sub-title>, <desc> и <category>, каждый со своим языком, и плеер выберет предпочитаемый пользователем. <orig-language> фиксирует язык оригинала передачи отдельно от <language> (языка транслируемой версии).
<title lang="en">The Bear</title>
<title lang="ru">Медведь</title>
<desc lang="en">A chef returns home to run a sandwich shop.</desc>
<desc lang="ru">Шеф-повар возвращается домой управлять кафе.</desc>
Привязка XMLTV к вашему плейлисту M3U
Программа передач бесполезна, пока она не соединена с каналами. Соединение происходит на стороне плейлиста:
- В строке
#EXTM3Uукажите на программу передач черезurl-tvg(или его синонимx-tvg-url). - В строке
#EXTINFкаждого канала задайтеtvg-id, равный<channel id="…">в программе передач.
Дальше плееры разрешают каждый канал по XMLTV в фиксированном порядке — сначала сопоставляют tvg-id с id канала, затем откатываются к сравнению tvg-name и отображаемого имени канала с каждым <display-name>. Самая надёжная практика: задайте tvg-id и сделайте его идентичным id из XMLTV. Сопоставление по именам хрупко из-за суффиксов «HD», регистра и пробелов. (Полный алгоритм сопоставления и атрибут сдвига времени tvg-shift см. в справочнике по формату M3U.)
Как это делает UniPlayer. UniPlayer сопоставляет по
tvg-idи откатывается к имени канала, поэтому одну универсальную коллекцию XMLTV можно привязать к нескольким разным плейлистам, и нужные каналы всё равно оживут — даже когда в этих плейлистах идентификаторы заданы непоследовательно. (Сегодня UniPlayer привязывает один источник EPG к плейлисту; более широкая поддержка нескольких EPG — в планах.)
Доставка, обновление и валидация
- Отдавайте сжатым. Gzip (
.xml.gz) универсален и заметно меньше..zipи.tarтоже распространены;.xzсжимает ещё сильнее, но распаковывается не каждым плеером, так что взвешивайте размер против совместимости. - Обновляйте разумно. Большинство программ передач обновляются каждые несколько часов; сообщайте частоту на стороне плейлиста (
refresh/m3uautoload), а не рассчитывайте, что плеер догадается сам. - Проверяйте по DTD. Поскольку у XMLTV есть настоящий DTD, вы можете проверить структуру и порядок элементов до публикации — это ловит те самые ошибки с порядком дочерних элементов, которые отвергают строгие плееры.
Как это делает UniPlayer. UniPlayer читает программы передач XMLTV как обычный
.xmlи как архивы.gz,.zipи.tar. Он также не делает лишней работы: если на один и тот же источник EPG ссылаются несколько плейлистов, UniPlayer загружает его один раз, а не скачивает одну и ту же программу передач повторно, — благодаря чему память и трафик остаются экономными даже с большими общими программами передач.
Чек-лист проверки и частые ошибки
- Объявляйте UTF‑8 в прологе и сохраняйте файл в UTF‑8 (без случайной BOM).
- Держите дочерние элементы в порядке DTD —
titleпередdesc,descпередcreditsи т. д. Нарушенный порядок не проходит строгую валидацию. - Всегда указывайте
stop, чтобы сеточные интерфейсы могли задать размер слотов. - Используйте полные временные метки с явным смещением. Пропуск пояса молча означает UTC.
- Делайте
idканалов стабильными и уникальными и в точности сопоставляйте их сtvg-idв плейлисте. - Не раздувайте программу передач. Публикуйте только нужные дни и жмите gzip; многомегабайтные несжатые программы передач замедляют каждого клиента.
- У
<category>/<title>побеждает первый. Плееры обычно берут первый из повторяющихся элементов, поэтому осознанно упорядочивайте языковые и жанровые варианты.
Полный пример с пояснениями
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv source-info-name="Example EPG" generator-info-name="MyGrabber 1.0">
<channel id="bbcone.uk">
<display-name lang="en">BBC One HD</display-name>
<display-name lang="en">BBC One</display-name>
<icon src="https://example.com/logos/bbc1.png"/>
</channel>
<programme start="20260618200000 +0000" stop="20260618210000 +0000" channel="bbcone.uk" catchup-id="ep-44871">
<title lang="en">Sherlock</title>
<sub-title lang="en">A Study in Pink</sub-title>
<desc lang="en">A modern update finds the famous sleuth solving crimes in London.</desc>
<credits>
<director>Paul McGuigan</director>
<actor role="Sherlock Holmes">Benedict Cumberbatch</actor>
<actor role="Dr John Watson">Martin Freeman</actor>
</credits>
<date>2010</date>
<category lang="en">Drama</category>
<category lang="en">Crime</category>
<language>en</language>
<length units="minutes">88</length>
<country>GB</country>
<episode-num system="xmltv_ns">0 . 0 . 0/1</episode-num>
<episode-num system="onscreen">S01E01</episode-num>
<video><colour>yes</colour><aspect>16:9</aspect><quality>HDTV</quality></video>
<audio><stereo>stereo</stereo></audio>
<previously-shown start="20100725" />
<subtitles type="teletext"><language>en</language></subtitles>
<rating system="BBFC"><value>12</value></rating>
<star-rating><value>5/5</value></star-rating>
<image type="poster" size="3" orient="P" system="tmdb">https://image.tmdb.org/.../sherlock.jpg</image>
</programme>
</tv>
Замечание о расширениях и совместимости
У XMLTV есть настоящая спецификация, но экосистема всё равно добавляет нестандартные атрибуты там, где спецификации не хватает: catchup-id для IPTV-архива, dd_progid для североамериканских идентификаторов передач, display-number/repeat-programs у Android TV. Потребители игнорируют непонятные им атрибуты и элементы, поэтому такие расширения можно безопасно включать. Составляя программу передач, проверяйте её по DTD, предпочитайте номера эпизодов xmltv_ns и стабильные идентификаторы каналов, а перед публикацией проверяйте результат в реальном плеере.
UniPlayer читает стандартные программы передач XMLTV и связывает их с каналами вашего собственного плейлиста по
tvg-id, с откатом к имени. Он также предлагает своим пользователям встроенную программу передач, собранную из общедоступных источников, — но не публикует файлы XMLTV и публичные ссылки на программы передач, не размещает каналы и не продаёт контент. Плейлист приносите вы, а программу передач выбираете сами: оставить встроенную в UniPlayer или подключить свою.
(01)Что такое XMLTV?
XMLTV — это открытый формат XML для описания телевизионного расписания. Созданный в 1999 году и поддерживаемый проектом XMLTV, он стал де-факто стандартным форматом программы передач (EPG) для IPTV-плееров, OTT-middleware и грабберов телепрограмм. Файл перечисляет каналы, а затем передачи, причём время выхода в эфир и канал хранятся в атрибутах каждой передачи.
(02)Какой формат даты и времени использует XMLTV?
Временные метки выглядят как YYYYMMDDHHMMSS, затем пробел и смещение часового пояса, например 20260618200000 +0000. Допускаются более короткие подстроки (например, только YYYYMM), а если смещение опущено, время считается UTC. Лучшая практика — всегда писать полную временную метку с явным смещением.
(03)Как привязать программу передач XMLTV к плейлисту M3U?
Укажите URL программы передач в атрибуте url-tvg (или x-tvg-url) строки #EXTM3U, а затем сделайте tvg-id каждого канала в точности равным id элемента <channel> в программе передач. Плееры сначала сопоставляют по tvg-id, а затем откатываются к сопоставлению по именам.
(04)Чем системы нумерации эпизодов xmltv_ns и onscreen отличаются друг от друга?
xmltv_ns — структурированная, машиночитаемая нумерация: три части через точку (сезон . эпизод . часть), все с отсчётом от нуля, каждую можно записать как X/Y, чтобы показать общее количество. onscreen — человекочитаемая строка ровно в том виде, в каком она показана на экране, например S01E02. Используйте xmltv_ns, когда это возможно, и onscreen в остальных случаях.