Install CherryMusic on Raspberry Pi for Personal Spotify

CherryMusic is a browser-based music streaming solution to create your own personal Spotify-like server for your local music collection. You store all of your music on your Raspberry Pi or mount your other NAS music folder on the Pi and then you can play all of your music through your web browser on any machine that has a local network connection or internet connection. To make accessing your music collection even more convenient you can combine it with free Dynamic DNS so you can access your music collection at a custom address like htpcguides.crabdance.com. CherryMusic also supports reverse proxies meaning you can access its interface at e.g. htpcguides.crabdance.com/cherrymusic when you are away from home. This guide was tested on a Raspberry Pi B+ and Pi 2 but should work on any debian based distro for ARMv7 devices like the Banana Pi, Beaglebone, ODROID and 32-bit or 64-bit systems running Ubuntu.

Protip: make sure you mount your external hard drive properly to prevent permission issues.

If you are trying to figure out which hardware would work best for you, consider reading the Pi benchmarks.

Pi Unit
Processor
RAM
RAM Bus
Network
WiFi
USB
SATA
Cost
Raspberry Pi 3
1.2 GHz ARMv8
Quad Core
1 GB DDR2
450 MHz
100 Mbit
Yes
4
No
$35
Raspberry Pi 2
900 MHz ARMv7
Quad Core
1 GB DDR2
450 MHz
100 Mbit
No
4
No
$35.00
Raspberry Pi
700 MHz ARMv6
Single Core
512 MB SDRAM
400 MHz
100 Mbit
No
4
No
$25
Banana Pi
1 GHz ARMv7
Dual Core
1 GB DDR3
432 MHz
Gigabit
No
2
Yes
$36.99
Banana Pi Pro
1 GHz ARMv7
Dual Core
1 GB DDR3
432 MHz
Gigabit
Yes
2
Yes
$45.00

CherryMusic essentially turns your Raspberry Pi into your personal Spotify for your music collection making it a cloud music server

cherrymusic interface screenshot

Install CherryMusic on Raspberry Pi

Update your repos and upgrade your packages

sudo apt-get update && sudo apt-get upgrade -y

Install CherryMusic dependencies

sudo apt-get install python python-pip git python-unidecode sqlite -y

Install CherryPy 3.6.0

sudo pip install CherryPy==3.6

Install imagemagick for displaying album thumbnails, lame mp3 encoder, flac encoder and vorbis tools (for ogg music). If you do not have any flac or ogg files you can remove the vorbis-tools and flac.

sudo apt-get install imagemagick lame vorbis-tools flac -y

Pull the latest CherryMusic and put it in the installation folder

sudo git clone --branch devel https://github.com/devsnd/cherrymusic.git /opt/cherrymusic

Change ownership of the CherryMusic folder to the pi user or whichever your main user on your system is to avoid permission issues

sudo chown -R pi:pi /opt/cherrymusic

Run CherryMusic, adjust the port you want to use.

You can browse to the web interface with the Raspberry Pi’s IP address at http://ip.address:7600 on any machine in your home network

python /opt/cherrymusic/cherrymusic --setup --port 7600

Make sure CherryMusic loaded and perform the initial setup by choosing the path to your music downloads and click Save and start CherryMusic

Create the admin user. When you’re done, hit Ctrl+C or Ctrl+Z back in your SSH session to stop the process and complete the rest of this guide

Options can be adjusted in here if you want to change the music path or port.

nano ~/.config/cherrymusic/cherrymusic.conf

When you’re done making changes hit Ctrl+X, Y and Enter to save

CherryMusic init.d Script

This will autostart CherryMusic on boot for your Raspberry Pi.

Create the CherryMusic init.d script

sudo nano /etc/init.d/cherrymusic

Paste this hopefully working CherryMusic init.d script

