La boîte à outils

Attention : cette page a été écrite en 2014 et les bibliothèques logicielles utilisée à l'époque ont beaucoup évolué depuis cette date. Il est probable que certains informations données ici ne soient plus pertinentes.

Une mise à jour a été effectuée début 2023, a priori avec succès.

Linux

L'application fonctionne sur n'importe quelle machine tournant sous linux. On peut l'installer sur un PC de bureau ou sur un laptop et, bien entendu sur une raspberry.

Naturellement la raspberry tourne sous linux. J'ai installé ma distribution favorite: la slackware. Je travaille avec depuis des années, je l'ai installée sur des dizaines de machines différentes sans difficulté majeure. Pour la rpi il y a un excellent site qui fournit les principaux liens à connaître. Mon installation a été effectuée en suivant pas à pas la procédure décrite sur le site de FatDog. J'ai pris la dernière version, la 14.1, comme sur mes autres PC et j'ai installé tous les paquetages standard. Tout s'est passé sans anicroche.

Suivant mes habitudes au début j'ai synchronisé avec subversion sur la rpi mes propres fichiers d'environnement, de configuration, mes utilitaires divers et variés afin d'avoir un cadre de travail identique sur toutes mes machines. Avoir tout les fichiers importants gérés par un gestionnaire de version fournit du même coup une sauvegarde automatique à chaque commit.
J'ajoute que l'ai profité de ce développement sur rpi pour me mettre à git. Maintenant toute l'application RadioK est gérée sous git et non plus sous subversion.

Tout ceci étant dit, l'application doit pourvoir tourner sur toutes les distributions linux. Le portage a été fait sur Ubuntu 20.4 sans trop de souci.

Mplayer

Au coeur de l'application il y a mplayer. C'est ce programme qui est chargé de diffuser les flux radio. Il est disponible dans toutes les distributions linux.
Naturellement on peut également utiliser n'importe quel programme capable de traiter des flux audio en continu, par exemple mpg123.

Bash

Les commandes de base sont écrites en bash(1). Bien entendu l'interpréteur est disponible dans tous les linux, il n'y a donc rien à installer, c'est l'avantage d'avoir choisi ce langage. Son inconvénient étant qu'il est difficile d'écrire des scripts robustes et que ses fonctionnalités sont limitées.

NodeJs

Le serveur web permettant de commander à distance la radio a été construit avec les outils de l'écosystème NodeJs.
Depuis quelques temps je travaille dans cet environnement javascript et je souhaitais continuer pour implémenter rapidement et simplement l'application RadioK. Les technologies javascript sont assez élégantes, les bibliothèques sont nombreuses, la communauté très active. Avec ce langage les développements sont très rapides.
En revanche écrire des programmes corrects est beaucoup plus difficile qu'il n'y parait et la documentation disponible est souvent médiocre.

De base NodeJs n'est pas installé sur une machine linux. Il faut donc aller sur le site web, télécharger le logiciel et l'installer. Ce fut facile avec la version 0.4, en revanche ce fut une vraie galère pour installer une des dernières versions. Actuellement je tourne avec la version 5.5. Il m'a fallu passer des heures à googler les problèmes, à trouver les modifications à apporter au code source, à compiler et à recompiler tout le paquet sachant qu'il faut environ une douzaine d'heures pour refabriquer un exécutable.
Il y a ensuite toute une liste de modules à installer. L'opération est assez simple car NodeJs dispose d'une commande, npm, qui permet de télécharger et d'installer automatiquement ce qu'il faut. Sur la page npmjs on peut voir le contenu de la grosse bibliothèque disponible pour cette technologie.

Pour RadioK les modules nécessaires sont les suivants:

  • express, http, path, fs, winston
  • exec-sync, moment
Normalement npm install devrait faire le job. Le fichier package.json fournit la liste des dépendances.

Les modules javascript implémentant les fonctionnalités de crontab(1) ont été la cause de grosses déconvenues. Pour des raisons inconnues, sans doute liées à la conception même de nodejs, ils ne déclenchaient pas les commandes programmées quand l'intervalle de répetition était trop grand. À cause de ce bug RadioK ne fonctionnait plus. La solution a consisté à utiliser simplement directement la commande unix de base crontab(1).

AngularJs

Ce framework est utilisé pour le codage des pages web. Il est disponible sur ce site mais il est référencé automatiquement, il n'y a donc rien à installer localement. De la même façon la bibliothèque jQuery est référencée automatiquement. En revanche il faut télécharger le module ui-slider et mettre le fichier slider.js dans le sous-répertoire www/kontrol/client/js.
Il faut aussi récupérer UI boostrap pour avoir les composants indispensables aux interactions.

Style

Les feuilles de style sont stockées dans le répertoire css. Les thèmes possibles sont pris sur le site bootswatch. Le style United a été choisi pour RadioK mais il est biensûr possible d'en changer.

Les définitions spécifiques sont dans le fichier radiok.less qu'il faut traiter par le programme lessc pour créer le fichier radiok.css. Ce dernier fichier est le résultat de la fusion des quelques définitions propres à RadioK et des définitions générales du thème sélectionné sur Bootswatch.

Mise en route

Répétons-le RadioK n'est pas livré comme un produit clés-en-main. Il est destiné aux bricoleurs, geeks et assimilés. Il nécessite un minimum de connaissances en informatique pour être opérationnel. Néanmoins il n'y a rien de très compliqué pour le faire fonctionner correctement. Il faut procéder méthodiquement, pas-à-pas, lors de l'installation.

