Tipp: Shoutcast als Relay für einen Icecast-Server

Da ich kürzlich mit diesem Problem konfrontiert wurde, teile ich gern die am Ende doch recht einfache Lösung.
Aufgabe war es, Moderatoren einen Icecast-Zugang für ihre Sendungen anzubieten, ohne dabei für die Hörer die bisher verwendete Shoutcast-Struktur des Streamservers aufgeben zu müssen. Es sollte also möglich gemacht werden, den Shoutcast-Server (Version 1.9.x), der bisher von den Hörern genutzt wurde, als Relay für den Icecast-Server einzurichten. Und so geht man vor:

Zunächst wird aus Kompatibilitätsgründen der Icecast-Server so eingerichtet, dass sich auch jeder native Shoutcast-Client zum Icecast verbinden kann. Dazu muss ein zusätzlicher Port definiert werden, da Shoutcast grundsätzlich 2 Verbindungs-Ports nutzt. Der zweite Port muss dabei um eins höher liegen als der normale Sende- und Empfangsport und benötigt zudem eine Kennzeichnung als Shoutcast-kompatibel.


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

<listen-socket>
<port>8001</port>
<!-- Folgende einstellung markiert den Port als Shoutcast-kompatibel -->
<shoutcast-compat>1</shoutcast-compat>
</listen-socket>

Anschließend sollte noch ein spezieller Mountpoint als Shoutcast-Mount angegeben werden, anderenfalls greift Shoutcast auf den Standard-Mount /stream zu:

<shoutcast-mount>/live</shoutcast-mount>

Abschließend wird im Abschnitt „Paths“ der Icecast-Konfiguration folgende Zeile geändert:

<alias source="/" dest="/status.xsl"/>

Als Ziel für den Alias muss der zuvor als Shoutcast-Mount definierte Wert eingetragen werden:

<alias source="/" dest="/live"/>

Und damit ist der Icecast-Server auch schon fertig eingerichtet. Jetzt muss nur noch die Shoutcast-Konfiguration entsprechend angepasst werden, sodass Shoutcast den Icecast- Stream als Relay weiterleitet:

RelayPort=8000
RelayServer=Server-Adresse

Zu beachten ist, dass Shoutcast jetzt zwar das Audiosignal abgreift, jedoch die Metadaten teilweise unzuverlässig empfängt. So werden z. B. die Infos zum gerade laufenden Song mit einigen Sekunden Verzögerung empfangen und der Stream-Name wird nur dann aktualisiert, wenn die Relay-Verbindung neu aufgebaut wird. Ansonsten ist diese Kette aber erstaunlich stabil. Dennoch ist ein kompletter Umstieg auf Icecast sicher die bessere Alternative.

Druckansicht

Tipp: Übersetzungen mit unified Diffs aktualisieren

Softwareprojekte, die von mehreren Entwicklern oder gar einer großen Community betrieben werden, verwenden nicht selten ein Versionierungssystem zur Verwaltung des Quellcodes. Doch nicht jeder, der an einem solchen Projekt beteiligt ist, kann oder möchte in die manchmal doch recht kompliziert anmutende Materie der Versionsverwaltung einsteigen. Wer zum Beispiel lediglich die Lokalisierungen, also die Übersetzungen der Software, auf dem neuesten Stand halten möchte, bekommt einiges zu tun, um die Versionsverwaltung auf seinem lokalen Rechner einzurichten. Dabei ist alles, was zur Aktualisierung zwischen zwei Versionen gebraucht wird, lediglich ein Übersichtlicher Ordnervergleich des alten und neuen Quellcodes.

Druckansicht

Tipp: SQL-Import mit Adminer

Über welche Vorteile das auf nur einer einzigen Datei basierende SQL-Verwaltungswerkzeug Adminer gegenüber Schwergewichten wie phpMyAdmin verfügt, habe ich vor einiger Zeit bereits geschildert. Heute nur ein ergänzender Tipp; für mich zur Erinnerung und für alle, die es noch nicht wussten. :)

Der Import eines sogenannten SQL-Dumps, also eine Backup-Datei mit Datenbanken oder nur den Tabellen einer einzigen Datenbank, versteckt sich im Adminer zunächst ein wenig. Schnell wird man aber fündig, wenn man innerhalb einer Datenbank den Menüpunkt „SQL-Query“ öffnet. Hier bietet sich sowohl die Möglichkeit, SQL-Code direkt auszuführen, als auch ein Dateiimporter, mit dem sich von der lokalen Festplatte eine SQL-Datei hochladen lässt. So gesehen also keine Besonderheit gegenüber phpMyAdmin. Interessant wird es erst, wenn die zu importierende Datei größer ist, als es der Wert „post_max_size“ in der PHP-Konfiguration des Webservers erlaubt. Hat man keine Möglichkeit, diesen Wert nachträglich heraufzusetzen oder möchte es auch gar nicht erst tun, dann bietet Adminer die Funktion, das Backup direkt vom Webserver einzuspielen.

