XMLTV

Linux Gazette n°99 — Février 2004

Bill Lovett


Table des matières
1. Installation
2. Configuration
3. Distribution

Où trouvez vous votre programme de télévision ? Le plus souvent, il s'agit d'un journal, un numéro récent d'un magazine de télévision, votre site web favori, voire votre plus proche TiVo™, ReplayTV™ ou autre magnétoscope numérique. Mais n'oubliez pas d'ajouter Linux en haut de cette liste. Vous pouvez laisser votre machine s'acquitter des tâches ingrates et vous livrer la liste des programmes. XMLTV, un court script bash et une tâche cron sont tout ce qu'il vous faut pour démarrer.


1. Installation

Commençons par le début : installer le programme. XMLTV est une suite de scripts Perl que l'on peut télécharger depuis membled.com/work/apps/xmltv. Il existe des versions pour les environnements de type Unix et Windows mais, pour des raisons évidentes, nous nous concentrerons sur la première. Si vous installez à partir du source, utilisez la procédure habituelle :



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

Si vous travaillez avec une Debian, un simple apt-get suffit (apt-cache search xmltv). Des liens vers les paquetages pour OS X, Red Hat 8 et Red Hat 9 sont disponibles sur la page principale du projet.


2. Configuration

Avant de pourvoir être utile, XMLTV doit savoir où vous vous trouvez géographiquement. XMLTV est international — il peut récupérer des programmes de télévision pour le Canada et les États-Unis, le Royaume-Uni, l'Autriche et l'Allemagne, la Nouvelle-Zélande, la Finlande, l'Italie, l'Espagne, les Pays-Bas, le Danemark et la Hongrie (La Belgique et la France seront bientôt couvertes) [1].

Les scripts qui collectent les programmes pour un pays donné sont appelés rapporteurs ; vous les trouverez sur la ligne de commande sous tv_grab_*. Nous utiliserons le rapporteur français, tv_grab_fr [2].

Quand vous exécutez un rapporteur pour la première fois, utilisez l'option --configure. Celle-ci démarre une session questions/réponses dans laquelle le rapporteur vous demandera votre code postal, votre fournisseur de chaînes de télévision, ainsi que les chaînes que vous souhaitez ignorer [3]. Le résultat du script est écrit dans ~/.xmltv/tv_grab_fr.conf et peut être facilement édité à la main.

Dès lors, XMLTV est prêt à satisfaire vos demandes. Faites un man tv_grab_na pour connaître toutes les options disponibles [4]. Pour le moment, deux d'entre elles suffisent :



% tv_grab_fr --days 1 --output /tmp/tv.xml

Cette commande ordonne au rapporteur d'obtenir les programmes d'une journée et de les enregistrer dans /tmp/tv.xml[5].

Le format de fichier de XMLTV n'est pas des plus agréables à lire, à moins que nous n'aimiez lire le marquage brut. Quelques autres scripts de la suite peuvent résoudre ce problème. tv_sort trie le contenu d'un fichierXMLTV par dates croissantes. tv_grep vous permet d'expurger ce qui, à l'évidence, ne vous intéresse pas dans les programmes. Voici comment j'exécute ces commandes :



% tv_sort --output /tmp/tv_sorted.xml /tmp/tv.xml
% tv_grep --output /tmp/tv_grepped.xml --ignore-case \
--not --category "Jeunesse" \
--not--category"Jeu"--not--title"Journal" \
--on-after now /tmp/tv_sorted.xml

Les commandes ci-dessus trient le fichier original et retirent tout ce qui est classé dans la catégorie « Jeunesse » ou « Jeu », ainsi que tout ce qui contient le mot « journal » dans le titre. De même, nous éliminons tout ce qui a commencé avant que tv_grep ne s'exécute[6].

À ce stade, nous en sommes encore à un fichier XML. Convertisseurs à la rescousse ! tv_to_text est un des outils permettant de passer du XML à d'autres formats. (Citons par exemple LaTeX, HTML et PDF. Lisez le fichier README pour connaître tous les formats actuellement disponibles). Après avoir lancé la commande de cette manière :



% tv_to_text --output /tmp/tv.txt /tmp/tv_grepped.xml

nous obtenons le résultat suivant :


02-25 (Wednesday)