La marche à suivre est la suivante :

  • Télécharger le logiciel depuis GitHub et copier les fichiers quelque part.
  • Définir la variable d'environnement RADIOK_HOME comme le chemin vers le répertoire où le logiciel a été copié. On peut aussi ajouter $RADIOK_HOME/bin dans son PATH.
  • Définir la variable RADIOK_PLAYER pour sélectionner soit mplayer soit mpg123.
  • Ajouter en plus ces 2 définitions dans le crontab courant.
  • Télécharger et installer les composants tiers mentionnés plus haut : NodeJs, Bootstrap, …
  • Vérifer que l'utilisateur est bien membre du groupe audio.
  • Tester mplayer avec une URL de radio comme par exemple :
    mplayer http://mp3lg.tdf-cdn.com/fip/all/fiphautdebit.mp3
  • Tester le script onair.sh comme par exemple avec les commandes suivantes :
    1. onair.sh -h
    2. onair.sh -l
    3. onair.sh a-fip
    4. onair.sh -k
  • Tester le serveur web en lançant d'abord :
    /usr/local/bin/node $RADIOK_HOME/www/kontrol/app.js en modifiant le chemin vers node si besoin.
    Avec le navigateur aller à la page http://localhost:18000/ et cliquer sur les différents liens.
  • En cas de soucis regarder les messages d'erreur du serveur affichés sur le terminal à partir duquel le server aura été démarré et également dans les fichiers log dans le répertoire run : le fichier radiok.log est écrit par le serveur web tandis que onair.log est utilisé par le script onair.sh.
    Les éventuels problèmes peuvent également survenir côté client. Il faut alors ouvrir la console du navigateur, par exemple en tapant Ctrl-J sur Chrome.
  • En cas de difficulté côté serveur, il faut corriger le problème et redémarrer le serveur, si c'est du côté client il faut recharger la page d'arrivée.
  • Quand le serveur est au point on peut alors utiliser le script plus complet start.sh pour démarrer. Il est bon de revérifier les pages envoyées, les fichiers log.
  • Le démarrage du contrôle vocal est décrit sur une page spécifique.
  • Enfin quand tout est au point on peut utiliser le script radiok.sh dans une crontab pour relancer automatiquement tous les morceaux de l'application au reboot avec une ligne comme celle-ci :
    @reboot $HOME/rpi/radiok/bin/radiok.sh1 $HOME/tmp/cronk.log 2>&1
    Il est malgré tout prudent de vérifier que tout refonctionne correctement après un redémarrage de la rpi. On vérifiera en particulier que la date est correctement mise car il faut laisser le temps à ntp de se synchroniser correctement.

Configuration

Malheureusement dans cette version de l'application les paramètres de configuration sont dispersés dans plusieurs fichiers. Il faut éditer les scripts ou les fichiers de code javascript pour changer des valeurs. On essaiera de regrouper ces paramètres dans un seul fichier dans une éventuelle future version.

mplayer

Les options de mplayer qui n'ont pas de raison de changer sont définies sur la ligne de commande préparée par onair.sh. En revanche les paramètres qui définissent le cache du programme sont à laisser dans le fichier ~/.mplayer/config. En effet ils sont assez sensibles pour assurer un bon fonctionnement de la radio. Le cache doit avoir une taille suffisante pour avoir un flux continu si le débit du réseau a des faiblesses mais cette taille doit rester raisonnable pour avoir un démarrage du son dans un délai acceptable. Il faut donc faire pas mal d'essais pour trouver le bon compromis. Ma config actuelle est celle ci-dessous, sachant que le débit descendant est autour de 20 kB/s.


prefer-ipv4=yes
nocache=no
cache=8192
cache-min=1
cache-seek-min=1

onair.sh

C'est dans ce script qu'est définie la liste des stations de radio préférées. Cette liste est implémentée en 2 tables d'association clé-valeur. La clé est un identifiant simple. L'utilisation d'un préfixe permet d'avoir automatiquement la liste classée par ordre alphabétique. Ainsi la clé a-fip viendra avant la clé z-rmb lors des affichages. La valeur stockée dans la table radios est l'url utilisée pour accéder au flux radio. En googlant un peu et en allant sur les sites web des radios on trouve facilement ces url. Dans l'autre table, surnames, la valeur est la chaîne de caractères choisie pour l'affichage du nom des stations sur les pages web.

start.sh

L'adresse du serveur est codée en dur dans ce fichier. Si le numéro de port par défaut, 18000, est changé il faut mettre à jour ce fichier.

app.js

Ce fichier contient le code de démarrage du serveur http. Le numéro de port qui a été choisi est 18000 mais il peut naturellement être changé.

box.js

Ce fichier javascript contient le code exécuté par le serveur http. Il traite les requêtes envoyées depuis un navigateur. On peut éditer les valeurs par défaut qui sont définies en haut du fichier, en particulier la clé de la radio et la durée de fonctionnement après déclenchement automatique.

vox.js

Ce fichier contient le code du traitement des requêtes vocales. En se basant sur les indications fournies sur la page audio on peut le modifier.

radiok.less

Ce fichier définit le style d'affichage des pages web. Il utilise un thème venant du site Bootswatch. On peut modifier comme on veut le style en n'oubliant pas de refabriquer le fichier radiok.css à l'aide de la commande lessc.

home.html

Ce fichier est le fragment de page qui présente la liste des radios disponibles et le bouton de réglage du volume. Ce slider peut avoir besoin d'être ajusté. On peut changer sa géométrie et les valeurs min et max pour le rendre plus facile à utiliser.