(modifié le 5 avril 2023 à 17:37)

Il y a quelques années j'ai acheté un amplificateur audio Yamaha, doté d'un port réseau RJ45 qui permet d'accéder à des webradios. Le tout s'appuie sur le service tiers vtuner.com

Le service marchait bien, et puis un beau matin plus rien! Enfin si, un message disant d'aller sur le site de vtuner, sur lequel je me rends compte qu'il faut maintenant payer 3$ par an. J'ai cherché une alternative et j'ai trouvé avec Ycast qui tourne sur mon Raspberry Pi.

Comme j'ai eu du mal à trouver des informations pour mettre en place et faire tourner YCast je vous propose un tutoriel en 🇫🇷.

Autant vous spoiler : c'est gratuit et ça marche aussi bien.

Pourquoi est-ce devenu payant ?

J'ignore la cause d'un tel revirement. Peut-être que vtuner a demandé à Yamaha une rétribution pour l'utilisation de son service du jour au lendemain, on pourrait imaginer que Yamaha n'a pas voulu céder, et c'est donc aux utilisateurs de payer... peut-être aussi que vtuner ne pouvait plus supporter les coûts d'hébergement, je n'en sais rien (et je m'en fou pas mal).

vtuner est également utilisé par d'autres marques que Yamaha : Pioneer, Samsung, Marantz, Denon, etc. Bref, ça a touché beaucoup de monde.

Votre amplificateur est-il encore mis à jour ?

Yamaha s'appuie maintenant sur un autre service tiers gratuit : airable. Pour en profiter il faut mettre à jour le micrologiciel de votre amplificateur.

Globalement tous les modèles d'ampli sortis à partir de 2017 (et plus récents) sont éligibles à une mise à jour pour basculer sur airable. Dans ce cas il suffit de faire la mise à jour en ligne (menu > network setup > update) ou depuis le site de Yamaha.

Par contre votre ampli est sorti entre 2011-2017 et fait partie de cette liste alors c'est mort :

CD-N301, CD-N500, CRX-N560, CX-A5000, HTR-4065, HTR-4066, HTR-4067, HTR-5066, HTR-5067, HTR-6064, HTR-6065, HTR-6067, HTR-7065, HTR-8063, HTR-9063, MCX-A300, MCX-P200, MCX-RC100, NP-S2000, R-N301, R-N500, RX-A1000, RX-A1010, RX-A1020, RX-A1030, RX-A1040, RX-A2000, RX-A2010, RX-A2020, RX-A2030, RX-A2040, RX-A3000, RX-A3010, RX-A3020, RX-A3030, RX-A3040, RX-A710, RX-A720, RX-A730, RX-A740, RX-A810, RX-A820, RX-A830, RX-A840, RX-S600, RX-S600D, RX-V1067, RX-V1071, RX-V1073, RX-V1075, RX-V1077, RX-V2065, RX-V2067, RX-V2071, RX-V2073, RX-V2075, RX-V2077, RX-V3067, RX-V3071, RX-V3073, RX-V3075, RX-V3077, RX-V3900, RX-V473, RX-V475, RX-V477, RX-V500D, RX-V573, RX-V575, RX-V577, RX-V671, RX-V673, RX-V675, RX-V677, RX-V771, RX-V773, RX-V775, RX-V777, RX-V867, RX-V871, RX-Z7, TSR-6750, YMC-700

Aucune mise à jour n'est disponible chez Yamaha (le mien est en gras).

Pas content j'étais :

C'est vrai, après tout c'est dans les specs du produit... Mais bon, Yamaha a peut être de bonnes raisons comme un incompatibilité technique, l'impossibilité de refabriquer un firmware. On ne saura jamais, peut-être est-ce juste une question de volonté et vu la taille de Yamaha je me dis que les mecs sont sûrement assez bon pour arriver à refaire des firmwares. Surtout que tu ne changes pas d'ampli tous les matins, donc question fidélité je trouve ça assez moyen.

La solution : YCast ✔️

Mais c'était sans compter Micha LaQua, aka milaq, un développeur allemand qui a eu la chouette idée de créer YCast. un programme python qui permet aux amplis qui ne peuvent pas être mis à jour de continuer de fonctionner.

YCast intercepte les requêtes HTTP que votre ampli fait à destination de vtuner et renvoie des webradios en dur (m3u) ou bien fait passerelle avec le site community radio browser. Un site communautaire qui liste toutes les webradios du monde.

Comment ça marche ?

Tout d'abord il faut créer un DNS menteur (DNS spoofing) pour que les requêtes DNS à destination de yradio.vtuner.com partent en réalité vers notre serveur YCast, qui travaille de concert notre reverse proxy porté par avec nginx (ou lighttpd).

