Ices & Icecast Howto for OpenBSD

HOWTO: Ices & Icecast/OpenBSD

Prerequisites:

  • Icecast
  • Ices
  • MP3’s/OGG’s
  • Unixish Operating System, In this case OpenBSD

Although this howto is written for OpenBSD I’m sure it will work on any other BSD or Linux Operating System with a few modifications given to the instructions below.

Please keep in mind that these instructions are by no means complete, or even guaranteed to work. I’m writing this from memory, so I might mistake some steps, but there is excellent documentation available through the use of Google or the Icecast/Ices site.

What I did:

STEP.1:

Compile and install icecast and ices, I’m not going to explain the instructions for that here as there is abundant documentation available for that already on the web.

In my case, I did not use the OpenBSD ports, instead I opted to use the source (most current) directly from the website.

STEP.2:

I installed a seperate HDD for music to be stored on, but you don’t have to go that far.

You can also do the following:

As ‘root’ create a directory where you would store mp3 files that are to be served:

# mkdir -p /opt/music

STEP.3:

I shared the music directory with Samba and copied a bunch of mp3’s to it in nicely organized sub directories directories. I’m not going to go into detail about the samba setup, as you should be able to find abundant documentation about it on the website, or on google.

My Samba configuration is very insecure, but it serves my needs well, as anyone on the network can copy files to and from it, and can make their own directories. I also have only one other person on my network who is trusted and able to access this share. You may setup samba as insecure or securely as you wish.

[Smb.conf]

[music]

comment = Radio Station Music

path = /music/all

read only = no

public = yes

guest ok = yes

[ Directory Listing ]

(/music/all)#ls -lt

total 440

drwxrwxrwx 3 iceuser iceuser 3584 May 6 19:35 punk

drwxrwxrwx 16 iceuser iceuser 3072 Feb 22 12:35 electronica

drwxrwxrwx 16 iceuser iceuser 1024 Feb 16 21:44 techno

drwxrwxrwx 13 iceuser iceuser 1024 Feb 16 17:22 chill

drwxrwxrwx 7 iceuser iceuser 2048 Feb 16 16:31 hiphop

drwxrwxrwx 5 iceuser iceuser 4608 Feb 15 20:57 rock

drwxrwxrwx 10 iceuser iceuser 1536 Feb 15 18:57 jungle

STEP.4:

I created a script in /usr/local/bin to scan my mp3’s, and generate a playlist of each directory as well as all of the mp3’s into one big list. This script is by no means complete, or even good, but it works. If you modify this script please feel free to let me know so I can post any modifications on this page.

(/usr/local/bin)# touch icecast.run

(/usr/local/bin)# chmod +x icecast.run

(/usr/local/bin)# vi icecast.run (or pico or ed, or whatever editor you like)

and this is what i entered in the script: (change pathnames as appropriate)

#!/bin/sh

if [ -d /music/all ]; then

clear

echo “looks like we have some mp3 directories to look at..”

echo “will proceed with playlist file creation”

echo -n “please be patient…”

sudo -u iceuser find /music/all/ -name *.mp3 -print > /music/all/all.txt

echo -n “.”

sudo -u iceuser find /music/all/jungle/ -name *.mp3 -print > /music/all/jungle.txt

echo -n “.”

sudo -u iceuser find /music/all/techno/ -name *.mp3 -print > /music/all/techno.txt

echo -n “.”

sudo -u iceuser find /music/all/chill/ -name *.mp3 -print > /music/all/chill.txt

echo -n “.”

sudo -u iceuser find /music/all/electronica/ -name *.mp3 -print > /music/all/electronica.txt

echo -n “.”

sudo -u iceuser find /music/all/hiphop/ -name *.mp3 -print > /music/all/hiphop.txt

echo -n “.”

sudo -u iceuser find /music/all/punk/ -name *.mp3 -print > /music/all/punk.txt

echo -n “.”

sudo -u iceuser find /music/all/rock/ -name *.mp3 -print > /music/all/rock.txt

echo -n “.”

echo -n “done”

else

clear

echo ” ERROR ERROR ERROR ERROR”

echo “”

echo “the mp3 files don’t exist”

echo “”

echo ” ERROR ERROR ERROR ERROR”

fi

if [ -f /music/ice/log/icecast.pid ]; then

echo “”

echo “icecast process already running”

echo “assuming you wish to terminate..”

echo “killing process”

#insert kill process thing here

echo “deleting pid file (if any)”

rm -f /music/ice/log/icecast.pid

echo -n “Starting icecast..”

sudo -u iceuser -b /usr/local/bin/icecast -c /usr/local/etc/icecast.xml >/dev/null 2>&1

echo -n “Running!”

echo “”

else

echo “”

echo -n “Starting icecast..”

sudo -u iceuser -b /usr/local/bin/icecast -c /usr/local/etc/icecast.xml >/dev/null 2>&1

echo -n “running!”

echo “”

fi

if [ -x /usr/local/bin/ices ]; then

echo “Starting ices now”

echo -n “source:”

sudo -u iceuser /usr/local/bin/ices -c /usr/local/etc/jungle.conf >/dev/null 2>&1

