Aller au contenu

[TUTO] Audio multiroom - Mopidy/Iris/Snapcast


.Shad.

Messages recommandés

mopidy.png.5f56835a47dcc7c2649fbaa8a6b3d1c7.png         iris-logo.png.983abd5d9534b24c4011684e4b67e7d7.png         Snapcast_800.png.2d41601b38660cbf8edbbe38c6dae014.png

 

1. Préambule

Mopidy est un serveur musical open source et modulaire permettant de streamer localement votre musique, ainsi que d'intégrer un nombre conséquent de services de streaming audio tels que Soundcloud, Youtube, Youtube Music, Tidal, etc... (Spotify n'est plus pris en charge actuellement).
Il intègre également de nombreux protocoles de communication : mqtt, json rpc, tcp, etc... et le rend donc adapté à un large panel d'utilisations.
Iris est une extension web de Mopidy, qui fournit une interface graphique moderne et l'intégration de différentes extensions de Mopidy et autre protocoles.
Snapcast, enfin, qui est un logiciel permettant la diffusion de musique par le réseau.
C'est une alternative libre et bon marché à des systèmes tels que ceux proposés par Sonos ou Apple.

C'est un tutoriel que j'essaie de rédiger depuis un petit temps déjà, mais :

  • je ne voyais pas comment présenter ça de façon simple et compréhensible par tous
  • je n'étais pas satisfait des images Docker existantes
  • l'intégration de Snapcast avec Iris n'était pas heureuse via Docker

Depuis, une image Docker facilitant l'interconfiguration des services a été publiée, et me permet aujourd'hui de vous présenter cette pépite.

2. Objectifs

Si vous naviguez un peu sur le site de Mopidy, vous verrez qu'un nombre conséquent d'intégrations sont possibles, de fait, je ne vais pas m'étendre sur tout ce qu'on peut réaliser, mais plutôt sur la fonctionnalité diffusion multiroom, qui n'est pas forcément bien documentée que ce soit sur le Github d'Iris ou de Snapcast. Encore moins dans le cadre d'un NAS, qui est pourtant une idée relativement logique dans le cadre d'un serveur de musique centralisé.

Ce qui sera abordé dans ce tutoriel :

  • L'installation et la configuration de deux instances de Mopidy (à multiplier suivant le nombre de flux différents que vous souhaitez pouvoir diffuser)
  • La diffusion de bibliothèque musicale locale
  • La configuration des clients

Ce qui sera abordé dans un second temps si engouement pour le sujet :

  • L'utilisation d'un proxy inversé avec Iris => quelques bugs que je trouve personnellement gênants mais certains y tiendront sûrement 😉 
  • L'intégration des différents services de streaming online supportés par Mopidy (voir extensions) => chaque extension possède sa propre manière d'être configurée, voir la doc associée ; dans tous les cas cela passe par la modification des fichiers mopidy.conf et l'ajout de fichiers supplémentaires parfois

3. Principe de fonctionnement

Configuration du système :

  • Une seule interface pour accéder aux différentes instances, à laquelle on accède depuis PC, mobile, tablette, etc...
  • Des clients
  • Le NAS, qui hébergera les différents services

diagramme-snapcast.drawio.png.4a29396198be585b08d27136124eded7.png

Remarque : Un client statique est un client de type "headless", qui n'accèdera pas à l'interface d'Iris mais recevra uniquement le flux depuis Snapcast. Un client dynamique peut être le smartphone avec lequel vous ajoutez des morceaux en liste de lecture, il peut également devenir un périphérique recevant des informations de Snapcast.

5. Prérequis

Difficulté : Moyenne

  • Un NAS compatible Docker
  • Des clients
  • Ports 1780, 6600, 6700, 6680 et 6780 (si deuxième instance) du NAS accessibles aux clients

6. Hypothèses

7. Installation

7-A. Fichier compose

