Local TV Guide: настройка локальной программы передач 2026
Если у тебя настроен CCcam или OScam, каналы идут, картинка есть — но в меню ресивера пусто там, где должно быть расписание, ты не один. Настройка local tv guide для шифрованных каналов — отдельная история, которую большинство гайдов объясняют криво или не объясняют вовсе. Разберём с нуля: откуда берётся EPG, почему он пропадает и как его починить.
Что такое локальный TV guide и как он работает в CCcam/OScam окружении
EPG (Electronic Program Guide) — это не отдельный сервис. Это данные, которые транслируются прямо внутри транспортного потока вместе с видео и аудио. Стандарт DVB описывает их как SI/PSI таблицы, конкретно — EIT (Event Information Table), которая передаётся на фиксированном PID 0x12.
Ресивер постоянно парсит этот поток, вытаскивает EIT и складывает в локальный кэш. На Enigma2 это файл /etc/enigma2/epg.dat, на старых OpenBox/Opensat — /var/tuxbox/config/epgcache. Пока тюнер принимает сигнал — кэш живёт и пополняется. Стоит переключить канал или перегрузить ресивер — всё, что не сохранено, теряется.
Разница между встроенным DVB EPG и внешним XMLTV
DVB EPG идёт прямо из спутникового сигнала. Ресивер его читает автоматически, никаких дополнительных настроек не нужно — если поток нормальный. XMLTV — это внешний XML-файл с расписанием, который скачивается отдельно и импортируется плагином типа EPGImport.
Когда DVB EPG работает нормально — это идеальный вариант. Но провайдеры часто передают только now/next (текущая и следующая программа), а полная неделя отсутствует. Вот тут и нужен XMLTV.
Откуда ресивер получает данные о программе
Два пути: из эфира (EIT scan) и из внешнего источника (XMLTV через HTTP или локальный файл). В Enigma2 оба варианта могут работать параллельно, и это иногда создаёт проблемы — двойные записи в расписании для одного канала.
Почему через card sharing EPG часто пустой
Вот момент, который путают 90% пользователей. Card sharing расшифровывает только видео и аудио потоки. EIT таблицы на PID 0x12 передаются в открытом виде — они не шифруются провайдером в подавляющем большинстве случаев. Значит, card sharing вообще не влияет на EPG.
Если EPG пустой — проблема в другом: EPG scan отключён в настройках bouquet, ресивер не успел накопить кэш, или EIT просто не доходит до тюнера из-за слабого сигнала. Не ищи причину в CCcam.cfg.
Роль now/next и 7-day EPG таблиц
EIT делится на два типа. Present/Following (table_id 0x4E) — это now/next, только текущая и следующая программа. Schedule tables (0x50–0x5F для текущего транспондера, 0x60–0x6F для других) — полная программа на 8 дней вперёд. Не все провайдеры передают schedule. Многие региональные каналы ограничиваются now/next, поэтому без XMLTV полной программы не будет.
Источники данных для локального TV guide
Хороший local tv guide строится на надёжном источнике данных. Есть несколько вариантов, у каждого свои плюсы.
Сбор EPG напрямую с транспондера (EIT scan)
Самый простой способ — просто включить сканирование EIT в настройках ресивера. В Enigma2 это Settings → Service Searching → EPG. Можно настроить background scan, который собирает данные со всех транспондеров в буклете. Минус: занимает время (30–60 минут на полное сканирование) и работает только пока ресивер включён.
XMLTV grabbers и формат файла
XMLTV — это просто XML. Минимальная структура выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tv SYSTEM "xmltv.dtd">
<tv generator-info-name="custom-grabber">
<channel id="channel.one">
<display-name lang="ru">Первый канал</display-name>
</channel>
<programme start="20260516180000 +0300" stop="20260516190000 +0300" channel="channel.one">
<title lang="ru">Вечерние новости</title>
<desc lang="ru">Выпуск новостей в 18:00</desc>
</programme>
</tv>
Атрибуты start и stop должны быть в формате YYYYMMDDHHmmss с UTC-смещением. Это важно — неправильный timezone здесь даёт сдвиг программы на час или больше.
При выборе XMLTV-источника проверяй: покрывает ли он твой регион, как часто обновляется (хорошая частота — каждые 12–24 часа), есть ли описания программ или только названия. Источник без описаний — это не EPG, это просто список названий.
OpenTV и MHW2 EPG для спутниковых каналов
Некоторые спутниковые платформы используют проприетарные форматы EPG вместо стандартного DVB EIT. OpenTV (используется на некоторых европейских платформах) и MediaHighway2 (MHW2) — два таких формата. Enigma2 умеет читать оба, но нужно убедиться что в настройках EPG включён соответствующий парсер. В OpenPLi это есть по умолчанию, в некоторых сборках OpenATV нужно ставить дополнительный плагин.
Скрипты конвертации сетки в XMLTV
Если у тебя есть источник расписания в другом формате (JSON API, HTML страница, CSV), можно написать простой Python-скрипт конвертации. Минимальный шаблон:
from xml.etree.ElementTree import Element, SubElement, tostring
from datetime import datetime
tv = Element('tv')
ch = SubElement(tv, 'channel', id='my.channel')
SubElement(ch, 'display-name').text = 'Мой канал'
prog = SubElement(tv, 'programme',
start='20260516180000 +0300',
stop='20260516190000 +0300',
channel='my.channel')
SubElement(prog, 'title').text = 'Программа'
Запускаешь по крону каждые 12 часов, кладёшь результат в /hdd/xmltv.xml — готово.
Настройка EPG в Enigma2 ресиверах с CCcam/OScam
Enigma2 — самая распространённая платформа для спутниковых ресиверов с поддержкой card sharing. EPGImport — стандартный плагин для внешних XMLTV источников.
Установка плагина EPGImport через feed
В Enigma2 (OpenPLi, OpenATV, OpenVix): Menu → Blue Panel → Plugins → Plugin Browser → EPGImport. Если не находит — нужно обновить список плагинов или добавить feed своей прошивки. После установки плагин появится в Extensions.
Конфигурация источников в /etc/epgimport/
EPGImport читает конфигурацию из /etc/epgimport/. Структура:
*.sources.xml— описание источников (URL XMLTV файлов)*.channels.xml— маппинг XMLTV channel id на service reference Enigma2
Пример sources.xml:
<sources>
<source type="gen_xmltv" nocheck="1">
<description>Локальный EPG</description>
<url>http://192.168.1.100/xmltv.xml</url>
<channels>/etc/epgimport/local.channels.xml</channels>
</source>
</sources>
Если XMLTV лежит прямо на ресивере: file:///hdd/xmltv.xml.
Привязка XMLTV каналов к bouquets через channel_id_list
Это самое важное. В channels.xml каждый XMLTV channel id нужно привязать к service reference Enigma2:
<channels>
<channel id="channel.one">1:0:1:1234:5678:0028:E0000000:0:0:0:</channel>
</channels>
Формат service reference: 1:0:TYPE:SID:TSID:ONID:NAMESPACE:0:0:0:. TYPE: 1 = TV, 2 = Radio. SID, TSID, ONID — смотришь в /etc/enigma2/lamedb или через Menu → Information → Service Info на нужном канале.
Можно автоматизировать поиск через grep:
grep -i "первый канал" /etc/enigma2/lamedb
Расписание автоматического импорта через cron
На большинстве ресиверов Enigma2 cron доступен. Добавить в /etc/cron/cron.daily или через crontab:
0 4 * * * python /usr/lib/enigma2/python/Plugins/Extensions/EPGImport/EPGImport.py --import
Или проще — настроить автозапуск прямо в плагине: EPGImport → Setup → Auto update time → 04:00.
Очистка кэша epg.dat при сбоях
Если EPG показывает мусор или устаревшие данные:
init 4
rm /etc/enigma2/epg.dat
rm /hdd/epg.dat 2>/dev/null
init 3
После перезапуска Enigma2 начнёт собирать EIT заново. Запусти импорт EPGImport вручную сразу после — иначе ждать придётся до следующего автообновления.
Привязка локального TV guide к каналам через CCcam/OScam потоки
Повторю ещё раз, потому что это действительно важно: EIT таблицы на PID 0x12 не шифруются. Твой local tv guide не зависит от того, работает card sharing или нет. OScam в режиме dvbapi занимается только дешифровкой ECM/EMM — пакеты EIT проходят мимо него.
Получение service reference для зашифрованных каналов
Для зашифрованных каналов service reference такой же, как для открытых. SID берёшь из /etc/enigma2/lamedb. Строка канала в lamedb выглядит так:
1:0:1:1234:5678:0028:E0000000:0:0:0:
Название канала
SID = 0x1234, TSID = 0x5678, ONID = 0x0028, NAMESPACE = 0xE0000000.
Совпадение PID EIT и видимого расписания
Если хочешь убедиться что EIT доходит — используй tcpdump на интерфейсе ресивера или смотри через wireshark на dvbapi порту OScam (по умолчанию 988):
tcpdump -i eth0 -nn port 988 -c 100
Но лучше проще: посмотри в плагине Service Information (доступен в большинстве прошивок Enigma2) — там будет показан PIDs текущего канала, включая EIT PID.
Что делать когда CAID меняется и EPG ломается
Смена CAID на канале на EPG не влияет. EPG ломается когда провайдер меняет SID или TSID канала (transponder reshuffling). В этом случае service reference в channels.xml становится неверным — нужно обновить его вручную. Ресивер при этом обычно сам находит канал (через bouquet update), но маппинг в EPGImport остаётся старым.
Решение: после обнаружения что EPG пропал для конкретного канала — проверь его service reference через Service Info, сравни с тем что в channels.xml, обнови если отличается.
Использование SoftCam с OScam для приёма EIT данных
В /etc/oscam/oscam.conf, секция [dvbapi], параметр pmt_mode влияет на то, как OScam взаимодействует с тюнером. При некоторых значениях (pmt_mode = 4 или 6) OScam может блокировать EIT фильтры. Если EPG пропал после установки OScam — попробуй:
[dvbapi]
enabled = 1
boxtype = dreambox
user = your_user
pmt_mode = 0
Также проверь файл /etc/oscam/oscam.dvbapi — если там есть строки с P: 0012 (фильтр на PID 0x12 EIT) — удали их.
Альтернативные методы для IPTV каналов и гибридных setup
Если часть каналов идёт через DVB-S, а часть через IPTV — это гибридный setup. EPG нужно настраивать для обоих источников отдельно.
M3U playlist с tvg-id и tvg-url атрибутами
В M3U плейлисте для IPTV каналов EPG привязывается через атрибуты в строке #EXTINF:
#EXTM3U url-tvg="http://192.168.1.100/xmltv.xml" x-tvg-url="http://192.168.1.100/xmltv.xml"
#EXTINF:-1 tvg-id="channel.one" tvg-name="Первый канал" tvg-logo="http://logo.url/ch1.png",Первый канал
udp://@239.1.1.1:1234
Атрибут tvg-id должен совпадать с id в XMLTV файле — это точка склейки. Если они не совпадают, EPG не подтянется даже если файл правильный.
Связка XMLTV с IPTV bouquets
В Enigma2 IPTV каналы (тип IPTV) тоже имеют service reference, но с другим type. Для них EPGImport работает точно так же — нужно добавить их в channels.xml с их service reference. Посмотреть ref можно через Service Info на конкретном IPTV канале.
EPG для HTTP/HLS потоков через прокси
Если IPTV-провайдер не даёт XMLTV — попробуй найти его EPG через tvheadend. TVheadend умеет принимать IPTV потоки и одновременно собирать EPG из нескольких источников, а затем отдавать клиентам единый поток по HTSP протоколу.
Tvheadend как промежуточный EPG сервер
Tvheadend — это полноценный TV-сервер для Linux. Он работает параллельно с OScam и может:
- Принимать DVB-S сигнал напрямую (если ресивер отдаёт поток по сети)
- Импортировать XMLTV из любых источников
- Отдавать EPG клиентам по HTSP (порт 9982) или HTTP API (порт 9981)
- Экспортировать готовый XMLTV для других ресиверов
Конфиг XMLTV grabber в Tvheadend: Configuration → Channel/EPG → EPG Grabber Modules → External XMLTV. Указываешь путь к скрипту или файлу, частоту обновления. После настройки все ресиверы в сети берут EPG с одного источника.
Диагностика и устранение типичных проблем
Большинство проблем с EPG решается за 5 минут если знать где смотреть.
EPG пустой после импорта — проверка channel_id_list
Первое что смотришь — лог EPGImport:
tail -f /tmp/epgimport.log
Там будет видно сколько каналов из XMLTV совпало с channels.xml. Если "0 matched" — проблема в маппинге. Проверь что tvg-id в XMLTV совпадает с id в channels.xml посимвольно, без лишних пробелов.
Второе — проверить размер epg.dat:
ls -la /hdd/epg.dat
Файл должен расти. Если размер 0 или файла нет — Enigma2 не сохраняет кэш в нужное место.
Сдвиг времени на ±1 час — настройка timezone и DST
Сдвиг ровно на 1 час — почти всегда DST (летнее/зимнее время). Проверь:
cat /etc/timezone
cat /etc/TZ
date
Timezone должен соответствовать твоему региону. Для России: Europe/Moscow, для Украины: Europe/Kiev, и так далее. При этом start/stop в XMLTV файле должны быть с правильным UTC-смещением. Если источник XMLTV пишет время без смещения — это его баг, и придётся либо конвертировать на лету, либо искать другой источник.
Программа есть только для now/next, нет на 7 дней
Провайдер не передаёт schedule tables. Единственное решение — внешний XMLTV с полной программой. Встроенный EPG scan здесь не поможет — если данных нет в потоке, взять их неоткуда.
EPG исчезает после перезагрузки ресивера
Классика. По умолчанию /etc/enigma2/ на большинстве ресиверов — это либо flash-память, либо tmpfs, который очищается при перезагрузке. Решение:
Menu → Setup → System → EPG → EPG Cache Path → изменить на /hdd/epg.dat. После этого перезагрузка ресивера не потеряет накопленный кэш. Если /hdd не смонтирован или места нет — используй USB-носитель: /media/usb/epg.dat.
Особо актуально для ресиверов с маленьким flash 32–64 MB — epg.dat там просто не умещается. Файл может вырасти до 20–50 MB при большом количестве каналов и полной неделе программы.
Конфликт двух источников EPG для одного канала
Если ресивер одновременно получает EIT из транспортного потока и XMLTV через EPGImport — могут появиться дубликаты в расписании. В Enigma2 это лечится отключением встроенного EPG scan для конкретного bouquet: в настройках буклета выставить "Don't use EIT" или аналогичный параметр. Либо наоборот — отключить EPGImport для каналов где хорошо работает встроенный EIT.
Ещё один нетривиальный случай: каналы с timeshift версиями (+3/+6 часов). Это региональные копии канала с тем же контентом но сдвинутым расписанием. Для них нужен отдельный XMLTV с соответствующим смещением времени, или отдельная запись в channels.xml с правильным offset в атрибутах.
Также: на старых прошивках OpenPLi 4.x и OpenATV 6.x формат epg.dat несовместим с новыми версиями EPGImport 4.x. Если после обновления плагина EPG перестал работать — попробуй откатить EPGImport до версии, совместимой с твоей прошивкой. Смотри changelog плагина на GitHub проекта EPGImport.
Почему EPG не отображается для каналов которые я смотрю через CCcam/OScam?
EIT таблицы передаются на PID 0x12 в транспортном потоке и не шифруются — card sharing здесь вообще ни при чём. Если EPG пустой, проверь: включён ли EPG scan в настройках ресивера, не отключён ли он для конкретного bouquet, и нормальный ли уровень сигнала. Слабый сигнал (ниже 60% качества) даёт потери пакетов и EIT не накапливается. OScam влияет только на дешифровку видео/аудио, не на EPG.
Можно ли использовать XMLTV файл без интернета на ресивере?
Да. Скопируй XMLTV файл на USB-диск или HDD: /hdd/xmltv.xml. В EPGImport sources.xml укажи URL как file:///hdd/xmltv.xml вместо http://. Это отлично работает для домашней сети: один сервер (Raspberry Pi, NAS) генерирует XMLTV и раздаёт его по NFS или SMB, ресивер монтирует шару и читает файл локально.
Чем отличается now/next EPG от полной 7-дневной программы?
Now/next — это EIT present/following с table_id 0x4E, содержит только текущую и следующую программу. Полная программа хранится в schedule tables (0x50–0x5F для текущего транспондера, 0x60–0x6F для остальных). Не все провайдеры передают schedule — многие ограничиваются now/next для экономии полосы. Если у тебя есть only now/next в эфире, единственный способ получить расписание на неделю — внешний XMLTV источник.
Как привязать XMLTV channel id к каналу в Enigma2?
Создай файл /etc/epgimport/mylocal.channels.xml со строками вида: <channel id="xmltv_id">1:0:1:SID:TSID:ONID:NAMESPACE:0:0:0:</channel>. SID, TSID, ONID смотришь в /etc/enigma2/lamedb (значения в hex) или через плагин Service Information — нажать кнопку Info на нужном канале. NAMESPACE обычно 0xE0000000 для спутника или 0x00000000 для IPTV.
EPG показывает программу на час раньше или позже — как исправить?
Сдвиг ровно на час — это DST. Проверь cat /etc/timezone на ресивере — должен быть правильный регион, например Europe/Moscow. В XMLTV атрибут start должен включать UTC-смещение: 20260516180000 +0300. Если XMLTV пишет время без смещения или в другой зоне — программа будет смещена. При переходе на летнее/зимнее время сдвиг появляется если timezone прописан жёстко как UTC+3 вместо named timezone с поддержкой DST.
Можно ли использовать один XMLTV источник для нескольких ресиверов в локальной сети?
Именно так и надо делать. Поднимаешь nginx или lighttpd на любой машине в сети (роутер, NAS, Raspberry Pi), кладёшь туда XMLTV файл, обновляешь его по cron каждые 12–24 часа. Все ресиверы прописывают один HTTP URL в своём EPGImport. Файл скачивается один раз и раздаётся локально — экономия трафика, синхронизированный EPG на всех устройствах. Nginx конфиг минимальный: location / { root /var/www/epg; }
Почему после перезагрузки ресивера весь EPG пропадает?
По умолчанию epg.dat сохраняется в /etc/enigma2/, который на большинстве ресиверов находится в flash-памяти или tmpfs и очищается при перезагрузке. Зайди в Settings → EPG → EPG Cache Path и смени путь на /hdd/epg.dat — это уже постоянное хранилище. После следующей перезагрузки ресивер прочитает кэш и не будет ждать нового EIT scan. Для ресиверов с маленьким flash (32–64 MB) это вообще единственный рабочий вариант.
Practical checklist for smooth viewing
Even the best CCCam or OSCam line needs two or three simple preparations. Update your receiver firmware, reset the ECM cache once a week and keep 15–20% free space on the USB stick or internal flash so that the reader can store keys without delays.
When tuning a dish, aim for MER/BER reserve: a two‑degree offset or a loose F‑connector often causes the “freezing” that users blame on cardsharing. Keep a short patch cord to test alternative routers, and save two profiles in OSCam — one for TCP, one for UDP — so you can switch instantly if your ISP starts filtering a protocol.
Utgard.tv monitors each hub 24/7, but you can speed up diagnostics by keeping a short log of your receiver actions. Note the time when you changed the channel, which CAID was active and whether you used Wi‑Fi or Ethernet. This tiny “journal” helps engineers reproduce your environment in the lab and return with a solution in minutes instead of hours.
- Keep two line slots enabled: if the first server hits a maintenance window, the second one instantly takes over without re-entering credentials.
- Run a monthly speed and latency test. Stable 1–2 Mbps with ping <80 ms is enough for SD/HD, but if jitter exceeds 20 ms, switch the router to wired mode.
- Save the Utgard.tv status page and Telegram bot @utgard_tv_bot to bookmarks — they publish maintenance notices before SEMrush or uptime monitors raise alerts.