PHP: Получение метаданных удаленного файла.mp3


Я ищу функцию, которая получает метаданные файла .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-файлов.)

Чтобы прояснить мой вопрос: Мне нужна быстрая автономная функция, которая считывает метаданные удаленного файла URL.mp3.

Author: dimitris93, 2014-09-24

1 answers

Эта функция загружает 64 КБ с URL-адреса файла .mp3, затем возвращает массив с метаданными с помощью функции getID3 (которая работает только с локальными файлами .mp3), а затем удаляет ранее загруженные 64 КБ. Проблема с этой функцией заключается в том, что она слишком медленная по своей природе (загружает 64 КБ на .mp3, представьте 1000 mp3-файлов.)

Да, ну и что ты предлагаешь? Как вы ожидаете получить данные, если вы их не получаете? Нет никакого способа иметь общий удаленный HTTP-сервер отправляет вам эти данные ID3. На самом деле, никакой магии нет. Подумайте об этом.

То, что вы делаете сейчас, уже довольно надежно, за исключением того, что оно не обрабатывает все версии ID3 и не будет работать для файлов с более чем 64 КБ тегов ID3. Что бы я сделал, чтобы улучшить его, так это использовать мульти-локон.

Существует несколько доступных классов 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.
}
 1
Author: Brad, 2014-09-24 19:34:12