Файл: system/classes/id3v2.php
Строк: 46
<?php
/* 
    Appointment: Информация о mp3 файле по URL
    File: id3v2.php 
 
*/
class Id3v2 {
    public $error;
    
    private $tags = array(
        'TALB' => 'Album',
        'TCON' => 'Genre',
        'TENC' => 'Encoder',
        'TIT2' => 'Title',
        'TPE1' => 'Artist',
        'TPE2' => 'Ensemble',
        'TYER' => 'Year',
        'TCOM' => 'Composer',
        'TCOP' => 'Copyright',
        'TRCK' => 'Track',
        'WXXX' => 'URL',
        'COMM' => 'Comment'
        );
         
    private function decTag($tag, $type){
        //TODO- handling of comments is quite weird
        //but I don't know how it is encoded so I will leave the way it is for now
        if ($type == 'COMM')
        {
            $tag = substr($tag, 0, 3) . substr($tag, 10);
        }
        //mb_convert_encoding is corrupted in some versions of PHP so I use iconv
        switch (ord($tag[2]))
        {
            case 0: //ISO-8859-1
                    return iconv('cp1251', 'UTF-8', substr($tag, 3));
            case 1: //UTF-16 BOM
                    return iconv('UTF-16LE', 'UTF-8', substr($tag, 5));
            case 2: //UTF-16BE
                    return iconv('UTF-16BE', 'UTF-8', substr($tag, 5));
            case 3: //UTF-8
                    return substr($tag, 3);
        }
        return false;
    }
    
    public function read($file){
        $f = fopen($file, 'r');
        $header = fread($f, 10);
        $header = @unpack("a3signature/c1version_major/c1version_minor/c1flags/Nsize", $header);
        if (!$header['signature'] == 'ID3')
        {
            $this->error = 'This file does not contain ID3 v2 tag';        
            fclose($f);
            return false;        
        }
           $result = array();
        for ($i=0; $i<22; $i++)
        {
            $tag = rtrim(fread($f, 6));
            
            if (!isset($this->tags[$tag])) break;
            
            $size = fread($f, 2);
            $size = @unpack('n', $size);
            $size = $size[1]+2;
    
            $value = fread($f, $size);    
            $value = $this->decTag($value, $tag);
    
            $result[$this->tags[$tag]] = $value;
        }
        
        fclose($f);
          return $result;    
    }    
}