Icecast via ipkg installieren

Aus
Version vom 31. Oktober 2009, 11:09 Uhr von Raymond (Diskussion | Beiträge) (→‎lokale mp3 Files: typo)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Icecast Server installieren

Installation von Software, die nicht von Synology kommt geht immer auf eigenes Risiko. 
Zum Teil sind dabei tiefe Eingriffe ins System nötig und das muss über die Konsole erledigt werden. 
Dabei besteht das Risiko von Fehlmanipulationen die bis zur Neuinstallation der DS führen können. 
Und dabei ist das Risiko sehr gross, dass auch die Partitionen mit Userdaten formatiert werden müssen.

Also alles was ihr macht geht auf Eure eigene Kappe :-)

What's that?

Icecast ist ein Streaming Server für Audo Streams (Internet Radio). Wenn man nur einen Stream zu gleichen Zeit aus dem Internet holen und ins Netzwerk streamen will, dann ist Streamripper die bessere Alternative. Im Gegensatz zu Streamripper bietet Icecast wesentlich mehr Möglichkeiten u.A. auch eigene Streams zu senden (habe ich aber selber ned probiert). Was man aber bei Icecast sicherlich brauchen kann ist die Möglichkeit Relays auf externe Streams aufzubauen (bietet Streamripper auch, aber nur auf 1 externen Stream) oder lokale MP3/OGG File via Playlists abspielen zu lassen.

Weitere Infos findet man im Thread im Forum

Voraussetzungen

  1. Zugriff via Telnet oder ssh auf die Konsole
    Fehler beim Erstellen des Vorschaubildes: Datei fehlt
  2. ipkg muss installiert sein

Installation

# ipkg install icecast

Bei diesem Befehl sollten neben icecast auch zwei weitere Pakete installiert werden, die zum reibungslosen Betrieb nötig sind.

Konfiguration

Die Conf von icecast wird über ein zentrales xml Dokument umgesetzt, welches sich unter /opt/etc/icecast.xml befindet. Die meisten Optionen sind selbsterklärend. Anbei mal ein Beispiel meiner Config bei mir zu Hause

