5.3 MP3_ID 

Besprochene Version: 1.1.3 | Lizenz: LGPL |
Klassendatei(en): MP3/Id.php |
Alexander Merzs Klasse MP3_ID eröffnet Ihnen die Möglichkeit, die ID3-Tags, die in MP3-Dateien enthalten sein können, zu lesen und zu manipulieren. Im ID3-Tag sind Informationen wie Titel, Interpret oder Genre enthalten. Darüber hinaus kann das Paket auch weitere Informationen wie die Bitrate oder die Lauflänge eines Stücks extrahieren. Dazu ist es allerdings notwendig, die Datei genauer zu inspizieren, was relativ viel Rechenleistung erfordert. Der Konstruktor erfordert keinen Parameter.
require_once("MP3/Id.php"); // neues Objekt instanziieren $myMP3=new MP3_Id(); // Datei einlesen $erg=$myMP3->read("51st_State.mp3"); if (PEAR::isError($erg)) { echo $erg->getMessage(); }
Die Datei wird mit der Methode read() eingelesen, die im Fehlerfall ein PEAR_Error-Objekt zurückgibt. Danach enthält das MP3_Id-Objekt alle Informationen, die direkt aus der Datei ausgelesen werden können. Um diese Daten weiterzuverarbeiten, steht die Methode getTag() zur Verfügung. Sie bekommt als ersten Parameter den Namen des Tags übergeben, das ausgelesen werden soll. Der zweite, optionale Parameter bestimmt den Wert, der zurückgegeben wird, wenn das gesuchte Tag nicht gefunden wird. In Tabelle 5.1 finden Sie die Tags, die direkt aus der Datei ausgelesen werden können. Allerdings kann es passieren, dass die Tags keine Informationen enthalten, da der Ersteller der Datei selbst dafür sorgen muss, dass die Felder gefüllt sind.
In der Version 2 [Weitere Informationen zu den Tags finden Sie unter www.id3.org. ] des ID3-Tags sind darüber hinaus noch Felder für den Liedtext oder ein Bild vorhanden. Allerdings scheint diese Version zurzeit kaum genutzt zu werden und wird derzeit auch noch nicht von der Klasse unterstützt. Es erscheint auch unwahrscheinlich, dass das Format sich in Zukunft weiter verbreiten wird, da eine der großen Stärken von MP3-Dateien ihre geringe Größe ist, die durch enthaltene Songtexte oder Ähnliches verloren gehen würde.
Möchten Sie nun also den Interpreten und den Titel eines Stücks ausgeben, sähe das so aus:
require_once("MP3/Id.php"); $myMP3=new MP3_Id(); $myMP3->read("51st_State.mp3"); echo ($myMP3->getTag("artists"))."<br />"; echo $myMP3->getTag("name"); // Ausgabe: // New Model Army // 51st State
Sie sehen schon, dass das Auslesen dieser Informationen wirklich sehr einfach ist. Genauso einfach können Sie Daten auch neu schreiben, wozu die Methode setTag() vorgesehen ist. Sie bekommt das Tag übergeben, das einen neuen Wert erhalten soll, und den dazugehörigen Wert. Bitte beachten Sie hierbei die maximalen Längen, die in Tabelle 5.1 angegeben sind. Ist ein Wert zu groß für das vorgesehene Feld, wird er ignoriert.
Ein wenig hinterhältig ist, dass Sie die Nummer des Genres nicht direkt setzen können. Es ist nur möglich, mithilfe von setTag("genre","Rock"); ein gültiges Genre zu selektieren. Das System bestimmt dann die dazugehörige Genre-Nummer, die dann im Tag abgelegt wird. Sollten Sie das Tag genreno manipuliert haben, so wird der dort enthaltene Wert überschrieben. Eine Liste aller verfügbaren Stilrichtungen können Sie sich mit
ausgeben lassen. Die Methode liefert ein indiziertes Array zurück, mit dem Sie natürlich auch weiterarbeiten können. In diesem Zusammenhang könnten die Methoden getGenre() und getGenreNo() hilfreich sein, die beide nicht statisch aufgerufen werden können. Die erste bekommt die Nummer eines Genres übergeben und liefert den Klartext-Namen zurück. Die zweite stellt die Umkehrung dazu dar, bekommt also den Namen eines Genres übergeben und liefert die korrespondierende Nummer zurück. Die Methode akzeptiert noch einen zweiten Parameter, mit dem Sie den Rückgabewert bestimmen können, falls das Genre nicht gefunden wird. Sollten Sie diesen zweiten Parameter nicht nutzen, gibt die Methode den Wert 0xFF bzw. 255 zurück, wenn das Genre nicht gefunden wird.
Möchten Sie alle Tags leeren, steht die Methode remove() zur Verfügung. Häufiger wird jedoch der Fall vorkommen, dass Sie eine relativ große Anzahl von MP3-Dateien mit ähnlichen Tags versehen müssen. Wenn Sie also beispielsweise alle Lieder einer CD mit Tags versehen wollen, sind die Tags artists, album und year immer identisch. In einem solchen Fall können Sie mithilfe der Methode copy() alle Tags aus einem »Master-Objekt« in die anderen Objekte hineinkopieren.
Nachdem Sie die Inhalte der gewünschten Tags verändert haben, können Sie die Datei mithilfe der Methode write() wieder speichern. Auch write() gibt im Fehlerfall ein PEAR_Error-Objekt zurück.
require_once("MP3/Id.php"); $master=new MP3_Id(); // "Master-MP3" einlesen $master->read("51st_State.mp3"); //Objekt fuer "leeres" MP3 $myMP3=new MP3_Id(); $myMP3->read("EmptyMP3.php"); // Daten kopieren $myMP3->copy($master); // Titel der Datei setzen $myMP3->setTag("name","Green and Grey"); // Datei schreiben $myMP3->write();
Möchten Sie einen tieferen Einblick in die Struktur der Datei bekommen, kann das Paket die Datei auch für Sie analysieren, die Bit-Rate, die Laufzeit und Ähnliches ermitteln. Hierzu können Sie entweder dem Konstruktor ein true als zweiten Parameter übergeben oder die Methode study() nutzen. Im ersten Fall wird die Datei sofort nach dem Einlesen analysiert, im zweiten erst nach dem Aufruf von study(). Da das Analysieren der Datei einen deutlich höheren Aufwand verursacht, sollten Sie diesen Schritt nur dann ausführen, wenn es wirklich nötig ist. Wenn Sie z. B. einen Server zum Verwalten Ihrer MP3-Dateien erstellen möchten, sollten Sie die Daten einmal ermitteln, wenn neue MP3s hinzugefügt werden, und diese dann in einer Datenbank oder Datei ablegen.
Nachdem die Datei analysiert wurde, stehen zusätzlich zu den schon genannten Tags die in Tabelle 5.2 erläuterten Tags zur Verfügung.