Технологии 20 января 2026 10 мин чтения

XMLTV формат: структура, поля, примеры

Техническое руководство по формату XMLTV — стандарту де-факто для передачи EPG данных в IPTV и OTT системах.

Что такое XMLTV

XMLTV — открытый XML-формат для описания телевизионных расписаний. Разработан в 1999 году для проекта xmltv.org и стал стандартом де-факто для IPTV middleware, медиаплееров и EPG-грабберов.

Широкая поддержка

Kodi, VLC, Ministra, Xtream и др.

📖

Человекочитаемый

Легко читать и отлаживать

🔧

Расширяемый

Кастомные атрибуты и поля

Простой парсинг

Стандартные XML-библиотеки

Структура документа

XMLTV документ состоит из корневого элемента tv, содержащего списки каналов и программ:

XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv source-info-name="EPG Service" generator-info-name="epgservice.ru">
  
  <!-- Список каналов -->
  <channel id="perviy">
    <display-name>Первый канал</display-name>
    <icon src="https://cdn.epgservice.ru/logos/perviy.png"/>
  </channel>
  
  <!-- Программы -->
  <programme start="20260206180000 +0300" channel="perviy">
    <title lang="ru">Время</title>
    <desc lang="ru">Информационная программа</desc>
    <category lang="ru">Новости</category>
  </programme>
  
</tv>

Элемент channel

Описывает телеканал. Должен идти до элементов programme.

Элемент Обязательный Описание
id (атрибут) Да Уникальный идентификатор канала
display-name Да Название канала
icon Нет URL логотипа канала
url Нет Сайт канала
XML — channel
<channel id="rossiya1">
  <display-name lang="ru">Россия 1</display-name>
  <display-name lang="en">Russia 1</display-name>
  <icon src="https://cdn.epgservice.ru/logos/rossiya1.png"/>
  <url>https://russia.tv</url>
</channel>

Элемент programme

Описывает одну передачу в расписании. Обязательные атрибуты: start, channel.

XML — programme (полный пример)
<programme start="20260206200000 +0300" stop="20260206220000 +0300" channel="perviy">
  <title lang="ru">Вечерний Ургант</title>
  <sub-title lang="ru">Гость — Иван Иванов</sub-title>
  <desc lang="ru">Развлекательное ток-шоу</desc>
  
  <credits>
    <presenter>Иван Ургант</presenter>
    <guest>Иван Иванов</guest>
  </credits>
  
  <date>2026</date>
  <category lang="ru">Ток-шоу</category>
  <language>ru</language>
  <length units="minutes">120</length>
  <icon src="https://cdn.epgservice.ru/posters/urgant.jpg"/>
  <country>RU</country>
  
  <episode-num system="onscreen">S6E124</episode-num>
  
  <rating system="RU">
    <value>16+</value>
  </rating>
</programme>
💡

Совет

Атрибут stop опционален, но рекомендуется указывать для корректного отображения в grid-интерфейсах.

Формат времени

Время в XMLTV указывается в формате YYYYMMDDHHmmss +HHMM:

Примеры
20260206180000 +0300  → 6 февраля 2026, 18:00 МСК
20260206150000 +0000  → То же время в UTC

Структура

  • YYYY — год (4 цифры)
  • MM — месяц (01-12)
  • DD — день (01-31)
  • HH — час (00-23)
  • mm — минуты (00-59)
  • ss — секунды (00-59)

Часовой пояс

  • +HHMM — смещение от UTC
  • +0300 — Москва (МСК)
  • +0000 — UTC
  • -0500 — EST (США)

Парсинг XMLTV

Python

Python
import xml.etree.ElementTree as ET
from datetime import datetime

tree = ET.parse('epg.xml')
root = tree.getroot()

# Каналы
channels = {}
for channel in root.findall('channel'):
    channel_id = channel.get('id')
    name = channel.find('display-name').text
    channels[channel_id] = name

# Программы
for programme in root.findall('programme'):
    channel_id = programme.get('channel')
    start = programme.get('start')
    title = programme.find('title').text
    
    start_dt = datetime.strptime(start[:14], '%Y%m%d%H%M%S')
    print(f"{channels[channel_id]}: {start_dt} - {title}")

JavaScript

JavaScript
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlString, 'text/xml');

// Каналы
const channels = {};
xmlDoc.querySelectorAll('channel').forEach(ch => {
  const id = ch.getAttribute('id');
  const name = ch.querySelector('display-name').textContent;
  channels[id] = name;
});

// Программы  
xmlDoc.querySelectorAll('programme').forEach(prog => {
  const channelId = prog.getAttribute('channel');
  const start = prog.getAttribute('start');
  const title = prog.querySelector('title').textContent;
  
  console.log(channels[channelId] + ': ' + start + ' - ' + title);
});

Валидация

Для валидации XMLTV используйте официальную DTD схему:

Terminal
xmllint --dtdvalid xmltv.dtd epg.xml

Нужен XMLTV файл?

EPG Service предоставляет XMLTV выгрузки для 4308 каналов. Также доступен JSON API для современных интеграций.

Получить доступ