2011-07-06 10 views
2

私は何か私のメディアサーバーからid3タグを取得するために取り組んでいます。私は私が(でもスペースを含む)単純なパスにこのファイルをコピーしたmp3の

<?php 
// From here: http://www.autistici.org/ermes/index.php?pag=1&post=15 
// and fixed here: http://www.barattalo.it 
// ------------------------------ 
// example: 
// print_r(tagReader ("myfile.mp3")); 
// ------------------------------ 
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, 9+$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['Lenght'] = 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; 
} 

とsubsequestコール

print_r(tagReader("/mnt/data/downloads/music/Arctic Monkeys/Who The F Are Arctic Monkeys_ - EP/05 Who The F Are Arctic Monkeys_.mp3")); 

のうち、ID3タグを掘り見つかり方法を持っており、この方法は正しく動作します。長いファイル名では動作していないようです。私は\でスペースをエスケープしようとしましたが、動作しませんでした。

+2

エラーは何ですか?ファイルが読み込み可能であり、存在していますか? –

+1

エラー報告と表示を有効にしてください: 'error_reporting(-1); ini_set( 'display_errors'、1); 'エラーが発生した場合は、同じ操作をもう一度行います。私はあなたがあなたの質問に追加することができますエラーメッセージが表示されることを前提としています。 – hakre

+1

WebサーバーのユーザーIDに/ mnt/dataから読み取る権限がありますか? –

答えて

0

、私はエラー報告をオンに終わった:PHPを見て、次のスクリプトを使用してファイルを読み取ることができるかどうかを確認できます。エラーが発生したので、私はFatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 13484377 bytes) in /opt/share/www/hi.php on line 16を得ました。ini_set("memory_limit","20M");を追加しました。それを修正しました。

1

素敵な小さなスクリプト!普及しているメディア共有サイトでは、PHPを使ってMP3のメディア処理をしています。私たちは常に、コマンドラインツールを使ってID3タグを読み込んでいます。私はPHPの中だけでそれらのタグを読むためのスクリプトを取得したことはありません。

とにかく、パスをエスケープする必要はありません。 PHPはそれがなくても基礎となるOSに適切に通信します。

あなたが与えた/mnt/data/...パスを再作成して、あなたが与えたのとまったく同じファイル名で私自身のMP3ファイルを置きました。また、スクリプトの先頭にerror_reporting(E_ALL);を追加してエラー報告を有効にしました。このスクリプトにはエラーはなく、私のMP3ファイルにはID3タグが正しく表示されていました。

ファイルは、あなたが考えていたパスにないか、おそらく/mnt/dataマウントポイントに問題があります。あなたはこれらの事をチェックしましたか?私は実際に上記のコメントを投稿

<?php 
    $path = "/mnt/data/downloads/music/Arctic Monkeys/Who The F Are Arctic Monkeys_ - EP/05 Who The F Are Arctic Monkeys_.mp3"; 
    if (!is_file($path)) { 
     throw new Exception("No such file"); 
    } else if (!is_readable($path)) { 
     throw new Exception("Path exists, but is not readable"); 
    } 
?> 
関連する問題