Cara Membaca ID3 Tags Dari File Mp3 Dengan PHP

No Comments
Waktu nyari-nyari mp3 lewat google terus masuk ke situs pencari mp3 seperti beemp3.com dan mp3skull.com, saya jadi penasaran dengan index mp3 yang mereka miliki. Kok bisa ya mereka bisa dapet informasi metadata dari banyak sekali mp3 yang ada di hasil pencarian mereka? padahal kalau saya lihat mereka nggak make 4shared apiKaskus Emoticon :confused

Setelah saya browsing-browsing ternyata dengan PHP bisa juga baca ID3 Tags dari file mp3. Tapi setelah saya pikir-pikir kalau mereka baca satu persatu ID3 Tags dari file mp3 di index mereka, bukannya itu makan resource sangat besar? Bayangin aja kalau harus baca ID3 Tags dari satu juta file mp3 yang ukurannya rata-rata 5MBKaskus Emoticon :takuts

Setelah saya browsing lagi terus ketemu web ini: Read remote MP3/AVI file header/ID3 tag information, saya jadi tau kalau ID3 Tags dari file mp3 bisa dibaca tanpa harus mendownload keseluruhan dari file mp3 yang akan dibaca. Tapi ternyata ada kekurangannya juga. Kalau pake cara ini yang kebaca cuma ID3v2 soalnya ID3v2 ada dibagian awal file sedangkan ID3v1 ada diakhir file. Karena saya nggak tau gimana caranya baca file dari belakang tanpa download keseluruhan file jadinya kalau mau baca ID3v1 mau nggak mau harus download keseluruhan file. Kemarin saya pernah tanya di stackoverflow.com tentang cara baca file dari belakang tanpa download keseluruhan file dan ada yang jawab nggak bisa Kaskus Emoticon :confused

Di PHP untuk membaca ID3 Tags kita bisa menggunakan class getID3. Sebenarnya ada yang lain, banyak mungkin. Saya taunya cuma ini sih Kaskus Emoticon :ngakak

Silahkan download dulu classnya di sini (download). Kalau udah didownload terus extract. Copy folder getid3 karena yang dibutuhkan cuma isi dari folder ini. Karena di sini kita cuma baca ID3 Tags dari file mp3, hapus file selain file-file ini:
1-getid3.lib.php
2-getid3.php
3-module.audio.mp3.php
4-module.tag.apetag.php
5-module.tag.id3v1.php
6-module.tag.id3v2.php
7-module.tag.lyrics3.php
kemudian siapkan contoh file mp3 yang akan dibaca. Di sini saya kasih nama "example.mp3". Contoh penggunaan class ini adalah seperti ini:
1<?php
2include 'getid3/getid3.php';
3$id3=new getid3();
4$id3v2=$id3->analyze('example.mp3');
5print_r($id3v2);
6?>
Kalau sukses kira-kira outputnya seperti ini:
01Array
02(
03    [GETID3_VERSION] => 1.9.3-20111213
04    [filesize] => 6311818
05    [filename] => example.mp3
06    [filepath] => /var/www/script/getid3
07    [filenamepath] => /var/www/script/getid3/example.mp3
08    [avdataoffset] => 2074
09    [avdataend] => 6311690
10    [fileformat] => mp3
11    [audio] => Array
12        (
13            [dataformat] => mp3
14            [channels] => 2
15            [sample_rate] => 44100
16            [bitrate] => 160000
17            [channelmode] => joint stereo
18            [bitrate_mode] => cbr
19            [lossless] =>
20            [encoder_options] => CBR160
21            [compression_ratio] => 0.11337868480726
22            [streams] => Array
23                (
24                    [0] => Array
25                        (
26                            [dataformat] => mp3
27                            [channels] => 2
28                            [sample_rate] => 44100
29                            [bitrate] => 160000
30                            [channelmode] => joint stereo
31                            [bitrate_mode] => cbr
32                            [lossless] =>
33                            [encoder_options] => CBR160
34                            [compression_ratio] => 0.11337868480726
35                        )
36
37                )
38
39        )
40
41    [tags] => Array
42        (
43            [id3v1] => Array
44                (
45                    [title] => Array
46                        (
47                            [0] => Ryuusei
48                        )
49
50                    [artist] => Array
51                        (
52                            [0] => TIA
53                        )
54
55                    [album] => Array
56                        (
57                            [0] => NARUTO BEST HIT COLLECTION 2
58                        )
59...
Contoh diatas kita harus mendownload keseluruhan file. Sedangkan jika hanya membaca bagian file yang diperlukan, cara kerjanya adalah kita download bagian file yang dibutuhkan lalu disimpan di tempat yang telah dipilih, baru kemudian dibaca ID3 Tagsnya.

Biar lebih cepet saya buat 2 fungsi, getPartFile dan getContentLength.
01<?php
02function getPartFile($url, $offset, $limit)
03{
04 $ch=curl_init();
05 curl_setopt($ch, CURLOPT_URL, $url);
06 curl_setopt($ch, CURLOPT_RANGE, $offset.'-'.$limit);
07 curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
08 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
09 $result=curl_exec($ch);
10 curl_close($ch);
11 return $result;
12}
13?>
01<?php
02function getContentLength($url)
03{
04 $ch=curl_init();
05 curl_setopt($ch, CURLOPT_URL, $url);
06 curl_setopt($ch, CURLOPT_NOBODY, 1);
07 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
08 curl_exec($ch);
09 $ContentLength=curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
10 curl_close($ch);
11 return $ContentLength;
12}
13?>
Fungsi getPartFile nanti digunakan untuk mendownload file berdasarkan offset dan limitnya. Misalnya untuk mendownload 1KB/1024 bytes pertama dari sebuah file, maka penggunaanya seperti ini: getPartFile($url,0,1023) Nah karena ukuran file yang didapat dari ID3 Tags adalah ukuran file setelah dipotong tadi (1 KB), jadi untuk mendapatkan ukuran file asli kita pake cURL yang ada pada fungsi getContentLength. Jika ukuran file tidak diketahui atau file tersebut kosong, fungsi ini akan bernilai -1.

Script akhirnya:
01<?php
02include 'getid3/getid3.php';
03
04function getPartFile($url, $offset, $limit)
05{
06 $ch=curl_init();
07 curl_setopt($ch, CURLOPT_URL, $url);
08 curl_setopt($ch, CURLOPT_RANGE, $offset.'-'.$limit);
09 curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
10 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
11 $result=curl_exec($ch);
12 curl_close($ch);
13 return $result;
14}
15
16function getContentLength($url)
17{
18 $ch=curl_init();
19 curl_setopt($ch, CURLOPT_URL, $url);
20 curl_setopt($ch, CURLOPT_NOBODY, 1);
21 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
22 curl_exec($ch);
23 $ContentLength=curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
24 curl_close($ch);
25 return $ContentLength;
26}
27
28$id3=new getid3();
29$id3v2=sys_get_temp_dir().'/temp.mp3';
31$size=getContentLength($url);
32//Jika ukuran file diketahui atau tidak kosong
33if($size!='-1'){
34//Menyimpan file hasil getPartFile($url,0,1023) kedalam tempat yang ada di variabel $id3v2.
35 $firstFile=file_put_contents($id3v2,getPartFile($url,0,1023));
36 $id3v2=$id3->analyze($id3v2);
37 print_r($id3v2);
38}
39else{
40 echo 'File kosong';
41}
42?>

Dear readers, after reading the Content please ask for advice and to provide constructive feedback Please Write Relevant Comment with Polite Language.Your comments inspired me to continue blogging. Your opinion much more valuable to me. Thank you.