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 apiSetelah 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:
2 | include 'getid3/getid3.php' ; |
4 | $id3v2 = $id3 ->analyze( 'example.mp3' ); |
Kalau sukses kira-kira outputnya seperti ini:
03 | [GETID3_VERSION] => 1.9.3-20111213 |
05 | [filename] => example.mp3 |
06 | [filepath] => /var/www/script/getid3 |
07 | [filenamepath] => /var/www/script/getid3/example.mp3 |
08 | [avdataoffset] => 2074 |
09 | [avdataend] => 6311690 |
15 | [sample_rate] => 44100 |
17 | [channelmode] => joint stereo |
20 | [encoder_options] => CBR160 |
21 | [compression_ratio] => 0.11337868480726 |
28 | [sample_rate] => 44100 |
30 | [channelmode] => joint stereo |
33 | [encoder_options] => CBR160 |
34 | [compression_ratio] => 0.11337868480726 |
57 | [0] => NARUTO BEST HIT COLLECTION 2 |
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.
02 | function getPartFile( $url , $offset , $limit ) |
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 ); |
02 | function getContentLength( $url ) |
05 | curl_setopt( $ch , CURLOPT_URL, $url ); |
06 | curl_setopt( $ch , CURLOPT_NOBODY, 1); |
07 | curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); |
09 | $ContentLength =curl_getinfo( $ch , CURLINFO_CONTENT_LENGTH_DOWNLOAD); |
11 | return $ContentLength ; |
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:
02 | include 'getid3/getid3.php' ; |
04 | function getPartFile( $url , $offset , $limit ) |
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 ); |
16 | function getContentLength( $url ) |
19 | curl_setopt( $ch , CURLOPT_URL, $url ); |
20 | curl_setopt( $ch , CURLOPT_NOBODY, 1); |
21 | curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); |
23 | $ContentLength =curl_getinfo( $ch , CURLINFO_CONTENT_LENGTH_DOWNLOAD); |
25 | return $ContentLength ; |
29 | $id3v2 =sys_get_temp_dir(). '/temp.mp3' ; |
31 | $size =getContentLength( $url ); |
35 | $firstFile = file_put_contents ( $id3v2 ,getPartFile( $url ,0,1023)); |
36 | $id3v2 = $id3 ->analyze( $id3v2 ); |