Hierzu ist nichts weiter zu tun, als die SQL-Datei ungepackt oder in gepackter Form (.gz) unter dem Namen adminer.sql bzw. adminer.sql.gz auf dem Webserver zu speichern. Sie muss im selben Verzeichnis liegen, in welchem auch das Adminer-Skript ausgeführt wird. Danach im Fenster SQL-Query noch den Punkt „Auf Server“ öffnen und die Schaltfläche „Ausführen“ anklicken. Den Rest erledigt der Webserver und alle Daten im SQL-Dump sollten importiert werden. Im vorliegenden Fall wurde ein entpackt ca. 9 MB großes MySQL-Backup auf diese Weise fehlerfrei importiert. Achtung: Adminer zeigt nach Abschluss des Vorgangs den kompletten Inhalt der eingelesenen Datei im Browser an, was das abschließende Laden der Seite bei großen Dumps stark verzögern kann. Ein Klick auf den Datenbanknamen in der Navigation bringt dann die übliche Tabellenübersicht. Zum Schluss sollte natürlich nicht vergessen werden, die hochgeladene SQL-Datei wieder vom Server zu entfernen, da sie sonst für jedermann aus dem Internet erreichbar ist!

Druckansicht

Container-Scripts: Übersicht auf dem Webspace

Funktionen, Module, Plugins, Templates, Lokalisierungen, Konfigurationsdateien; dies und mehr benötigt eine ausgewachsene Webanwendung, um einen größtmöglichen Funktions- und Konfigurationsumfang zu bieten. Sehr schnell entstehen auf diese Weise Anwendungsboliden, deren Umfang durchaus um ein Vielfaches größer sein kann, als die eigentlichen Inhalte, die von ihnen verwaltet werden sollen. So ist die deutsche Version des CMS- und Blogsystems WordPress beispielsweise bereits als Download-Paket ca. 3 MB groß (entpackt 9 MB mit 844 Dateien), während die in der Datenbank abgelegten, reinen Textinhalte eines Blogs lediglich wenige hundert Kilobyte wiegen, je nach Größe des Blogs.

Ein guter Ansatz, diesen Wust an Dateien etwas zusammenzustauchen, wurde von dem eher an fortgeschrittene Benutzer gerichteten Contentmanager sNewsCMS gewagt. Das System besteht im wesendlichen aus einer einzigen, ca. 150 KB großen Kerndatei, welche sämtliche Funktionen und Konfigurationen enthält. Weiterhin wird nur noch eine Designvorlage benötigt, um die Funktionen zur Inhaltsausgabe aufzurufen. Programmcode und Design sind hier also logisch voneinander getrennt. Der Vorteil besteht in der Übersichtlichkeit des Codes, man muss nicht in tiefen Verzeichnisbäumen wühlen, um eine Modifizierung anzubringen. Weniger komfortabel wird es allerdings, wenn es um die Einspielung von Sicherheits- und Stabilitätsupdates geht. Ein System wie sNews ist durch seine eher begrenzten Möglichkeiten dafür ausgelegt, als Grundlage für größere Webprojekte zu dienen, was die ein oder andere Modifizierung an der Kerndatei notwendig macht. Wird die Kerndatei nun aktualisiert, bleibt dem Webmaster nichts anderes übrig, als seine Modifizierungen erneut anzubringen oder sie falls möglich in eine andere Datei auszulagern, um die Arbeit nach jedem Update minimal zu halten. sNews ist also eher als Basis zu sehen und weniger als der Ansatz eines ultra sparsamen CMS.
Mittlerweile gibt es von sNews eine Abspaltung namens Redaxscript, welche das 1-Datei-Prinzip wieder etwas aufweicht und verschiedene Funktionen in einzelne Dateien auslagert und zudem das System um einige neue Funktionen erweitert. Dennoch ist die Größe des Systems im Vergleich zu anderen Systemen sehr gering gehalten.

