Veremos cómo instalar Tvheadend en un servidor Linux (Gentoo) para ver canales IPTV que recibo a través de mi contrato Movistar Fusión TV. Aunque esta información fue válida durante el 2015 tanto Tvheadend (nueva versión) como el propio Movistar TV (EPG) han evolucionado, así que dejo este apunte como documentación de referencia pero te recomiendo consultar el nuevo apunte Tvheadend y Movistar TV (2016).

Aviso a navegantes: En mi caso no utilizo el router de Movistar, lo he sustituido por un equipo linux, por lo tanto todo lo descrito en este artículo es válido para esta forma de trabajar, te recomiendo echarle un ojo también a este apunte: Movistar Fusión Fibra + TV + VoIP con router Linux. Quizá también te podrían interesar otros apuntes cómo el que va sobre WebGrab+Plus con TVHeadEnd en Linux, mi Media Center casero y por último la “Raspberry Pi OpenElec con XBMC“.

fuentesstb2015

Tvheadend y Movistar TV + XBMC/KODI

 

Instalación de Tvheadend en Linux Gentoo (systemd)

Estas son las opciones que utilicé en el 2015, el comando para instalar Tvheadend en un linux Gentoo con systemd. Si prefieres openrc consulta este otro apunte.

[code language=”bash” light=”true”]
lunatv # cat /etc/portage/package.accept_keywords
# tvheadend
~media-tv/tvheadend-9999 **

lunatv ~ # cat /etc/portage/package.use/tvheadend
media-tv/tvheadend avahi capmt constcw cwc dbus dvb dvbscan ffmpeg -hdhomerun imagecache inotify iptv -libav satip timeshift uriparser xmltv zlib

lunatv ~ # emerge -v tvheadend
:
[/code]

 

Si en el futuro quieres actualizar simplemente ejecuta lo siguiente:

[code language=”bash” light=”true”]
lunatv ~ # emerge -DuvNp system world
[/code]

 

Aquí tienes el fichero .service. Ten en cuenta que esta versión está ligeramente retocada, dependo del servicio igmpproxy (más aquí).

[code language=”bash” light=”true”]
lunatv ~ # cat /etc/systemd/system/tvheadend.service

[Unit]
Description=UDP-to-HTTP multicast traffic relay daemon
After=network-online.target igmpproxy.service

[Service]
Type=forking
EnvironmentFile=/etc/conf.d/tvheadend
ExecStart=/usr/bin/tvheadend -f -C -u $TVHEADEND_USER -g $TVHEADEND_GROUP -c $TVHEADEND_CONFIG $TVHEADEND_OPTIONS
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
[/code]
 

Por último, el fichero de configuración. El parámetro más importante es el directorio al que apunta TVHEADEND_CONFIG. Ese directorio es en el que debes trabajar cuando quieras cambiar la configuración de tvheadend.

[code language=”bash” light=”true”]
lunatv ~ # cat /etc/conf.d/tvheadend
# See the tvheadend(1) manpage for more info.

# Run Tvheadend as this user.
TVHEADEND_USER="tvheadend"

# Run Tvheadend as this group.
TVHEADEND_GROUP="video"

# Path to Tvheadend config.
TVHEADEND_CONFIG="/etc/tvheadend"

# Other options you want to pass to Tvheadend.
TVHEADEND_OPTIONS=""
[/code]
 

Estos son los comandos necesarios para habilitar, arrancar y parar el servicio

[code language=”bash” light=”true”]
lunatv ~ # systemctl enable tvheadend
lunatv ~ # systemctl start tvheadend
lunatv ~ # systemctl stop tvheadend
[/code]

 
 

TVheadEnd + Add-On “Tvheadend HTSP Client”

En este artículo documento la siguiente opción: TVHeadEnd + Add-On “Tvheadend HTSP Client”. Es una opción muy buena con una arquitectura sencilla: El XBMC usa el addon Tvheadend HTSP Client para conectar vía HTSP con el daemon TVHeadEnd que se ejecuta en el Linux que a su vez se suscribe a la fuente multicast para recibir y reenviar el canal de TV. Además soporta intepretar el EPG en formato XMLTV.

