MDP
I got a new work laptop with various spyware installed. I therefore want to limit its access to my systems, what with me being paranoid. Previously, if I wanted to listen to music, I’d connect my NFS music partition and play it from my work computer. But why go through the intermediary, when I can play stuff directly from my Pi? Especially as it was originally supposed to be a media center. Seeing as my Pi is headless, I need an interface of some kind. Preferably one that can be accessed from multiple devices. The simplest option, of course, is some kind of web thingy. Especially as I already have that set up for books and torrents.
MDP
A quick search found mdp, which seemed to fulfil my purposes. An additional bonus is that it has an Arch wiki page - that always boosts my confidence in a given program.
Installation
Installation of mdp is simple enough - apt install mpd
does the trick. Though in my case I first had to upgrade stuff. Which really should be done a lot more often…
Configuration
Mpd is configured via /etc/mpd.conf
. The only thing needed to get things started was to set music_directory "/media/data/Music"
in order for mdp
to know where to find my music. That being said, mpd
won’t actually check for music files etc. - that’s up to clients (see below).
mpd over sockets
Apt installs mpd
as a service, but configured to use http for communication. To use sockets, the following have to be executed:
sudo systemctl enable mpd.socket
sudo systemctl start mpd.socket
In my case the second command kept failing until I restarted mdp
(sudo systemctl stop mdp
). Which in retrospect is quite obvious…
Volume control
The default seems to be to use alsa for playback. Which on my Pi worked fine. Until I wanted to change the volume via a client. It took me a while to work out what values were needed, but this post pretty much explains how to set it up. The following worked for me:
audio_output {
type "alsa"
name "My ALSA Device"
device "hw:CARD=Headphones,DEV=0"
mixer_control "Headphone"
mixer_index "0"
}
MPC
Mpd by itself doesn’t do all that much. You also need a client. To test that things were working, I went with the basic command line client, which is mpc. This can be installed via apt install mpc
.
Once it’s installed, run mpc update
to make sure mpd scans all music sources.
To check what’s available, run mpc ls
. This will list the folders in the music library, e.g.:
The Police
Akeboshi
Steph Macleod
Akurat - Prowincja
Neil Young - Harvest
Jack White - Lazaretto
mutyumu
Globus - Epicon
To search for a specific artist, run e.g. mpc search artist akurat
, which in my case resulted in the following:
Akurat - Prowincja/01 - Akurat - AudioTrack 01.mp3
Akurat - Prowincja/02 - Akurat - AudioTrack 02.mp3
Akurat - Prowincja/03 - Akurat - AudioTrack 03.mp3
Akurat - Prowincja/04 - Akurat - AudioTrack 04.mp3
...
Now I executed the following to add a song and start playing it:
mpc add "Akurat - Prowincja/01 - Akurat - AudioTrack 01.mp3"
mpc play
So much for testing it out.
RompЯ
The next step was to install a web client. The mpd website has a list of http clients, so I just had a look through them and picked whichever had the nicest photos, the winner being RompЯ.
Installation
RompЯ is a PHP website, so all that is needed to install it is to download and unpack a zip file to wherever it should be served from. Seeing that I already have a media
website set up, I decided to have it there, so it went to /var/www/media/music
.
Before RompЯ will work, it needs to check its settings. Which are written to the server in the prefs
folder. This doesn’t exist (I’m guessing because git doesn’t send empty folders and they didn’t want to have extra files in there), so it needs to be created. Ditto if custom album pictures are to be uploaded:
mkdir music/prefs
mkdir music/albumart
chown -R www-data:www-data music/
Nginx
I use Nginx as my server, which has detailed instructions on how to setup on the RompЯ website. This pretty much boils down to:
Install needed plugins
apt-get install nginx php-curl php-json php-xml php-mbstring php-sqlite3 php-gd php-fpm php-intl imagemagick
Add entry to nginx config file
In my case this is /etc/nginx/sites-enabled/media
location /music/ {
allow all;
index index.php;
location ~ \.php {
try_files $uri index.php =404;
fastcgi_pass unix:/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include /etc/nginx/fastcgi_params;
fastcgi_read_timeout 1800;
}
error_page 404 = /rompr/404.php;
try_files $uri $uri/ =404;
location ~ /albumart/* {
expires -1s;
}
# Use http auth
auth_basic "Music";
auth_basic_user_file /etc/apache2/.htpasswd;
}
The only differences from that on the website are changing the endpoint name (’/rompr/’ -> ‘/music/’) and adding http auth.
Update php limits
This is done in /etc/php/7.3/fpm/php.ini
(or the appropriate for whatever version is used). The following values should be set:
allow_url_fopen = On
memory_limit = 128M
max_execution_time = 1800
Testing time!
To make sure everything was working, I restarted the services:
systemctl restart mpd
systemctl restart nginx
This shouldn’t have been needed, as I was restarting them along the way, but better safe than sorry.
The only thing left was to check whether everything worked, by going to the /music/ endpoint and inputting my user and password. That’s it. Now I can control my music from any browser, anywhere in the world. Not that it makes all that much sense when I’m out of hearing of the loudspeakers…
Updater
One thing that seemed useful, and that isn’t automatically added, is an updater of the music library. This can be done manually via the various clients, but seems onerous. So a simple cron task in /etc/cron.daily/music-update
will do the job:
#!/bin/sh
#
# Rescan the mpd music library to index new files
/usr/bin/mpc rescan --wait
Icecast
See this for a description of how to connect
Icecast with MDP.
The basic apt install icecast2
will suffice to set it up, after changing the listening port to 8030, and the hostname to media.ahiru.pl
in /etc/icecast2/icecast.xml
.
MDP config
Make sure the following is set in the config file:
audio_output {
type "shout"
name "Raspberry stream"
host "localhost"
port "8030"
mount "/mpd"
password "<password>"
bitrate "128"
format "44100:16:2"
protocol "icecast2" # optional
}
Then reset both MDP and icecast.
Proxying
It turns out that Icecast doesn’t play too nicely with Nginx, so I ended up just forwarding a port on the router…
Troubleshooting
Missing log file
Every now and then (I’m guessing it’s after system updates), MDP doesn’t want to start because it can’t find its log files. The solution is to recreate its /var
dir:
sudo mkdir /var/log/mpd && sudo mkdir /var/log/icecast2/ && sudo chown icecast2:icecast /var/log/icecast2/