<MeinElement> Ich bin Elementinhalt. </MeinElement>
<html> <!--HTML Eröffnungs-Tag--> <head>...</head> <!--HTML Kopf (z.B. Name)--> <body> <!--HTML Anweisungsteil--> ... </body> <!--Ende Anweisungsteil--> </html> <!--HTML Abschluss-Tag-->
<IMG SRC="PFAD" HEIGTH=X WIDTH=X> <!--X=PIXEL-->
<A HREF="URL/DATEI">TEXT</A>
<OL><LI>....</LI></OL>
<TABLE>....</TABLE>
<FRAMESET>...</FRAMESET>
PHP (Akronym für „PHP: Hypertext Preprocessor“) ist eine weit verbreitete und für den allgemeinen Gebrauch bestimmte Open-Source-Skriptsprache, welche speziell für die Webprogrammierung geeignet ist, und in HTML eingebettet werden kann. Der Unterschied zu herkömmlichen Script-Sprachen ist die serverseitige Ausführung des Quellcodes
<html> <head> <title>Ein PHP-Versuch</title> </head> <body> <?php echo "<p> Hallo Welt </p>"; ?> </body> </html>
<?php //Verzeichnisse bitte alle ohne endenden '/' angeben //Verzeichnis der MP3-Dateien $mp3root='/usr/data/mp3'; //Verzeichnis der PHP-Dateien auf dem Server $root='/srv/www/htdocs/jukebox'; //Pfad zum mpg123 Binary $mpg123='/usr/bin/mpg123'; //Pfad zum id3v2 Binary $id3v2='/usr/bin/id3v2'; ?>
Um viele Seiten Quelltext überschaubar zu halten bietet es sich an, Software in einzelne Abschnitte zu gliedern und dementsprechend in gesonderte Dateien abzuspeichern. In PHP ist der Aufruf der jeweiligen Module mit der include()-Funktion möglich. In diesem Projekt wurde daher folgende Struktur angelegt:
font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-variant: normal; background-color: #CCA241;
a:link {color: #000000;} a:visited {color: #123456;} a:hover {color: #654321;} a:active {color: #111111;}
<?php //ist die Variable "path" definiert? if (!isset($getpath)) { //Pfad-Datei auslesen (hier wird immer der aktuelle Pfad in Textform gespeichert) $setq=file($root."/path"); //ist in der Pfad-Datei kein Pfad enthalten? if ($setq[0]=='') { //öffne Pfad-Datei $setfile = fopen($root."/path", "w"); //schreibe den in der _config.php angegebenen MP3-root-Pfad in Pfad-Datei fwrite($setfile,$mp3root); //Datei schließen fclose($setfile); //Verzeichniswechsel zum MP3-Root-Verzeichnis chdir($mp3root); } else { //ansonsten wechsele zum ausgelesenen Pfad chdir($setq[0]); } } ?>
for ($i=0; $i<=(count($filearr)-1); $i++) { $playlistdir=getcwd(); $addtitle=$playlistdir."/".$filearr[$i]; echo "<a href=\"./index.php?action=add&addtitle=$addtitle\">$filearr[$i]</a>"; }
<?php shell_exec("id3v2 -l mp3datei.mp3 | grep -m 1 Title") //Ausgabe: "Title: Mein Lied Artist: Mein Künstler" ?>
<?php //$title wird vorher festgelegt und enthält den Dateinamen $out=shell_exec($id3v2.' -l '.$title.' |grep -m 1 Title'); //Stringteile vor dem ":" werden entfernt $out=substr($out,strpos($out,':')+1); //Stringteile ab "Artist" werden entfernt $out=substr($out,0,strpos($out,'Artist:')-9); //Ausgabe im Browser: "Titel: Mein Lied" echo "Titel: ".$out; ?>
<html> <head> <title>Web MP3 Jukebox</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body class="body"> <?php //einbinden der Konfigurationsvariablen include("./_config.php"); //abfangen der übergebenen Variablen $getaction=$_GET['action']; $gettitle=$_GET['title']; $getremtitle=$_GET['remtitle']; $getaddtitle=$_GET['addtitle']; $getpath=$_GET['path']; //wenn kein aktueller Titel gesetzt, dann = 0 if (!isset($gettitle)) { $gettitle=0; } //Auswerten der übergebenen Variablen include($root."/switch.php"); ?> <!-- Haupttabelle Start !--> <table width="840" cellpadding="0" cellspacing="0" class="main"> <!-- obere Zeile Start !--> <tr> <!-- Zelle oben links (Player) !--> <td width="420" class="border"> <div></div> <?php include($root.'/player.php'); ?> </td> <!-- Zelle oben rechts (ID3 Informationen) !--> <td width="420" class="border"> <div></div> <?php include($root.'/id3.php'); ?> </td> </tr> <!-- obere Zeile Ende !--> <!-- untere Zeile Start !--> <tr height="400"> <!-- Zelle unten links (Playliste) !--> <td width="420" class="border"> <div></div> <?php include($root.'/playlist.php'); ?> </td> <!-- Zelle unten rechts (Browser) !--> <td width="420" class="border"> <div></div> <?php include($root.'/browser.php'); ?> </td> </tr> <!-- untere Zeile Ende !--> </table> <!-- Haupttabelle Ende !--> </body> </html>
<?php //Länge der Playlist<1? -> Bild für inaktiven Button if (count($playlist)<1) { echo "<td width=\"85\"><img src=\"./pix/player_play_inact.jpg\"></td>"; } //Player spielt gerade? -> Bild für "spielt gerade"-Button elseif ($getaction=='play') { echo "<td width=\"85\"><img src=\"./pix/player_play_play.jpg\"></td>"; } //alle andern Fälle -> Bild für aktiven button und Hyperlink, //um den Player mit entsprechenden Parametern zu starten else { echo "<td width=\"85\"> <a href=\"./index.php?action=play&title=$gettitle\"> <img src=\"./pix/player_play_act.jpg\" class=\"pix\"> </a> </td>"; } ?>
<?php //Playlist aus Datei einlesen $playlist=file($root."/playlist"); //Nummern für die Aufzählung bestimmen for ($k=0; $k<=count($playlist)-1; $k++) { $l=$k+1; if ($l<=9) { $l="0".$l; } //Nummern für die Aufzählung ausgeben echo "<tr width=\"30\"><td>".$l.'. </td>'; //Pfadangabe aus dem String für die Dateinamen entfernen $listtitle=substr_replace($playlist[$k],'',0,strrpos($playlist[$k],"/")+1); echo "<td width="340">"; if ($k==$gettitle) {echo "<b>";} //Link mit Zeiger auf den Titel und Dateinamen ausgeben echo "<a href=\"./index.php?action=play&title=$k\">$listtitle</a>"; if ($k==$gettitle) {echo '</b>';} echo "</td>"; //"X" zum entfernen des Titels mit Zeiger auf den Titel ausgeben echo "<td width=\"10\"> <a href=\"./index.php?action=remove&remtitle=$k\" class=\"rem\">X</a>" ."</td></tr>"; } echo "</table></td></tr>"; //falls Titel in Playlist vorhanden, "remove all" Button aktivieren if (count($playlist)>=1) { echo "<tr valign=\"bottom\"><td><br><p> <a href=\"./index.php?action=removeall\" class=\"rem\">remove all</a> </p></td></tr>"; } ?>
<?php switch($getaction) { //[...] case 'play': //falls Player noch spielt, Prozess beenden exec('killall mpg123'); //Playliste aus Datei in Array einlesen $playlist=file($root.'/playlist'); //zu spielenden Title aus Array auswählen $title=$playlist[$gettitle]; //Leerzeichen für die Übergabe an die Konsole entfernen $title=str_replace(' ','\ ',$title); //Zeilenumbrüche für die Übergabe an die Konsole entfernen $title=ereg_replace("[\n\r]","\ ",$title); //String zur Konsolenübergabe $execstr=$mpg123.' '.$title.' 1>/dev/null 2>&1 &'; //Bsp: $execstr="/usr/bin/mpg123 /verzeichnis/kuenstler/lied.mp3 1>/dev/null 2>&1 &"; //zur Unterdrückung von Rückmeldungen der Konsole: //"1>/dev/null 2>&1 &" (Browserfenster friert sonst ein) //übergebe Zeichenstring an die Kommandozeile exec($execstr); //Ende "case" Bereich break; } ?>
Die Entwicklung dieses Players war mit dem Hintergedanken verbunden, einen in unserer Studenten-WG bereits vorhandenen Linux-Router (ohne grafische Oberfläche, Monitor, Tastatur etc.) als Jukebox für Küche, Bad oder Flur zu betreiben. Nach intensiver Recherche im Internet fanden wir zwar zahlreiche Möglichkeiten, diese Aufgabe zu realisieren, jedoch erschien uns keine der Lösungen akzeptabel. Der Player sollte plattformunabhängig, von jedem Rechner im WG-Netz erreichbar und steuerbar sein. Ein Webinterface erschien also am einfachsten und für den nicht sonderlich leistungsstarken WG-Router am meisten ressourcensparend.
Die Suche nach geeigneten Konsolenprogrammen zum Apspielen der MP3-Dateien und zum Auslesen der ID3-Tags führte uns zu den o.g. MPG123 und ID3V2. Eine einfache Installation in das Linux System und die simple Handhabung waren dabei, für uns entscheidende, Suchkriterien.
Der Entwicklungsstatus des Players ist momentan auf einem Stand, in dem er problemlos erweitert und verändert werden kann. Ideen für weitere Module wären beispielsweise eine Anzeige der Länge der einzelnen Titel oder eine Art Schiebebalken, um an bestimmte stellen des jeweiligen Musikstückes zu „spulen“.
Alle hier vorgestellten Ausarbeitungen und Implementierungen dürfen frei heruntergeladen, bearbeitet und weiterverbreitet werden. Über ein Feedback von Interessenten und Entwicklern, die sich mit unserem Projekt beschäftigen, würden wir uns sehr freuen.