HOWTO: Set Up daapd on Fedora Linux

The information on this page is outdated and may not be accurate anymore, since I no longer run machines at home.

Update: This was revised according to my brand new Core 3 install. Core 3 includes Howl and a few of the necessary libraries, so it streamlines the process considerably. If you find anything wrong with this, drop a line.

Introduction

This is a set of notes pertaining to my experiments with daapd, an -compatible streaming server that implements the DAAP protocol. This was partly inspired by this item on Mac OS X Hints, but I wanted to have a complete, reproducible procedure that could be used as a reference by myself or others with no time to spare.

(If you don't run , Sandy McArthur has a package that also uses Howl to announce itself, plus other notes on Rendezvous)

Please note that there is now a second DAAP server for platforms called mt-daapd, which has a package available. I have not tried it yet - it looked promising at first (it supports dynamic playlists, for one thing), but the project now seems to be dead (I've seen no updates for a long while). Then again, it might just be "stable", since I know it's been ported to the recently.

Caveats and Disclaimer

All of the steps described here were done and tested on Core 3. Any similar release should work fine, but I remember having trouble getting the exact same code to work properly in 9 due to i18n issues (the ID3 tag parsing would choke and die when handling accented characters). Your mileage may vary, and I'm not at all responsible for any data loss (or other damage) that you may incur by installing and using this stuff like I describe.

Getting the Code

daapd relies on several specific libraries. Most are now included in or available via apt from freshrpms.net, so I only needed the actual server:

  • daapd-0.2.4a.tgz
  • libid3tag and howl-devel can be installed via apt from freshrpms.net with a single command:
# apt-get install libid3tag libid3tag-devel howl-devel

I do not need MP4/ support, so I didn't compile mpeg4ip (which, by the way, is at least as complex to install on its own). Neverhteless, Jarrod Smith sent me a few notes I've tacked on to the bottom of this post.

Compiling it

Compiling everything is pretty straightforward. Assuming you like things tidy like me and set up Packages and Build directories for your workspace, things should work like this (steps expanded to make things as clear as possible for newbies).

(On previous versions, it was necessary to edit /etc/ld.so.conf to add /usr/local/lib to the library search path. With Core 3, that was no longer necessary.)

Note: Check the bottom of this page for Jarrod Smith's notes on support

Since places Howl in /usr instead of /usr/local and I don't have need for support (actually, I found mpeg4ip a lot more trouble than it's worth), I've had to edit the makefile a bit:

$ cd Build/
$ tar -zxvf ../Packages/daapd-0.2.4a.tgz
$ cd daapd-0.2.4a/
$ vi makefile

...edit to look like this:

MPEG4_ENABLE = 0
...
        HOWLDIRS := $(sort $(wildcard /usr/include/howl*) )

...and compile it:

$ make
$ su
Password:
# mkdir -p /usr/local/man/man8
# make install

Do note that this installs daapd as /usr/local/bin/daapd instead of /usr/local/sbin/daapd, which is where daemons should be. But hey, I'm a stickler for consistency. The mkdir is to ensure the man page gets installed correctly (/usr/local/man does not exist in a stock install)

If you're upgrading, make sure the build replaces any current version of libhttpd - when upgrading my server in previous builds, I had to go down into libhttp and do the ./configure; make; make install dance there before I got daapd to work.

Configuration

The configuration file format is fairly simple:

$ cat /etc/sysconfig/daap/daapd.conf
Port            3689
ServerName      Jukebox
DBName          daapd music
Password
Root            /mnt/storage/mp3
Cache           /var/spool/daapd/cache
Timescan        2
Rescan          0

The README file has more information, but basically this setup is a password-free server ( does not have usernames, only per-server passwords), stores a database cache under /var/spool (do a mkdir -p /var/spool/daapd as root to ensure it exists before running the daemon) and does not rescan the library every time a client connects.

If you are upgrading, delete your cache file. Trust me, it saves you a lot of bother.

System Configuration

Making daapd run upon startup is a matter of installing the folloing init script (tested under only):

cat /etc/init.d/daapd
#!/bin/sh
#
# A startup script for the daapd DAAP server
#
# chkconfig: 345 98 2
# description: This script is used to start the daapd \
# server as a background process.\
#
# Usage /etc/init.d/daapd start|stop|reload|restart|status

# Source function library.
. /etc/rc.d/init.d/functions

DAAP_CONF=/etc/sysconfig/daapd/daapd.conf
DAAP_LOG=/var/log/daapd/access_log
prog=DAAP
exe=/usr/local/bin/daapd

start() {
        echo -n "Starting $prog: "
        if [ -f /var/lock/subsys/daapd ] ; then
                echo_failure
                echo
                exit 1;
        fi
        daemon $exe -c $DAAP_CONF >> $DAAP_LOG &
        RETVAL=$?
        [ $RETVAL = 0 ] && touch /var/lock/subsys/daapd && echo_success
        echo
        return $RETVAL
}

stop() {
        echo -n "Stopping $prog: "
        killproc $exe
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && rm -f /var/lock/subsys/daapd /var/run/daapd.pid
}

reload()
{
        echo -n $"Reloading $prog:"
        killproc $exe -HUP
        RETVAL=$?
        echo
}


case "$1" in
start)
        start
        ;;
