Calcifer/output/smart-home-episode-1-la-juk...

242 lines
19 KiB
HTML
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.

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Couac.tv - Smart home, épisode 1, la Jukebox.</title>
<link rel="stylesheet" type="text/css" href="http://couac.tv/theme/css/main.css" />
<link rel="stylesheet" href="https://fonts.ppsfleet.navy/Josephin_sans/style.css" />
<link rel="stylesheet" href="https://fonts.ppsfleet.navy/arimo/arimo.css" />
<link rel="alternate" type="application/rss+xml" href="http://couac.tv/feeds/all.atom.xml" />
<meta property="og:site_name" content="Couac.tv">
<meta name="author" content="Tom Darboux">
<meta name="description" content="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 …" />
<meta property="og:description" content="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 …">
<meta property="og:title" content="Smart home, épisode 1, la Jukebox.">
</head>
<body>
<header>
<h1>
<a href="http://couac.tv/">Couac.tv</a>
</h1>
<aside>
</aside>
<nav>
<ul>
<li><a href="https://pixelfed.social/tjiho">Quelques Photos</a></li>
<li><a href="http://tom.darboux.me">A propos de moi</a></li>
</ul>
</nav>
</header>
<main>
<article class="post">
<div>
<h1><a href="http://couac.tv/smart-home-episode-1-la-jukebox.html" rel="bookmark">Smart home, épisode 1, la Jukebox.</a></h1>
<div class="meta">
<p>
Posted on <time datetime="2020-08-30T00:00:00+02:00">dim. 30 août 2020</time> in <a href="http://couac.tv/category/iot.html">Iot</a> by <a class="url fn" href="http://couac.tv/author/tom-darboux.html">Tom Darboux</a>
. </p>
</div> </div>
<div>
<p>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.</p>
<h2>I - Choisir un logiciel de musique:</h2>
<p>Pour faire une jukebox, il y a à la fois beaucoup et finalement bien peu de logiciels.</p>
<ul>
<li>Subsonic</li>
<li>Pulseaudio</li>
<li>Icecast</li>
<li>Snapcast</li>
<li>MPD</li>
<li>DLNA</li>
<li>Mopidy</li>
<li>Le Bluetooth</li>
</ul>
<p>J'ai démarré avec un fork de Subsonic, Airsonic, il analyse une bibliothèque musical en local et permet de la jouer à distance:</p>
<ul>
<li>Il a beaucoup vieilli, il n'y a pas d'interface web potable.</li>
<li>Malgré que ce soit vieux, il tournait péniblement sur mon mini pc</li>
<li>Ne s'interface pas avec d'autre source de musique</li>
</ul>
<p>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...</p>
<p>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.</p>
<ul>
<li>Je n'ai pas réussi à le compiler sous Fedora 32, il faudra attendre Fedora 33</li>
<li>Semble prometteur</li>
</ul>
<p>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.</p>
<p>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é.</p>
<p>Je ferais sûrement un autre tuto pour limplémentation du Bluetooth</p>
<h2>II - Installer les outils</h2>
<p>Pulseaudio:</p>
<div class="highlight"><pre><span></span><code>dnf install pulseaudio pulseaudio-utils alsa-plugins-pulseaudio
</code></pre></div>
<p>Les codecs (via mplayer, pratique pour tester le son en ligne de commande):</p>
<div class="highlight"><pre><span></span><code><span class="n">dnf</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">download1</span><span class="o">.</span><span class="n">rpmfusion</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">free</span><span class="o">/</span><span class="n">fedora</span><span class="o">/</span><span class="n">rpmfusion</span><span class="o">-</span><span class="n">free</span><span class="o">-</span><span class="n">release</span><span class="o">-$</span><span class="p">(</span><span class="n">rpm</span><span class="w"> </span><span class="o">-</span><span class="n">E</span><span class="w"> </span><span class="o">%</span><span class="n">fedora</span><span class="p">)</span><span class="o">.</span><span class="n">noarch</span><span class="o">.</span><span class="n">rpm</span><span class="w"> </span><span class="n">http</span><span class="p">:</span><span class="o">//</span><span class="n">download1</span><span class="o">.</span><span class="n">rpmfusion</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">nonfree</span><span class="o">/</span><span class="n">fedora</span><span class="o">/</span><span class="n">rpmfusion</span><span class="o">-</span><span class="n">nonfree</span><span class="o">-</span><span class="n">release</span><span class="o">-$</span><span class="p">(</span><span class="n">rpm</span><span class="w"> </span><span class="o">-</span><span class="n">E</span><span class="w"> </span><span class="o">%</span><span class="n">fedora</span><span class="p">)</span><span class="o">.</span><span class="n">noarch</span><span class="o">.</span><span class="n">rpm</span><span class="w"></span>
<span class="n">dnf</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="n">mplayer</span><span class="w"> </span><span class="n">mencode</span><span class="w"></span>
</code></pre></div>
<h2>III - Installer Mopidy</h2>
<p>L'installation est très simple:</p>
<div class="highlight"><pre><span></span><code>dnf install mopidy mopidy-spotify mopidy-mpd
</code></pre></div>
<p>on édite la config dans <code>/etc/mopidy/mopidy.conf</code>:</p>
<div class="highlight"><pre><span></span><code><span class="k">[http]</span><span class="w"></span>
<span class="na">enabled</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">true</span><span class="w"></span>
<span class="na">hostname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">wall-e.home</span><span class="w"></span>
<span class="na">port</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">6680</span><span class="w"></span>
<span class="na">zeroconf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">Mopidy HTTP server on $hostname</span><span class="w"></span>
<span class="na">allowed_origins</span><span class="w"> </span><span class="o">=</span><span class="w"></span>
<span class="na">csrf_protection</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">true</span><span class="w"></span>
<span class="na">default_app</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">mopidy</span><span class="w"></span>
<span class="k">[mpd]</span><span class="w"></span>
<span class="na">hostname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">10.10.10.10</span><span class="w"></span>
<span class="k">[file]</span><span class="w"></span>
<span class="na">enabled</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">true</span><span class="w"></span>
<span class="na">media_dirs</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">/mnt/truck/Musique</span><span class="w"></span>
<span class="na">show_dotfiles</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">false</span><span class="w"></span>
<span class="na">excluded_file_extensions</span><span class="w"> </span><span class="o">=</span><span class="w"></span>
<span class="w"> </span><span class="na">.directory</span><span class="w"></span>
<span class="w"> </span><span class="na">.html</span><span class="w"></span>
<span class="w"> </span><span class="na">.jpeg</span><span class="w"></span>
<span class="w"> </span><span class="na">.jpg</span><span class="w"></span>
<span class="w"> </span><span class="na">.log</span><span class="w"></span>
<span class="w"> </span><span class="na">.nfo</span><span class="w"></span>
<span class="w"> </span><span class="na">.pdf</span><span class="w"></span>
<span class="w"> </span><span class="na">.png</span><span class="w"></span>
<span class="w"> </span><span class="na">.txt</span><span class="w"></span>
<span class="w"> </span><span class="na">.zip</span><span class="w"></span>
<span class="na">follow_symlinks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">false</span><span class="w"></span>
<span class="na">metadata_timeout</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">1000</span><span class="w"></span>
</code></pre></div>
<p>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 <code>sudo pip</code> mais c'est pas trop la sécurité)</p>
<div class="highlight"><pre><span></span><code>chsh mopidy -s /bin/bash # par default il est en nologin
su mopidy
pip3 --user install Mopidy-Iris
pip3 --user install Mopidy-Mobile
</code></pre></div>
<p>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.</p>
<div class="highlight"><pre><span></span><code><span class="n">sed</span><span class="w"> </span><span class="o">-</span><span class="n">i</span><span class="w"> </span><span class="s1">&#39;s/google.com/lol.home/&#39;</span><span class="w"> </span><span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">mopidy</span><span class="o">/.</span><span class="n">local</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="o">.</span><span class="mi">8</span><span class="o">/</span><span class="n">site</span><span class="o">-</span><span class="n">packages</span><span class="o">/</span><span class="n">mopidy_iris</span><span class="o">/</span><span class="k">static</span><span class="o">/</span><span class="n">app</span><span class="o">.</span><span class="n">js</span><span class="w"></span>
</code></pre></div>
<p>Enfin on lance Mopidy</p>
<div class="highlight"><pre><span></span><code>systemctl start mopidy
</code></pre></div>
<p>Pour plus d'info : <a href="https://docs.mopidy.com/en/latest/installation/">la documentation de mopidy</a></p>
<p>Les interfaces webs sont accessible sur http://wall-e.home:6680</p>
<h2>IV - La bête: Pulseaudio vs le bête: moi</h2>
<p>Naïvement, j'ai cliqué sur une piste, et je n'ai pas eu de son.</p>
<p>Naïvement j'ai cherché sur internet comment lancer Pulseaudio avec Systemd.</p>
<p>Naïvement j'ai suivi les conseils glané sur les forums.</p>
<p>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.</p>
<p>1 - On désactive la configuration par défaut, qui n'est adapté que si</p>
<ul>
<li>on fait tout avec l'utilisateur principal (merci la sécurité)</li>
<li>on utilise une interface graphique</li>
</ul>
<div class="highlight"><pre><span></span><code>systemctl --global disable pulseaudio.service pulseaudio.socket
</code></pre></div>
<p>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)</p>
<p>Pas besoin d'aller chercher midi à 14h, on copie les configs déjà existantes:</p>
<div class="highlight"><pre><span></span><code>cp /usr/lib/systemd/user/pulseaudio.service /etc/systemd/system/pulseaudio.service
cp /usr/lib/systemd/user/pulseaudio.socket /etc/systemd/system/pulseaudio.socker
</code></pre></div>
<p>Puis il faut éditer <code>/etc/systemd/system/pulseaudio.service</code> pour qu'il se lance avec le bon utilisateur</p>
<div class="highlight"><pre><span></span><code>User=mopidy
</code></pre></div>
<p>et on change encore quelques bricoles:</p>
<div class="highlight"><pre><span></span><code>Restart=always
Type=simple
</code></pre></div>
<p>pour que ça ressemble à</p>
<div class="highlight"><pre><span></span><code><span class="k">[Unit]</span><span class="w"></span>
<span class="na">Description</span><span class="o">=</span><span class="s">Sound Service</span><span class="w"></span>
<span class="na">Requires</span><span class="o">=</span><span class="s">pulseaudio.socket</span><span class="w"></span>
<span class="k">[Service]</span><span class="w"></span>
<span class="na">ExecStart</span><span class="o">=</span><span class="s">/usr/bin/pulseaudio --daemonize=no</span><span class="w"></span>
<span class="na">LockPersonality</span><span class="o">=</span><span class="s">yes</span><span class="w"></span>
<span class="na">MemoryDenyWriteExecute</span><span class="o">=</span><span class="s">yes</span><span class="w"></span>
<span class="na">NoNewPrivileges</span><span class="o">=</span><span class="s">yes</span><span class="w"></span>
<span class="na">Restart</span><span class="o">=</span><span class="s">always</span><span class="w"></span>
<span class="na">RestrictNamespaces</span><span class="o">=</span><span class="s">yes</span><span class="w"></span>
<span class="na">SystemCallArchitectures</span><span class="o">=</span><span class="s">native</span><span class="w"></span>
<span class="na">SystemCallFilter</span><span class="o">=</span><span class="s">@system-service</span><span class="w"></span>
<span class="c1"># Note that notify will only work if --daemonize=no</span><span class="w"></span>
<span class="na">Type</span><span class="o">=</span><span class="s">simple</span><span class="w"></span>
<span class="na">UMask</span><span class="o">=</span><span class="s">0077</span><span class="w"></span>
<span class="na">User</span><span class="o">=</span><span class="s">mopidy</span><span class="w"></span>
<span class="k">[Install]</span><span class="w"></span>
<span class="na">Also</span><span class="o">=</span><span class="s">pulseaudio.socket</span><span class="w"></span>
<span class="na">WantedBy</span><span class="o">=</span><span class="s">default.target</span><span class="w"></span>
</code></pre></div>
<p>On ne touche pas au socket qui est</p>
<div class="highlight"><pre><span></span><code><span class="k">[Unit]</span><span class="w"></span>
<span class="na">Description</span><span class="o">=</span><span class="s">Sound System</span><span class="w"></span>
<span class="na">ConditionUser</span><span class="o">=</span><span class="s">!root</span><span class="w"></span>
<span class="k">[Socket]</span><span class="w"></span>
<span class="na">Priority</span><span class="o">=</span><span class="s">6</span><span class="w"></span>
<span class="na">Backlog</span><span class="o">=</span><span class="s">5</span><span class="w"></span>
<span class="na">ListenStream</span><span class="o">=</span><span class="s">%t/pulse/native</span><span class="w"></span>
<span class="k">[Install]</span><span class="w"></span>
<span class="na">WantedBy</span><span class="o">=</span><span class="s">sockets.target</span><span class="w"></span>
</code></pre></div>
<p>on enable tout ça:</p>
<div class="highlight"><pre><span></span><code>systemctl enable --now pulseaudio
</code></pre></div>
<p>Si vous avez du son bravo !</p>
<h2>V - Si ce n'est pas bon, des commandes en vrac</h2>
<p>Sinon quelques commandes utiles</p>
<div class="highlight"><pre><span></span><code>usermod -a -G pulse mopidy
</code></pre></div>
<div class="highlight"><pre><span></span><code>usermod -a -G audio mopidy
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="o">-</span><span class="n">i</span><span class="w"> </span><span class="o">-</span><span class="n">u</span><span class="w"> </span><span class="n">mopidy</span><span class="w"> </span><span class="c1"># pour devenir mopidy en cleanant les variables d&#39;env qui font tout buguer</span><span class="w"></span>
</code></pre></div>
<div class="highlight"><pre><span></span><code>pactl list sinks # à lancer en tant que mopidy - affiche les sorties audios
</code></pre></div>
<div class="highlight"><pre><span></span><code>pactl set-default-sink # à lancer en tant que mopidy - choisis la sortie audio à utiliser
</code></pre></div>
<div class="highlight"><pre><span></span><code>speaker-test # teste le son, si vous avez des grésillement ou mieux c&#39;est bon, pulseaudio fonctionne
</code></pre></div>
<div class="highlight"><pre><span></span><code>mplayer mon-super-morceau.flac # joue un morceau de musique, pour être sur
</code></pre></div>
<h2>VI - Applications pour controler mopidy</h2>
<p>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.</p>
<p>MPD étant un standard, il y a énormément de clients téléphone et ordinateurs.</p>
<ul>
<li>Sous Android j'utilise M.A.L.P, open-source et disponible via F-droid</li>
<li>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.</li>
</ul>
</div>
</article>
</main>
</body>
</html>