La beauté de YCast c'est que tout est fait à la volée. Avant d'aller plus loin vérifiez que votre ampli fait partie des amplis compatibles / testés avec YCast.

On a donc besoin :

  • d'un routeur libre (Tomato ou DD-WRT)
  • d'un Raspberry Pi (toutes versions, B+ chez moi)

Si vous n'avez pas de routeur sous Tomato / DD-WRT le Raspberry Pi sera suffisant, installez Pi-Hole dessus et ça fera le job.

Pour ce tutoriel nous avons les adresses IP statiques suivantes (ip fixe ou dhcp static) :

  •  192.168.0.14: Raspberry Pi
  •  192.168.0.254 : routeur tomato

1. Tomato : libérer le port 80

De mon côté c'est mon routeur Tomato qui s'occupe de la résolution DNS pour mes machines avec dnsmasq. Je vous ai déjà parlé de dnsmasq à plusieurs reprises : pour feinter un chromecast, débloquer du contenu Netflix géolocalisé, etc.

Le routeur Tomato va également faire tourner le service nginx que je ne voulais pas installer sur mon Raspberry Pi pour éviter que ça interfère avec Domoticz. Seul YCast tournera sur le Raspberry Pi.

D'abord on change le port 80 d'administration HTTP en 8080 du routeur pour le laisser à nginx :

Menu administration > admin access > HTTP port

Je vous conseille le 8080, faire save puis faire reboot du routeur.

2. Tomato : configurer le DNS menteur

J'ai une clé USB de 1go (FAT32) insérée dans mon routeur et elle est automatiquement montée au démarrage (menu USB & NAS). Celle-ci va stocker le fichier de configuration de nginx pour éviter de solliciter et d'user la partition /jffs (logs nginx toussa).

D'aborder indiquons au routeur qu'il doit résoudre les adresses localement (via son résolveur interne).

Si vous utilisez Tomato :

  • Menu Advanced > DHCP/DNS >
    • ✅ Use Internal DNS

Si vous utilisez DD-WRT :

  • Services > Services > DNSMasq/DNS >
    • ✅ Enable
    • ✅ Local DNS

Ensuite on ajoute une entrée dnsmasq pour faire pointer *.vtuner.com vers le routeur Tomato grâce au champ "Dnsmasq Custom configuration" :

address=/.vtuner.com/192.168.0.254

note : l'absence d'étoile "*" est normale. Le point "." englobe tous les sous-domaines dans la syntaxe dnsmasq

On n'oublie pas le bouton "save".

Vérifiez depuis votre PC la résolution DNS menteuse :

nslookup yradio.vtuner.com
Serveur : r7000
Address: 192.168.0.254

Nom : yradio.vtuner.com
Address: 192.168.0.254

Ici c'est bien l'adresse IP du routeur qui est retournée et non l'enregistrement DNS publique, c'est parfait.

3. Tomato : configuration du serveur web (nginx)

Copiez le contenu du fichier ycast-nginx.conf à la racine de la clé USB connectée sur le routeur Tomato puis éditez le fichier pour remplacer 192.168.0.14 par l'IP de votre Raspberry Pi dans ce fichier.

Passons à la configuration de nginx dans le routeur Tomato.

Menu Web Server > Nginx & PHP :

  • Basic Settings > Enable Server on Start
  • Advanced Settings >
    • Use user config file
    • User config file path : /tmp/mnt/CLE1GO/ycast-nginx.conf

(je me suis basé sur le modèle de configuration nginx Ycast)

Pour tester manuellement la config et le lancement de nginx :

nginx -t -c /tmp/mnt/CLE/ycast-nginx.conf
nginx -c /tmp/mnt/CLE/ycast-nginx.conf
nginx: the configuration file ... syntax is ok
nginx: configuration file ... test is successful

4. Raspberry Pi : installation de YCast

Et c'est parti sous Raspbian (testé avec Raspberry Pi OS/Raspbian 9, 10 et 11).

D'abord il faut installer ces paquets :

sudo apt install python3 python3-pip libtiff5 libopenjp2-7

Pour simplifier l'installation des dépendances de modules python nous allons confier l'installation de YCast à pip3.

sudo pip3 install ycast

Puis on clone le dépôt YCast contenant le code et les exemples :

git clone https://github.com/milaq/YCast.git /home/pi/ycast-yamaha

Note : le dépôt git ne sera utile que pour le fichier stations.example.yml au lancement du service. YCast est en réalité stocké ici (grâce à pip3) :

/usr/local/lib/python3.5/dist-packages/ycast

5. Raspberry Pi : service YCast