<icecast>
    <limits>
        <clients>100</clients>
        <!-- Wieviele externe Verbindung dürfen maximal aufgebaut werden ? -->
        <sources>10</sources>
        <threadpool>5</threadpool>
        <queue-size>524288</queue-size>
        <client-timeout>30</client-timeout>
        <header-timeout>15</header-timeout>
        <source-timeout>10</source-timeout>
        <!-- If enabled, this will provide a burst of data when a client 
             first connects, thereby significantly reducing the startup 
             time for listeners that do substantial buffering. However,
             it also significantly increases latency between the source
             client and listening client.  For low-latency setups, you
             might want to disable this. -->
        <burst-on-connect>1</burst-on-connect>
        <!-- same as burst-on-connect, but this allows for being more
             specific on how much to burst. Most people won't need to
             change from the default 64k. Applies to all mountpoints  -->
        <burst-size>65535</burst-size>
    </limits>

    <authentication>
        <!-- Sources log in with username 'source' -->
        <source-password>hackme</source-password>
        <!-- Relays log in username 'relay' -->
        <relay-password>hackme</relay-password>

        <!-- Admin logs in with the username given below -->
        <admin-user>admin</admin-user>
        <admin-password>bobmar1+</admin-password>
    </authentication>

    <!--  set the mountpoint for a shoutcast source to use, the default if not
         specified is /stream but you can change it here if an alternative is
         wanted or an extension is required -->
    <!-- <shoutcast-mount>/example</shoutcast-mount> -->

    <!-- Uncomment this if you want directory listings -->
    <!--
    <directory>
        <yp-url-timeout>15</yp-url-timeout>
        <yp-url>http://dir.xiph.org/cgi-bin/yp-cgi</yp-url>
    </directory>
     -->

    <!-- This is the hostname other people will use to connect to your server.
    It affects mainly the urls generated by Icecast for playlists and yp
    listings. -->
    <!-- Fully Qualified Domainname -->
    <hostname>eureDomain.tld</hostname>

    <!-- You may have multiple <listener> elements -->
    <listen-socket>
        <port>8000</port>
        <!-- IP Adresse des Servers -->
        <bind-address>192.168.1.2</bind-address>
        <shoutcast-mount>/stream</shoutcast-mount>
    </listen-socket>
    <!--
    <listen-socket>
        <port>8001</port>
    </listen-socket>
    -->
    <master-server>192.168.1.2</master-server>
    <master-server-port>8001</master-server-port>
    <master-update-interval>120</master-update-interval>
    <master-password>hackme</master-password>

    <!-- setting this makes all relays on-demand unless overridden, this is
         useful for master relays which do not have <relay> definitions here.
         The default is 0 -->
    <!-- Relays dienen dazu Verbindungen zu externen Streams aufzubauen und diese an die eigene DS zu streamen
         Relays on Demand bauen die Verbindung zum externen Server erst auf wenn diese Ressource lokal angefordert wird -->
    <!--<relays-on-demand>1</relays-on-demand>-->

    <relay>
        <server>208.53.158.16</server>
        <port>8080</port>
        <mount>/</mount>
        <local-mount>/pop</local-mount>
        <on-demand>1</on-demand>
        <relay-shoutcast-metadata>1</relay-shoutcast-metadata>
    </relay>
    

    <!-- Only define a <mount> section if you want to use advanced options,
         like alternative usernames or passwords
    <mount>
        <mount-name>/example-complex.ogg</mount-name>

        <username>othersource</username>
        <password>hackmemore</password>

        <max-listeners>1</max-listeners>
        <dump-file>/tmp/dump-example1.ogg</dump-file>
        <burst-size>65536</burst-size>
        <fallback-mount>/example2.ogg</fallback-mount>
        <fallback-override>1</fallback-override>
        <fallback-when-full>1</fallback-when-full>
        <intro>/example_intro.ogg</intro>
        <hidden>1</hidden>
        <no-yp>1</no-yp>
        <authentication type="htpasswd">
                <option name="filename" value="myauth"/>
                <option name="allow_duplicate_users" value="0"/>
        </authentication>
        <on-connect>/home/icecast/bin/stream-start</on-connect>
        <on-disconnect>/home/icecast/bin/stream-stop</on-disconnect>
    </mount>

    <mount>
        <mount-name>/auth_example.ogg</mount-name>
        <authentication type="url">
            <option name="mount_add"       value="http://myauthserver.net/notify_mount.php"/>
            <option name="mount_remove"    value="http://myauthserver.net/notify_mount.php"/>
            <option name="listener_add"    value="http://myauthserver.net/notify_listener.php"/>
            <option name="listener_remove" value="http://myauthserver.net/notify_listener.php"/>
        </authentication>
    </mount>

    -->
    <!-- Diese Config ist sehr wichtig wenn lokale MP3/OGG Files über Playlists zum Abspielen angeboten werden sollen -->
    <fileserve>1</fileserve>

    <paths>
		<!-- basedir is only used if chroot is enabled -->
        <basedir>/opt/share/icecast</basedir>

        <!-- Note that if <chroot> is turned on below, these paths must both
             be relative to the new root, not the original root -->
        <logdir>/opt/var/log/icecast</logdir>
        <webroot>/opt/share/icecast/web</webroot>
        <adminroot>/opt/share/icecast/admin</adminroot>
        <!-- <pidfile>/opt/share/icecast/icecast.pid</pidfile> -->

        <!-- Aliases: treat requests for 'source' path as being for 'dest' path
             May be made specific to a port or bound address using the "port"
             and "bind-address" attributes.
          -->
        <!--
        <alias source="/foo" dest="/bar"/>
          -->
        <!-- Aliases: can also be used for simple redirections as well,
             this example will redirect all requests for http://server:port/ to
             the status page
          -->
        <alias source="/" dest="/status.xsl"/>
    </paths>

    <logging>
        <accesslog>access.log</accesslog>
        <errorlog>error.log</errorlog>
        <!-- <playlistlog>playlist.log</playlistlog> -->
      	<loglevel>4</loglevel> <!-- 4 Debug, 3 Info, 2 Warn, 1 Error -->
      	<logsize>10000</logsize> <!-- Max size of a logfile -->
        <!-- If logarchive is enabled (1), then when logsize is reached
             the logfile will be moved to [error|access|playlist].log.DATESTAMP,
             otherwise it will be moved to [error|access|playlist].log.old.
             Default is non-archive mode (i.e. overwrite)
        -->
        <!-- <logarchive>1</logarchive> -->
    </logging>

    <security>
        <chroot>0</chroot>
        <!--
        <changeowner>
            <user>nobody</user>
            <group>nogroup</group>
        </changeowner>
        -->
    </security>