stop)
        stop
        ;;
reload)
        reload
        ;;
restart)
        stop
        start
        ;;
status)
        status $exe
        RETVAL=$?
        ;;
*)
        echo "Usage: daapd {start|stop|reload|restart|status}"
        exit 1
esac

(don't forget to create the log directory using mkdir -p /var/log/daapd)

...and running chkconfig to add it to the system services list and bind it to the proper runlevels:

# chkconfig --add daapd
# chkconfig --level 345 daapd on
# chkconfig --list  | grep daapd
daapd           0:off   1:off   2:off   3:on    4:on    5:on    6:off
# service daapd start
Starting DAAP:                                             [  OK  ]

Rendezvous Setup

With Core 3, publishing the DAAP server is simply a matter of adding the following line to mDNSResponder.conf:

# tail -1 /etc/howl/mDNSResponder.conf
"Music Jukebox" _daap._tcp.     local.  3689

If you've followed my Rendezvous HOWTO, making iTunes aware of your DAAP server is a simple matter of adding four lines to /etc/rendezvous.conf:

Music Jukebox
_daap._tcp.
none
3689

will then automagically display your server on its left-hand view.

Other methods exist, like using Network Beacon or invoking mDNSProxyResponderPosix by hand like so (taken from Mac OS X Hints):

mDNSProxyResponderPosix 10.0.1.201 squeal "Music Jukebox" _daap._tcp. 3689 &

Log Rotation

To make things really neat, drop into /etc/logrotate.d the following file:

# cat /etc/logrotate.d/daapd
/var/log/daapd/*log {
    missingok
    notifempty
    endscript
}

This wil ensure logrotate truncates the log file and removes old versions.

Support

Jarrod Smith was kind enough to send along the following set of notes -

support only requires a subset of the MPEG4IP package (just the mp4v2 library). As per the README.mpeg4ip file packaged with daapd 0.2.2b:

  tar xvfz mpeg4ip-x.x.tar.gz
  cd mpeg4ip-x.x/
  ./bootstrap --disable-server
  cp mpeg4ip_config.h /usr/local/include/
  cp include/mpeg4ip.h /usr/local/include/
  cd lib/mp4v2/
  edit Makefile:
      replace the line "SUBDIRS = . test util"
      with "SUBDIRS = ."
  make
  make install

Once that's done, you set MPEG4_ENABLE = 1 in the daapd makefile and rebuild as normal.

Known Bugs

There is a minor issue with the way the startup script is written - a bogus failure message is appended to the log file when you kill the DAAP server (this is due to some differences between and I'm not grokking yet, or sleep deprivation - not sure which, fixes welcome).