En cada uno de los XBMC se añade el Add-On “Tvheadend HTSP Client” y se configura para acceder por HTSP al servidor donde se ejecuta el daemon de TVHeadEnd, por donde recibirá “lista” de canales, cómo llegar hasta ellos y más adelante el EPG.

tvheaden_cl1

tvheaden_cl2
 

Lista de canales y EPG

A continuación vamos a bajarnos el listado de canales y el EPG y para conseguirlo contamos con un script fantástico llamado movistartv2xmltv, un proyecto muy activo que es capaz de conectar con el servicio SD&S (Service Discovery & Selection) de Movistar TV para recoger la información de canales y programación (EPG). Una vez tenga ambos alimentaré a TVHeadEnd y será el quien los presente a los clientes XBMC.

Instalo el script en mi servidor Linux casero, primero instalo como root unas dependencias para después, como un usuario normal, bajarme el script.

[code language=”bash” light=”true”]
totobo ~ # emerge -v xmltv
totobo ~ # export EPYTHON=python2.7
totobo ~ # easy_install –upgrade pytz
:
totobo ~ $ curl -L -Ok https://github.com/ese/movistartv2xmltv/archive/master.zip
totobo ~ $ unzip master.zip
totobo ~ $ rm master.zip
totobo ~ $ mv movistartv2xmltv-master/ movistartv2xmltv
totobo ~ $ cd movistartv2xmltv/
totobo movistartv2xmltv $ chmod 755 *.py
[/code]

Creo su fichero de configuración (formato json). Utilizo el nombre tv_grab_es_movistar.config, es el que por defecto buscará el programa al llamarlo sin argumentos:

[code light=”true”]
{
"demarcation": "",
"days": "6",
"filename": "/home/luis/movistartv2xmltv/movistartv-guia.xml",
"quiet": "False",
"offset": "0",
"logfile": "/home/luis/movistartv2xmltv/movistartv.log"
}
[/code]

  • Nota: después de la primera ejecución el programa modifica el json y quedará tal que así:

[code light=”true”]
{
"demarcation": 19,
"mcast_port": 3937,
"tvpackages": ["UTX6C", "UTX8F"],
"days": "6",
"mcast_grp_start": "239.0.2.129",
"filename": "/home/luis/movistartv2xmltv/movistartv-guia.xml",
"quiet": "False",
"offset": "0",
"logfile": "/home/luis/movistartv2xmltv/movistartv.log"
}
[code]

 

<h4>Primer paso: La lista de canales</h4>

<p style="text-align: justify;">Necesito esta lista para alimentar a TVHeadEnd, para saber dónde están los iconos de los canales, etc.</p>

[code language="bash" light="true"]
totobo movistartv2xmltv $ export EPYTHON=python2.7
totobo movistartv2xmltv $ ./tv_grab_es_movistar.py -h
:
totobo movistartv2xmltv $ ./tv_grab_es_movistar.py –m3u –output movistartv-canales.m3u
[/code]

TVHeadEnd no entiende esta lista en formato .m3u, así que vamos a convertirla a su formato. Una vez más, otro genial script disponible en GitHub m3u2hts se encarga de la tarea.

[code language=”bash” light=”true”]
totobo movistartv2xmltv $ mkdir tvheadend
totobo movistartv2xmltv $ cd tvheadend/

totobo tvheadend $ curl -Ok https://raw.githubusercontent.com/grudolf/m3u2hts/master/m3u2hts.py
totobo tvheadend $ chmod 755 m3u2hts.py
[/code]
 

Ejecuto el programa m3u2hts (nota que mi interfaz es el vlan100), dependiendo de la versión de TVHeadEnd (3.4 o 3.9+) usando argumentos diferentes:

M3U2HTS con TVHeadEnd 3.4

Ejecuto el script y vemos cómo se generan cuatro directorios:

