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 api
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 5MB
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
Di PHP untuk membaca ID3 Tags kita bisa menggunakan class getID3. Sebenarnya ada yang lain, banyak mungkin. Saya taunya cuma ini sih
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:
kemudian siapkan contoh file mp3 yang akan dibaca. Di sini saya kasih
nama "example.mp3". Contoh penggunaan class ini adalah seperti ini:
Kalau sukses kira-kira outputnya seperti ini:
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.
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:

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 5MB

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

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

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 |
1 | <?php |
2 | include 'getid3/getid3.php' ; |
3 | $id3 = new getid3(); |
4 | $id3v2 = $id3 ->analyze( 'example.mp3' ); |
5 | print_r( $id3v2 ); |
6 | ?> |
01 | Array |
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 | ... |
Biar lebih cepet saya buat 2 fungsi, getPartFile dan getContentLength.
01 | <?php |
02 | function 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 |
02 | function 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 | ?> |
Script akhirnya:
01 | <?php |
02 | include 'getid3/getid3.php' ; |
03 |
04 | function 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 |
16 | function 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' ; |
30 | $url = 'http://example.com/example.mp3' ; |
31 | $size =getContentLength( $url ); |
32 | //Jika ukuran file diketahui atau tidak kosong |
33 | if ( $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 | } |
39 | else { |
40 | echo 'File kosong' ; |
41 | } |
42 | ?> |