2014-09-24 2 views
3

Я ищу функцию, которая получает метаданные файла .mp3 из URL-адреса (НЕ локального файла .mp3 на моем сервере).
Кроме того, я не хочу устанавливать http://php.net/manual/en/id3.installation.php или что-нибудь похожее на мой сервер.
Я ищу автономную функцию.PHP: получить метаданные удаленного файла .mp3

Сейчас я использую эту функцию:

<?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; 
} 
?> 

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

Для того, чтобы мой вопрос ясно (загрузки 64KB на душу .mp3, вообразите 1000 mp3 файлов.): мне нужен быстрый автономный функцию, которая считывает метаданные удаленного файла .mp3.

+2

Так что вы говорите, вы не хотите использовать библиотеку, построенную специально для этого и вместо этого надеется что какой-то пользователь где-то перестроил библиотеку без необходимости установки дополнительных пакетов? – Ohgodwhy

+0

Спрашивая вопросы снова ??? http://stackoverflow.com/questions/25955180/php-get-metadata-of-remote-mp3-file-from-url –

+1

Эта библиотека требует установки на каждом сервере, не так ли? это означает, что если я сменил сервер, мне нужно будет установить эту библиотеку с самого начала. Допустим, я создал веб-сайт .php, который должен использовать эту библиотеку, а затем я хотел его продать. Я должен был бы обучить каждого отдельного покупателя индивидуально, как установить эту библиотеку на своем сервере, чтобы мой .php работал на их сервере? Вы видите мою мысль? – dimitris93

ответ

1

Эта функция загрузки 64KB из URL-файла .mp3, а затем возвращает массив метаданных с помощью функции getID3 (который работает на локальных файлов .mp3 только), а затем удаляет 64KB-х ранее загруженных. Проблема с этой функцией заключается в том, что она слишком медленна по своей природе (загружает 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. 
} 
+0

Я понимаю, что вы имеете в виду. Я не понял, что такое использование класса EpiCurl, нужно ли обрабатывать разные версии ID3? или вы имеете в виду, что $ results [] - это массив, содержащий все URL-адреса, с которых я пытаюсь получить метаданные? – dimitris93

+0

загрузит метаданные из 10 URL-адресов одновременно? – dimitris93

+0

@Shiro Да, этот класс должен сделать несколько HTTP-запросов одновременно. Это позволит вам получить 10 или около того файлов за раз. – Brad