[code language=”bash” light=”true”]
totobo tvheadend $ EPYTHON=python2.7 python m3u2hts.py -c utf-8 –iface vlan100 -r ../movistartv-canales.m3u
OK
totobo tvheadend $ ls -al
total 36
drwxr-xr-x 6 luis luis 4096 ene 31 18:59 .
drwxr-xr-x 3 luis luis 4096 ene 31 18:55 ..
drwxr-xr-x 2 luis luis 4096 ene 31 18:59 channels
drwxr-xr-x 2 luis luis 4096 ene 31 18:59 channeltags
drwxr-xr-x 3 luis luis 4096 ene 31 18:59 epggrab
drwxr-xr-x 2 luis luis 4096 ene 31 18:59 iptvservices
-rwxr-xr-x 1 luis luis 11535 ene 31 18:54 m3u2hts.py
[/code]

Copio los cuatro directorios al directorio de trabajo de TVHeadEnd (en mi caso en /etc), notar que esto solo hay que hacerlo la primera vez. Ah!, no olvides cambiar los permisos (mira el comando chown).

[code language=”bash” light=”true”]
totobo tvheadend # /etc/init.d/tvheadend stop

totobo tvheadend # cd /etc/tvheadend/
totobo tvheadend # cp -R /home/luis/movistartv2xmltv/tvheadend/channels .
totobo tvheadend # cp -R /home/luis/movistartv2xmltv/tvheadend/channeltags .
totobo tvheadend # cp -R /home/luis/movistartv2xmltv/tvheadend/epggrab .
totobo tvheadend # cp -R /home/luis/movistartv2xmltv/tvheadend/iptvservices .

totobo tvheadend # chown -R tvheadend:video /etc/tvheadend/
[/code]
 
M3U2HTS con TVHeadEnd 3.9

En mi caso tengo instalada la versión 3.9+. Una vez que realicé la instalación ejecuté “tvheadend start” una única vez para que se creara la estructura de directorios, después lo paré con “tvheadend stop”. A continuación ejecuto m3u2hts para importar los canales de Movistar TV.

No dejar de leer la nota respecto a la conversión para la versión 3.9+ en el sitio de GitHub porque todavia es experimental. Ejecuto el script y vemos cómo se generan tres directorios:

[code language=”bash” light=”true”]
___IMPORTANTE: Elimino la ‘@’ en las URL’s de los canales multicast:
totobo movistartv2xmltv $ sed -i "s/\/@/\//" movistartv-canales.m3u

___CONVIERTO .m3u A FORMATO TVHEADEND 3.9+
totobo movistartv2xmltv $ cd tvheadend/
totobo tvheadend $ EPYTHON=python2.7 python m3u2hts.py –newformat -c utf-8 –iface vlan100 -r ../movistartv-canales.m3u -o channel
OK
totobo tvheadend $ ls -al
total 32
drwxr-xr-x 5 luis luis 4096 feb 8 12:32 .
drwxr-xr-x 3 luis luis 4096 feb 1 20:25 ..
drwxr-xr-x 4 luis luis 4096 feb 8 12:32 channel
drwxr-xr-x 3 luis luis 4096 feb 8 12:32 epggrab
drwxr-xr-x 3 luis luis 4096 feb 8 12:32 input

totobo tvheadend $ sudo cp -R channel/ epggrab/ input/ /etc/tvheadend
totobo tvheadend $ sudo chown -R tvheadend:video /etc/tvheadend/
totobo tvheadend $ sudo chmod go-rwx -R /etc/tvheadend/input/ /etc/tvheadend/epggrab/ /etc/tvheadend/channel/
[/code]

Una vez que tengo los canales pasados a los directorios de TVHeadEnd ya puedo arrancarlo e irme a XBMC a ver cómo los muestra ya disponibles.

[code language=”bash” light=”true”]
totobo tvheadend # /etc/init.d/tvheadend start
[/code]

tvheadlist

Lo iconos los entrega TVHeadEnd porque él se los baja desde el servidor de Movistar TV, si te fijas en la lista de canales también obtuvo el lugar desde el cual bajarse el icono.

tvheadendchannels

 

Nota: he creado un contenedor Docker para ejecutar Tvheadend, ya está 100% operativo, échale un ojo, estos son los proyectos donde tienes todo lo necesario:

Si no conoces Docker, te dejo estos enlaces: ¿qué es Docker? y otros casos de uso de Docker

 

