Flux RSS/Atom - Traitement, mise-en-page

Date: 2016-04-13

Tags: RSS info soft

J’utilise beaucoup de flux RSS, et j’aime bien que tout le contenu soit disponible, par exemple un article complet sans commentaires dans le cas d’un blog.

Le principe est de pouvoir l’utiliser offline, par exemple en chargeant la page. Ça permet aussi d’éviter quelques clics (dont les pubs et une mise en page non neutre) et d’avoir tout le contenu directement dans le lecteur RSS.

Bons Exemples

Mauvais Exemples

EDN

Comme on peut remarquer, le flux : http://www.edn.com/rss/design/analog ne contient que des liens vers les pages des articles et une description un peu vide.

Une première étape est de changer le lien vers la version imprimable de l’article. Les deux URL ont l’identifiant de l’article en commun :

http://edn.com/design/analog/$**<font color=green>ID_ARTICLE</font>**/<font color=maroon>TITRE_ARTICLE</font>
http://www.edn.com/Home/PrintView?contentItemId=**<font color=green>ID_ARTICLE</font>**

Une ligne de bash suffit à faire le travail de base :

wget -qO- http://www.edn.com/rss/design/analog |sed -e 's#<link><!\[CDATA\[http://edn.com/design/analog/#<link><!\[CDATA\[http://www.edn.com/Home/PrintView?contentItemId=#' |sed -e 's#/[^/]*\]\]></link>#\]\]></link>#'

L’étape suivant est d’utiliser ce lien pour remplir le flux.

Comme mon niveau en PHP tient plus du bricolage qu’autre chose, il est sûrement possible de faire beaucoup mieux et plus efficace.

On va utiliser un algo simple :

function do_process(temp_file) {
    articles[0][] = get_article_ids(temp_file);
    articles[1][] = get_article_titles(temp_file);
    articles[2][] = get_articles_dates(temp_file);
    
    rss = fopen("new_rss", 'w');
    fputs(rss, header);
    iter = 0;
    foreach(articles[0] as id) {
        article = download(article_url + "id");
        fputs(rss, article);
        fputs(rss, articles[1][iter]);
        fputs(rss, articles[2][iter]);
        iter++;
    }
    fputs(rss, footer);
    fclose(rss);
}

oldsum = md5sum(temp_file);
if((date() - date(temp_file)) > timestep {
    download(url, temp_file);
    if(md5sum(temp_file) != oldsum) {
        do_process(temp_file);
    }
}

Le script commence par tester si le flux RSS a été mis à jour récemment et s’il a changé, pour économiser la bande passante et les ressources du site distant comme ceux de la machine executant le script. Ensuite, le flux RSS est analysé, les identifiants, date et titre de chaque article sont stockés dans un tableau qui est utilisé pour construire le flux RSS final. La librairie simple_html_dom permet de manipuler facilement les balises XML.

Bugs

La date est incorrecte dans certains articles du flux RSS d’EDN (Nov 01 2016 pour un article écrit le 11 Jan 2016), mais la majorité fonctionne.

Références

Electronics Électronique puissance semiconducteur semiconductors power Hardware CPE INSA Xavier Bourgeois

Xavier B.