#!/bin/sh
### BEGIN INIT INFO
# Provides:          Cherrymusic
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Cherrymusic
# Description:       Cherrymusic for music streaming
### END INIT INFO
 
 
# Documentation available at
# http://refspecs.linuxfoundation.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html
# Debian provides some extra functions though
. /lib/lsb/init-functions
 
 
DAEMON_NAME="cherrymusic"
DAEMON_USER=root
DAEMON_PATH="/usr/bin/python"
DAEMON_OPTS="/opt/cherrymusic/cherrymusic"
DAEMON_PWD="${PWD}"
DAEMON_DESC=$(get_lsb_header_val $0 "Short-Description")
DAEMON_PID="/var/run/${DAEMON_NAME}.pid"
DAEMON_NICE=0
DAEMON_LOG='/var/log/cherrymusic'
 
[ -r "/etc/default/${DAEMON_NAME}" ] && . "/etc/default/${DAEMON_NAME}"
 
do_start() {
  local result
 
	pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null
	if [ $? -eq 0 ]; then
		log_warning_msg "${DAEMON_NAME} is already started"
		result=0
	else
		log_daemon_msg "Starting ${DAEMON_DESC}" "${DAEMON_NAME}"
		touch "${DAEMON_LOG}"
		chown $DAEMON_USER "${DAEMON_LOG}"
		chmod u+rw "${DAEMON_LOG}"
		if [ -z "${DAEMON_USER}" ]; then
			start-stop-daemon --start --quiet --oknodo --background \
				--nicelevel $DAEMON_NICE \
				--chdir "${DAEMON_PWD}" \
				--pidfile "${DAEMON_PID}" --make-pidfile \
				--exec "${DAEMON_PATH}" -- $DAEMON_OPTS
			result=$?
		else
			start-stop-daemon --start --quiet --oknodo --background \
				--nicelevel $DAEMON_NICE \
				--chdir "${DAEMON_PWD}" \
				--pidfile "${DAEMON_PID}" --make-pidfile \
				--chuid "${DAEMON_USER}" \
				--exec "${DAEMON_PATH}" -- $DAEMON_OPTS
			result=$?
		fi
		log_end_msg $result
	fi
	return $result
}
 
do_stop() {
	local result
 
	pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null
	if [ $? -ne 0 ]; then
		log_warning_msg "${DAEMON_NAME} is not started"
		result=0
	else
		log_daemon_msg "Stopping ${DAEMON_DESC}" "${DAEMON_NAME}"
		killproc -p "${DAEMON_PID}" "${DAEMON_PATH}"
		result=$?
		log_end_msg $result
		rm "${DAEMON_PID}"
	fi
	return $result
}
 
do_restart() {
	local result
	do_stop
	result=$?
	if [ $result = 0 ]; then
		do_start
		result=$?
	fi
	return $result
}
 
do_status() {
	local result
	status_of_proc -p "${DAEMON_PID}" "${DAEMON_PATH}" "${DAEMON_NAME}"
	result=$?
	return $result
}
 
do_usage() {
	echo $"Usage: $0 {start | stop | restart | status}"
	exit 1
}
 
case "$1" in
start)   do_start;   exit $? ;;
stop)    do_stop;    exit $? ;;
restart) do_restart; exit $? ;;
status)  do_status;  exit $? ;;
*)       do_usage;   exit  1 ;;
esac

Make the CherryMusic init.d script executable

sudo chmod +x /etc/init.d/cherrymusic

Tell the system to use CherryMusic

sudo update-rc.d cherrymusic defaults

If the CherryMusic init.d script fails you can use a cronjob.

Add a cronjob to make CherryMusic automatically start on boot, the init.d script I found wasn’t working

crontab -l | { cat; echo "@reboot cd /opt/cherrymusic ; /usr/bin/python cherrymusic"; } | crontab -

Reboot to make sure CherryMusic is starting on boot

sudo reboot

If it fails you can always start CherryMusic manually

python /opt/cherrymusic/cherrymusic

You can now finishing setting up CherryMusic by going to the web interface after it reboots. It is fairly self-explanatory and easy to set up.

Using this guide, access the web interface again after the Raspberry Pi reboots at  http://ip.address:7600

If you want to be able to access CherryMusic outside your home network with a free Dynamic DNS address follow this guide and then port forward 7600 on your router or which ever custom port you set.