Segundo paso: descargar y activar el EPG

El siguiente paso es ejecutar el programa (sin argumentos) para descargar el EPG. Nota: en el fichero de configuración indicamos el nombre del fichero de salida y al llamarlo sin argumentos por defecto se dedica a bajarse el EPG. La primera vez lo ejecuto manualmente para verificar su funcionamiento e ir viendo el Log en paralelo.

[code language=”bash” light=”true”]
totobo movistartv2xmltv $ export EPYTHON=python2.7
totobo movistartv2xmltv $ nohup ./tv_grab_es_movistar.py &amp;
[/code]
 
Observo en paralelo el log

Que no te extrañe, tarda unos 30 minutos en un servidor (Intel Core i5) (también probé a hacerlo en el linux del receptor VU+ ultimo pero tardaba unos 60 minutos), así que he decidido usar mi servidor casero.

El fichero resultante: /home/luis/movistartv2xmltv/movistartv-guia.xml ocupa unos 15MB:

Captura de pantalla 2015-01-30 a las 22.58.26

Ahora que tenemos el EPG en /home/luis/movistartv2xmltv/movistartv-guia.xml se lo enviamos al daemon TVHeadEnd a través de un socket, pero antes debo instalar el programa socat y configurar TVHeadEnd para que acepte la información EPG a través de un interfaz externo (socket xmltv.sock), conectamos con el programa a través del interfaz Web y modificamos Configuración-> Channel/EPG-> EPG Grabber-> Interfaz Externo

[code language=”bash” light=”true”]
totobo epggrab # emerge -v socat
[/code]

xmltv-sock

Por fin podemos mandar el fichero EPG a TVHeadEnd on el comando siguiente:

[code language=”bash” light=”true”]
# cat /home/luis/movistartv2xmltv/movistartv-guia.xml | socat – UNIX-CONNECT:/etc/tvheadend/epggrab/xmltv.sock
[/code]
 
Al cabo de un minuto empezaremos a ver cómo aparece el EPG en los canales en XBMC.

movistarepg
 

Automatizar todo el proceso

Hemos visto todo el proceso paso por paso, ahora podemos automatizar la parte final, releer el EPG y enviárselo a TVHeadEnd, en mi caso lo hago a través del cron, creo un pequeño script y lo instalo en el directorio de ejecución diaria (/etc/cron.daily).

[code language=”bash” light=”true”]
#!/bin/bash
#

# Preparo el PATH
export PATH=/usr/sbin:/usr/bin:/sbin:/bin:.

# CWD al directorio donde he instalado movistartv2xmltv
cd /home/luis/movistartv2xmltv

# Ejecuto movistartv2xmltv (tarda aprox. 30 min)
#
# Crea el fichero: /home/luis/movistartv2xmltv/movistartv-guia.xml
#
EPYTHON=python2.7 ./tv_grab_es_movistar.py

#
# Mando a TVHeadEnd el fichero generado
#
sync &amp;&amp; sleep 5
cat /home/luis/movistartv2xmltv/movistartv-guia.xml | socat – UNIX-CONNECT:/etc/tvheadend/epggrab/xmltv.sock
[/code]
 

Nota sobre Routing y resolución DNS

El tráfico hacia los servidores de Movistar TV que se origina desde el daemon TVHeadEnd o desde los programas recolectores (ej: movistartv2xmltv, m3u2hts.py) debe ser enrutado correctamente hacia la VLAN2 de Movistar. Además, las consultas “DNS” que realice el programa movistartv2xmltv.py deben ir al DNS Server de Movistar TV ( 172.26.23.3).

Fácil decirlo pero puede ser complicado hacerlo, de hecho si no lo tienes bien configurado puede darte problemas como los scripts dando timeout o algunas cosas funcionen y otras no (por ejemplo, que sí descargues el EPG pero los iconos no puedan ser descargados por TVHeadEnd).

En mi caso lo tengo resuelto porque he sustituido el router de Telefónica por un equipo linux que se encarga de todo, en ese apunte encontrarás documentación relacionada con el routing, y además he añadido lo siguiente en la configuración de BIND del equipo: