2011-08-04 Fluxbox, intégrer la météo dans le menu

http://www.k1ka.be/pics/meteo/Cumulus_cloud.png

Beaucoup de sites consacrés à la météo proposent d'intégrer un résumé des prévisions dans un site web par l'inclusion d'un peu de code javascript. Il n'est pas difficile d'analyser les données renvoyées pour en faire un autre usage, comme les transformer en code compatible avec celui d'un gestionnaire de fenêtre.

Ce qui suit concerne Fluxbox et http://www.meteo.be1 mais c'est sans doute transposable à d'autres configurations.

http://www.k1ka.be/pics/meteo/verwachtingenresultfr.png Institut royal météorologique (IRM)

Pour obtenir le code javascript, les instructions figurent sur cette page et l'url incluse dans ce code correspondait dans le cas qui m'intéressait à

http://www.meteo.be/meteo/view/fr/1370090?filter=6447

Tapée telle quelle dans la barre d'adresse d'un navigateur, le résultat n'est évidemment pas très beau, mais ce qui compte, c'est que les données renvoyées comportent du code html sous cette forme (je l'ai simplifié en éliminant toutes les informations de style pour le rendre lisible):

  <td>jeudi</td>
  <td><img src="http://www.kmi.be/.../1.gif"/></td>
  <td>7&deg;/23&deg;</td>

Avec quelques expressions régulières, c'est jouable :-).

D'un autre côté, Fluxbox, bien qu'il ne permette pas de créer des entrées de menu dynamiques, permet d'inclure un sous menu de cette manière:

   [submenu] (Météo) {}
      [include] (/home/gv/.fluxbox/forecast)
   [end]

et d'insérer dans le menu des lignes d'information sur lesquelles le passage de la souris est sans effet, avec le mot clé nop (pour no operation).

   [nop] (texte affiché) <chemin/icone.xpm>

Le tag correspondant à l'icone n'est pas explicitement documenté pour ce contexte, mais ça marche.

Le principe est donc de récupérer périodiquement les données en question pour les formatter ainsi dans un fichier de sous-menu:

   [nop] (Cette nuit 15°) </home/gv/.fluxbox/icons/24.xpm>
   [nop] (Demain 25°) </home/gv/.fluxbox/icons/3.xpm>
   [nop] (Vendredi 16°/23°) </home/gv/.fluxbox/icons/3.xpm>
   [nop] (Samedi 16°/23°) </home/gv/.fluxbox/icons/6.xpm> 

Il a fallu au préalable télécharger toutes les icones au format gif et les convertir en xpm...2

Le script Perl qui fait le boulot:

  #!/usr/bin/perl
  
  use LWP::Simple;
  
  my $path = '/home/gv/.fluxbox/';
  my $file = $path . 'forecast';
  open F,">$file";
  my $url = 'http://www.meteo.be/meteo/view/fr/1370090?filter=6447';
  my $content = get $url;
  if (defined $content) {
    $content =~ s/\\//g; # élimination du junk
    my @jours; my @degres; my @icones;
    while ($content =~ s/<td.*?>(.*?)<\/td>//) {
      my $s = $1;
      if ($s =~ /\/(\d*)\.gif/) {
        push @icones,$1             # le numéro de l'icone
      } elsif ($s =~ s/&deg;/°/g) {
        push @degres,$s             # la température
      } else {
        $s =~ s/^(\w)/\u\1/;        # mise en capitale de la 1ère lettre
        push @jours,$s              # du jour
      }
    }
    my $l = @jours;
    for (my $i = 0; $i < $l; $i++) {
      print F "[nop] ($jours[$i] $degres[$i]) <${path}icons/$icones[$i].xpm>\n"
    }
  } else {
    print F "[nop] (Pas d'infos) <>\n"
  }
  close F

et voilà le travail !

http://www.k1ka.be/pics/meteo/menu.jpg

Footnotes:

1. Comme pour tous les sites de ce type, il y a des restrictions de copyright, et le fait de masquer l'origine des données sur un site public serait répréhensible, mais je ne vois pas en quoi l'usage sur un poste de travail personnel contreviendrait à cela.
2. D'accord, c'est du chipot, mais là aussi, les scripts Perl, ça aide :-)