5th article migration WIP
|
@ -22,8 +22,9 @@ main {
|
||||||
}
|
}
|
||||||
|
|
||||||
.article:hover {
|
.article:hover {
|
||||||
box-shadow: 0 1px 4px 2px #acacac;
|
box-shadow: 0 1px 4px 3px #989898;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
border-radius: .5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (min-width: 767px) {
|
@media screen and (min-width: 767px) {
|
||||||
|
|
BIN
static/img/mopidy-iris-1.jpeg
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
static/img/mpd-1.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
static/img/ncmpcpp-1.png
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
static/img/ncmpcpp-2.png
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
static/img/ncmpcpp-3.png
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
static/img/snapcast-1.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
static/img/snapcast-2.jpeg
Normal file
After Width: | Height: | Size: 33 KiB |
|
@ -0,0 +1,316 @@
|
||||||
|
[//]: # (title: Build your multi-room and multi-provider sound server with Platypush, Mopidy and Snapcast)
|
||||||
|
[//]: # (description: How to leverage Platypush and other open-source projects to build an extensible and versatile music server.)
|
||||||
|
[//]: # (image: /img/mpd-1.png)
|
||||||
|
[//]: # (published: 2019-10-22)
|
||||||
|
|
||||||
|
Today’s abundance of music streaming services has created lots of opportunities to listen to whichever music you like
|
||||||
|
wherever you like, but there’s a huge fragmentation problem that hasn’t been tackled seriously by the music tech
|
||||||
|
industry yet.
|
||||||
|
|
||||||
|
Spotify allows you to find and discover a lot of tunes, but not all the music is there.
|
||||||
|
|
||||||
|
You may want to integrate your collection of mp3s into your Spotify collection, but that is simply not an option.
|
||||||
|
|
||||||
|
You may have favourite tracks that are only available on SoundCloud or albums that aren’t available on Spotify, but
|
||||||
|
you’ve purchased in the past on Google Music or iTunes, but there’s no way to have them all in one place: each of these
|
||||||
|
solution comes with its separate app.
|
||||||
|
|
||||||
|
You may want to integrate your favourite online radios or podcasts into your music app, but that’s, again, not an option
|
||||||
|
— TuneIn, Podcast Addict or Google Podcasts are distinct apps.
|
||||||
|
|
||||||
|
You may want to easily stream your playlists to any speaker or pair of headphones you own, but that’s not as easy as it
|
||||||
|
sounds. You may have to replace your existing speakers with expensive solutions (like Sonos or Bose) to enjoy a proper
|
||||||
|
multi-room setup. Apps like Spotify come with their solutions (e.g. Spotify Connect), but only a limited number of
|
||||||
|
devices is supported and, again, it works as a solution only as long as you stream Spotify content from the Spotify app.
|
||||||
|
|
||||||
|
There have been commercial solutions that have tried to tackle this fragmentation problem and provide you with the
|
||||||
|
possibility to stream music from any app to any speaker without having to replace your audio system, but the situation
|
||||||
|
isn’t that bright after Google
|
||||||
|
has [discontinued its Chromecast Audio support](https://www.theverge.com/2019/1/11/18178751/google-chromecast-audio-discontinued-sale),
|
||||||
|
and AirPlay works relatively well only as long as you’re in an Apple ecosystem.
|
||||||
|
|
||||||
|
As of today the problem “how do I play whichever piece of music I like, from whichever service I like, on whichever
|
||||||
|
device I like, all in one interface, without having to install 10 different apps” is still largely unsolved if you rely
|
||||||
|
on commercial solutions.
|
||||||
|
|
||||||
|
Luckily, we’ve got plenty of open source software around that comes to rescue. It requires a bit more work than just
|
||||||
|
downloading an app and logging in, but the rewards are priceless.
|
||||||
|
|
||||||
|
## One music server to rule them all
|
||||||
|
|
||||||
|
[Mopidy](https://mopidy.com/) is one of the best open source solutions around when it comes to integrating multiple
|
||||||
|
music services under one single interface. It’s entirely written in Python, it’s (almost) 100% compatible
|
||||||
|
with [MPD](https://www.musicpd.org/doc/html/protocol.html), a music protocol that has been around since 2003 and comes
|
||||||
|
with lots of compatible clients (command-line, web-based, mobile apps etc.), and there are countless plugins that let
|
||||||
|
Mopidy integrate with any kind of music service around.
|
||||||
|
|
||||||
|
It’s relatively easy to install mopidy on a RaspberryPi and turn it into a powerful music centre.
|
||||||
|
|
||||||
|
- Add the mopidy repository to your apt lists and install the base package:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
wget -q -O - https://apt.mopidy.com/mopidy.gpg | sudo apt-key add -
|
||||||
|
|
||||||
|
# Run the following if you're running Raspbian/Debian Buster
|
||||||
|
sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/buster.list
|
||||||
|
|
||||||
|
# Run the following command if you're running Raspbian/Debian Stretch
|
||||||
|
sudo wget -q -O /etc/apt/sources.list.d/mopidy.list https://apt.mopidy.com/stretch.list
|
||||||
|
|
||||||
|
# Update the repositories and install mopidy
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install mopidy mopidy-mpd
|
||||||
|
```
|
||||||
|
|
||||||
|
- Install any additional extension for the music services you like:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# Spotify support
|
||||||
|
sudo apt-get install mopidy-spotify
|
||||||
|
|
||||||
|
# Local files support
|
||||||
|
sudo apt-get install mopidy-local
|
||||||
|
|
||||||
|
# Dirble support
|
||||||
|
sudo apt-get install mopidy-dirble
|
||||||
|
|
||||||
|
# Podcast support
|
||||||
|
sudo apt-get install mopidy-podcast mopidy-podcast-gpodder mopidy-podcast-itunes
|
||||||
|
|
||||||
|
# Last.FM scrobbling support
|
||||||
|
sudo apt-get install mopidy-scrobbler
|
||||||
|
|
||||||
|
# Soma.FM support
|
||||||
|
sudo apt-get install mopidy-somafm
|
||||||
|
|
||||||
|
# Soundcloud support
|
||||||
|
sudo apt-get install mopidy-soundcloud
|
||||||
|
|
||||||
|
# TuneIn support
|
||||||
|
sudo apt-get install mopidy-tunein
|
||||||
|
|
||||||
|
# YouTube support
|
||||||
|
sudo apt-get install mopidy-youtube
|
||||||
|
```
|
||||||
|
|
||||||
|
And there are even more extensions available for Mopidy - you may want to take a look on
|
||||||
|
[their website](https://mopidy.com/ext/) to get an overview of the compatible services.
|
||||||
|
|
||||||
|
Head to the pages of those extensions to find out whether they need some extra dependencies or extra configuration to be
|
||||||
|
added to your `~/.config/mopidy/mopidy.conf` file.
|
||||||
|
|
||||||
|
You may also want to make sure that the HTTP module is enabled in your mopidy configuration, since most of the web
|
||||||
|
frontends (including Platypush) rely on it to interact with mopidy over websockets:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
[http]
|
||||||
|
enabled = true
|
||||||
|
hostname = 0.0.0.0
|
||||||
|
port = 6680
|
||||||
|
```
|
||||||
|
|
||||||
|
There is also a wide range of frontend clients available for Mopidy, from command-line MPD clients to full-blown web
|
||||||
|
clients that do a very good job replicating the UI of some of the most popular music apps around. Let's have a quick
|
||||||
|
overview of my favourite solutions to interact with Mopidy:
|
||||||
|
|
||||||
|
- `netcat`/`telnet`. Mopidy is compatible with the MPD protocol, and once started it will listen by default on port 6600
|
||||||
|
for MPD commands. It’s relatively straightforward to explore your library or control the playback even without
|
||||||
|
installing another client (although it’s probably not the most user-friendly way, but very good if you want to make
|
||||||
|
some scripts):
|
||||||
|
|
||||||
|
```shell
|
||||||
|
$ echo status | nc localhost 6600
|
||||||
|
OK MPD 0.19.0
|
||||||
|
volume: 100
|
||||||
|
repeat: 0
|
||||||
|
random: 1
|
||||||
|
single: 0
|
||||||
|
consume: 0
|
||||||
|
playlist: 3
|
||||||
|
playlistlength: 1489
|
||||||
|
xfade: 0
|
||||||
|
state: stop
|
||||||
|
song: 513
|
||||||
|
songid: 560
|
||||||
|
nextsong: 173
|
||||||
|
nextsongid: 220
|
||||||
|
OK
|
||||||
|
|
||||||
|
$ echo currentsong | nc localhost 6600
|
||||||
|
OK MPD 0.19.0
|
||||||
|
file: spotify:track:218UgZapIcNRP9f38C5cMp
|
||||||
|
Time: 365
|
||||||
|
Artist: 3rd Force
|
||||||
|
Album: Vital Force
|
||||||
|
Title: Echoes Of A Dream
|
||||||
|
Date: 1997
|
||||||
|
Track: 6
|
||||||
|
Pos: 513
|
||||||
|
Id: 560
|
||||||
|
AlbumArtist: 3rd Force
|
||||||
|
X-AlbumUri: spotify:album:3mSCVZabNB0rUmpYgPkDuV
|
||||||
|
OK
|
||||||
|
|
||||||
|
$ echo play | nc localhost 6600
|
||||||
|
OK MPD 0.19.0
|
||||||
|
OK
|
||||||
|
|
||||||
|
$ echo stop | nc localhost 6600
|
||||||
|
OK MPD 0.19.0
|
||||||
|
OK
|
||||||
|
```
|
||||||
|
|
||||||
|
- `mpc` is a tiny command-line utility that makes it a bit easier to interact with MPD/mopidy instances for scripting
|
||||||
|
purposes without handling low-level protocol messages:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo apt-get install mpc
|
||||||
|
mpc help # To see available commands
|
||||||
|
mpc play # Play the music
|
||||||
|
```
|
||||||
|
|
||||||
|
- `ncmpcpp` is a ncurses-based terminal client that I've been using for more than a decade, and it's probably one of
|
||||||
|
the lightest yet most versatile music clients I've seen around - and definitely my favourite:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo apt-get install ncmpcpp
|
||||||
|
```
|
||||||
|
|
||||||
|
![ncmpcpp screenshot 1](../img/ncmpcpp-1.png)
|
||||||
|
![ncmpcpp screenshot 2](../img/ncmpcpp-2.png)
|
||||||
|
![ncmpcpp screenshot 3](../img/ncmpcpp-3.png)
|
||||||
|
|
||||||
|
- `mopidy-iris` is probably one of the most user-friendly, well-maintained and feature-rich Mopidy clients around, and
|
||||||
|
it's compatible with desktop, tablet and mobile and it comes with a UI that successfully mimics that of many popular
|
||||||
|
music apps:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo apt-get install mopidy-iris
|
||||||
|
```
|
||||||
|
|
||||||
|
After installing it head to `http://your-raspberry:6680` and select Iris as the web interface.
|
||||||
|
|
||||||
|
![iris interface](../img/mopidy-iris-1.jpeg)
|
||||||
|
|
||||||
|
And you have many more compatible clients available (just check the list of extensions), from minimal, to feature-rich
|
||||||
|
(such as MusicBox), to a specific client for party mode optimized for multiple users! And, being compatible with MPD,
|
||||||
|
all the MPD clients out there should also work out of the box. And the list also includes a *Mopidy Mobile* app and
|
||||||
|
several MPD apps for Android and iOS.
|
||||||
|
|
||||||
|
## Hook Mopidy to Platypush
|
||||||
|
|
||||||
|
You can connect Platypush to Mopidy. That provides you with one more UI for interacting with your instance (embedded in
|
||||||
|
the Platypush web panel), and it opens a world of possibilities when it comes to automating music interactions.
|
||||||
|
|
||||||
|
- Install Platypush with the HTTP and MPD dependencies:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
[sudo] pip install 'platypush[http,mpd]'
|
||||||
|
```
|
||||||
|
|
||||||
|
- Enable the MPD/mopidy plugin and backend in your platypush configuration file:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
music.mpd:
|
||||||
|
host: localhost
|
||||||
|
port: 6600
|
||||||
|
|
||||||
|
backend.music.mopidy:
|
||||||
|
host: localhost
|
||||||
|
```
|
||||||
|
|
||||||
|
A `backend.music.mpd` is also provided, but if you use Mopidy instead of a bare MPD server then it's advised to use
|
||||||
|
`backend.music.mopidy` instead - the former checks for updates by polling the server at regular intervals, while the
|
||||||
|
Mopidy-specific backend listens for events continuously over the provided websocket interface.
|
||||||
|
|
||||||
|
- Restart Platypush and head to `http://your-raspberry:8008`. You should see a new tab for Mopidy — yet another web
|
||||||
|
interface to interact with the server.
|
||||||
|
|
||||||
|
![Platypush MPD interface](../img/mpd-1.png)
|
||||||
|
|
||||||
|
Before proceeding on how to automate the interaction with your new music server, let's see how to turn Mopidy into a
|
||||||
|
full multi-room music server with Snapcast.
|
||||||
|
|
||||||
|
## Multi-room setup
|
||||||
|
|
||||||
|
The ability to synchronize music across multiple rooms and devices is a great feature of a modern smart home. However,
|
||||||
|
most of the commercial solutions available today (like Sonos or Bose) are expensive and require in most of the cases to
|
||||||
|
replace your speakers with theirs. Luckily it’s relatively easy to set up a multi-room experience with multiple
|
||||||
|
RaspberryPis, without having to change your speakers. Let’s see how.
|
||||||
|
|
||||||
|
- Install Snapcast by following the instructions on their [Github page](https://github.com/badaix/snapcast)
|
||||||
|
|
||||||
|
- Create an `/etc/default/snapserver` file on the machine(s) where you’re running your Mopidy instance(s) with the
|
||||||
|
following content:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
USER_OPTS="--user snapserver:snapserver --stream=pipe:///tmp/snapfifo?name=mopidy&codec=pcm --codec=pcm"
|
||||||
|
SNAPSERVER_OPTS=""
|
||||||
|
```
|
||||||
|
|
||||||
|
In the example above we’ll use a PCM lossless codec for streaming the music, and we’ll be using `/tmp/snapfifo` as a
|
||||||
|
file queue where Mopidy will push its audio stream.
|
||||||
|
|
||||||
|
- Start snapserver on your Mopidy machine(s) by simply running the executable, and optionally add it to your startup
|
||||||
|
configuration.
|
||||||
|
|
||||||
|
- Configure the [audio] section of your mopidy.conf file to stream to the Snapcast FIFO (note: with this configuration
|
||||||
|
Mopidy will only stream to the new file and not to your speakers, you'll need to run `snapclient` to play the audio):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
[audio]
|
||||||
|
mixer = software
|
||||||
|
mixer_volume = 100
|
||||||
|
output = audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! wavenc ! filesink location=/tmp/snapfifo
|
||||||
|
```
|
||||||
|
|
||||||
|
The `audio.output` setting of Mopidy is actually a very flexible way of building GStreamer pipelines to redirect and
|
||||||
|
transform the audio however you like. In this example I'm transforming the audio to stereo WAV at 48 kHz, which may be
|
||||||
|
perfect if you're seeking for a true loseless audio experience, but may cause some glitches if your network isn't very
|
||||||
|
stable (we're basically passing uncompressed audio around). It's possible to encode and compress the stream by applying
|
||||||
|
e.g. an MP3 or OGG encoder to the pipeline, but this causes the GStreamer pipeline to become very unstable for some
|
||||||
|
reason (the bug has been opened for a couple of years and Mopidy developers are still scratching their head on why it
|
||||||
|
happens), so the loseless stream option may be the only one that works for now.
|
||||||
|
|
||||||
|
- Create an `/etc/default/snapclient` file on all the machines that will be connecting to your Snapserver, included the
|
||||||
|
Mopidy machine itself if you want to directly play music from too (opposed to using it just as a music backend):
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
START_SNAPCLIENT=true
|
||||||
|
USER_OPTS="--user snapclient:audio"
|
||||||
|
```
|
||||||
|
|
||||||
|
- Start `snapclient` on the machines that will be connecting to your Mopidy instance. The command will
|
||||||
|
be `snapclient -h localhost` on the machine that runs mopidy itself and `snapclient -h remote-host-ip-or-name` on the
|
||||||
|
other machines. You can run as many `snapclient` instances on a host as the servers you want to connect it to.
|
||||||
|
|
||||||
|
- Enable the Snapcast backend and plugin in the Platypush configuration of each of the machines that will be running the
|
||||||
|
client or the server:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
backend.music.snapcast:
|
||||||
|
hosts:
|
||||||
|
- server1
|
||||||
|
- server2
|
||||||
|
- server3
|
||||||
|
|
||||||
|
music.snapcast:
|
||||||
|
host: default-server-ip-or-name
|
||||||
|
```
|
||||||
|
|
||||||
|
- Restart Platypush and head to the web panel on port 8008. You should see a new tab for Snapcast, identified by the
|
||||||
|
speaker icon. From here you can control which stream will be playing on which host, you can create streaming groups,
|
||||||
|
change the volume etc.
|
||||||
|
|
||||||
|
![Platypush Snapcast interface](../img/snapcast-1.png)
|
||||||
|
|
||||||
|
- You can also install an [Android app](https://play.google.com/store/apps/details?id=de.badaix.snapcast) to control
|
||||||
|
your multi-room setup, even though the app allows you to control one server at the time. The app however will allow
|
||||||
|
you to play audio streams also on your smartphone.
|
||||||
|
|
||||||
|
![Snapcast app interface](../img/snapcast-2.jpeg)
|
||||||
|
|
||||||
|
If you use Iris as a web interface to Mopidy you can now head to settings and enable the Snapcast plugin. A speaker icon
|
||||||
|
will appear in the bottom bar, and you’ll be able to control your music setup from there as well.
|
||||||
|
|
||||||
|
Time to enjoy your low-cost but powerful multi-room music setup!
|