La Gaceta de Linux ...¡ haciendo a Linux un poco más divertido !

XMLTV

Por Bill Lovett

Traducción al español por José Antonio Magro Cortés
el día 6 de Abril de 2005, para La Gaceta de Linux

¿Dónde podrías buscar para ver la programación de la televisión? Normalmente, en un periódico, en un número reciente de la revista TV Guide, en tu sitio Web favorito o en Tivo, ReplayTV o cualquier otro PVR. Pero no olvides añadir Linux a la lista. Puedes dejar que la máquina haga el trabajo sucio y que te muestre la programación. XMLTV, un pequeño script de bash, y una tarea de cron es todo lo que necesitas para empezar.

Instalación

Lo primero es lo primero: instalar el programa. XMLTV es una suite de scripts en Perl que se pueden descargar desde membled.com/work/apps/xmltv. Éstas son versiones para entornos Unix y Windows, aunque, por razones obvias, nos centraremos en las primeras. Si vamos a instalarlo desde el código fuente, el procedimiento normal es:

% perl Makefile.PL
% make
% make test
% make install 

Si trabajamos con Debian, es tan simple como usar apt-cache search xmltv. En la página principal del proyecto se pueden encontrar vínculos a paquetes para OS X, Red Hat 8 y Red Hat 9.

Configuración

Antes de poder utilizar XMLTV, debemos tener en cuenta dónde estamos. XMLTV es internacional: puede recoger programaciones de TV para Canadá y EEUU, Reino Unido, Austria y Alemania, Nueva Zelanda, Finlandia, Italia, España, Países Bajos, Dinamarca y Hungría. Actualmente se trabaja para incorporar a esta lista a Bélgica y Francia. Los scripts que recopilan las listas de un país concreto se conocen con el nombre de "grabbers" y se pueden llamar desde la línea de comandos mediante tv_grab_*. Vamos a utilizar el "grabber" de EEUU, tv_grab_na.

La primera vez que lo ejecutemos, lo haremos con la opción --configure. De esta forma se inicia una sesión interactiva, en la que el usuario y el "grabber" se conocerán algo mejor, debido a que se incluye el código postal, el proveedor de servicios de TV y los canales. Los resultados del script se escriben en ~/.xmltv/tv_grab_na.conf y se pueden editar fácilmente a mano.

En este momento, XMLTV está listo para servirte. Ejecutamos man tv_grab_na para conocer las posibles opciones. Por ahora, sólo necesitaremos dos:

% tv_grab_na --days 1 --output /tmp/tv.xml
De esta forma, le decimos al "grabber" capture la lista de un día y la guarde en /tmp/tv.xml.

Los ficheros de XMLTV tienen un formato que no facilitan precisamente la lectura, a menos que disfrutemos con el código puro y duro. La suite proporciona algunos scripts que pueden solucionar este problema. tv_sort ordena los contenidos de un fichero de fechas de xmltv. tv_grep permite eliminar parte de la basura de las listas. Yo suelo ejecutarlo así:

% tv_sort --output /tmp/tv_sorted.xml /tmp/tv.xml
% tv_grep --output /tmp/tv_grepped.xml --ignore-case --not --category Children \
          --not --category Sports --not --title "Paid Programming" \
          --not --title "Local Origination" \
          --on-after now /tmp/tv_sorted.xml
Los comandos anteriores ordenan el fichero original y, posteriormente, descarta cualquier cosa categorizada como "Children" o "Sports" así como cualquiera que contenga "Paid Programming" (infomercials) o "Local Origination" (acceso público) en el título. Además, descartamos todo lo que se haya emitido antes de la ejecución del script.

Por ahora, seguimos teniendo un fichero XML. ¡A mí los conversores! tv_to_text es una de las herramientas que nos pueden ayudar a pasar de XML a otro formato. (Entre otras posibilidades se incluyen LaTeX, HTML y PDF. Echa un vistazo al archivo readme para ver el número de formatos disponibles actualmente. Después de ejecutar esto:

% tv_to_text --output /tmp/tv.txt /tmp/tv_grepped.xml
Obtenemos una salida así:
21:00--21:30    Spy School      38
21:00--21:30    Designing for the Sexes // European Kitchen     64
21:00--21:30    Chappelle's Show        67
21:00--21:30    The Real World // Las Vegas     71
21:00--22:00    Law & Order: Special Victims Unit // Guilt      44
21:00--22:00    Wild Card // Auntie Venom       45
21:00--22:00    Cold Case Files // The Accidental Killer; Little Sister Lost    57
21:00--22:00    America's Most Wanted: America Fights Back // Top Ten Most Wanted Fugitives     5
21:00--22:00    The FBI Files // The Price of Greed     60
21:00--22:00    Trading Spaces // Nashville: Murphywood Crossing        61
21:00--22:00    Great Chowder Cook-Off  63
21:00--22:00    Ends of the Earth // Secrets of the Holy Land   65
21:00--22:00    The E! True Hollywood Story // The Hilton Sisters       68
...
Simple y sin complicaciones. Justo lo que necesitamos para el paso final: entrega por correo electrónico.

Entrega

Hasta el momento, hemos utilizado algunas posibilidades de XMLTV, aunque poco más. Además, hemos utilizado un método poco cómodo y poco automatizado. Por suerte, podemos agrupar todos los comandos que hemos utilizado hasta ahora en un script de shell y enviarlo a nosotros mismos por correo. El comando mail se ocupa de ello:

% mail -s "Today's TV listings from XMLTV" user@localhost < /tmp/tv.txt
El script completo quedaría así (versión texto de la lista):
#!/bin/sh

# Grab today's listings:
tv_grab_na --days 1 --output /tmp/tv.xml

# Sort
tv_sort --output /tmp/tv_sorted.xml /tmp/tv.xml

# Grep
tv_grep --output /tmp/tv_grepped.xml --ignore-case --not --category Children \
--not --category Sports --not --title "Paid Programming" \
--not --title "Local Origination" \
--on-after now /tmp/tv_sorted.xml

# Convert To Text
tv_to_text --output /tmp/tv.txt /tmp/tv_grepped.xml

# Email
mail -s "Today's TV listings from XMLTV" user@localhost < /tmp/tv.txt

Ahora sólo tenemos que ponerlo como una tarea de cron que se ejecute una vez al día y tendremos toda la programación de TV sin publicidad exterior, así como ningún canal o espectáculo que no nos interese.

Y lo que es más importante, conocemos la base para añadirle más características. Lo que hemos tratado es sólo el principio; más allá de los scripts de línea de comandos existe un cliente GUI. Por supuesto, hay muchas más cosas que se pueden hacer desde la línea de comandos, como por ejemplo:

  1. Obtener datos desde imdb.com mediante tv_imdb
  2. Dividir las listas en ficheros separados para cada día y canal mediante tv_split
  3. Transformar el XML con nuestra propia hoja de estilo XSLT.
  4. Enviar sólo el correo electrónico si se encuentran determinadas palabras clave.
Todo depende de la forma en que deseemos obtener la información y de cómo se encadenen los scripts.

[BIO] Bill Lovett es un desarrollador Web de New York. Es uno de esos tipos de PHP/MySQL. Tiene un extraño interés por ejecutar sistemas Linux sobre viejas máquinas que ya deberían estar en la basura. Se puede leer más sobre Bill y sus proyectos de Open Source en http://www.ilovett.com/


Copyright © 2004, Bill Lovett. Licencia de copia http://linuxgazette.net/copying.html

Publicado en el número 99 de Linux Gazette, Febrero de 2004