phpmp3id3

Allow unicode when extract ID3 audio tags


I use the PHP code below in order to extract metadatas from MP3 files. it works fine.

But when Title tag contain special characters, then the title is removed autimatically.

How to make it able to work with unicode. Example of title tag : áåðÐáýúíó ?

<?php
$mp3 = 'example.mp3';
$myResult = tagReader($mp3);
print_r($myResult);
function tagReader($file){
    $id3v23 = array ("TIT2","TALB","TPE1","TRCK","TDRC","TLEN","USLT", "TT2");
    $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 = "";
            }
        }
    }

    return $result;
}

?>

Solution

  • Solution:

    <?php
    $mp3 = 'example.mp3';
    $myResult = tagReader($mp3);
    print_r($myResult);
    function unichr($i) {
        return iconv('UCS-4LE', 'UTF-8', pack('V', $i));
    }
    
    function tagReader($file){
        $id3v23 = array ("TIT2","TALB","TPE1","TRCK","TDRC","TLEN","USLT", "TT2");
        $fsize = filesize($file);
        $fd = fopen($file,"r");
        $tag = fread($fd,$fsize);
        $tmp = "";
        fclose($fd);
        if (substr($tag,0,3) == "ID3") {
            $result['FileName'] = $file;
            $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'] = utf8_encode(substr($tmp,13));
                    }
                    $tmp = "";
                }
            }
        }
        return $result;
    }
    ?>