Я ищу функцию, которая получает метаданные файла .mp3 с URL-адреса (НЕ локального файла .mp3 на моем сервере).
Кроме того, я не хочу устанавливать http://php.net/manual/en/id3.installation.php или что-нибудь похожее на мой сервер.
Я ищу отдельную функцию.
Прямо сейчас я использую эту функцию:
<?php
function getfileinfo($remoteFile)
{
$url=$remoteFile;
$uuid=uniqid("designaeon_", true);
$file="../temp/".$uuid.".mp3";
$size=0;
$ch = curl_init($remoteFile);
//==============================Get Size==========================//
$contentLength = 'unknown';
$ch1 = curl_init($remoteFile);
curl_setopt($ch1, CURLOPT_NOBODY, true);
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_HEADER, true);
curl_setopt($ch1, CURLOPT_FOLLOWLOCATION, true); //not necessary unless the file redirects (like the PHP example we're using here)
$data = curl_exec($ch1);
curl_close($ch1);
if (preg_match('/Content-Length: (\d+)/', $data, $matches)) {
$contentLength = (int)$matches[1];
$size=$contentLength;
}
//==============================Get Size==========================//
if (!$fp = fopen($file, "wb")) {
echo 'Error opening temp file for binary writing';
return false;
} else if (!$urlp = fopen($url, "r")) {
echo 'Error opening URL for reading';
return false;
}
try {
$to_get = 65536; // 64 KB
$chunk_size = 4096; // Haven't bothered to tune this, maybe other values would work better??
$got = 0; $data = null;
// Grab the first 64 KB of the file
while(!feof($urlp) && $got < $to_get) { $data = $data . fgets($urlp, $chunk_size); $got += $chunk_size; } fwrite($fp, $data); // Grab the last 64 KB of the file, if we know how big it is. if ($size > 0) {
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RESUME_FROM, $size - $to_get);
curl_exec($ch);
// Now $fp should be the first and last 64KB of the file!!
@fclose($fp);
@fclose($urlp);
} catch (Exception $e) {
@fclose($fp);
@fclose($urlp);
echo 'Error transfering file using fopen and cURL !!';
return false;
}
$getID3 = new getID3;
$filename=$file;
$ThisFileInfo = $getID3->analyze($filename);
getid3_lib::CopyTagsToComments($ThisFileInfo);
unlink($file);
return $ThisFileInfo;
}
?>
Эта функция загружает 64 КБ из URL-адреса файла .mp3, а затем возвращает массив с метаданными, используя getID3
функция (которая работает на local .mp3 files only
), а затем удаляет ранее загруженные 64 КБ.
Проблема этой функции в том, что она слишком медленная по своей природе (загружает 64 КБ на .mp3, представьте 1000 mp3-файлов.)
Чтобы прояснить мой вопрос: Мне нужен быстрый автономный функция, которая читает метаданные удаленного файла .mp3 URL.
Эта функция загружает 64 КБ из URL-адреса файла .mp3, затем возвращает массив с метаданными с помощью функции getID3 (которая работает только с локальными файлами .mp3), а затем удаляет ранее загруженные файлы размером 64 КБ. Проблема этой функции в том, что она слишком медленная по своей природе (загружает 64 КБ на .mp3, представьте 1000 mp3-файлов.)
Да, хорошо, что ты предлагаешь? Как вы ожидаете получить данные, если вы не получаете данные? Невозможно заставить общий удаленный HTTP-сервер отправить вам эти данные ID3. На самом деле, нет волшебства. Думаю об этом.
То, что вы делаете сейчас, уже довольно солидно, за исключением того, что оно не обрабатывает все версии ID3 и не будет работать для файлов с более чем 64 КБ тегов ID3. Чтобы улучшить его, я бы использовал multi-cURL.
Есть несколько доступных классов PHP, которые делают это проще:
https://github.com/jmathai/php-multi-curl
$mc = EpiCurl::getInstance();
$results[] = $mc->addUrl(/* Your stream URL here /*); // Run this in a loop, 10 at a time or so
foreach ($results as $result) {
// Do something with the data.
}
Других решений пока нет …