Changeset 92618 in spip-zone for _plugins_/getID3/trunk/getid3/getid3.php


Ignore:
Timestamp:
Nov 2, 2015, 1:49:55 PM (4 years ago)
Author:
brunobergot@…
Message:

version 1.3.8 : maj de la lib getID3 en version 1.9.10 + maj copyright

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/getID3/trunk/getid3/getid3.php

    r71835 r92618  
    44//  available at http://getid3.sourceforge.net                 //
    55//            or http://www.getid3.org                         //
     6//          also https://github.com/JamesHeinrich/getID3       //
    67/////////////////////////////////////////////////////////////////
    78//                                                             //
     
    1819        define('GETID3_INCLUDEPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
    1920}
     21// Workaround Bug #39923 (https://bugs.php.net/bug.php?id=39923)
     22if (!defined('IMG_JPG') && defined('IMAGETYPE_JPEG')) {
     23        define('IMG_JPG', IMAGETYPE_JPEG);
     24}
    2025
    2126// attempt to define temp dir as something flexible but reliable
     
    2429        $temp_dir = '';
    2530}
    26 if (!$temp_dir && function_exists('sys_get_temp_dir')) {
    27         // PHP v5.2.1+
     31if (!$temp_dir && function_exists('sys_get_temp_dir')) { // sys_get_temp_dir added in PHP v5.2.1
    2832        // sys_get_temp_dir() may give inaccessible temp dir, e.g. with open_basedir on virtual hosts
    2933        $temp_dir = sys_get_temp_dir();
    3034}
    31 $temp_dir = realpath($temp_dir);
     35$temp_dir = @realpath($temp_dir); // see https://github.com/JamesHeinrich/getID3/pull/10
    3236$open_basedir = ini_get('open_basedir');
    3337if ($open_basedir) {
     
    5862}
    5963// $temp_dir = '/something/else/';  // feel free to override temp dir here if it works better for your system
    60 define('GETID3_TEMP_DIR', $temp_dir);
     64if (!defined('GETID3_TEMP_DIR')) {
     65        define('GETID3_TEMP_DIR', $temp_dir);
     66}
    6167unset($open_basedir, $temp_dir);
    6268
     
    98104        public $info;                             // Result array.
    99105        public $tempdir = GETID3_TEMP_DIR;
     106        public $memory_limit = 0;
    100107
    101108        // Protected variables
    102109        protected $startup_error   = '';
    103110        protected $startup_warning = '';
    104         protected $memory_limit    = 0;
    105 
    106         const VERSION           = '1.9.5-20130220';
     111
     112        const VERSION           = '1.9.10-20150914';
    107113        const FREAD_BUFFER_SIZE = 32768;
    108114
     
    114120
    115121                // Check for PHP version
    116                 $required_php_version = '5.0.5';
     122                $required_php_version = '5.3.0';
    117123                if (version_compare(PHP_VERSION, $required_php_version, '<')) {
    118124                        $this->startup_error .= 'getID3() requires PHP v'.$required_php_version.' or higher - you are running v'.PHP_VERSION;
     
    238244
    239245
    240         public function openfile($filename) {
     246        public function openfile($filename, $filesize=null) {
    241247                try {
    242248                        if (!empty($this->startup_error)) {
     
    251257                        $this->info = array();
    252258                        $this->info['GETID3_VERSION']   = $this->version();
    253                         $this->info['php_memory_limit'] = $this->memory_limit;
     259                        $this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false);
    254260
    255261                        // remote files not supported
     
    262268
    263269                        // open local file
    264                         if (is_readable($filename) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) {
     270                        //if (is_readable($filename) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { // see http://www.getid3.org/phpBB3/viewtopic.php?t=1720
     271                        if ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) {
    265272                                // great
    266273                        } else {
    267                                 throw new getid3_exception('Could not open "'.$filename.'" (does not exist, or is not a file)');
    268                         }
    269 
    270                         $this->info['filesize'] = filesize($filename);
     274                                $errormessagelist = array();
     275                                if (!is_readable($filename)) {
     276                                        $errormessagelist[] = '!is_readable';
     277                                }
     278                                if (!is_file($filename)) {
     279                                        $errormessagelist[] = '!is_file';
     280                                }
     281                                if (!file_exists($filename)) {
     282                                        $errormessagelist[] = '!file_exists';
     283                                }
     284                                if (empty($errormessagelist)) {
     285                                        $errormessagelist[] = 'fopen failed';
     286                                }
     287                                throw new getid3_exception('Could not open "'.$filename.'" ('.implode('; ', $errormessagelist).')');
     288                        }
     289
     290                        $this->info['filesize'] = (!is_null($filesize) ? $filesize : filesize($filename));
    271291                        // set redundant parameters - might be needed in some include file
    272                         $this->info['filename']     = basename($filename);
     292                        // filenames / filepaths in getID3 are always expressed with forward slashes (unix-style) for both Windows and other to try and minimize confusion
     293                        $filename = str_replace('\\', '/', $filename);
    273294                        $this->info['filepath']     = str_replace('\\', '/', realpath(dirname($filename)));
     295                        $this->info['filename']     = getid3_lib::mb_basename($filename);
    274296                        $this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename'];
    275297
     
    296318                                                }
    297319                                                $this->info['filesize'] = $real_filesize;
    298                                                 $this->error('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize, 3).'GB) and is not properly supported by PHP.');
     320                                                $this->warning('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize, 3).'GB) and is not properly supported by PHP.');
    299321                                }
    300322                        }
     
    321343
    322344        // public: analyze file
    323         public function analyze($filename) {
     345        public function analyze($filename, $filesize=null, $original_filename='') {
    324346                try {
    325                         if (!$this->openfile($filename)) {
     347                        if (!$this->openfile($filename, $filesize)) {
    326348                                return $this->info;
    327349                        }
     
    353375                        // ID3v2 detection (NOT parsing), even if ($this->option_tag_id3v2 == false) done to make fileformat easier
    354376                        if (!$this->option_tag_id3v2) {
    355                                 fseek($this->fp, 0, SEEK_SET);
     377                                fseek($this->fp, 0);
    356378                                $header = fread($this->fp, 10);
    357379                                if ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) {
     
    364386
    365387                        // read 32 kb file data
    366                         fseek($this->fp, $this->info['avdataoffset'], SEEK_SET);
     388                        fseek($this->fp, $this->info['avdataoffset']);
    367389                        $formattest = fread($this->fp, 32774);
    368390
    369391                        // determine format
    370                         $determined_format = $this->GetFileFormat($formattest, $filename);
     392                        $determined_format = $this->GetFileFormat($formattest, ($original_filename ? $original_filename : $filename));
    371393
    372394                        // unable to determine file format
     
    587609                                                        'module'    => 'au',
    588610                                                        'mime_type' => 'audio/basic',
     611                                                ),
     612
     613                                // AMR  - audio       - Adaptive Multi Rate
     614                                'amr'  => array(
     615                                                        'pattern'   => '^\x23\x21AMR\x0A', // #!AMR[0A]
     616                                                        'group'     => 'audio',
     617                                                        'module'    => 'amr',
     618                                                        'mime_type' => 'audio/amr',
    589619                                                ),
    590620
     
    11621192                                'flac'      => array('vorbiscomment' , 'UTF-8'),
    11631193                                'divxtag'   => array('divx'          , 'ISO-8859-1'),
     1194                                'iptc'      => array('iptc'          , 'ISO-8859-1'),
    11641195                        );
    11651196                }
     
    11821213                                                }
    11831214                                                if ($value) {
    1184                                                         $this->info['tags'][trim($tag_name)][trim($tag_key)][] = $value;
     1215                                                        if (!is_numeric($key)) {
     1216                                                                $this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value;
     1217                                                        } else {
     1218                                                                $this->info['tags'][trim($tag_name)][trim($tag_key)][]     = $value;
     1219                                                        }
    11851220                                                }
    11861221                                        }
     
    11971232                                if ($this->option_tags_html) {
    11981233                                        foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {
    1199                                                 foreach ($valuearray as $key => $value) {
    1200                                                         if (is_string($value)) {
    1201                                                                 //$this->info['tags_html'][$tag_name][$tag_key][$key] = getid3_lib::MultiByteCharString2HTML($value, $encoding);
    1202                                                                 $this->info['tags_html'][$tag_name][$tag_key][$key] = str_replace('&#0;', '', trim(getid3_lib::MultiByteCharString2HTML($value, $encoding)));
    1203                                                         } else {
    1204                                                                 $this->info['tags_html'][$tag_name][$tag_key][$key] = $value;
     1234                                                $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $encoding);
     1235                                        }
     1236                                }
     1237
     1238                                // ID3v1 encoding detection hack start
     1239                                // ID3v1 is defined as always using ISO-8859-1 encoding, but it is not uncommon to find files tagged with ID3v1 using Windows-1251 or other character sets
     1240                                // Since ID3v1 has no concept of character sets there is no certain way to know we have the correct non-ISO-8859-1 character set, but we can guess
     1241                                if ($comment_name == 'id3v1') {
     1242                                        if ($encoding == 'ISO-8859-1') {
     1243                                                if (function_exists('iconv')) {
     1244                                                        foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {
     1245                                                                foreach ($valuearray as $key => $value) {
     1246                                                                        if (preg_match('#^[\\x80-\\xFF]+$#', $value)) {
     1247                                                                                foreach (array('windows-1251', 'KOI8-R') as $id3v1_bad_encoding) {
     1248                                                                                        if (@iconv($id3v1_bad_encoding, $id3v1_bad_encoding, $value) === $value) {
     1249                                                                                                $encoding = $id3v1_bad_encoding;
     1250                                                                                                break 3;
     1251                                                                                        }
     1252                                                                                }
     1253                                                                        }
     1254                                                                }
    12051255                                                        }
    12061256                                                }
    12071257                                        }
    12081258                                }
     1259                                // ID3v1 encoding detection hack end
    12091260
    12101261                                $this->CharConvert($this->info['tags'][$tag_name], $encoding);           // only copy gets converted!
     
    12601311        }
    12611312
    1262 
    12631313        public function getHashdata($algorithm) {
    12641314                switch ($algorithm) {
     
    15661616
    15671617
    1568 abstract class getid3_handler
    1569 {
     1618abstract class getid3_handler {
     1619
     1620        /**
     1621        * @var getID3
     1622        */
    15701623        protected $getid3;                       // pointer
    15711624
     
    15941647        public function AnalyzeString($string) {
    15951648                // Enter string mode
    1596             $this->setStringMode($string);
     1649                $this->setStringMode($string);
    15971650
    15981651                // Save info
     
    16351688                        return substr($this->data_string, $this->data_string_position - $bytes, $bytes);
    16361689                }
    1637             $pos = $this->ftell() + $bytes;
    1638             if (!getid3_lib::intValueSupported($pos)) {
     1690                $pos = $this->ftell() + $bytes;
     1691                if (!getid3_lib::intValueSupported($pos)) {
    16391692                        throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10);
    1640             }
     1693                }
    16411694                return fread($this->getid3->fp, $bytes);
    16421695        }
     
    16581711                        }
    16591712                        return 0;
    1660             } else {
    1661                 $pos = $bytes;
    1662                 if ($whence == SEEK_CUR) {
     1713                } else {
     1714                        $pos = $bytes;
     1715                        if ($whence == SEEK_CUR) {
    16631716                                $pos = $this->ftell() + $bytes;
    1664                 } elseif ($whence == SEEK_END) {
    1665                                 $pos = $this->info['filesize'] + $bytes;
    1666                 }
    1667                 if (!getid3_lib::intValueSupported($pos)) {
     1717                        } elseif ($whence == SEEK_END) {
     1718                                $pos = $this->getid3->info['filesize'] + $bytes;
     1719                        }
     1720                        if (!getid3_lib::intValueSupported($pos)) {
    16681721                                throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10);
    16691722                        }
     
    16831736        }
    16841737
    1685         protected function error($text)
    1686         {
     1738        protected function error($text) {
    16871739                $this->getid3->info['error'][] = $text;
    16881740
     
    16901742        }
    16911743
    1692         protected function warning($text)
    1693         {
     1744        protected function warning($text) {
    16941745                return $this->getid3->warning($text);
    16951746        }
    16961747
    1697         protected function notice($text)
    1698         {
     1748        protected function notice($text) {
    16991749                // does nothing for now
    17001750        }
Note: See TracChangeset for help on using the changeset viewer.