J'ai déjà écrit un billet sur l'utilisation d'un fil RSS.
Alexis, un ami, m'a demandé comment il pourrait récupérer efficacement la liste
des titres des musiques de RadioFG.
À partir de cet exemple, je vais montrer comment créer un fil RSS.
Nous allons tout d'abord réaliser un flux minimal qui suit la spécification RSS 2.0. Le RSS est un format XML, c'est dont très simple à manipuler et à comprendre.
La racine doit s'appeler "rss", avoir un attribut "version" avec la valeur "2.0" et
contenir un unique élément "channel".
La balise "channel" a un titre ("title"), un lien ("link") et une description ("description").
Voici un fichier RSS minimal :
<?xml version="1.0" ?> <rss version="2.0"> <channel> <title>TITRE</title> <link>http://www.monsite.fr/</link> <description>DESCRIPTION</description> </channel> </rss>
Il faut maintenant ajouter les éléments ("item") dans la balise "channel".
Ces éléments contiennent usuellement un titre, un lien et une description.
Ils sont optionnels, mais on doit fournir une description ou un titre.
Ce qui nous donne :
<?xml version="1.0" ?> <rss version="2.0"> <channel> <title>TITRE</title> <link>http://www.monsite.fr/</link> <description>DESCRIPTION</description> <item> <title>TITRE 1</title> <link>http://www.monsite.fr/lien1.html</link> <description>DESCRIPTION 1</description> </item> <item> <title>TITRE 2</title> <link>http://www.monsite.fr/lien2.html</link> <description>DESCRIPTION 2</description> </item> </channel> </rss>
RadioFG fournit 2 accès à leur liste de musique soit au format HTML
(http://www.radiofg.com/rcs/), soit au format XML (http://www.radiofg.com/rcs/XMLSongs.xml).
J'aurais pu utiliser le format XML et le transformer en RSS en utilisant une transformation XSLT
(XSLT sert à transformer du XML vers un autre XML, par exemple RSS).
Cependant, l'utilisation de la version HTML est plus simple.
La version HTML est facile à manipuler avec des expressions régulières.
Étant donné le peu d'informations à fournir, je vais tout mettre dans le titre.
Voici le code PHP5 :
<?php
header('Content-type:text/xml');
echo '<?xml version="1.0" encoding="iso-8859-1" ?>';
?>
<rss version="2.0">
<channel>
<title>Les titres de RadioFG</title>
<link>http://www.radiofg.com/rcs/</link>
<description>Les titres de RadioFG, par Olivier FAURAX</description>
<?php
$lignes = file_get_contents('http://www.radiofg.com/rcs/');
// On reconnait le motif <li>HEURE - <b>TITRE</b> (COMPOSITEUR)</li>
preg_match_all('|<li>([^ ]+) - <b>(.+)</b> \((.+)\)</li>|',$lignes,$matches);
for($i=0; $matches[0][$i]; $i++)
echo '<item><title>'.$matches[1][$i].' - '.$matches[2][$i].' ('.$matches[3][$i].')</title></item>';
?>
</channel>
</rss>
Et voilà.
Les premières lignes indiquent que le format utilisé est du XML, en passant
les problèmes de conflit XML/PHP (quand le '<?' de la déclaration XML est interprété
comme le début d'un bloc PHP).
Ensuite, il y a l'entête fixe qui ne change pas, puis on récupère le fichier HTML et on
cherche le motif contenant les informations.
Finalement, on ajoute les 'item' avec le titre contenant les informations.
Pour améliorer, on peut ajouter des balises optionnelles comme le TTL (Time To Live) pour indiquer au bout de combien de temps le flux doit être actualisé (ex : chaque minute).
D'un naturel joyeux, positif et curieux, je m'intéresse à beaucoup de choses parmi lesquels la salsa, l'espéranto, la plongée mais surtout l'informatique, le web et Linux (Mandriva).
Même si j'aime programmer, je m'intéresse également aux aspects d'ergonomie, de design et de marketing.
Je suis actuellement développeur firmware chez Neotion. Pour savoir comment j'en suis arrivé là, il y a mon CV.
M'écrire : olivier+blog@faurax.fr
Retrouvez-moi sur Facebook, Friendfeed, Identi.ca et Twitter.
