dreamcatcher

Rendre le RSS de France Culture lisible

Contenu

Introduction

Je n'utilise aucun logiciel pour Atom ou RSS. Mais comme les fichiers RSS de Radio France sont en XML, il est très simple de les manipuler un peu et d'en produire un fichier en HTML, comme celui dans cette copie d'écran:
copie d'écran: Flux transformé

Préparation

Transformer XML en HTML est une des applications pour XSLT (“Extended Style Language Transformations”). Le cœur de ma procédure est donc un stylesheet, qui contient des règles pour la transformation. Il faut ensuite un logiciel (“Xslt-Processor”) qui lit le fichier RSS et mon fichier XSL pour en produire un fichier HTML.

Enfin, j'ai écris un script pour

XSL-Stylesheet

Dans la chronologie de l'exécution, le script qui organise tout, serait la première pièce à vous montrer. Mais ce script est facile à écrire et – de plus – pas forcément le même pour chaque interpréteur de commandes. J'utilise la Bash sous Linux et mon Xslt-Processeur est xsltproc, mais le stylesheet va fonctionner aussi dans d'autres contextes.

Voici donc le stylesheet (scroll):

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
©2020-2020 Michael Uplawski <michael.uplawski@uplawski.eu>
  Created with nothing.  
-->
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" omit-xml-declaration="yes"/>

    <!-- match the root-tag -->
  <xsl:template match="/">
    <!-- matches the root-tag -->
    <xsl:message>
      <xsl:text>handling root</xsl:text>
    </xsl:message>
    <xsl:apply-templates select="//rss"/>
  </xsl:template>

  <!-- traverse the xml-structure to where we want to go.
  This can serve other purposes, later -->
  <xsl:template match="rss">
    <xsl:message>
      <xsl:text>handling rss</xsl:text>
    </xsl:message>
    <xsl:apply-templates select="channel"/>
  </xsl:template>

  <!-- match an the channel tag -->
  <xsl:template match="channel">
    <xsl:message>
      <xsl:text>handling channel </xsl:text>
    </xsl:message>
    <html>
      <head>
        <title><xsl:value-of select="title"/></title>
        <style type="text/css">
          body {
            background-color:black;
            font-family:"Linux Biolinum";
            font-size: 15pt;
          }
          table {
            border:1px solid black;
            border-radius:5px;
            background-color:black;
            border-spacing:0;
            cell-spacing:3px;
            margin: 1em;
          }
          th, td {
            border:1px solid black;
            border-radius:5px;
            background-color:#f0f0e0;
          }
          a {
            font-weight:bold;
          }
          h1 id="" {color: #ffff00;}
        </style>
      </head>
      <body>
        <h1><xsl:value-of select="title"/></h1 id="">
        <xsl:element name="a">
          <xsl:attribute name="href">
            <xsl:value-of select="link"/>
          </xsl:attribute>
          <xsl:value-of select="link"/>
        </xsl:element>
        <table>
          <tr>
          <th>Émission (mp3)</th>
          <th>Titre</th>
          <th>Détails</th>
        </tr>
        <xsl:apply-templates select="item"/>
      </table>
      <p>Ω</p>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="item">
    <tr>
      <xsl:call-template name="emission"/>
      <xsl:apply-templates select="title">
        <xsl:with-param name="link" select="link"/>
      </xsl:apply-templates>
      <xsl:apply-templates select="description"/>
    </tr>
  </xsl:template>

  <xsl:template name="emission">
    <td>
      <xsl:element name="a">
        <xsl:attribute name="href"><xsl:value-of select="enclosure/@url"/></xsl:attribute>
        <xsl:value-of select="pubDate"/>
      </xsl:element>
    </td>
  </xsl:template>

  <xsl:template match="item/title">
    <xsl:param name="link"/>
    <td>
      <xsl:element name="a">
        <xsl:attribute name="href"><xsl:value-of select="$link"/></xsl:attribute>
        <xsl:value-of select="."/>
      </xsl:element>
    </td>
  </xsl:template>

  <xsl:template match="item/description">
    <td><xsl:value-of select="."/></td>
  </xsl:template>

</xsl:stylesheet>
<!-- EOF -->

Script Shell

Si le stylesheet est nécessaire pour la transformation de XML (RSS) en HTML, ce que je fais dans le script est un peu plus ce que je souhaite, personnellement.

A part de mon choix d'un Xslt-Processeur, quelques détails sont du a mes propres préférences et pas techniquement obligatoires :

  1. Le script va afficher le résultat de la transformation dans Firefox.
  2. Les connexions au site de France Culture sont rendu anonyme avec tor.
  3. Pour éviter des problèmes avec le navigateur, je nettoie le code de la page HTML avec Tidy.
  4. Le téléchargement du fichier RSS original est fait avec Curl.

La modification du script ne devrait pas être trop compliqué, si vous le souhaitez. Voici la version actuelle :

#!/bin/bash
# ©2020-2020 Michael Uplawski <michael.uplawski@uplawski.eu>
# Use ths script at your own risk, modify it as you please.
# But maybe leave the copyright-notice intact. Thank You.

if [ $# == 0 ]
then
  echo -e "========================================="
  echo -e "ERROR! Argument missing!"
  echo -e "\tExemples:"
  echo -e "\tLes Chemins De La Philosophie: 10467"
  echo -e "\tÀ Présent: 21450"
  echo -e "\tLa Question Du Jour: 16362"
  echo -e "========================================="
  echo -e "Hit any key to exit"
  read a
  exit 1
fi

if [ ! `which xsltproc` ]
then
  echo -e "========================================="
  echo -e "ERROR! xsltproc is not found in the path."
  echo -e "========================================="
  echo -e "\tHit any key to exit"
  read a
  exit 2
fi

# --------- SOME DEFINITIONS ----------
# The Name of the RSS-provider:
RSS_NAME='France Culture www.franceculture.fr'
# The part of the RSS-url which precedes the rss-file
RSS=http://radiofrance-podcast.net/podcast09/
# The xsl stylesheet which produces html
XSL=~/bin/planks_and_nails.xsl

NBR=$1

# The browser to pipe the result to
# BROWSER='/usr/bin/lynx'
# BROWSER='/usr/bin/lynx'
# BROWSER='/usr/bin/w3m'
BROWSER='/usr/bin/firefox'

# a temporary xml-file
FL=`mktemp --suffix=.xml`
# a temporary html-file
HTML=`mktemp --suffix=.html`

# --------> ACTION <---------
# First download the rss-file
torify curl -s -A '' "$RSS"rss_"$NBR".xml > $FL
# ... then transform it to HTML
xsltproc -o $HTML $XSL $FL

# ... then tidy up the HTML-code if tidy is available
if [ `which tidy` ]
then
  tidy -i -m -asxhtml --output-xhtml yes --strict-tags-attributes yes --add-xml-decl yes --add-xml-space yes --doctype strict -utf8 "$HTML"
fi
# <--------- END Action --------->

# Display 
$BROWSER $HTML
# remove temporary files
sleep 10
rm -f $FL
rm -f $HTML

Utilisation

Les différents flux des émissions de Radio-France portent un suffixe numérique, qui les identifie. Trois exemples :

Pour connaître ce numéro, il faut se rendre sur la page Web d'une émission sur franceculture.fr. Cliquez sur le lien S'ABONNER, puis tenez la souris au-dessus de RSS, comme sur la copie d'écran pour « Les Nuits de France Culture » : copie d'écran : s'abonner au RSS
Vous devrez voir le numéro à la fin de l'URL qui correspond à ce flux RSS.

Si le script est ~/bin/planks_and_nails (« des_planches_et_des_clous ») et le stylesheet est ~/bin/planks_and_nails.xsl , comme noté dans le script, la commande suivante va produire une version du Flux RSS pour l'émission « Les Chemins de la Philosophie » : :~$ bin/planks_and_nails 10467

Extra

Comme je m'intéresse aux toujours mêmes flux de seulement six émissions, j'ai ajouté une autre étappe d'automatisation.

Il existent des logiciels qui fournissent un simple interface graphique aux scripts shell. Exemple :

Yad-dialog Yad-dialog

Je suis plus à l'aise avec Yad, mais les autres font à peu près la même chose: Dialog, Whiptail, Zenity peuvent remplacer Yad. Voici alors un autre script, qui ne fait pas plus que créer un dialogue graphique qui me propose les émissions de ma liste. C'est très court. Dans le dialogue, je peux marquer l'entrée pour qui je souhaite voir l'historique des émissions et ensuite pousser le bouton 'OK'. À ce moment le script d'origine est appelé pour la suite.


#!/bin/bash
emission=`yad --title="choose RSS" --num-output --entry-label "Émission" --entry "Les pieds sur terre" "La question du jour" "À présent" "Les chemins de la philosophie" "La méthode scientifique" "La série documentaire"`
# emission is a 1-based array.
if [ $emission ]
then
  # each numbrer refers to 1 emission. This array is
  # 0-based, hence the 0 at the beginning.
  nums=(0 10078 16362 21450 10467 14312 10177)
  echo "emission is $emission, number is ${nums[$emission]}"
  ref=${nums[$emission]}
  planks_and_nails $ref
fi

Conclusion

La page générée vous laisse le choix de, soit, télécharger le fichier mp3 d'une émission ou de vous rendre sur la page Web de l'émission, si vous souhaitez vous informer sur le contexte ou voir les références et recommandations de littérature. En tout cas, vous voyez rapidement l'historique de vos émissions préférées sans avoir besoin de naviguer sur le site de France Culture.

Ω