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:
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 ); |
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.