echo -n “, jungle”

sudo -u iceuser /usr/local/bin/ices -c /usr/local/etc/chill.conf >/dev/null 2>&1

echo -n “, chill”

sudo -u iceuser /usr/local/bin/ices -c /usr/local/etc/rock.conf >/dev/null 2>&1

echo -n “, rock”

sudo -u iceuser /usr/local/bin/ices -c /usr/local/etc/hiphop.conf >/dev/null 2>&1

echo -n “, hiphop”

sudo -u iceuser /usr/local/bin/ices -c /usr/local/etc/punk.conf >/dev/null 2>&1

echo -n “, punk”

sudo -u iceuser /usr/local/bin/ices -c /usr/local/etc/techno.conf >/dev/null 2>&1

echo -n “, techno”

sudo -u iceuser /usr/local/bin/ices -c /usr/local/etc/electronica.conf >/dev/null 2>&1

echo -n “, electronica”

echo “”

echo “”

else

echo “”

echo “main program file ices is missing”

echo “check your path to make sure”

echo “ices is resident somewhere!”

echo “”

fi

STEP.5:

I setup my /etc/rc.local file to run my script once upon boot of the box. On other operating systems this might be in /etc/rc.d/ or /usr/local/etc/.

echo “# for icecast /usr/local/bin/icecast.run” >> /etc/rc.local

Be sure to use >> and not >. As >> is append, and > is overwrite.

STEP.6:

Edit your icecast.xml and ices.conf files.

[ icecast.xml ]

<icecast>

<limits>

<clients>10</clients>

<sources>10</sources>

<threadpool>5</threadpool>

<queue-size>102400</queue-size>

<client-timeout>30</client-timeout>

<header-timeout>15</header-timeout>

<source-timeout>10</source-timeout>

</limits>

<authentication>

<source-password>PASSWORD</source-password>

<relay-password>PASSWORD</relay-password>

<admin-user>admin</admin-user>

<admin-password>PASSWORD</admin-password>

</authentication>

<hostname>radio.servers.spizzo.spazzo</hostname>

<listen-socket><port>8000</port></listen-socket>

<fileserve>1</fileserve>

<paths>

<basedir>/music/ice</basedir>

<logdir>/music/ice/log/icecast</logdir>

<webroot>/music/ice/web</webroot>

<adminroot>/music/ice/admin</adminroot>

<pidfile>/music/ice/log/icecast.pid</pidfile>

</paths>

<logging>

<accesslog>access.log</accesslog>

<errorlog>error.log</errorlog>

<loglevel>1</loglevel> <!– 4 Debug, 3 Info, 2 Warn, 1 Error –>

</logging>

<security>

<chroot>0</chroot>

</security>

<mount>

<mount-name>/techno</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

<mount>

<mount-name>/electronica</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

<mount>

<mount-name>/punk</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

<mount>

<mount-name>/oldies</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

<mount>

<mount-name>/hiphop</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

<mount>

<mount-name>/rock</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

<mount>

<mount-name>/chill</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

<mount>

<mount-name>/jungle</mount-name>

<password>PASSWORD</password>

<max-listeners>2</max-listeners>

<fallback-mount>/all</fallback-mount>

</mount>

</icecast>

[ Edit ices.conf (or in this case the rock music stream)]

<?xml version=”1.0″?>

<ices:Configuration xmlns:ices=”http://www.icecast.org/projects/ices”>

<Playlist>

<File>/music/all/rock.txt</File>

<Randomize>1</Randomize>

<Type>builtin</Type>

<Module>ices</Module>

</Playlist>

<Execution>

<Background>1</Background>

<Verbose>0</Verbose>

<BaseDirectory>/music/ice/log/rock</BaseDirectory>

</Execution>

<Stream>

<Server>

<Hostname>YOUR.HOST.NAME.HERE</Hostname>

<Port>8000</Port>

<Password>PASSWORD</Password>

<Protocol>http</Protocol>

</Server>

<Mountpoint>/rock</Mountpoint>

<Name>Spizzo Rock Radio!</Name>

<Genre>Rock / Alternative</Genre>

<Description>Rock and Alternative – sixties to today</Description>

<URL>http://localhost/rock</URL>

<Public>0</Public>

<Bitrate>128</Bitrate>

<Reencode>0</Reencode>

<Samplerate>44100</Samplerate>

<Channels>2</Channels>

</Stream>

</ices:Configuration>

STEP.7:

Reboot and test it out.

[ Output on Login ]

looks like we have some mp3 directories to look at..

will proceed with playlist file creation

please be patient……….done

deleting pid file (if any)

Starting icecast..Running!

Starting ices now

source:, jungle, chill, rock, hiphop, punk, techno, electronica

You should see something like the previous when you login. If there is any errors, make sure you have the correct paths in your icecast config files and in your icecast.run script.

[Web Test]

You should now be able to access the icecast website. Make sure you check the paths, and set up the web site according to the icecast documentation before attempting this. It’s really quite easy to setup though.

http://ip.of.your.box:8000/status.xsl