14:45--16:25    Passion impossible      TF1
15:00--16:05    Questions au gouvernement       France 3
15:25--16:25    Un, dos, tres - Une question d'argent   M 6
15:40--16:20    Fastlane - Faux bonds   Canal +
15:50--16:45    Nash Bridges - Jeu de guerre    France 2
15:50--16:45    La Sicile       France 5
16:20--17:05    Fastlane - Double dames Canal +
16:25--17:15    Preuve à l'appui - Sans mobile apparent TF1
16:25--17:25    Un, dos, tres - Les premiers pas        M 6
16:45--17:39    Les abeilles et leur reine      France 5
17:05--18:40    Dans les griffes de la mode     Canal +
17:15--18:05    7 à la maison - L'idole des filles      TF1
17:25--17:50    Le meilleur du ridicule M 6
17:30--18:00    C'est pas sorcier - Manon, Charlotte, Pompadour... Histoires de pommes de terre France 3
17:39--17:50    Si vous étiez... - Invité : Raphaël Mezrahi     France 5
17:50--18:50    The sentinel - Peggy    M 6
....

Simple et sans fioritures. Voilà exactement ce dont nous avons besoin pour l'étape finale : l'envoi d'un message électronique.


3. Distribution

Si nous nous étions arrêtés à ce stade, nous aurions utilisé quelques possibilités de XMLTV, mais pratiquement rien de plus. Nous aurions également manqué d'ergonomie et d'automatismes. Heureusement, nous pouvons regrouper toutes les commandes que nous avons vues jusqu'ici dans un script shell, et nous faire envoyer par courrier électronique le résultat final. La commande mail peut se charger de l'envoi :



% mail -s "Les programmes de télévision d'aujourd'hui par XMLTV" utilisateur@localhost < /tmp/tv.txt

Voici à quoi ressemble le script xmltv_daily.sh complet (vous en trouverez la version texte en langue anglaise ici) :


#!/bin/sh

# Rapatriement des programmes de télévision :
tv_grab_fr --days 1 --output /tmp/tv.xml

# Tri par dates croissantes :
tv_sort --output /tmp/tv_sorted.xml /tmp/tv.xml

# Filtrage :
tv_grep --output /tmp/tv_grepped.xml --ignore-case \
--not --category "Jeunesse" \
--not --category "Jeu" --not --title "Journal" \
--on-after now /tmp/tv_sorted.xml

# Conversion au format texte :
tv_to_text --output /tmp/tv.txt /tmp/tv_grepped.xml

# Message électronique :
mail -s "Les programmes de télévision d'aujourd'hui par XMLTV" utilisateur@localhost < /tmp/tv.txt

Placez ce script dans une tâche cron qui s'exécute une fois par jour, et vous aurez vos programmes de télévision sans publicité extérieure, ni les chaînes ou autres émissions qui ne vous intéressent pas.

Plus important encore, vous avez une base que vous pourrez étendre. Ce que nous avons rassemblé n'est que le début — outre les scripts en ligne de commande, une interface graphique cliente est également disponible. Bien sûr, il y a une foule d'autres choses que vous pourriez faire depuis la ligne de commande, telles que :

  1. Récupérer des données depuis imdb.com via tv_imdb

  2. Scinder les programmes des différentes chaînes de télévision en fichiers séparés, via tv_split

  3. Transformer le fichier XML avec votre propre feuille de style XSLT

  4. Envoyer un message électronique uniquement si certains mots-clés sont trouvés

Tout dépend de la manière dont vous souhaitez consommer l'information et de votre habileté à chaîner tous les scripts entre eux.

Bill Lovett est développeur web à New York. C'est un adepte de PHP/MySQL. Et il a cette curieuse habitude de faire tourner Linux sur d'anciennes machines qui auraient en toute justice dû être jetées il y a des années. Vous en saurez plus sur Bill Lovett et ses projets Open Source en visitant son site web.

Copyright © 2004, Bill Lovett.

Copying license http://www.linuxgazette.com/copying.html.

Paru dans le n°99 de la Linux Gazette de février 2004.

Traduction française par Fabien Catteau .

Relecture de la traduction française par Joëlle Cornavin .

Notes

[1]

Le résultat est déjà satisfaisant. (N.d.T.)

[2]

Contrairement aux autres rapporteurs, celui-ci n'est pas intégré à XMLTV ; il doit être téléchargé depuis la page principale de XMLTV et placé dans le répertoire /usr/bin. (N.d.T.)

[3]

tv_grab_fr ne demande pas le code postal). (N.d.T.)

[4]

La commande tv_grab_fr s'utilise de la même manière que tv_grab_na, mais elle ne possède pas de page de manuel). (N.d.T.)

[5]

Par défaut, et contrairement aux autres rapporteurs, tv_grab_fr ne prend pas le programme à partir d'aujourd'hui ; pour contourner ce problème, ajoutez l'option --offset -1). (N.d.T.)

[6]

À vérifier. (N.d.T.)