</icecast>

Verwendung

Icecast lässt sich nicht mit Root Rechten starten/betreiben, sondern es muss unter einem eingeschränkten User angeworfen werden. Also als nicht Root anmelden oder als root zuerst ein su meinBenutzer machen damit ein anschliessendes

# icecast -b -c /opt/etc/icecast.xml

den Server sauber starten lässt. Dies startet den Server im Hintergrund mit dem angegebenen Config File. Wenn der User dann eine Verbindung zum obigen Relay aufbauen will dann gibt es folgendes ein

http://deineDomain.tld:8000/pop

der Server öffnet dann die externe Verbindung zum Server und streamt die Daten an den lokalen Port 8000.

Icecast beim Booten laden

Damit man direkt nach dem Booten auch auf Icecast zugreifen kann, muss man sich noch ein kleines Startscript schreiben. Dieses kann man in /opt/etc/init.d/ als Startscript ablegen (z.B. S99icecast.sh)

#!/opt/bin/bash
su euerBenutzer -c '/opt/bin/icecast -b -c /opt/etc/icecast.xml' >> /dev/null

Dann muss das Script noch ausführbar gemacht werden, dazu auf der Konsole (telnet oder ssh)

$ chmod +x /opt/etc/init.d/S99icecast.sh

Nach einem Reboot sollte dann der Icecast Server laufen

lokale mp3 Files

Um lokale MP3 Files via Playlist einem Client zugänglich zu machen müssen sich die MP3 Files unterhalb von /opt/share/icecast/web liegen. Das lässt sich mit einem ln -s relativ einfach schnell erledigen.

# ln -s /volume1/music/ /opt/share/icecast/web/mp3

Um eine lokale Playliste zu erstellen bedient man sich am besten der Shell und wechselt zuerst in den Ordner web der Icecast Installation (ich habe die Files in web/mp3)

# cd /opt/share/icecast/web
# find mp3/ -name *.mp3 -print > playlist.m3u

Dabei werden alle mp3 Files in eine einzige Playlist geschrieben! Letzendlich ist aber eine solche Playlist nur ein Textfile mit einer URL pro Zeile und MP3-Song. Jetzt stehen die Pfade in der Datei natürlich nicht ganz korrekt. Denn diese sollte absolute Pfade sein. Dazu setze ich ein anderes PHP Script ein, welches die fehlenden Daten anfügt.

<?php
$f = file('/opt/share/icecast/web/playlist.m3u');
for($i=0;$i<count($f);$i++){
 $f[$i] = 'http://eureDomain.tld:8000/'.str_replace('./','',trim($f[$i]));
}
$f = implode("\n",$f);
$fp = fopen('/opt/share/icecast/web/playlist.m3u','w');
fwrite($fp,$f);
fclose($fp);
?>

Und jetzt sollten sich die File so

http://eureDomain.tld:8000/playlist.m3u

ansprechen lassen.

Goodie ;-)

Oft benutzt man Streamripper um einen Sender auf die Platte aufzunehmen und hat das Problem, dass dieser Streamripper als MP3 Titel einfach die Meta Daten des Streams nimmt. Und die können Leerzeichen enthalten. Diese Leerzeichen führen dazu, dass die Files erst mühsam umbenannt werden müssen, damit auch Linux keine Probleme damit hat (komischerweise etwas was Windows schon seit Urzeiten kann ;-). Dazu habe ich ein kleines PHP Script, das ein Verzeichnis (NICHT rekursiv) ausliest und eventuell vorhandene Leerzeichen in Dateinamen ersetzt

<?php
foreach(glob('/volume1/public/mp3/*.mp3') as $wert){
 $newName = preg_replace('/\s{1,}/','_',$wert);
 if($newName != $wert){
  exec('mv "'.$wert.'" "'.$newName.'"');
 }
}
?>

Externe Links

Icecast.org