Es geht aber noch eine Stufe kompakter: wer sich schon immer über die unverhältnismäßige Größe des vielfach bei Webhostern eingesetzten phpMyAdmin geärgert hat, sollte mal einen Blick auf die sehr viel kleinere, ihrem großen Vorbild jedoch in nichts nachstehende Alternative namens Adminer werfen. Das Script besteht aus einer einzigen, je nach Version zwischen 150 und 200 KB großen Datei, welche einfach nur auf den Webspace geladen und ausgeführt werden muss. Dabei kann sie beliebig umbenannt werden, um sie vor all zu neugierigen Augen zu schützen, obgleich eine Login-Abfrage natürlich integriert ist. Programmcode, Sprachdateien, ja selbst die Icons sind als Base64-Code im Script enthalten und passen in vergleichsweise wenige Kilobyte.
Ein Blick auf die Webseite im Bereich Sourcecode zeigt jedoch, dass es sich in Wirklichkeit ebenfalls um eine aus mehreren Dateien bestehende Webanwendung handelt. Der Endanwender erhält lediglich eine „kompilierte“ Version, in der alle benötigten Dateien in einem nur schwer lesbaren Zeichensalat zusammengefügt wurden. Einfaches Prinzip, geniale Wirkung. Modifizierungen am Script sind hierbei aber nur schwer möglich, sodass es sich empfiehlt, diese Veränderungen in Plugins auszulagern, das Script als Quellcode zu betreiben oder es mit eigenen Veränderungen selbst zu kompilieren. Seinen Zweck erfüllt es allemal out-of-the-box und unterstützt sogar mehrere Datenbanksysteme, wovon man beim eher plumpen phpMyAdmin nur träumen kann.

Im Hinblick auf ausgewachsene Contentmanager ist es letztendlich natürlich schwer machbar, solche Systeme auf die sprichwörtliche Größe einer Haselnuss zu quetschen. Diese Systeme können und sollen so offen wie möglich bleiben, um dem Endanwender das beste Maß an Anpassungsmöglichkeiten zu bieten. Es ist außerdem wenig sinnvoll, eine Programmiersprache wie php zu entwickeln, wenn deren Möglichkeiten am Ende kaum ausgenutzt werden. Doch gerade am letztgenannten Beispiel zeigt sich, dass es auch Fälle gibt, in denen man nicht mit Kanonen auf Spatzen schießen muss, um an sein Ziel zu gelangen.

Druckansicht

Internationale Software

Wie schwierig ist es eigentlich für einen Programmierer, seine Software zu internationalisieren – also das Anbieten verschiedener Sprachversionen?
Dieser Frage habe ich mich mal am Beispiel des PHP-Scripts zur Administration eines TeamTalk-Servers angenommen. Bisher habe ich immer bereits fertige Vorlagen verwendet und diese übersetzt. Nun aber wollte ich herausfinden, welche Arbeit es macht, Mehrsprachigkeit anzubieten.

Druckansicht

Deutsche Zeitansage mit SmartButler

Der SmartButler ist ein Addon für gängige Instant-Messaging-Programme. Mit ihm ist es möglich, sich durch eine Sprachausgabe die eingehenden Nachrichten oder Statusänderungen der Kontakte vorlesen zu lassen. Zusätzlich bietet der Butler noch allerlei Spielereien, so beispielsweise eine Erinnerungsfunktion, einen News- und Zitatvorleser und eine Benachrichtigung über neue Mails. Aber auch eigene Erweiterungen lassen sich schreiben, Kenntnisse in VBScript oder JAvascript vorausgesetzt. Beispielscripts sind auf der SmartButler-Homepage zu bekommen.

Eines dieser Scripts beinhaltet eine Zeitansage. Diese ist jedoch auf das englische Zeitformat abgestimmt, sodass deutsche Sprachausgaben damit etwas seltsam klingen. Nachdem ich mir den SmartButler installiert und ihn bereits nach kurzer Zeit beherrscht habe, wollte ich mich gleich in die Vollen stürzen und habe mir im Verfahren „Trial and error“ ein eigenes, deutsches Zeitscript geschrieben. Es stellte sich heraus, dass die Aufgabe sogar recht simpel war und das fertige Script viel weniger Codezeilen beinhaltete als das Originalscript, welches ich zum Abgucken und Klauen als Vorlage genommen habe. :) Vermutlich auch deshalb, weil ich zur Wiedergabe der Zeit nur die reine Computerzeit verwende und keine Begriffe wie „viertel“, „halb“ oder „Mitternacht“, wie es im Originalscript der Fall ist. Diese Eventualitäten lassen sich jedoch mit relativ wenig Arbeit nachrüsten. Für den Moment reicht jedoch eine einfache Ansage.

Lange rede, kurzer Sinn:
Hier gibts das Script zum Download!

Die Installation ist recht einfach. Archiv entpacken und die Datei zeitansage.js aufrufen, schon sollte SmartButler die aktuelle Zeit vorlesen. Wer die Ansage anpassen möchte, kann die Datei mit jedem Texteditor öffnen und die entsprechenden Zeilen verändern. Ich habe sie zum besseren Verständnis durchkommentiert.
Die Zeitansage kann nun z. B. sehr gut verwendet werden, um sie mit einer Tastenkombination jederzeit aufzurufen oder auch um mit dem Taskplaner alle halbe Stunde die Zeit wiederzugeben. Viel Spaß damit, Ideen und Änderungen im Code sind sehr willkommen!

Druckansicht