Что такое XMLTV
XMLTV — открытый XML-формат для описания телевизионных расписаний. Разработан в 1999 году для проекта xmltv.org и стал стандартом де-факто для IPTV middleware, медиаплееров и EPG-грабберов.
Широкая поддержка
Kodi, VLC, Ministra, Xtream и др.
Человекочитаемый
Легко читать и отлаживать
Расширяемый
Кастомные атрибуты и поля
Простой парсинг
Стандартные XML-библиотеки
Структура документа
XMLTV документ состоит из корневого элемента tv, содержащего списки каналов и программ:
<?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 | Нет | Сайт канала |
<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.
<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
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
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 схему:
xmllint --dtdvalid xmltv.dtd epg.xml Нужен XMLTV файл?
EPG Service предоставляет XMLTV выгрузки для 4308 каналов. Также доступен JSON API для современных интеграций.
Получить доступ