L'installation se fera principalement en SSH.
Avec la version 7.2 de DSM, il est possible de rédiger le fichier compose via l'interface de Container Manager (nouveau nom du paquet Docker), restent certaines commandes qui ne peuvent être accomplies que par terminal, à vous de voir ce que vous préférez, si vous savez le faire en lignes de commande vous n'aurez aucune difficulté à le faire via Container Manager.
Vous pouvez consulter mon tutoriel introductif à Docker pour plus d'informations sur les étapes qui vont suivre.

Et maintenant, c'est parti !

On crée le dossier pour Iris dans le dossier partagé docker :

mkdir -p /volume1/docker/iris

Puis on crée le fichier compose :

nano /volume1/docker/iris/docker-compose.yml
Révélation
version: "2.1"
services:

   iris-snapserver:
      image: jaedb/snapserver
      container_name: iris-snapserver
      network_mode: host
      volumes:
         # for fifo stream output
         - /tmp/snapserver:/tmp
         # snapserver config
         - /volume1/docker/iris/snapserver/snapserver.conf:/etc/snapserver.conf:ro
         # mopidy iris stream plugin
         - /volume1/docker/iris/snapserver/meta_mopidy.py:/usr/share/snapserver/plug-ins/meta_mopidy.py:ro
      depends_on:
         - iris-instance1
         - iris-instance2
      restart: unless-stopped

   iris-instance1:
      image: jaedb/iris
      container_name: iris-instance1
      network_mode: host
      #environment:
         #- PIP_PACKAGES=Mopidy-YTMusic Mopidy-Tidal Mopidy-SoundCloud
      volumes:
         # iris-specific storage
         - /volume1/docker/iris/instance1/data:/var/lib/mopidy/iris
         # playlists
         - /volume1/docker/iris/playlists:/var/lib/mopidy/m3u
         # config
         - /volume1/docker/iris/instance1/config:/config:ro
         # local
         - /volume1/docker/iris/local:/var/lib/mopidy/local
         # music files
         - /volume1/music/bibliotheque:/var/lib/mopidy/media:ro
         # for fifo stream output
         - /tmp/snapserver:/tmp
      restart: unless-stopped

   iris-instance2:
      image: jaedb/iris
      container_name: iris-instance2
      network_mode: host
      #environment:
         #- PIP_PACKAGES=Mopidy-YTMusic Mopidy-Tidal Mopidy-SoundCloud
      volumes:
         # iris-specific storage
         - /volume1/docker/iris/instance2/data:/var/lib/mopidy/iris
         # playlists
         - /volume1/docker/iris/playlists:/var/lib/mopidy/m3u
         # config
         - /volume1/docker/iris/instance2/config:/config:ro
         # local
         - /volume1/docker/iris/local:/var/lib/mopidy/local
         # music files
         - /volume1/music/bibliotheque:/var/lib/mopidy/media:ro
         # for fifo stream output
         - /tmp/snapserver:/tmp
      restart: unless-stopped

Remarques : 

  • On regroupe tout dans une seule stack, les services n'ayant pas vocation à fonctionner individuellement
  • On se place sur l'hôte directement, pour faciliter la détection en broadcast sur le réseau local
  • // IMPORTANT \\ On ne peut pas directement monter le dossier partagé "music" dans le conteneur, c'est valable pour tout autre dossier partagé a fortiori. Et ce, pour des raisons de permission : en effet les dossiers partagés ne sont pas soumis aux ACL de DSM
    Donc par exemple, créer un dossier intermédiaire, "bibliothèque" dans mon cas
  • // IMPORTANT \\ On différencie l'emplacement des playlists qu'on va créer de l'emplacement des musiques car :
    • on va chowner le dossier contenant les playlists Mopidy, on évite de faire ça sur un dossier utilisé par d'autre programmes
    • on va monter notre médiathèque en lecture seule pour éviter toute modification accidentelle, ce qui en revanche posera problème pour des playlists qu'on sera amené à modifier
  • J'ai nommé mes instances "iris-instance1" et "iris-instance2", à adapter à votre guise dans la suite du tutoriel.
  • Je crée un dossier "local" commun, qui contiendra les métadonnées des morceaux scannés, ça m'évitera de devoir scanner pour chaque instance. Si pour une raison ou une autre, vous ne souhaitez pas disposer de la même bibliothèque sur l'une et l'autre des instances, créez deux dossiers "local" dans instance1 et instance2.
  • La variable d'environnement PIP_PACKAGES est utile pour installer des extensions Mopidy supplémentaires, commentée par défaut car intégrations non traîtées ici.

