Calcifer/content/articles/jukebox-1.md

260 lines
7.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Title: Smart home, épisode 1, la Jukebox.
Date: 2020-08-30 00:00
Category: Iot
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.
* Subsonic
* Pulseaudio
* Icecast
* Snapcast
* MPD
* DLNA
* Mopidy
* 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ée 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 limplé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](https://docs.mopidy.com/en/latest/installation/)
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 ca s'utilisait les doigts dans le nez, 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 à 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
```
VI - Applications pour controler mopidy
----
Voilà bientôt 2 ans que j'utilise Mopidy, l'année 2022 vient de commencer. Et je n'utilise quasiment jamais l'interface web.
MPD étant un standard, il y a énormément de clients téléphone et ordinateurs.
- Sous Android j'utilise M.A.L.P, open-source et disponible via F-droid
- Sous Linux, une application QT, Cantata. Cette superbe application gère aussi les podcasts et permet de streamer les podcasts en MPD sur l'enceinte.