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) это вообще единственный рабочий вариант.

Практические советы для стабильного просмотра

Даже самая стабильная линия CCCam или OSCam требует пары простых подготовительных шагов. Обновляйте прошивку ресивера, раз в неделю очищайте ECM‑кеш и держите 15–20% свободного места на USB‑накопителе или во встроенной памяти, чтобы кардридер записывал ключи без задержек.

При настройке антенны оставляйте запас по MER/BER: смещение на два градуса или ослабленный F‑коннектор чаще становится причиной “фризов”, чем сам кардшаринг. Держите под рукой короткий патч‑корд для проверки другого роутера и сохраните два профиля в OSCam — под TCP и под UDP — чтобы мгновенно переключиться, если провайдер начнёт фильтровать протокол.

Utgard.tv следит за каждым хабом 24/7, однако вы можете ускорить диагностику, если будете вести небольшой журнал действий. Записывайте время переключения канала, активный CAID и то, использовали ли вы Wi‑Fi или Ethernet. Такой мини‑отчёт позволит инженерам воспроизвести вашу конфигурацию в лаборатории и предложить решение не за часы, а за минуты.

  • Держите активными две линии: если первый сервер уходит на обслуживание, второй тут же подхватывает поток без повторного ввода логина.
  • Раз в месяц делайте замер скорости и задержек. Стабильных 1–2 Мбит/с при пинге до 80 мс достаточно для SD/HD, но если джиттер превышает 20 мс — переведите роутер на провод.
  • Сохраните в закладки страницу статуса Utgard.tv и Telegram‑бота @utgard_tv_bot — там появляются уведомления о работах раньше, чем успеют среагировать SEMrush или внешние мониторы.