EPG: una guía que viaja aparte
La EPG (Electronic Program Guide, guía electrónica de programación) es la parrilla que indica qué se emite ahora y después en cada canal. En la TDT, esta información viaja en la propia señal, dentro de tablas normalizadas por el estándar DVB. En Internet es distinto: el vídeo de un canal y su guía llegan, por lo general, por dos caminos distintos.

Por un lado, el reproductor recibe el flujo de vídeo a partir de una lista M3U o de una conexión Xtream Codes. Por otro, descarga un archivo de guía, casi siempre en formato XMLTV, que describe varios días de programas para decenas o cientos de canales. El trabajo del reproductor consiste entonces en hacer corresponder cada canal de la lista con su parrilla en el archivo.
Esta separación explica la mayoría de los problemas: un canal puede funcionar perfectamente y tener la guía vacía, porque el vídeo y la guía no dependen el uno de la otra.
La estructura de un archivo XMLTV
XMLTV es un formato abierto, nacido a principios de los años 2000 en la comunidad del software libre, basado en el lenguaje XML. Un archivo contiene un elemento raíz <tv> y después dos tipos de bloques: los canales y los programas.
<?xml version="1.0" encoding="UTF-8"?>
<tv generator-info-name="ejemplo">
<channel id="ejemplo1.es">
<display-name>Ejemplo 1</display-name>
<icon src="https://img.ejemplo.es/ex1.png"/>
</channel>
<programme start="20260928204500 +0200" stop="20260928223000 +0200" channel="ejemplo1.es">
<title lang="es">Documental de la noche</title>
<desc lang="es">Viaje al corazón de los volcanes de Auvernia.</desc>
<category lang="es">Documental</category>
</programme>
</tv>
El elemento channel
Cada <channel> lleva un atributo id, el identificador único del canal en ese archivo. A menudo se forma como un nombre de dominio (ejemplo1.es), pero es solo una convención: vale cualquier cadena de caracteres. Contiene además uno o varios nombres para mostrar (<display-name>) y a veces un logotipo (<icon>).
El elemento programme
Cada <programme> describe un programa: hora de inicio (start), hora de fin (stop), canal correspondiente (channel, que repite el id de un elemento <channel>), título y, opcionalmente, sinopsis, categoría, episodio, año, cartel o clasificación por edades. Los programas son independientes unos de otros, lo que permite que un archivo cubra desde unas horas hasta varias semanas.
La correspondencia entre lista y guía: tvg-id
El vínculo entre el canal de tu lista y su parrilla se basa en el atributo tvg-id de la línea #EXTINF. La regla es sencilla: el tvg-id de la lista debe ser idéntico, carácter por carácter, al id del <channel> en el archivo XMLTV.
#EXTINF:-1 tvg-id="ejemplo1.es" group-title="Generalistas",Ejemplo 1 HD
https://tv.ejemplo.es/live/ex1.m3u8
Si la lista indica tvg-id="Ejemplo1.es" y la guía id="ejemplo1.es", la correspondencia falla en muchos reproductores, porque la comparación distingue mayúsculas y minúsculas. Cuando no hay tvg-id, algunos reproductores intentan una correspondencia por el nombre (tvg-name o nombre mostrado) con el <display-name> de la guía; es menos fiable, porque «Ejemplo 1 HD» y «Ejemplo 1» no son idénticos.
Con una conexión Xtream Codes, la correspondencia es en principio automática: el servidor proporciona para cada canal un campo epg_channel_id que hace de tvg-id, y una guía XMLTV coherente con esos identificadores. El funcionamiento de esta API se detalla en nuestro artículo sobre las conexiones Xtream Codes, y la sintaxis de las listas en el formato M3U línea por línea.
Horas, zonas horarias y desfases
Las horas XMLTV se escriben con la forma AAAAMMDDhhmmss seguida de un desfase respecto al tiempo universal (UTC). Así, 20260928204500 +0200 significa el 28 de septiembre de 2026 a las 20:45, en una zona adelantada dos horas respecto al UTC, es decir, las 18:45 UTC.
En la Francia metropolitana, la hora legal es UTC+1 en invierno (+0100) y UTC+2 en verano (+0200). El cambio a la hora de verano tiene lugar el último domingo de marzo, y la vuelta a la hora de invierno, el último domingo de octubre. Una guía correcta para un canal francés debe, por tanto, cambiar de desfase en esas fechas, o expresarlo todo en UTC con +0000. Las zonas horarias y las fechas de cambio de hora varían según los países.
El reproductor convierte después esas horas a la zona de tu dispositivo. De ahí tres posibles fuentes de desfase:
| Síntoma | Causa probable | Remedio |
|---|---|---|
| Toda la guía está desfasada exactamente una hora | El archivo indica un desfase fijo que ignora el cambio de hora, o +0000 cuando las horas son locales | Ajuste de desfase de la guía en el reproductor, o atributo tvg-shift |
| Desfase de varias horas | Zona horaria del dispositivo mal configurada, o guía prevista para otro país | Comprobar fecha, hora y zona horaria en los ajustes del sistema |
| Un solo canal desfasado | Canal emitido desde otra zona horaria o desfasado a propósito (versión «+1») | tvg-shift solo en ese canal |
| Desfase de unos minutos | El canal no respeta sus horarios anunciados | Ninguno: la guía refleja la parrilla prevista |
El atributo tvg-shift se coloca en una línea #EXTINF y se expresa en horas, que pueden ser negativas o decimales: tvg-shift="-1" retrasa la guía una hora para ese canal. Es un parche: si el desfase aparece o desaparece con el cambio de hora, el verdadero defecto está en el archivo de origen.
Una última trampa, frecuente en los sticks de TV y las box: una fecha del sistema incorrecta. Si el dispositivo no ha sincronizado su reloj (sin red al arrancar, sin pila de respaldo), el reproductor busca los programas de otro día y no muestra nada. Activa la fecha y la hora automáticas en los ajustes.
Guía vacía: las causas, por orden
Cuando la guía se queda desesperadamente vacía, procede con método, de lo más sencillo a lo más técnico.
- La guía aún no se ha cargado. Un archivo grande puede tardar de unos segundos a varios minutos en la primera descarga, sobre todo en un dispositivo modesto. Deja que el reproductor termine y vuelve a abrir la lista de canales.
- No hay ninguna dirección de guía configurada. Con una lista M3U, hace falta un atributo
url-tvgen la cabecera o una dirección introducida en los ajustes del reproductor. - La dirección no responde. Ábrela en un navegador: debes obtener una descarga o XML, no una página de error.
- Los identificadores no coinciden. Busca el
tvg-idde un canal en el archivo XMLTV (una vez descomprimido). Si no figura exactamente igual, el vínculo está roto. - La guía está caducada. Mira las fechas de los últimos
<programme>: un archivo que termina ayer no puede mostrar nada hoy. - La fecha del dispositivo es incorrecta. Consulta la sección anterior.
Si solo algunos canales no tienen guía, casi siempre es el paso 4: esos canales no existen en el archivo, o figuran con otro identificador. Ningún ajuste del reproductor puede inventar una parrilla que la fuente no tiene.
Tamaño, compresión y frecuencia de actualización
Un archivo XMLTV es prolijo: cada programa repite sus etiquetas, sus atributos y a veces largas sinopsis. Para unos cientos de canales durante una semana, el archivo puede pesar varias decenas de megabytes. Por eso se distribuye muy a menudo comprimido en formato gzip, con la extensión .xml.gz. El texto XML, muy repetitivo, se comprime bien: es habitual que el tamaño se reduzca entre cinco y diez veces.
| Elemento | Efecto en el peso | Consejo |
|---|---|---|
| Número de días cubiertos | Proporcional | Dos o tres días bastan para el directo |
| Número de canales | Proporcional | Una guía limitada a tus canales es más rápida |
| Sinopsis e imágenes | Importante | Útiles, pero hacen más pesada la carga |
Compresión .gz | Reduce mucho la descarga | Preferirla cuando la fuente la ofrezca |
En un stick de TV con poca memoria, lo que cuesta no es tanto la descarga como el análisis del archivo: hay que leer e indexar decenas de miles de programas. Una guía acotada se carga bastante más rápido que una guía «mundial» de la que solo usas una fracción.
En cuanto a la frecuencia, los reproductores vuelven a descargar la guía a intervalos regulares (a menudo una vez al día) o bajo demanda. Si tu parrilla parece congelada, fuerza una actualización desde los ajustes. En AICKO IPTV, esta operación y la incorporación de una fuente de guía se describen en la página guía de TV (EPG).
En resumen
- La guía de programación es un archivo XMLTV aparte del vídeo.
- Contiene elementos
<channel>y<programme>vinculados por un identificador. - El
tvg-idde la lista debe ser estrictamente idéntico alidde la guía. - Las horas llevan un desfase UTC (
+0100o+0200en Francia);tvg-shiftcorrige un canal desfasado. - Una guía comprimida en
.xml.gzy limitada a tus canales se carga más rápido.
Preguntas frecuentes
¿Por qué mi guía está desfasada una hora desde el cambio de hora?
El archivo de origen usa un desfase fijo que no sigue el paso a la hora de verano o de invierno. El remedio duradero es una fuente corregida; mientras tanto, un desfase de una hora en los ajustes de la guía o un tvg-shift compensan el defecto.
¿Puedo usar una guía distinta de la de mi servicio?
Sí, si tu reproductor permite introducir una dirección XMLTV. Pero la guía solo funcionará si sus identificadores de canal coinciden con los tvg-id de tu lista; si no, hay que adaptar esos identificadores en la lista.
¿Tiene que descomprimir el reproductor el archivo .gz?
Sí, la mayoría de los reproductores de televisión aceptan directamente los archivos .xml.gz. Solo tienes que descomprimirlo tú mismo para inspeccionarlo, por ejemplo con 7-Zip en Windows.
¿Por qué algunos canales tienen guía y otros no?
Los canales sin guía no están en el archivo XMLTV o figuran con un identificador distinto de su tvg-id. El reproductor solo puede mostrar lo que la fuente describe.
