2011-04-18 51 views
1

它適用於本地文件,但不適用於外部域。這裏是我的代碼(這是我從http://www.barattalo.it/2010/02/22/reading-mp3-informations-with-php-id3-tags/了):filesize()stat無法獲取MP3文件的ID3標籤

<? 
function tagReader($file){ 
$id3v23 = array("TIT2","TALB","TPE1","TRCK","TDRC","TLEN","USLT"); 
$id3v22 = array("TT2","TAL","TP1","TRK","TYE","TLE","ULT"); 
$fsize = filesize($file); 
$fd = fopen($file,"r"); 
$tag = fread($fd,$fsize); 
$tmp = ""; 
fclose($fd); 
if (substr($tag,0,3) == "ID3") { 
    $result['FileName'] = $file; 
    $result['TAG'] = substr($tag,0,3); 
    $result['Version'] = hexdec(bin2hex(substr($tag,3,1))).".".hexdec(bin2hex(substr($tag,4,1))); 
} 
if($result['Version'] == "4.0" || $result['Version'] == "3.0"){ 
    for ($i=0;$i<count($id3v23);$i++){ 
     if (strpos($tag,$id3v23[$i].chr(0))!= FALSE){ 
      $pos = strpos($tag, $id3v23[$i].chr(0)); 
      $len = hexdec(bin2hex(substr($tag,($pos+5),3))); 
      $data = substr($tag, $pos, 10+$len); 
      for ($a=0;$a<strlen($data);$a++){ 
       $char = substr($data,$a,1); 
       if($char >= " " && $char <= "~") $tmp.=$char; 
      } 
      if(substr($tmp,0,4) == "TIT2") $result['Title'] = substr($tmp,4); 
      if(substr($tmp,0,4) == "TALB") $result['Album'] = substr($tmp,4); 
      if(substr($tmp,0,4) == "TPE1") $result['Author'] = substr($tmp,4); 
      if(substr($tmp,0,4) == "TRCK") $result['Track'] = substr($tmp,4); 
      if(substr($tmp,0,4) == "TDRC") $result['Year'] = substr($tmp,4); 
      if(substr($tmp,0,4) == "TLEN") $result['Length'] = substr($tmp,4); 
      if(substr($tmp,0,4) == "USLT") $result['Lyric'] = substr($tmp,7); 
      $tmp = ""; 
     } 
    } 
} 
if($result['Version'] == "2.0"){ 
    for ($i=0;$i<count($id3v22);$i++){ 
     if (strpos($tag,$id3v22[$i].chr(0))!= FALSE){ 
      $pos = strpos($tag, $id3v22[$i].chr(0)); 
      $len = hexdec(bin2hex(substr($tag,($pos+3),3))); 
      $data = substr($tag, $pos, 6+$len); 
      for ($a=0;$a<strlen($data);$a++){ 
       $char = substr($data,$a,1); 
       if($char >= " " && $char <= "~") $tmp.=$char; 
      } 
      if(substr($tmp,0,3) == "TT2") $result['Title'] = substr($tmp,3); 
      if(substr($tmp,0,3) == "TAL") $result['Album'] = substr($tmp,3); 
      if(substr($tmp,0,3) == "TP1") $result['Author'] = substr($tmp,3); 
      if(substr($tmp,0,3) == "TRK") $result['Track'] = substr($tmp,3); 
      if(substr($tmp,0,3) == "TYE") $result['Year'] = substr($tmp,3); 
      if(substr($tmp,0,3) == "TLE") $result['Lenght'] = substr($tmp,3); 
      if(substr($tmp,0,3) == "ULT") $result['Lyric'] = substr($tmp,6); 
      $tmp = ""; 
     } 
    } 
} 
return $result; 
} 
$song = tagReader("file.mp3"); 
echo $song[Title]; 
?> 

回答

0

它與本地文件纔有效。你不能通過遠程mp3文件作爲這個功能的參數,這是沒有意義的。文件以fopen()打開,因此它們必須是本地文件。 filesize()同樣的事情。

$fsize = filesize($file); 
    $fd = fopen($file,"r"); 

你究竟想用這個函數加載什麼?你的意思是「它不適用於外部域名」?

該行只能與存儲在與此腳本相同的目錄中的file.mp3一起使用。

$song = tagReader("file.mp3"); 

如果您不能讀取本地文件,那麼您應該檢查該文件的讀取權限。

相同的原因爲什麼filesize()可能不起作用。

建議:應使用字母數字數組索引報價...

echo $song['Title']; // or 
    echo $song["Title"]; 

,而不是

echo $song[Title]; 

是的,它可能工作了,不過,你不應該這樣做。我建議使用單引號以避免在某些特定情況下對變量名稱進行評估(如數組索引,如$array['$index'])。

+0

感謝所有的幫助,我剛開始學習php的繩索... 我可以使用類似file_get_contents()而不是?或者還有另一種方式暫存本地文件?我知道我可以使用curl來wget,但是我無法在我的服務器上運行shell命令。 – robbiest 2011-04-18 23:22:42

+0

或者只是下載文件的第一部分?我需要的所有信息都是正確的... – robbiest 2011-04-18 23:27:00

+0

@robbiest,file_get_contents()可以幫助您獲取遠程文件,而不是在下載後使用此功能。關於ID3v2 ...是的,它在文件流的開頭(ID3v1在最後),但你不知道標籤數據的大小。 ID3v2並不像ID3v1那麼簡單,它可能包含超過這幾個字段(120+)。有時它可能包含非常大量的數據,並且您想要的標籤可能接近標籤流的末尾。您應該更好地學習PHP,以及如何處理流內部,並且您可以在[官方id3v2文檔](http://id3.org/id3v2.3.0)之後編寫自己的ID3v2提取器。 – Wh1T3h4Ck5 2011-04-19 00:07:07