7-B. Préparation des dossiers et fichiers

7-B-1. Dossiers de configuration

Pas spécialement adapté pour s'installer sur un NAS, OS base Linux avec ses restrictions, on va créer en amont les dossiers dont les services auront besoin lors de la création de la stack. En SSH, connectez-vous avec un utilisateur disposant des droits d'écriture dans le dossier partagé docker :

mkdir -p /volume1/docker/iris/instance1/config \
/volume1/docker/iris/instance1/data \
/volume1/docker/iris/instance2/config \
/volume1/docker/iris/instance2/data \
/volume1/docker/iris/snapserver \
/volume1/docker/iris/local \
/volume1/docker/iris/playlists

On va maintenant changer la propriété des dossiers pour respectivement :

  • pouvoir télécharger les métadonnées de nos morceaux, albums, artistes, etc...
  • écrire et modifier des playlists Mopidy
  • ajouter des token d'identification pour les services de stream online (non traîté ici)
sudo chown 105:users /volume1/docker/iris/instance1/config \
/volume1/docker/iris/instance1/data \
/volume1/docker/iris/instance2/config \
/volume1/docker/iris/instance2/data \
/volume1/docker/iris/local \
/volume1/docker/iris/playlists

Remarque : L'utilisateur d'ID 105 est celui qui écrira dans ces dossiers, or il n'est évidemment pas repris par les ACL DSM, donc pour ne pas toucher aux ACL Synology et garantir l'accès aux dossiers en question, on ne chmod pas mais on chown.

7-B-2. Fichiers de configuration

On va créer un fichier de configuration qui écrasera les paramètres par défaut du serveur Mopidy, pour l'adapter à notre besoin.

7-B-2-a. Instance1

nano /volume1/docker/iris/instance1/config/mopidy.conf
Révélation
# To check the actual config for a running iris container :
#
# docker exec -it <iris container name> mopidy config

################
# CORE PLUGINS #
################

[core]
data_dir = /var/lib/mopidy

[audio]
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! filesink location=/tmp/stream1_fifo

[file]
enabled = false

[http]
hostname = 0.0.0.0
default_app = iris
allowed_origins =
  nas.xxxxxx.synology.me:6680
  192.168.100.100:6680

[mpd]
hostname = 0.0.0.0

[m3u]
playlists_dir = /var/lib/mopidy/m3u

##########
# ADDONS #
##########

[local]
media_dir = /var/lib/mopidy/media
scan_timeout = 5000
excluded_file_extensions =
  .cue
  .directory
  .html
  .jpeg
  .jpg
  .log
  .nfo
  .pdf
  .png
  .txt
  .zip
  .db
  .ini
  .m3u
  .m3u8

[musicbox_webclient]
enabled = false

########
# IRIS #
########

[iris]
snapcast_enabled = true
snapcast_host = nas.xxxxxx.synology.me
snapcast_ssl = false
snapcast_stream = STREAM1

####################
# STREAM PROVIDERS #
####################

[spotify]
enabled = false

[youtube]
enabled = false

[ytmusic]
enabled = false

[soundcloud]
enabled = false

7-B-2-b. Instance2

nano /volume1/docker/iris/instance2/config/mopidy.conf
Révélation
# To check the actual config for a running iris container :
#
# docker exec -it <iris container name> mopidy config

################
# CORE PLUGINS #
################

[core]
data_dir = /var/lib/mopidy

[audio]
output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! filesink location=/tmp/stream2_fifo

[file]
enabled = false

[http]
hostname = 0.0.0.0
port = 6780
default_app = iris
allowed_origins =
  nas.xxxxxx.synology.me:6680
  192.168.100.100:6680

[mpd]
hostname = 0.0.0.0
port = 6700

[m3u]
playlists_dir = /var/lib/mopidy/m3u

##########
# ADDONS #
##########

