Calcifer

Smart home, épisode 1, la Jukebox.

Posted on in Iot by Tom Darboux .

Il est 2h du matin, et la voix d'Adèle sort enfin de mes enceintes, victoire ! Aller me coucher ou noter les instructions pour ne pas oublier, le choix fut dur.

I - Choisir un logiciel de musique:

Pour faire une jukebox, il y a à la fois beaucoup et finalement bien peu de logiciels.

  • Le vieux sage: Subsonic
  • Le barbu mal rasé: Pulseaudio
  • Le barbu bien rasé: Icecast
  • L'ado: Snapcast
  • Le simplet: MPD
  • Le beau parleur: DLNA
  • L'agent double: Mopidy
  • Le Bluetooth: le Bluetooth

J'ai démarré avec un fork de Subsonic, Airsonic, il analyse une bibliothèque musical en local et permet de la jouer à distance:

  • Il a beaucoup vieilli, il n'y a pas d'interface web potable.
  • Malgré que ce soit vieux, il tournait péniblement sur mon mini pc
  • Ne s'interface pas avec d'autre source de musique

Pulseaudio et Icecast, je n'ai pas pris le temps de comprendre leur fonctionnement mais à l'opposé de Airsonic, il sont là pour streamer des flux audios. La musique est sur votre client ( téléphone ) et elle est streamé par le réseau vers le serveur, c'est du Bluetooth via le wifi...

Snapcast c'est la même chose, mais en plus moderne. Faible latence, il permet aussi de synchroniser plusieurs enceintes et dispose de clients modernes.

  • Je n'ai pas réussi à le compiler sous Fedora 32, il faudra attendre Fedora 33
  • Semble prometteur

DLNA, c'est un standard pour partager et streamer des médias inventé par un consortium de grosses boites (Samsung, Sony, Microsoft, et autres), si vous avez une télévision connecté non Android, ça peut être un choix intéressant, ça sera sûrement natif dans votre télé. Le principal hic c'est que Apple et Google ( soit 100% des smartphones ) ne font pas partie de ce consortium et ils poussent chacun un concurrent. Le deuxième problème est que la qualité des implémentations varie selon le prix et l'ancienneté de la télé, à tester.

Le dernier, Mopidy, est un mix des précédents. Par défaut il fonctionne comme Subsonic, la musique est en local mais via des plugins ( Spotify, MPD, subsonic, soundcloud,... ) et son api il est possible d'étendre ses fonctionnalités, c'est celui-ci que j'ai installé.

Je ferais sûrement un autre tuto pour l’implémentation du Bluetooth

II - Installer les outils

Pulseaudio:

dnf install pulseaudio pulseaudio-utils alsa-plugins-pulseaudio

Les codecs (via mplayer, pratique pour tester le son en ligne de commande):

dnf install http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
dnf install mplayer mencode

III - Installer Mopidy

L'installation est très simple:

dnf install mopidy mopidy-spotify mopidy-mpd

on édite la config dans /etc/mopidy/mopidy.conf:

[http]
enabled = true
hostname = wall-e.home
port = 6680
zeroconf = Mopidy HTTP server on $hostname
allowed_origins =
csrf_protection = true
default_app = mopidy

[mpd]
hostname = 10.10.10.10

[file]
enabled = true
media_dirs = /mnt/truck/Musique
show_dotfiles = false
excluded_file_extensions =
  .directory
  .html
  .jpeg
  .jpg
  .log
  .nfo
  .pdf
  .png
  .txt
  .zip
follow_symlinks = false
metadata_timeout = 1000

Il y a plusieurs interfaces, j'en utilise deux, Iris sur pc et Mopidy-mobile sur mon téléphone, on les installe avec pip (on pourrait faire du sudo pip mais c'est pas trop la sécurité)

chsh mopidy -s /bin/bash # par default il est en nologin
su mopidy
pip3 --user install Mopidy-Iris
pip3 --user install Mopidy-Mobile

Dans la doc d'Iris, il faut ajouter les droits sudo à un script, le script n'est pas utile, donc on privilégie encore une fois notre sécurité (enfin à vous de voir). Malheureusement, Iris utilise Google-analytics, il suffit de remplacer les appels à Google par du beurre.

sed -i 's/google.com/lol.home/' /var/lib/mopidy/.local/lib/python3.8/site-packages/mopidy_iris/static/app.js

Enfin on lance Mopidy

systemctl start mopidy

Pour plus d'info : la documentation de mopidy

Les interfaces webs sont accessible sur http://wall-e.home:6680

IV - La bête: Pulseaudio vs le bête: moi

Naïvement, j'ai cliqué sur une piste, et je n'ai pas eu de son.

Naïvement j'ai cherché sur internet comment lancer Pulseaudio avec Systemd.

Naïvement j'ai suivi les conseils glané sur les forums.

Naïvement je pensais que Pulseaudio c'était "finger in the nose", et que en 2020 on peut se passer de lire la doc juste pour avoir du son.

1 - On désactive la configuration par défaut, qui n'est adapté que si

  • on fait tout avec l'utilisateur principal (merci la sécurité)
  • on utilise une interface graphique
systemctl --global disable pulseaudio.service pulseaudio.socket

2 - On fait un service pour lancer Pulseaudio en tant que mopidy (on pourrait être tenté de sacrifier la sécurité pour la simplicité en lancant pulseaudio en root, on ne le fait pas)

Pas besoin d'aller chercher midi à 14h, on copie les configs déjà existantes:

cp /usr/lib/systemd/user/pulseaudio.service /etc/systemd/system/pulseaudio.service
cp /usr/lib/systemd/user/pulseaudio.socket /etc/systemd/system/pulseaudio.socker

Puis il faut éditer /etc/systemd/system/pulseaudio.service pour qu'il se lance avec le bon utilisateur

User=mopidy

et on change encore quelques bricoles:

Restart=always
Type=simple

pour que ça ressemble à

[Unit]
Description=Sound Service
Requires=pulseaudio.socket

[Service]
ExecStart=/usr/bin/pulseaudio --daemonize=no
LockPersonality=yes
MemoryDenyWriteExecute=yes
NoNewPrivileges=yes
Restart=always
RestrictNamespaces=yes
SystemCallArchitectures=native
SystemCallFilter=@system-service
# Note that notify will only work if --daemonize=no
Type=simple
UMask=0077
User=mopidy

[Install]
Also=pulseaudio.socket
WantedBy=default.target

On ne touche pas au socket qui est

[Unit]
Description=Sound System
ConditionUser=!root

[Socket]
Priority=6
Backlog=5
ListenStream=%t/pulse/native

[Install]
WantedBy=sockets.target

on enable tout ça:

systemctl enable --now pulseaudio

Si vous avez du son bravo !

V - Si ce n'est pas bon, des commandes en vrac

Sinon quelques commandes utiles

usermod -a -G pulse mopidy
usermod -a -G audio mopidy
sudo -i -u mopidy # pour devenir mopidy en cleanant les variables d'env qui font tout buguer
pactl list sinks # à lancer en tant que mopidy - affiche les sorties audios
pactl set-default-sink # à lancer en tant que mopidy - choisis la sortie audio a utiliser
speaker-test # teste le son, si vous avez des grésillement ou mieux c'est bon, pulseaudio fonctionne
mplayer mon-super-morceau.flac # joue un morceau de musique, pour être sur

Prochain tuto, le Bluetooth si j'y arrive.