[PHP] Odczyt tagów IDv3 z MP3

Kazdy z uzytkownikow komputera sluchal na nim muzyki. Zostalismy juz przyzwyczajeni do tak zwanych tagów IDv3. Ale jak je odczytac za pomoca PHP?

W gruncie rzeczy sprawa nie jest taka prosta jak moglo by się wydawać. Najlepszym wyjściem będzie skorzystanie z klasy autorstwa T. Oliveira.

Kod klasy znajduje sie poniżej:

(wersja z kolorowaniem)

get_frame_size($aux);

$flags = substr($text,8,2);

$info = substr($text,11,$size-1);

if ($size!= 0){

$tags[$ID] = $info;

$this->tags_count++;

}

$text = substr($text,10+$size,strlen($text));

}

}

/********************/

/**public functions**/

/********************/

/**Constructor**/

function ID3($file_name){

$this->file_name = $file_name;

$this->last_error_num = 0;

}

/**Read the file and put the TAGS

content on $this->tags array**/

function getInfo(){

if ($this->file_name!= ”){

$mp3 = @fopen($this->file_name,”r”);

$header = @fread($mp3,10);

if (!$header) {

$this->last_error_num = 2;

return false;

die();

}

if (substr($header,0,3) != „ID3″){

$this->last_error_num = 3;

return false;

die();

}

$header = bin2hex($header);

$version = base_convert(substr($header,6,2),16,10).”.”.base_convert(substr($header,8,2),16,10);

$flags = base_convert(substr($header,10,2),16,2);

$flags = str_pad($flags,8,0,STR_PAD_LEFT);

if ($flags[7] == 1){

//echo(‚with Unsynchronisation
‚);

}

if ($flags[6] == 1){

//echo(‚with Extended header
‚);

}

if ($flags[5] == 1){//Esperimental tag

$this->last_error_num = 4;

return false;

die();

}

$total = $this->get_frame_size(substr($header,12,8));

$text = @fread($mp3,$total);

fclose($mp3);

$this->extractTags($text,$this->tags);

}

else{

$this->last_error_num = 1;//file not set

return false;

die();

}

return true;

}

/*************

* PUBLIC

* Functions to get information

* from the ID3 tag

**************/

function getArtist(){

if (array_key_exists(‚TPE1’,$this->tags)){

return $this->tags[‚TPE1’];

}else{

$this->last_error_num = 5;

return false;

}

}

function getTrack(){

if (array_key_exists(‚TRCK’,$this->tags)){

return $this->tags[‚TRCK’];

}else{

$this->last_error_num = 5;

return false;

}

}

function getTitle(){

if (array_key_exists(‚TIT2’,$this->tags)){

return $this->tags[‚TIT2’];

}else{

$this->last_error_num = 5;

return false;

}

}

function getAlbum(){

if (array_key_exists(‚TALB’,$this->tags)){

return $this->tags[‚TALB’];

}else{

$this->last_error_num = 5;

return false;

}

}

function getYear(){

if (array_key_exists(‚TYER’,$this->tags)){

return $this->tags[‚TYER’];

}else{

$this->last_error_num = 5;

return false;

}

}

function getGender(){

if (array_key_exists(‚TCON’,$this->tags)){

return $this->tags[‚TCON’];

}else{

$this->last_error_num = 5;

return false;

}

}

}

?>

Klasa składa się z dwóch bloków – odczytu pliku i przetworzenia informacji. Omawianie dokładnego działania klasy nie ma z grubsza sensu ponieważ główną ideą jest proste zastosowanie:)

Oto prosty przykład użycia (zakładam że klasa została zapisana w pliku id3.class.php, wersja z kolorowaniem):

getInfo()){

echo(‚

WykonawcaTytułNr ścieżkiAlbum/Rok wydaniaGatunekKomentarz
‚. $myId3->getArtist() . ‚&nbsp‚. $myId3->getTitle() . ‚&nbsp‚. $myId3->getTrack() . ‚&nbsp‚. $myId3->getAlbum() . ‚/’.$myId3->getYear().’&nbsp‚. $myId3->getGender() . ‚&nbsp‚. $myId3->tags[‚COMM’]. ‚&nbsp

‚);

}else{

echo($errors[$myId3->last_error_num]);

}

?>

Jak widać użycie jest proste i intuicyjne. Jeśli ktos ma wątpliwości bądź pytania zapraszam do komentarzy poniżej:)

0
Zamknij

Choć staramy się je ograniczać, wykorzystujemy mechanizmy takie jak ciasteczka, które pozwalają naszym partnerom na śledzenie Twojego zachowania w sieci. Dowiedz się więcej.