[local]
media_dir = /var/lib/mopidy/media
scan_timeout = 5000
excluded_file_extensions =
  .cue
  .directory
  .html
  .jpeg
  .jpg
  .log
  .nfo
  .pdf
  .png
  .txt
  .zip
  .db
  .ini
  .m3u
  .m3u8

[musicbox_webclient]
enabled = false

########
# IRIS #
########

[iris]
snapcast_enabled = true
snapcast_host = nas.xxxxxx.synology.me
snapcast_ssl = false
snapcast_stream = STREAM2

####################
# STREAM PROVIDERS #
####################

[spotify]
enabled = false

[youtube]
enabled = false

[ytmusic]
enabled = false

[soundcloud]
enabled = false

Remarques : 

  • Dans instance1, on pense à modifier nas.xxxxxx.synology.me par son nom de domaine
  • Dans instance2, on a modifié le port de l'instance pour éviter la collision avec la première, on utilise le port 6780

7-B-2-b. Snapserver

On va télécharger le fichier de configuration depuis le Github :

wget https://raw.githubusercontent.com/badaix/snapcast/master/server/etc/snapserver.conf -P /volume1/docker/iris/snapserver/

qu'on édite ensuite :

nano /volume1/docker/iris/snapserver/snapserver.conf

en commentant la ligne (on ajoute un # devant) :

source = pipe:///tmp/snapfifo?name=default

et on ajoute les lignes suivantes directement à la suite :

source = pipe:///tmp/stream1_fifo?name=STREAM1&controlscript=meta_mopidy.py&controlscriptparams=--mopidy-host=nas.xxxxxx.synology.me
source = pipe:///tmp/stream2_fifo?name=STREAM2&controlscript=meta_mopidy.py&controlscriptparams=--mopidy-host=nas.xxxxxx.synology.me%20--mopidy-port=6780

Remarque : On pense à modifier nas.xxxxxx.synology.me par son nom de domaine

On va également télécharger le script python faisant le lien entre Iris et Snapcast :

wget https://raw.githubusercontent.com/badaix/snapcast/master/server/etc/plug-ins/meta_mopidy.py -P /volume1/docker/iris/snapserver/

7-B-3. Dossiers de stream

On crée un dossier qui accueillera nos fifo de stream Snapcast, et je les rends accessible par tous en écriture :

mkdir -p /tmp/snapserver && sudo chmod 777 /tmp/snapserver

7-C. Création de la stack

On est prêt, plus qu'à lancer la stack :

sudo docker-compose -f /volume1/docker/iris/docker-compose.yml up -d && sudo docker-compose -f /volume1/docker/iris/docker-compose.yml logs -f

Les logs devraient donner quelque chose de la sorte :

Révélation
iris-snapserver    | 2023-06-04 21-37-22.392 [Info] (Snapserver) Version 0.27.0, revision 54a3d862
iris-snapserver    | 2023-06-04 21-37-22.404 [Info] (Snapserver) Adding source: pipe:///tmp/stream1_fifo?name=STREAM1&controlscript=meta_mopidy.py&controlscriptparams=--mopidy-host=nas.xxxxxx.synology.me
iris-snapserver    | 2023-06-04 21-37-22.404 [Info] (Snapserver) Adding source: pipe:///tmp/stream2_fifo?name=STREAM2&controlscript=meta_mopidy.py&controlscriptparams=--mopidy-host=nas.xxxxxx.synology.me%20--mopidy-port=6780
iris-snapserver    | 2023-06-04 21-37-22.404 [Notice] (init) Settings file: "/root/.config/snapserver/server.json"
iris-snapserver    | 2023-06-04 21-37-22.404 [Info] (Snapserver) Using HTTP host name: NAS
iris-snapserver    | 2023-06-04 21-37-22.404 [Error] (Avahi) Failed to create client: Daemon not running
iris-snapserver    | 2023-06-04 21-37-22.404 [Info] (PcmStream) PcmStream: STREAM1, sampleFormat: 48000:16:2
iris-snapserver    | 2023-06-04 21-37-22.405 [Info] (PipeStream) PipeStream mode: create
iris-snapserver    | 2023-06-04 21-37-22.405 [Info] (Server) Stream: {"fragment":"","host":"","path":"/tmp/stream1_fifo","query":{"chunk_ms":"20","codec":"flac","controlscript":"meta_mopidy.py","controlscriptparams":"--mopidy-host=nas.xxxxxx.synology.me","name":"STREAM1","sampleformat":"48000:16:2"},"raw":"pipe:////tmp/stream1_fifo?chunk_ms=20&codec=flac&controlscript=meta_mopidy.py&controlscriptparams=--mopidy-host=nas.xxxxxx.synology.me&name=STREAM1&sampleformat=48000:16:2","scheme":"pipe"}
iris-snapserver    | 2023-06-04 21-37-22.405 [Info] (PcmStream) PcmStream: STREAM2, sampleFormat: 48000:16:2
iris-snapserver    | 2023-06-04 21-37-22.405 [Info] (PipeStream) PipeStream mode: create
iris-snapserver    | 2023-06-04 21-37-22.405 [Info] (Server) Stream: {"fragment":"","host":"","path":"/tmp/stream2_fifo","query":{"chunk_ms":"20","codec":"flac","controlscript":"meta_mopidy.py","controlscriptparams":"--mopidy-host=nas.xxxxxx.synology.me --mopidy-port=6780","name":"STREAM2","sampleformat":"48000:16:2"},"raw":"pipe:////tmp/stream2_fifo?chunk_ms=20&codec=flac&controlscript=meta_mopidy.py&controlscriptparams=--mopidy-host=nas.xxxxxx.synology.me --mopidy-port=6780&name=STREAM2&sampleformat=48000:16:2","scheme":"pipe"}
iris-snapserver    | 2023-06-04 21-37-22.405 [Info] (FlacEnc) Init - compression level: 2
iris-snapserver    | 2023-06-04 21-37-22.463 [Error] (PosixStream) Exception: end of file
iris-snapserver    | 2023-06-04 21-37-22.463 [Info] (FlacEnc) Init - compression level: 2
iris-snapserver    | 2023-06-04 21-37-22.464 [Error] (PosixStream) Exception: end of file
iris-snapserver    | 2023-06-04 21-37-22.464 [Info] (ControlServer) Creating TCP acceptor for address: 0.0.0.0, port: 1705
iris-snapserver    | 2023-06-04 21-37-22.464 [Info] (ControlServer) Creating HTTP acceptor for address: 0.0.0.0, port: 1780
iris-snapserver    | 2023-06-04 21-37-22.464 [Info] (StreamServer) Creating stream acceptor for address: 0.0.0.0, port: 1704
iris-snapserver    | 2023-06-04 21-37-22.464 [Info] (Snapserver) Number of threads: 4, hw threads: 4
iris-instance2     | INFO     2023-06-04 21:37:34,067 [7:MainThread] mopidy.__main__
iris-instance1     | INFO     2023-06-04 21:37:34,066 [7:MainThread] mopidy.__main__
iris-instance1     |   Starting Mopidy 3.4.1
iris-instance2     |   Starting Mopidy 3.4.1
iris-instance1     | INFO     2023-06-04 21:37:34,796 [7:MainThread] mopidy.config
iris-instance1     |   Loading config from builtin defaults
iris-instance1     | INFO     2023-06-04 21:37:34,799 [7:MainThread] mopidy.config
iris-instance1     |   Loading config from file:///config/mopidy.conf
iris-instance1     | INFO     2023-06-04 21:37:34,800 [7:MainThread] mopidy.config
iris-instance1     |   Loading config from command line options
iris-instance1     | INFO     2023-06-04 21:37:35,170 [7:MainThread] mopidy.internal.path
iris-instance1     |   Creating dir file:///var/lib/mopidy/.cache/mopidy
iris-instance2     | INFO     2023-06-04 21:37:34,796 [7:MainThread] mopidy.config
iris-instance2     |   Loading config from builtin defaults
iris-instance2     | INFO     2023-06-04 21:37:34,799 [7:MainThread] mopidy.config
iris-instance2     |   Loading config from file:///config/mopidy.conf
iris-instance2     | INFO     2023-06-04 21:37:34,800 [7:MainThread] mopidy.config
iris-instance2     |   Loading config from command line options
iris-instance2     | INFO     2023-06-04 21:37:35,170 [7:MainThread] mopidy.internal.path
iris-instance2     |   Creating dir file:///var/lib/mopidy/.cache/mopidy
iris-instance2     | INFO     2023-06-04 21:37:39,210 [7:MainThread] mopidy.__main__
iris-instance1     | INFO     2023-06-04 21:37:39,210 [7:MainThread] mopidy.__main__
iris-instance1     |   Enabled extensions: local, m3u, iris, mpd, softwaremixer, stream, http
iris-instance1     | INFO     2023-06-04 21:37:39,211 [7:MainThread] mopidy.__main__
iris-instance1     |   Disabled extensions: file, musicbox_webclient, youtube, spotify, ytmusic, soundcloud
iris-instance2     |   Enabled extensions: m3u, local, softwaremixer, stream, mpd, iris, http
iris-instance2     | INFO     2023-06-04 21:37:39,210 [7:MainThread] mopidy.__main__
iris-instance2     |   Disabled extensions: soundcloud, file, ytmusic, spotify, musicbox_webclient, youtube
iris-instance1     | INFO     2023-06-04 21:37:40,694 [7:MainThread] mopidy.commands
iris-instance2     | INFO     2023-06-04 21:37:40,715 [7:MainThread] mopidy.commands
iris-instance2     |   Starting Mopidy mixer: SoftwareMixer
iris-instance2     | INFO     2023-06-04 21:37:40,716 [7:MainThread] mopidy.commands
iris-instance2     |   Starting Mopidy audio
iris-instance2     | INFO     2023-06-04 21:37:40,718 [7:MainThread] mopidy.commands
iris-instance2     |   Starting Mopidy backends: LocalBackend, M3UBackend, StreamBackend
iris-instance2     | INFO     2023-06-04 21:37:40,976 [7:Audio-2] mopidy.audio.actor
iris-instance2     |   Audio output set to "audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! filesink location=/tmp/stream2_fifo"
iris-instance1     |   Starting Mopidy mixer: SoftwareMixer
iris-instance1     | INFO     2023-06-04 21:37:40,695 [7:MainThread] mopidy.commands
iris-instance1     |   Starting Mopidy audio
iris-instance1     | INFO     2023-06-04 21:37:40,696 [7:MainThread] mopidy.commands
iris-instance1     |   Starting Mopidy backends: LocalBackend, M3UBackend, StreamBackend
iris-instance1     | INFO     2023-06-04 21:37:40,834 [7:MainThread] mopidy.commands
iris-instance1     |   Starting Mopidy core
iris-instance1     | INFO     2023-06-04 21:37:40,840 [7:MainThread] mopidy.commands
iris-instance1     |   Starting Mopidy frontends: MpdFrontend, IrisFrontend, HttpFrontend
iris-instance1     | ERROR    2023-06-04 21:37:40,841 [7:MainThread] mopidy.commands
iris-instance1     |   Frontend (MpdFrontend) initialization error: MPD server startup failed: [Errno 98] Address already in use
iris-instance1     | INFO     2023-06-04 21:37:40,841 [7:IrisFrontend-7] mopidy_iris.core
iris-instance1     |   Starting Iris 3.67.0
iris-instance1     | INFO     2023-06-04 21:37:40,842 [7:HttpFrontend-9] mopidy.http.actor
iris-instance1     |   HTTP server running at [::ffff:0.0.0.0]:6680
iris-instance1     | INFO     2023-06-04 21:37:40,842 [7:MainThread] mopidy.commands
iris-instance1     |   Starting GLib mainloop
iris-instance1     | INFO     2023-06-04 21:37:40,962 [7:HttpServer] mopidy.internal.path
iris-instance1     |   Creating dir file:///var/lib/mopidy/http
iris-instance1     | INFO     2023-06-04 21:37:40,975 [7:Audio-2] mopidy.audio.actor
iris-instance1     |   Audio output set to "audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! filesink location=/tmp/stream1_fifo"

8. Interface IRIS

8-A. Configuration générale et Instance1

On se rend maintenant à l'adresse http://nas.xxxxxx.synology.me:6680:

iris_1.PNG.477c267a05136ceb5aa3fdc830b7ef5f.PNG

On se dirige ensuite vers les Settings, catégorie Server, et on renomme l'instance :

iris_2.PNG.0d3aa087d8e7a063a3290777303bf48a.PNG

On va ensuite dans Services configurer Snapcast, on modifie localhost pour le nom d'hôte de notre NAS, et on coche Enabled :

iris_3.thumb.png.afec96996eac6e3fa51f76d6e22ffaff.png

On peut également se connecter à LastFM pour récupérer les vignettes des artistes, et à Genius pour que les paroles des chansons défilent pendant la lecture.

// IMPORTANT \\ La librairie utilisée pour Mopidy n'est plus supportée par Spotify, évitez donc de vous y connecter.

Dans Interface, j'aime bien généralement cocher "Wide scrollbars".

8-B. Instance2

On va maintenant rajouter notre seconde instance, vers laquelle on pourra facilement switcher d'un clic, on retourne dans Server, on clique sur "+ Add New Server" :

iris_4.thumb.png.f0713dd1a0a605fece9f510690534a00.png

Si tout s'est correctement exécuté auparavant, vous devriez obtenir le statut Connected, vous remarquerez également que les réglages des autres catégories persistent.

8-C. Exportation et sauvegarde de la configuration sur le serveur

Afin d'éviter de répéter la majorité de ces étapes pour les prochains clients dynamiques, on peut aller dans la catégorie Advanced -> Share configuration => Export/share :

iris_5.thumb.png.fcc5444b6b18ef9a6f5b4750114f441a.png

Vous pourrez dorénavant importer la configuration depuis le serveur (il faut prélablement se connecter à une des instances depuis un nouveau périphérique) en cliquant sur Import from server.
Cela ne fonctionne que pour les paramètres généraux, la deuxième instance devra être ajoutée comme initialement.

8-D. Indexation des morceaux

On va maintenant lancer l'indexation des morceaux, on peut le faire par l'interface, suivant le CPU ça peut prendre plus ou moins de temps, comptez environ 1m30 par 1000 morceaux.

Pour cela, deux méthodes :

  • via le terminal :
sudo docker exec -it iris-instance1 mopidy local scan

Ou si je veux faire un test avec un nombre réduit de morceaux :

sudo docker exec -it iris-instance1 mopidy local scan --limit 100
  • via l'interface, dans Advanced, on clique sur Start local scan (full scan par contre) :

iris_6.png.7c8b019b63bb738f66129f47d319fa43.png

Une fois le scan terminé, je peux aller dans l'onglet Albums, et cliquer sur Refresh tout en haut à droite de la fenêtre :

iris_7.thumb.png.6a9e8360aca94c281a7a585a7bba1efd.png

On va faire clic droit sur un album -> Add to queue, les morceaux sont maintenant dans l'onglet Now playing, en attente d'un ordre de lecture.

8-E. Lecture synchronisée

Voilà, il ne reste plus qu'à tester, oui mais où ? et bien sur notre périphérique ! on retourne dans Settings -> Services -> Snapcast -> on coche Streaming enabled :

iris_9.PNG.03bb234e6a844d2899fa9a16120ef749.PNG

Je peux renommer mon groupe, rez-de-chaussée (RDC) par exemple, et lui dire qu'il diffusera le flux Snapcast STREAM1, émis par Instance1.
Dans ce groupe, j'ai renommé mon périphérique appelé par défaut "Snapweb client" en PC, plus parlant.

Je vais maintenant ajouter un deuxième périphérique, par exemple mon smartphone, je vais donc importer les données de configuration précédemment enregistrées sur le serveur. En cliquant sur Streaming enabled, un nouveau groupe apparaît (j'ai renommé mon périphérique du nom de mon smartphone) :

iris_10.PNG.06f4de3a1f1d2b07b253b035fa6f9d8a.PNG

Allons maintenant dans Now playing, et lançons la musique depuis la barre de lecture en bas de page.

Si tout se passe bien, vous devriez entendre la musique jouée conjointement, et en parfaite synchronisation, depuis les deux clients !

Pourquoi ne pas, par exemple, les mettre dans le même groupe ? On clique sur Group dans la tuile correspondant au 2ème périphérique (voir impression d'écran ci-dessus), et on choisit RDC. Maintenant, on peut contrôler le volume général du groupe depuis Volume (barre horizontale) et le volume individuel de chaque périphérique sinon (barre verticale). Si je ne veux plus qu'ils soient groupés, je reclique sur Group, puis New Group.

Je peux également changer le flux lu par un groupe depuis Stream.

Pas tout à fait synchronisés ? la barre de Latency est là pour ça, on peut ajuster le décalage en avance ou retard de phase des périphériques indépendamment. C'est notamment une fonction utile pour les périphériques clients qui diffusent via Bluetooth.

8-F. Playlists

8-F-1. Playlist locale

Pour créer une playlist, je clic droit sur un morceau, Add to playlist -> je crée une nouvelle playlist ou j'en choisis une existante.
Il faudra ensuite aller dans l'onglet Playlists et cliquer sur Refresh comme pour les albums pour les voir apparaître.

8-F-1. Radios

Je vais vider ma liste d'attente, pour cela je clique sur Clear :

iris_11.thumb.PNG.f3c35efa347c8e60316b761ed38998c4.PNG

Dans cette page, je clique ensuite sur Add en haut à droite, je vais ajouter l'URL d'une radio, par exemple M Disney :

iris_12.thumb.PNG.7c127780647675d192b0a275fc9abeb3.PNG

Je dois cliquer sur + Add à droite avant de cliquer Add en bas, la radio apparaît ensuite dans la liste des morceaux en attente, et je peux cliquer droit (ou ...) pour lancer la lecture ou  pour l'ajouter à une playlist.

9. Configuration des clients statiques

Nous allons maintenant voir comment configurer des clients statiques, par exemple sous Linux.

sudo apt-get install snapclient

Puis :

sudo nano /etc/default/snapclient
# Start the client, used only by the init.d script
START_SNAPCLIENT=true

# Additional command line options that will be passed to snapclient
# note that user/group should be configured in the init.d script or the systemd unit file
# For a list of available options, invoke "snapclient --help"
SNAPCLIENT_OPTS="--host nas.xxxxxx.synology.me"

Je lance le service :

sudo systemctl start snapclient.service

Je fais en sorte qu'il se lance au démarrage :

sudo systemctl enable snapclient.service

Entre temps, vous devriez voir un nouveau périphérique parmi les clients Snapcast dans votre interface Iris.

10. Quelques commandes utiles

Pour supprimer la base de métadonnées :

sudo docker exec -it <nom du conteur iris> mopidy local clear

Pour vérifier la configuration utilisée par une instance (celle-ci affichera tous les champs, ceux par défaut et ceux que vous avez écrasés dans votre fichier de configuration) :

sudo docker exec -it <nom du conteur iris> mopidy config

11. Conclusion

Je ne couvre dans ce tutoriel qu'une petite partie des fonctionnalités disponibles, on peut trier les recherches suivant les sources, ce qui prend son importance si l'on commence à intégrer différents services de streaming.
Il existe une extension MopiQTT(non officielle) qui prend en charge MQTT, ou encore la possibilité de créer des webhooks via Commands => Add :

iris_13.PNG.6e8db1c26284f43a1f94225cd1dc2b87.PNG

Ainsi qu'un module HomeAssistant : https://github.com/bushvin/hass-integrations

Pour ceux qui sont un peu initiés, les possibilités domotiques sont énormes.

MàJ : 06/06/2023

Modifié par .Shad.
Lien vers le commentaire
Partager sur d’autres sites

  • .Shad. a modifié le titre en [TUTO] Audio multiroom - Mopidy/Iris/Snapcast

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.