Nous créons le service YCast pour systemd et on copie le fichier contenant les radios (stations.yml) :

sudo useradd ycast
cd /home/pi/ycast-yamaha/examples
sudo cp ycast.service.example /etc/systemd/system/ycast.service
cp stations.yml.example ../stations.yml

Remplacez 127.0.0.1 par l'IP locale du Raspberry Pi 192.168.0.14 dans ycast.service pour que le service soit accessible pour le routeur. Si vous utilisez Pi-Hole ce changement sera inutile car tout sera en local sur le RPI.

C'est dans le fichier stations.xml que vous devrez gérer vos favoris et on y trouve quelques exemples dans le fichier livré.

C'est le moment de lancer ycast manuellement et vérifier que tout fonctionne :

python3 -m ycast -d -l 192.168.0.14 -p 8010 -c /home/pi/ycast-yamaha/stations.yml
  • -d : pour le debug
  • -l 192.168.0.14 : IP du raspberry Pi sur laquelle ycast écoute
  • -p 8010 : port d'écoute YCast

Attention : au lancement de ycast apparaît "Debug mode: off". Cette information de debug ne correspond pas au "-d" de ycast mais à flask, le framework python qui fait tourner YCast. Il restera à "off", pas d'inquiétude. Le debug s'affiche en terminal lors du lancement du binaire. En tant que service vous ne verrez pas la sortie donc inutile d'activer le debug.

C'est le moment de tester sur votre ampli 🥳 !

Si tout fonctionne activez le service :

 systemctl enable --now ycast.service

En cas de souci...

Vérifiez que le service YCast tourne :

 ps aux | grep ^[y]cast
ycast 22696 ... /usr/bin/python3 -m ycast -l 192.168.0.14 -p 8010 -c /home/pi/ycast-yamaha/stations.yml

Aussi j'ai fais quelques suggestions sur le GitHub (et une pull-request qui pleure dans son coin...) comme la possibilité de saisir l'ID d'une webradio au lieu de son M3U en dur qui est amené à changer avec le temps.

Mettre à jour YCast

Pour mettre à jour YCast vers une version plus récente (voir les versions chez PyPi)

On stoppe le service :

sudo systemctl stop ycast

puis on met à jour le paquet à l'aide de pip3 :

sudo pip3 install --upgrade ycast

On relance le service et on vérifie la version :

sudo systemctl start ycast && sudo systemctl status ycast

Et quelques liens utiles :

Je mets ici quelques astuces pour RadioBrowser (Syntaxe complète) :

Radio par identifiant :
http://www.radio-browser.info/webservice/json/stations/byid/118153

Recherche par UUID :
https://fr1.api.radio-browser.info/json/stations/byuuid/9607cdda-0601-11e8-ae97-52543be04c81

Radio par nom "couleur3" :
https://fr1.api.radio-browser.info/json/stations/byname/couleur%203

API :
https://api.radio-browser.info/

J'ai traduit quelques termes ici et modifié l'accueil qui démarre sur "mes stations" au lieu de RadioBrowser :

➡️ fichier traduit server.py (raw)

(transposez mes modifications si une nouvelle version de YCast est sortie après l'écriture de ce tuto).

Bonus : fichier M3U d'exemple

Voici mon fichier d'exemple M3U :
/home/pi/ycast-yamaha/stations.yml

A_Perso:
Frisky Chill: http://chill.friskyradio.com/friskychill_mp3_high
Tipik (Pure): http://radio.rtbf.be/tipik/mp3-160/fl
Virage Radio: http://virageradio.ice.infomaniak.ch/virageradio-natio.mp3
Virgin Radio: http://europe2.lmn.fm/europe2.aac
Mint: http://audiostream.rtl.be/mint192
Couleur 3: http://stream.srg-ssr.ch/m/couleur3/mp3_128

Attention les URLs des flux changent avec le temps qui passe, en cherchant "le nom de la radio m3u" dans google vous trouverez facilement la nouvelle URL si elle a changé.

Conclusion

De mon côté je suis très satisfait de cette alternative! Il faut mettre un peu les mains dans le cambouis mais il est aussi possible de n'utiliser qu'un Raspberry si vous n'avez pas de routeur (plus simple).

Sinon, vous pouvez passer par un partage DLNA si vous cherchez juste à lire un M3U rapidement depuis votre box, routeur, NAS ou PC, j'ai testé et ça marche même si c'est peu pratique (cf p.54).

Voilà, j'espère que ce tutoriel vous aura aidé, j'ai essayé de lever tous les points flous et soucis rencontrés. J'espère que votre ampli a donc retrouvé ses webradios 🎵

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter