Les flux RSS, Shaarli et PubSubHubbub

Derrière ces termes barbares se cache trois outils qui servent beaucoup à la diffusion du contenu sur internet.

Les flux RSS, vous le savez sûrement, c’est ce qui nous évite de faire tous les jours le tour de nos sites préférés comme sur internet avant 2000. Shaarli, c’est un équivalent de del.ico.us, codé par Monsieur Sebsauvage, et ça sert à mettre de côté et partager les liens que l’ont trouve intéressant. Et PubSubHubbub c’est quelque chose d’assez récent qui s’articule avec les flux RSS pour apporter de l’instantanéité.

Dans un flux RSS normal, l’abonné demande périodiquement au fournisseur si il y a du nouveau. Si le fournisseur à une nouvelle, il se passera donc au maximum une période (de quelques minutes à quelques heures) avant que son abonné l’apprenne.

Dans un flux RSS compatible PubSubHubbub, il y a un intermédiaire en plus, un « hub » qui est prévenu automatiquement par le fournisseur dès qu’il y a du nouveau. Et le hub va à son tour prévenir les abonnés immédiatement.

Comme souvent, c’est une technologie poussée par Google qui l’utilise également pour Feedburner, Google Reader, Google Alerts mais aussi pour son service d’indexation (Le googlebot agissant comme un abonné, il est prévenu dès qu’il y a du nouveau contenu à ajouter à l’index)

Et comme souvent, Goole a libéré cette technologie ce qui fait que tout le monde peut l’utiliser pour rendre son flux compatible, créer son hub ou faire son client d’abonnement.

Pourquoi je vous parle de tout ça ? Parce que quand j’utilisais encore Google Reader pour partager mes liens, je les publiais en temps réel sur Twitter à l’aide du service Reader2Twitter. Mais maintenant que j’utilise Shaarli (sur le mini site « Les petits liens d’Alda. » ) je me retrouvais à devoir attendre plus d’une demi-heure que Twitterfeed vérifie mon flux et publie les nouveautés sur Twitter. Et une demi-heure à l’âge de l’instantanéité, c’est long.

J’ai donc retroussé mes manches et ai quelque peu modifié Shaarli pour:

  1. Rendre les flux RSS et ATOM générés compatibles avec PubSubHubbub
  2. Prévenir un des hubs choisi qu’il y a une mise à jour.

Il faut tout d’abord récupérer la librairie disponible pour PHP sur le site de PubSubHubbub: Publisher.php

Puis rajouter quelques lignes au fichier index.php de Shaarli:

// ------------------------------------------------------------------------------------------
// Misc utility functions:

// Update pubsubhubbub
// External library import
include './publisher.php';
$hub_url = 'http://pubsubhubbub.appspot.com/';
function pubsubhub()
{
        global $hub_url;
        $p = new Publisher($hub_url);
        $topic_url = array (
                        serverUrl().$_SERVER['SCRIPT_NAME'].'?do=atom',
                        serverUrl().$_SERVER['SCRIPT_NAME'].'?do=rss'
                     );
        $p->publish_update($topic_url);
}

// Returns the server URL (including port and http/https), without path.
// eg. "http://myserver.com:8080"
// You can append $_SERVER['SCRIPT_NAME'] to get the current script URL.
// Ouput the last 50 links in RSS 2.0 format.
function showRSS()
{
    global $LINKSDB;

// ...

     echo 'Shared linksfr-FR'.$pageaddr.''."nn";
    echo '


          ';
    $i=0;
    $keys=array(); foreach($linksToDisplay as $key=>$value) { $keys[]=$key; }  // No, I can't use array_keys().

// ...

}
function showATOM()
{
    global $LINKSDB;

// ...

    $feed='';
    $feed.=''.htmlspecialchars($GLOBALS['title']).'';
    if (!$GLOBALS['config']['HIDE_TIMESTAMPS'] || isLoggedIn()) $feed.=''.htmlspecialchars($latestDate).'';
    $feed.='';
    $feed.='

            ';
    $feed.=''.htmlspecialchars($pageaddr).'';
    $feed.=''.htmlspecialchars($pageaddr).''."nn"; // Yes, I know I should use a real IRI (RFC3987), but the site URL will do.
    $feed.=$entries;
    $feed.='';
    echo $feed;
    exit;
}
    // -------- User clicked the "Save" button when editing a link: Save link to database.
    if (isset($_POST['save_edit']))
    {

// ...

        $LINKSDB->savedb(); // save to disk
        pubsubhub();
        invalidateCaches();

        // If we are called from the bookmarklet, we must close the popup:

// ...
        exit;
    }

Une fois ces modifications effectuées, il ne reste plus qu’à attendre que les abonnés demandent une mise à jour du flux. Ensuite s’ils sont compatibles, ils passeront en mode PubSubHubbub. Pour tester c’est très simple, il suffit de créer un flux feedburner. De base il se met à jour tous les quarts d’heure, avec PubSubHubbub activé c’est instantané.

Concernant la mise à jour des liens sur twitter, Twitterfeed avait annoncé la compatibilité en 2010 mais il a quand même fallu attendre plus de 30min avant de voir mes liens apparaître. Je suis donc passé à dlvr.it qui a une fréquence de mise à jour minimum de 15min et qui permet de cocher une case pour activer PubSubHubbub. Les liens n’arrivent toujours pas en temps réel (il faudrait pour ça que je monte mon propre client je suppose) mais les 5 minutes que j’ai constaté sont un délai déjà plus acceptable.