Changeset 96229 in spip-zone


Ignore:
Timestamp:
Mar 28, 2016, 10:58:10 AM (3 years ago)
Author:
brunobergot@…
Message:

report de r96228

maj de la lib getid3 en version 1.9.12 + ajout de getid3 et mejs aux crédits

ref ​https://core.spip.net/issues/3693

Location:
_core_/branches/spip-3.1/plugins/medias
Files:
30 edited
1 copied

Legend:

Unmodified
Added
Removed
  • _core_/branches/spip-3.1/plugins/medias

  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/extension.cache.dbm.php

    r85814 r96229  
    7575
    7676        // public: constructor - see top of this file for cache type and cache_options
    77         public function getID3_cached_dbm($cache_type, $dbm_filename, $lock_filename) {
     77        public function __construct($cache_type, $dbm_filename, $lock_filename) {
    7878
    7979                // Check for dba extension
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/extension.cache.mysql.php

    r93092 r96229  
    8181
    8282        // public: constructor - see top of this file for cache type and cache_options
    83         public function getID3_cached_mysql($host, $database, $username, $password, $table = 'getid3_cache') {
     83        public function __construct($host, $database, $username, $password, $table='getid3_cache') {
    8484
    8585                // Check for mysql support
     
    135135
    136136        // public: analyze file
    137         public function analyze($filename, $filesize = null, $original_filename = '') {
     137        public function analyze($filename, $filesize=null, $original_filename='') {
    138138
    139139                if (file_exists($filename)) {
     
    176176
    177177        // private: (re)create sql table
    178         private function create_table($drop = false) {
     178        private function create_table($drop=false) {
    179179
    180180                $SQLquery  = 'CREATE TABLE IF NOT EXISTS `'.mysql_real_escape_string($this->table).'` (';
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/extension.cache.sqlite3.php

    r93092 r96229  
    9797        * @return type
    9898        */
    99         public function __construct($table = 'getid3_cache', $hide = false) {
     99        public function __construct($table='getid3_cache', $hide=false) {
    100100                $this->table = $table; // Set table
    101101                $file = dirname(__FILE__).'/'.basename(__FILE__, 'php').'sqlite';
     
    160160        * @return boolean
    161161        */
    162         public function analyze($filename, $filesize = null, $original_filename = '') {
     162        public function analyze($filename, $filesize=null, $original_filename='') {
    163163                if (!file_exists($filename)) {
    164164                        return false;
     
    166166                // items to track for caching
    167167                $filetime = filemtime($filename);
    168                 $filesize = filesize($filename);
     168                $filesize_real = filesize($filename);
    169169                // this will be saved for a quick directory lookup of analized files
    170170                // ... why do 50 seperate sql quries when you can do 1 for the same result
     
    174174                $sql = $this->get_id3_data;
    175175                $stmt = $db->prepare($sql);
    176                 $stmt->bindValue(':filename', $filename, SQLITE3_TEXT);
    177                 $stmt->bindValue(':filesize', $filesize, SQLITE3_INTEGER);
    178                 $stmt->bindValue(':filetime', $filetime, SQLITE3_INTEGER);
     176                $stmt->bindValue(':filename', $filename,      SQLITE3_TEXT);
     177                $stmt->bindValue(':filesize', $filesize_real, SQLITE3_INTEGER);
     178                $stmt->bindValue(':filetime', $filetime,      SQLITE3_INTEGER);
    179179                $res = $stmt->execute();
    180180                list($result) = $res->fetchArray();
     
    183183                }
    184184                // if it hasn't been analyzed before, then do it now
    185                 $analysis = parent::analyze($filename, $filesize=null, $original_filename='');
     185                $analysis = parent::analyze($filename, $filesize, $original_filename);
    186186                // Save result
    187187                $sql = $this->cache_file;
    188188                $stmt = $db->prepare($sql);
    189                 $stmt->bindValue(':filename', $filename, SQLITE3_TEXT);
    190                 $stmt->bindValue(':dirname', $dirname, SQLITE3_TEXT);
    191                 $stmt->bindValue(':filesize', $filesize, SQLITE3_INTEGER);
    192                 $stmt->bindValue(':filetime', $filetime, SQLITE3_INTEGER);
    193                 $stmt->bindValue(':atime', time(), SQLITE3_INTEGER);
    194                 $stmt->bindValue(':val', base64_encode(serialize($analysis)), SQLITE3_TEXT);
     189                $stmt->bindValue(':filename', $filename,                           SQLITE3_TEXT);
     190                $stmt->bindValue(':dirname',  $dirname,                            SQLITE3_TEXT);
     191                $stmt->bindValue(':filesize', $filesize_real,                      SQLITE3_INTEGER);
     192                $stmt->bindValue(':filetime', $filetime,                           SQLITE3_INTEGER);
     193                $stmt->bindValue(':atime',    time(),                              SQLITE3_INTEGER);
     194                $stmt->bindValue(':val',      base64_encode(serialize($analysis)), SQLITE3_TEXT);
    195195                $res = $stmt->execute();
    196196                return $analysis;
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/getid3.lib.php

    r93092 r96229  
    1616{
    1717
    18         public static function PrintHexBytes($string, $hex = true, $spaces = true, $htmlencoding = 'UTF-8') {
     18        public static function PrintHexBytes($string, $hex=true, $spaces=true, $htmlencoding='UTF-8') {
    1919                $returnstring = '';
    2020                for ($i = 0; $i < strlen($string); $i++) {
     
    5454
    5555
    56         public static function safe_inc(&$variable, $increment = 1) {
     56        public static function safe_inc(&$variable, $increment=1) {
    5757                if (isset($variable)) {
    5858                        $variable += $increment;
     
    107107
    108108
    109         public static function NormalizeBinaryPoint($binarypointnumber, $maxbits = 52) {
     109        public static function NormalizeBinaryPoint($binarypointnumber, $maxbits=52) {
    110110                // http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html
    111111                if (strpos($binarypointnumber, '.') === false) {
     
    261261
    262262
    263         public static function BigEndian2Int($byteword, $synchsafe = false, $signed = false) {
     263        public static function BigEndian2Int($byteword, $synchsafe=false, $signed=false) {
    264264                $intvalue = 0;
    265265                $bytewordlen = strlen($byteword);
     
    290290
    291291
    292         public static function LittleEndian2Int($byteword, $signed = false) {
     292        public static function LittleEndian2Int($byteword, $signed=false) {
    293293                return self::BigEndian2Int(strrev($byteword), false, $signed);
    294294        }
     
    305305
    306306
    307         public static function BigEndian2String($number, $minbytes = 1, $synchsafe = false, $signed = false) {
     307        public static function BigEndian2String($number, $minbytes=1, $synchsafe=false, $signed=false) {
    308308                if ($number < 0) {
    309309                        throw new Exception('ERROR: self::BigEndian2String() does not support negative numbers');
     
    340340
    341341
    342         public static function Bin2Dec($binstring, $signed = false) {
     342        public static function Bin2Dec($binstring, $signed=false) {
    343343                $signmult = 1;
    344344                if ($signed) {
     
    367367
    368368
    369         public static function LittleEndian2String($number, $minbytes = 1, $synchsafe = false) {
     369        public static function LittleEndian2String($number, $minbytes=1, $synchsafe=false) {
    370370                $intstring = '';
    371371                while ($number > 0) {
     
    440440        }
    441441
    442         public static function fileextension($filename, $numextensions = 1) {
     442        public static function fileextension($filename, $numextensions=1) {
    443443                if (strstr($filename, '.')) {
    444444                        $reversedfilename = strrev($filename);
     
    505505        }
    506506
    507         public static function array_max($arraydata, $returnkey = false) {
     507        public static function array_max($arraydata, $returnkey=false) {
    508508                $maxvalue = false;
    509509                $maxkey = false;
     
    519519        }
    520520
    521         public static function array_min($arraydata, $returnkey = false) {
     521        public static function array_min($arraydata, $returnkey=false) {
    522522                $minvalue = false;
    523523                $minkey = false;
     
    697697
    698698        // ISO-8859-1 => UTF-8
    699         public static function iconv_fallback_iso88591_utf8($string, $bom = false) {
     699        public static function iconv_fallback_iso88591_utf8($string, $bom=false) {
    700700                if (function_exists('utf8_encode')) {
    701701                        return utf8_encode($string);
     
    714714
    715715        // ISO-8859-1 => UTF-16BE
    716         public static function iconv_fallback_iso88591_utf16be($string, $bom = false) {
     716        public static function iconv_fallback_iso88591_utf16be($string, $bom=false) {
    717717                $newcharstring = '';
    718718                if ($bom) {
     
    726726
    727727        // ISO-8859-1 => UTF-16LE
    728         public static function iconv_fallback_iso88591_utf16le($string, $bom = false) {
     728        public static function iconv_fallback_iso88591_utf16le($string, $bom=false) {
    729729                $newcharstring = '';
    730730                if ($bom) {
     
    787787
    788788        // UTF-8 => UTF-16BE
    789         public static function iconv_fallback_utf8_utf16be($string, $bom = false) {
     789        public static function iconv_fallback_utf8_utf16be($string, $bom=false) {
    790790                $newcharstring = '';
    791791                if ($bom) {
     
    830830
    831831        // UTF-8 => UTF-16LE
    832         public static function iconv_fallback_utf8_utf16le($string, $bom = false) {
     832        public static function iconv_fallback_utf8_utf16le($string, $bom=false) {
    833833                $newcharstring = '';
    834834                if ($bom) {
     
    10031003        }
    10041004
    1005         public static function recursiveMultiByteCharString2HTML($data, $charset = 'ISO-8859-1') {
     1005        public static function recursiveMultiByteCharString2HTML($data, $charset='ISO-8859-1') {
    10061006                if (is_string($data)) {
    10071007                        return self::MultiByteCharString2HTML($data, $charset);
     
    10171017        }
    10181018
    1019         public static function MultiByteCharString2HTML($string, $charset = 'ISO-8859-1') {
     1019        public static function MultiByteCharString2HTML($string, $charset='ISO-8859-1') {
    10201020                $string = (string) $string; // in case trying to pass a numeric (float, int) string, would otherwise return an empty string
    10211021                $HTMLstring = '';
     
    11651165
    11661166
    1167         public static function GetDataImageSize($imgData, &$imageinfo = array()) {
     1167        public static function GetDataImageSize($imgData, &$imageinfo=array()) {
    11681168                static $tempdir = '';
    11691169                if (empty($tempdir)) {
     1170                        if (function_exists('sys_get_temp_dir')) {
     1171                                $tempdir = sys_get_temp_dir(); // https://github.com/JamesHeinrich/getID3/issues/52
     1172                        }
     1173
    11701174                        // yes this is ugly, feel free to suggest a better way
    1171                         require_once(dirname(__FILE__).'/getid3.php');
    1172                         $getid3_temp = new getID3();
    1173                         $tempdir = $getid3_temp->tempdir;
    1174                         unset($getid3_temp);
     1175                        if (include_once(dirname(__FILE__).'/getid3.php')) {
     1176                                if ($getid3_temp = new getID3()) {
     1177                                        if ($getid3_temp_tempdir = $getid3_temp->tempdir) {
     1178                                                $tempdir = $getid3_temp_tempdir;
     1179                                        }
     1180                                        unset($getid3_temp, $getid3_temp_tempdir);
     1181                                }
     1182                        }
    11751183                }
    11761184                $GetDataImageSize = false;
     
    13351343        }
    13361344
    1337         public static function IncludeDependency($filename, $sourcefile, $DieOnFailure = false) {
     1345        public static function IncludeDependency($filename, $sourcefile, $DieOnFailure=false) {
    13381346                global $GETID3_ERRORARRAY;
    13391347
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/getid3.php

    r93092 r96229  
    110110        protected $startup_warning = '';
    111111
    112         const VERSION           = '1.9.10-20150914';
     112        const VERSION           = '1.9.12-201602240818';
    113113        const FREAD_BUFFER_SIZE = 32768;
    114114
     
    244244
    245245
    246         public function openfile($filename, $filesize = null) {
     246        public function openfile($filename, $filesize=null) {
    247247                try {
    248248                        if (!empty($this->startup_error)) {
     
    343343
    344344        // public: analyze file
    345         public function analyze($filename, $filesize = null, $original_filename = '') {
     345        public function analyze($filename, $filesize=null, $original_filename='') {
    346346                try {
    347347                        if (!$this->openfile($filename, $filesize)) {
     
    635635                                                ),
    636636
     637                                // DSF  - audio       - Direct Stream Digital (DSD) Storage Facility files (DSF) - https://en.wikipedia.org/wiki/Direct_Stream_Digital
     638                                'dsf'  => array(
     639                                                        'pattern'   => '^DSD ',  // including trailing space: 44 53 44 20
     640                                                        'group'     => 'audio',
     641                                                        'module'    => 'dsf',
     642                                                        'mime_type' => 'audio/dsd',
     643                                                ),
     644
    637645                                // DSS  - audio       - Digital Speech Standard
    638646                                'dss'  => array(
     
    877885                                                        'group'     => 'audio-video',
    878886                                                        'module'    => 'riff',
    879                                                         'mime_type' => 'audio/x-wave',
     887                                                        'mime_type' => 'audio/x-wav',
    880888                                                        'fail_ape'  => 'WARNING',
    881889                                                ),
     
    11051113
    11061114
    1107         public function GetFileFormat(&$filedata, $filename = '') {
     1115        public function GetFileFormat(&$filedata, $filename='') {
    11081116                // this function will determine the format of a file based on usually
    11091117                // the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG,
     
    16311639
    16321640
    1633         public function __construct(getID3 $getid3, $call_module = null) {
     1641        public function __construct(getID3 $getid3, $call_module=null) {
    16341642                $this->getid3 = $getid3;
    16351643
     
    16951703        }
    16961704
    1697         protected function fseek($bytes, $whence = SEEK_SET) {
     1705        protected function fseek($bytes, $whence=SEEK_SET) {
    16981706                if ($this->data_string_flag) {
    16991707                        switch ($whence) {
     
    17501758        }
    17511759
    1752         public function saveAttachment($name, $offset, $length, $image_mime = null) {
     1760        public function saveAttachment($name, $offset, $length, $image_mime=null) {
    17531761                try {
    17541762
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio-video.asf.php

    r93092 r96229  
    16431643        }
    16441644
    1645         public static function FILETIMEtoUNIXtime($FILETIME, $round = true) {
     1645        public static function FILETIMEtoUNIXtime($FILETIME, $round=true) {
    16461646                // FILETIME is a 64-bit unsigned integer representing
    16471647                // the number of 100-nanosecond intervals since January 1, 1601
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio-video.matroska.php

    r93092 r96229  
    12241224        }
    12251225
    1226         private function EnsureBufferHasEnoughData($min_data = 1024) {
     1226        private function EnsureBufferHasEnoughData($min_data=1024) {
    12271227                if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) {
    12281228                        $read_bytes = max($min_data, $this->getid3->fread_buffer_size());
     
    12771277        }
    12781278
    1279         private function readEBMLelementData($length, $check_buffer = false) {
     1279        private function readEBMLelementData($length, $check_buffer=false) {
    12801280                if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) {
    12811281                        return false;
     
    12861286        }
    12871287
    1288         private function getEBMLelement(&$element, $parent_end, $get_data = false) {
     1288        private function getEBMLelement(&$element, $parent_end, $get_data=false) {
    12891289                if ($this->current_offset >= $parent_end) {
    12901290                        return false;
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio-video.mpeg.php

    r93092 r96229  
    503503        }
    504504
    505         private function readBitsFromStream(&$bitstream, &$bitstreamoffset, $bits_to_read, $return_singlebit_as_boolean = true) {
     505        private function readBitsFromStream(&$bitstream, &$bitstreamoffset, $bits_to_read, $return_singlebit_as_boolean=true) {
    506506                $return = bindec(substr($bitstream, $bitstreamoffset, $bits_to_read));
    507507                $bitstreamoffset += $bits_to_read;
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio-video.nsv.php

    r93092 r96229  
    133133        }
    134134
    135         public function getNSVfHeaderFilepointer($fileoffset, $getTOCoffsets = false) {
     135        public function getNSVfHeaderFilepointer($fileoffset, $getTOCoffsets=false) {
    136136                $info = &$this->getid3->info;
    137137                $this->fseek($fileoffset);
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio-video.quicktime.php

    r93092 r96229  
    8080                        $info['avdataend'] = $info['avdataend_tmp'];
    8181                        unset($info['avdataend_tmp']);
     82                }
     83
     84                if (!empty($info['quicktime']['comments']['chapters']) && is_array($info['quicktime']['comments']['chapters']) && (count($info['quicktime']['comments']['chapters']) > 0)) {
     85                        $durations = $this->quicktime_time_to_sample_table($info);
     86                        for ($i = 0; $i < count($info['quicktime']['comments']['chapters']); $i++) {
     87                                $bookmark = array();
     88                                $bookmark['title'] = $info['quicktime']['comments']['chapters'][$i];
     89                                if (isset($durations[$i])) {
     90                                        $bookmark['duration_sample'] = $durations[$i]['sample_duration'];
     91                                        if ($i > 0) {
     92                                                $bookmark['start_sample'] = $info['quicktime']['bookmarks'][($i - 1)]['start_sample'] + $info['quicktime']['bookmarks'][($i - 1)]['duration_sample'];
     93                                        } else {
     94                                                $bookmark['start_sample'] = 0;
     95                                        }
     96                                        if ($time_scale = $this->quicktime_bookmark_time_scale($info)) {
     97                                                $bookmark['duration_seconds'] = $bookmark['duration_sample'] / $time_scale;
     98                                                $bookmark['start_seconds']    = $bookmark['start_sample']    / $time_scale;
     99                                        }
     100                                }
     101                                $info['quicktime']['bookmarks'][] = $bookmark;
     102                        }
     103                }
     104
     105                if (isset($info['quicktime']['temp_meta_key_names'])) {
     106                        unset($info['quicktime']['temp_meta_key_names']);
     107                }
     108
     109                if (!empty($info['quicktime']['comments']['location.ISO6709'])) {
     110                        // https://en.wikipedia.org/wiki/ISO_6709
     111                        foreach ($info['quicktime']['comments']['location.ISO6709'] as $ISO6709string) {
     112                                $latitude  = false;
     113                                $longitude = false;
     114                                $altitude  = false;
     115                                if (preg_match('#^([\\+\\-])([0-9]{2}|[0-9]{4}|[0-9]{6})(\\.[0-9]+)?([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?(([\\+\\-])([0-9]{3}|[0-9]{5}|[0-9]{7})(\\.[0-9]+)?)?/$#', $ISO6709string, $matches)) {
     116                                        @list($dummy, $lat_sign, $lat_deg, $lat_deg_dec, $lon_sign, $lon_deg, $lon_deg_dec, $dummy, $alt_sign, $alt_deg, $alt_deg_dec) = $matches;
     117
     118                                        if (strlen($lat_deg) == 2) {        // [+-]DD.D
     119                                                $latitude = floatval(ltrim($lat_deg, '0').$lat_deg_dec);
     120                                        } elseif (strlen($lat_deg) == 4) {  // [+-]DDMM.M
     121                                                $latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0').$lat_deg_dec / 60);
     122                                        } elseif (strlen($lat_deg) == 6) {  // [+-]DDMMSS.S
     123                                                $latitude = floatval(ltrim(substr($lat_deg, 0, 2), '0')) + floatval(ltrim(substr($lat_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lat_deg, 4, 2), '0').$lat_deg_dec / 3600);
     124                                        }
     125
     126                                        if (strlen($lon_deg) == 3) {        // [+-]DDD.D
     127                                                $longitude = floatval(ltrim($lon_deg, '0').$lon_deg_dec);
     128                                        } elseif (strlen($lon_deg) == 5) {  // [+-]DDDMM.M
     129                                                $longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0').$lon_deg_dec / 60);
     130                                        } elseif (strlen($lon_deg) == 7) {  // [+-]DDDMMSS.S
     131                                                $longitude = floatval(ltrim(substr($lon_deg, 0, 2), '0')) + floatval(ltrim(substr($lon_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($lon_deg, 4, 2), '0').$lon_deg_dec / 3600);
     132                                        }
     133
     134                                        if (strlen($alt_deg) == 3) {        // [+-]DDD.D
     135                                                $altitude = floatval(ltrim($alt_deg, '0').$alt_deg_dec);
     136                                        } elseif (strlen($alt_deg) == 5) {  // [+-]DDDMM.M
     137                                                $altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0').$alt_deg_dec / 60);
     138                                        } elseif (strlen($alt_deg) == 7) {  // [+-]DDDMMSS.S
     139                                                $altitude = floatval(ltrim(substr($alt_deg, 0, 2), '0')) + floatval(ltrim(substr($alt_deg, 2, 2), '0') / 60) + floatval(ltrim(substr($alt_deg, 4, 2), '0').$alt_deg_dec / 3600);
     140                                        }
     141
     142                                        if ($latitude !== false) {
     143                                                $info['quicktime']['comments']['gps_latitude'][]  = (($lat_sign == '-') ? -1 : 1) * floatval($latitude);
     144                                        }
     145                                        if ($longitude !== false) {
     146                                                $info['quicktime']['comments']['gps_longitude'][] = (($lon_sign == '-') ? -1 : 1) * floatval($longitude);
     147                                        }
     148                                        if ($altitude !== false) {
     149                                                $info['quicktime']['comments']['gps_altitude'][]  = (($alt_sign == '-') ? -1 : 1) * floatval($altitude);
     150                                        }
     151                                }
     152                                if ($latitude === false) {
     153                                        $info['warning'][] = 'location.ISO6709 string not parsed correctly: "'.$ISO6709string.'", please submit as a bug';
     154                                }
     155                                break;
     156                        }
    82157                }
    83158
     
    423498                                                                                                        // 64-bit integer
    424499                                                                                                        $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 8));
     500                                                                                                        break;
     501
     502                                                                                                case 'covr':
     503                                                                                                        $atom_structure['data'] = substr($boxdata, 8);
     504                                                                                                        // not a foolproof check, but better than nothing
     505                                                                                                        if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
     506                                                                                                                $atom_structure['image_mime'] = 'image/jpeg';
     507                                                                                                        } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
     508                                                                                                                $atom_structure['image_mime'] = 'image/png';
     509                                                                                                        } elseif (preg_match('#^GIF#', $atom_structure['data'])) {
     510                                                                                                                $atom_structure['image_mime'] = 'image/gif';
     511                                                                                                        }
     512                                                                                                        break;
    425513
    426514                                                                                                case 'atID':
     
    441529                                                                                        if ($atomname == 'covr') {
    442530                                                                                                // not a foolproof check, but better than nothing
    443                                                                                                 if (preg_match('#^\xFF\xD8\xFF#', $atom_structure['data'])) {
     531                                                                                                if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
    444532                                                                                                        $atom_structure['image_mime'] = 'image/jpeg';
    445                                                                                                 } elseif (preg_match('#^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A#', $atom_structure['data'])) {
     533                                                                                                } elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
    446534                                                                                                        $atom_structure['image_mime'] = 'image/png';
    447535                                                                                                } elseif (preg_match('#^GIF#', $atom_structure['data'])) {
     
    9551043                                        $atom_structure['data_references'][$i]['size']                    = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4));
    9561044                                        $drefDataOffset += 4;
    957                                         $atom_structure['data_references'][$i]['type']                    =               substr($atom_data, $drefDataOffset, 4);
     1045                                        $atom_structure['data_references'][$i]['type']                    =                           substr($atom_data, $drefDataOffset, 4);
    9581046                                        $drefDataOffset += 4;
    9591047                                        $atom_structure['data_references'][$i]['version']                 = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 1));
     
    9611049                                        $atom_structure['data_references'][$i]['flags_raw']               = getid3_lib::BigEndian2Int(substr($atom_data,  $drefDataOffset, 3)); // hardcoded: 0x0000
    9621050                                        $drefDataOffset += 3;
    963                                         $atom_structure['data_references'][$i]['data']                    =               substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));
     1051                                        $atom_structure['data_references'][$i]['data']                    =                           substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3));
    9641052                                        $drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3);
    9651053
     
    10311119                                        return false;
    10321120                                }
    1033                                 $info['quicktime']['time_scale'] = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
     1121                                $info['quicktime']['time_scale'] = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
    10341122
    10351123                                $atom_structure['creation_time_unix']    = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
     
    10461134                                $atom_structure['modification_date']      = getid3_lib::BigEndian2Int(substr($atom_data,  0, 4)); // "standard Macintosh format"
    10471135                                $atom_structure['version_number']         = getid3_lib::BigEndian2Int(substr($atom_data,  4, 2)); // hardcoded: 0x00
    1048                                 $atom_structure['atom_type']              =               substr($atom_data,  6, 4);        // usually: 'PICT'
     1136                                $atom_structure['atom_type']              =                           substr($atom_data,  6, 4);        // usually: 'PICT'
    10491137                                $atom_structure['atom_index']             = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01
    10501138
     
    10561144                                $atom_structure['region_size']   = getid3_lib::BigEndian2Int(substr($atom_data,  0, 2)); // The Region size, Region boundary box,
    10571145                                $atom_structure['boundary_box']  = getid3_lib::BigEndian2Int(substr($atom_data,  2, 8)); // and Clipping region data fields
    1058                                 $atom_structure['clipping_data'] =               substr($atom_data, 10);           // constitute a QuickDraw region.
     1146                                $atom_structure['clipping_data'] =                           substr($atom_data, 10);           // constitute a QuickDraw region.
    10591147                                break;
    10601148
     
    11471235                                $atom_structure['creation_time_unix']        = getid3_lib::DateMac2Unix($atom_structure['creation_time']);
    11481236                                $atom_structure['modify_time_unix']          = getid3_lib::DateMac2Unix($atom_structure['modify_time']);
    1149                                 $info['quicktime']['time_scale']    = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
     1237                                $info['quicktime']['time_scale']    = ((isset($info['quicktime']['time_scale']) && ($info['quicktime']['time_scale'] < 1000)) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']);
    11501238                                $info['quicktime']['display_scale'] = $atom_structure['matrix_a'];
    11511239                                $info['playtime_seconds']           = $atom_structure['duration'] / $atom_structure['time_scale'];
     
    12671355
    12681356                                // check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field
    1269                                 while  (($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))
     1357                                while (($mdat_offset < (strlen($atom_data) - 8))
     1358                                        && ($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))
    12701359                                        && ($chapter_string_length < 1000)
    12711360                                        && ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2))
    1272                                         && preg_match('#^[\x20-\xFF]+$#', substr($atom_data, $mdat_offset + 2, $chapter_string_length), $chapter_matches)) {
     1361                                        && preg_match('#^([\x00-\xFF]{2})([\x20-\xFF]+)$#', substr($atom_data, $mdat_offset, $chapter_string_length + 2), $chapter_matches)) {
     1362                                                list($dummy, $chapter_string_length_hex, $chapter_string) = $chapter_matches;
    12731363                                                $mdat_offset += (2 + $chapter_string_length);
    1274                                                 @$info['quicktime']['comments']['chapters'][] = $chapter_matches[0];
    1275                                 }
    1276 
     1364                                                @$info['quicktime']['comments']['chapters'][] = $chapter_string;
     1365
     1366                                                // "encd" atom specifies encoding. In theory could be anything, almost always UTF-8, but may be UTF-16 with BOM (not currently handled)
     1367                                                if (substr($atom_data, $mdat_offset, 12) == "\x00\x00\x00\x0C\x65\x6E\x63\x64\x00\x00\x01\x00") { // UTF-8
     1368                                                        $mdat_offset += 12;
     1369                                                }
     1370                                }
    12771371
    12781372
     
    14241518
    14251519                        case "\x00\x00\x00\x00":
    1426                         case 'meta': // METAdata atom
    14271520                                // some kind of metacontainer, may contain a big data dump such as:
    14281521                                // mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4
    14291522                                // http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt
    14301523
    1431                     $atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
    1432                     $atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
    1433                     $atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
     1524                                $atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
     1525                                $atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
     1526                                $atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
    14341527                                //$atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
    14351528                                break;
    14361529
     1530                        case 'meta': // METAdata atom
     1531                                // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html
     1532
     1533                                $atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
     1534                                $atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
     1535                                $atom_structure['subatoms']  = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
     1536                                break;
     1537
    14371538                        case 'data': // metaDATA atom
     1539                                static $metaDATAkey = 1; // real ugly, but so is the QuickTime structure that stores keys and values in different multinested locations that are hard to relate to each other
    14381540                                // seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data
    14391541                                $atom_structure['language'] =                           substr($atom_data, 4 + 0, 2);
    14401542                                $atom_structure['unknown']  = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2));
    14411543                                $atom_structure['data']     =                           substr($atom_data, 4 + 4);
     1544                                $atom_structure['key_name'] = @$info['quicktime']['temp_meta_key_names'][$metaDATAkey++];
     1545
     1546                                if ($atom_structure['key_name'] && $atom_structure['data']) {
     1547                                        @$info['quicktime']['comments'][str_replace('com.apple.quicktime.', '', $atom_structure['key_name'])][] = $atom_structure['data'];
     1548                                }
     1549                                break;
     1550
     1551                        case 'keys': // KEYS that may be present in the metadata atom.
     1552                                // https://developer.apple.com/library/mac/documentation/QuickTime/QTFF/Metadata/Metadata.html#//apple_ref/doc/uid/TP40000939-CH1-SW21
     1553                                // The metadata item keys atom holds a list of the metadata keys that may be present in the metadata atom.
     1554                                // This list is indexed starting with 1; 0 is a reserved index value. The metadata item keys atom is a full atom with an atom type of "keys".
     1555                                $atom_structure['version']       = getid3_lib::BigEndian2Int(substr($atom_data,  0, 1));
     1556                                $atom_structure['flags_raw']     = getid3_lib::BigEndian2Int(substr($atom_data,  1, 3));
     1557                                $atom_structure['entry_count']   = getid3_lib::BigEndian2Int(substr($atom_data,  4, 4));
     1558                                $keys_atom_offset = 8;
     1559                                for ($i = 1; $i <= $atom_structure['entry_count']; $i++) {
     1560                                        $atom_structure['keys'][$i]['key_size']      = getid3_lib::BigEndian2Int(substr($atom_data, $keys_atom_offset + 0, 4));
     1561                                        $atom_structure['keys'][$i]['key_namespace'] =                           substr($atom_data, $keys_atom_offset + 4, 4);
     1562                                        $atom_structure['keys'][$i]['key_value']     =                           substr($atom_data, $keys_atom_offset + 8, $atom_structure['keys'][$i]['key_size'] - 8);
     1563                                        $keys_atom_offset += $atom_structure['keys'][$i]['key_size']; // key_size includes the 4+4 bytes for key_size and key_namespace
     1564
     1565                                        $info['quicktime']['temp_meta_key_names'][$i] = $atom_structure['keys'][$i]['key_value'];
     1566                                }
    14421567                                break;
    14431568
     
    14671592                                // terminated by a 32-bit integer set to 0. If you are writing a program
    14681593                                // to read user data atoms, you should allow for the terminating 0.
     1594                                if (strlen($atom_data) > 12) {
     1595                                        $subatomoffset += 4;
     1596                                        continue;
     1597                                }
    14691598                                return $atom_structure;
    14701599                        }
     
    17801909                if (empty($QuicktimeIODSaudioProfileNameLookup)) {
    17811910                        $QuicktimeIODSaudioProfileNameLookup = array(
    1782                             0x00 => 'ISO Reserved (0x00)',
    1783                             0x01 => 'Main Audio Profile @ Level 1',
    1784                             0x02 => 'Main Audio Profile @ Level 2',
    1785                             0x03 => 'Main Audio Profile @ Level 3',
    1786                             0x04 => 'Main Audio Profile @ Level 4',
    1787                             0x05 => 'Scalable Audio Profile @ Level 1',
    1788                             0x06 => 'Scalable Audio Profile @ Level 2',
    1789                             0x07 => 'Scalable Audio Profile @ Level 3',
    1790                             0x08 => 'Scalable Audio Profile @ Level 4',
    1791                             0x09 => 'Speech Audio Profile @ Level 1',
    1792                             0x0A => 'Speech Audio Profile @ Level 2',
    1793                             0x0B => 'Synthetic Audio Profile @ Level 1',
    1794                             0x0C => 'Synthetic Audio Profile @ Level 2',
    1795                             0x0D => 'Synthetic Audio Profile @ Level 3',
    1796                             0x0E => 'High Quality Audio Profile @ Level 1',
    1797                             0x0F => 'High Quality Audio Profile @ Level 2',
    1798                             0x10 => 'High Quality Audio Profile @ Level 3',
    1799                             0x11 => 'High Quality Audio Profile @ Level 4',
    1800                             0x12 => 'High Quality Audio Profile @ Level 5',
    1801                             0x13 => 'High Quality Audio Profile @ Level 6',
    1802                             0x14 => 'High Quality Audio Profile @ Level 7',
    1803                             0x15 => 'High Quality Audio Profile @ Level 8',
    1804                             0x16 => 'Low Delay Audio Profile @ Level 1',
    1805                             0x17 => 'Low Delay Audio Profile @ Level 2',
    1806                             0x18 => 'Low Delay Audio Profile @ Level 3',
    1807                             0x19 => 'Low Delay Audio Profile @ Level 4',
    1808                             0x1A => 'Low Delay Audio Profile @ Level 5',
    1809                             0x1B => 'Low Delay Audio Profile @ Level 6',
    1810                             0x1C => 'Low Delay Audio Profile @ Level 7',
    1811                             0x1D => 'Low Delay Audio Profile @ Level 8',
    1812                             0x1E => 'Natural Audio Profile @ Level 1',
    1813                             0x1F => 'Natural Audio Profile @ Level 2',
    1814                             0x20 => 'Natural Audio Profile @ Level 3',
    1815                             0x21 => 'Natural Audio Profile @ Level 4',
    1816                             0x22 => 'Mobile Audio Internetworking Profile @ Level 1',
    1817                             0x23 => 'Mobile Audio Internetworking Profile @ Level 2',
    1818                             0x24 => 'Mobile Audio Internetworking Profile @ Level 3',
    1819                             0x25 => 'Mobile Audio Internetworking Profile @ Level 4',
    1820                             0x26 => 'Mobile Audio Internetworking Profile @ Level 5',
    1821                             0x27 => 'Mobile Audio Internetworking Profile @ Level 6',
    1822                             0x28 => 'AAC Profile @ Level 1',
    1823                             0x29 => 'AAC Profile @ Level 2',
    1824                             0x2A => 'AAC Profile @ Level 4',
    1825                             0x2B => 'AAC Profile @ Level 5',
    1826                             0x2C => 'High Efficiency AAC Profile @ Level 2',
    1827                             0x2D => 'High Efficiency AAC Profile @ Level 3',
    1828                             0x2E => 'High Efficiency AAC Profile @ Level 4',
    1829                             0x2F => 'High Efficiency AAC Profile @ Level 5',
    1830                             0xFE => 'Not part of MPEG-4 audio profiles',
    1831                             0xFF => 'No audio capability required',
     1911                                0x00 => 'ISO Reserved (0x00)',
     1912                                0x01 => 'Main Audio Profile @ Level 1',
     1913                                0x02 => 'Main Audio Profile @ Level 2',
     1914                                0x03 => 'Main Audio Profile @ Level 3',
     1915                                0x04 => 'Main Audio Profile @ Level 4',
     1916                                0x05 => 'Scalable Audio Profile @ Level 1',
     1917                                0x06 => 'Scalable Audio Profile @ Level 2',
     1918                                0x07 => 'Scalable Audio Profile @ Level 3',
     1919                                0x08 => 'Scalable Audio Profile @ Level 4',
     1920                                0x09 => 'Speech Audio Profile @ Level 1',
     1921                                0x0A => 'Speech Audio Profile @ Level 2',
     1922                                0x0B => 'Synthetic Audio Profile @ Level 1',
     1923                                0x0C => 'Synthetic Audio Profile @ Level 2',
     1924                                0x0D => 'Synthetic Audio Profile @ Level 3',
     1925                                0x0E => 'High Quality Audio Profile @ Level 1',
     1926                                0x0F => 'High Quality Audio Profile @ Level 2',
     1927                                0x10 => 'High Quality Audio Profile @ Level 3',
     1928                                0x11 => 'High Quality Audio Profile @ Level 4',
     1929                                0x12 => 'High Quality Audio Profile @ Level 5',
     1930                                0x13 => 'High Quality Audio Profile @ Level 6',
     1931                                0x14 => 'High Quality Audio Profile @ Level 7',
     1932                                0x15 => 'High Quality Audio Profile @ Level 8',
     1933                                0x16 => 'Low Delay Audio Profile @ Level 1',
     1934                                0x17 => 'Low Delay Audio Profile @ Level 2',
     1935                                0x18 => 'Low Delay Audio Profile @ Level 3',
     1936                                0x19 => 'Low Delay Audio Profile @ Level 4',
     1937                                0x1A => 'Low Delay Audio Profile @ Level 5',
     1938                                0x1B => 'Low Delay Audio Profile @ Level 6',
     1939                                0x1C => 'Low Delay Audio Profile @ Level 7',
     1940                                0x1D => 'Low Delay Audio Profile @ Level 8',
     1941                                0x1E => 'Natural Audio Profile @ Level 1',
     1942                                0x1F => 'Natural Audio Profile @ Level 2',
     1943                                0x20 => 'Natural Audio Profile @ Level 3',
     1944                                0x21 => 'Natural Audio Profile @ Level 4',
     1945                                0x22 => 'Mobile Audio Internetworking Profile @ Level 1',
     1946                                0x23 => 'Mobile Audio Internetworking Profile @ Level 2',
     1947                                0x24 => 'Mobile Audio Internetworking Profile @ Level 3',
     1948                                0x25 => 'Mobile Audio Internetworking Profile @ Level 4',
     1949                                0x26 => 'Mobile Audio Internetworking Profile @ Level 5',
     1950                                0x27 => 'Mobile Audio Internetworking Profile @ Level 6',
     1951                                0x28 => 'AAC Profile @ Level 1',
     1952                                0x29 => 'AAC Profile @ Level 2',
     1953                                0x2A => 'AAC Profile @ Level 4',
     1954                                0x2B => 'AAC Profile @ Level 5',
     1955                                0x2C => 'High Efficiency AAC Profile @ Level 2',
     1956                                0x2D => 'High Efficiency AAC Profile @ Level 3',
     1957                                0x2E => 'High Efficiency AAC Profile @ Level 4',
     1958                                0x2F => 'High Efficiency AAC Profile @ Level 5',
     1959                                0xFE => 'Not part of MPEG-4 audio profiles',
     1960                                0xFF => 'No audio capability required',
    18321961                        );
    18331962                }
     
    21352264
    21362265
    2137         public function CopyToAppropriateCommentsSection($keyname, $data, $boxname = '') {
     2266        public function CopyToAppropriateCommentsSection($keyname, $data, $boxname='') {
    21382267                static $handyatomtranslatorarray = array();
    21392268                if (empty($handyatomtranslatorarray)) {
     
    22582387                                }
    22592388                        }
    2260                         $info['quicktime']['comments'][$comment_key][] = $data;
     2389                        $gooddata = array($data);
     2390                        if ($comment_key == 'genre') {
     2391                                // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
     2392                                $gooddata = explode(';', $data);
     2393                        }
     2394                        foreach ($gooddata as $data) {
     2395                                $info['quicktime']['comments'][$comment_key][] = $data;
     2396                        }
    22612397                }
    22622398                return true;
     
    22762412        }
    22772413
     2414
     2415        /*
     2416        // helper functions for m4b audiobook chapters
     2417        // code by Steffen Hartmann 2015-Nov-08
     2418        */
     2419        public function search_tag_by_key($info, $tag, $history, &$result) {
     2420                foreach ($info as $key => $value) {
     2421                        $key_history = $history.'/'.$key;
     2422                        if ($key === $tag) {
     2423                                $result[] = array($key_history, $info);
     2424                        } else {
     2425                                if (is_array($value)) {
     2426                                        $this->search_tag_by_key($value, $tag, $key_history, $result);
     2427                                }
     2428                        }
     2429                }
     2430        }
     2431
     2432        public function search_tag_by_pair($info, $k, $v, $history, &$result) {
     2433                foreach ($info as $key => $value) {
     2434                        $key_history = $history.'/'.$key;
     2435                        if (($key === $k) && ($value === $v)) {
     2436                                $result[] = array($key_history, $info);
     2437                        } else {
     2438                                if (is_array($value)) {
     2439                                        $this->search_tag_by_pair($value, $k, $v, $key_history, $result);
     2440                                }
     2441                        }
     2442                }
     2443        }
     2444
     2445        public function quicktime_time_to_sample_table($info) {
     2446                $res = array();
     2447                $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
     2448                foreach ($res as $value) {
     2449                        $stbl_res = array();
     2450                        $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
     2451                        if (count($stbl_res) > 0) {
     2452                                $stts_res = array();
     2453                                $this->search_tag_by_key($value[1], 'time_to_sample_table', $value[0], $stts_res);
     2454                                if (count($stts_res) > 0) {
     2455                                        return $stts_res[0][1]['time_to_sample_table'];
     2456                                }
     2457                        }
     2458                }
     2459                return array();
     2460        }
     2461
     2462        function quicktime_bookmark_time_scale($info) {
     2463                $time_scale = '';
     2464                $ts_prefix_len = 0;
     2465                $res = array();
     2466                $this->search_tag_by_pair($info['quicktime']['moov'], 'name', 'stbl', 'quicktime/moov', $res);
     2467                foreach ($res as $value) {
     2468                        $stbl_res = array();
     2469                        $this->search_tag_by_pair($value[1], 'data_format', 'text', $value[0], $stbl_res);
     2470                        if (count($stbl_res) > 0) {
     2471                                $ts_res = array();
     2472                                $this->search_tag_by_key($info['quicktime']['moov'], 'time_scale', 'quicktime/moov', $ts_res);
     2473                                foreach ($ts_res as $value) {
     2474                                        $prefix = substr($value[0], 0, -12);
     2475                                        if ((substr($stbl_res[0][0], 0, strlen($prefix)) === $prefix) && ($ts_prefix_len < strlen($prefix))) {
     2476                                                $time_scale = $value[1]['time_scale'];
     2477                                                $ts_prefix_len = strlen($prefix);
     2478                                        }
     2479                                }
     2480                        }
     2481                }
     2482                return $time_scale;
     2483        }
     2484        /*
     2485        // END helper functions for m4b audiobook chapters
     2486        */
     2487
     2488
    22782489}
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio-video.riff.php

    r93092 r96229  
    11711171                                break;
    11721172
     1173                        case 'WEBP':
     1174                                // https://developers.google.com/speed/webp/docs/riff_container
     1175                                $info['fileformat'] = 'webp';
     1176                                $info['mime_type']  = 'image/webp';
     1177
     1178$info['error'][] = 'WebP image parsing not supported in this version of getID3()';
     1179                                break;
    11731180
    11741181                        default:
    1175                                 $info['error'][] = 'Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA), found "'.$RIFFsubtype.'" instead';
     1182                                $info['error'][] = 'Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA|WEBP), found "'.$RIFFsubtype.'" instead';
    11761183                                //unset($info['fileformat']);
    11771184                }
     
    18981905        }
    18991906
    1900         public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian = true) {
     1907        public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) {
    19011908
    19021909                $parsed['biSize']          = substr($BITMAPINFOHEADER,  0, 4); // number of bytes required by the BITMAPINFOHEADER structure
     
    19171924        }
    19181925
    1919         public static function ParseDIVXTAG($DIVXTAG, $raw = false) {
     1926        public static function ParseDIVXTAG($DIVXTAG, $raw=false) {
    19201927                // structure from "IDivX" source, Form1.frm, by "Greg Frazier of Daemonic Software Group", email: gfrazier@icestorm.net, web: http://dsg.cjb.net/
    19211928                // source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip
     
    25772584        }
    25782585
    2579         private function EitherEndian2Int($byteword, $signed = false) {
     2586        private function EitherEndian2Int($byteword, $signed=false) {
    25802587                if ($this->container == 'riff') {
    25812588                        return getid3_lib::LittleEndian2Int($byteword, $signed);
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio.aac.php

    r93092 r96229  
    259259
    260260
    261         public function getAACADTSheaderFilepointer($MaxFramesToScan = 1000000, $ReturnExtendedInfo = false) {
     261        public function getAACADTSheaderFilepointer($MaxFramesToScan=1000000, $ReturnExtendedInfo=false) {
    262262                $info = &$this->getid3->info;
    263263
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio.bonk.php

    r93092 r96229  
    214214        }
    215215
    216         public static function BonkIsValidTagName($PossibleBonkTag, $ignorecase = false) {
     216        public static function BonkIsValidTagName($PossibleBonkTag, $ignorecase=false) {
    217217                static $BonkIsValidTagName = array('BONK', 'INFO', ' ID3', 'META');
    218218                foreach ($BonkIsValidTagName as $validtagname) {
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio.mp3.php

    r93092 r96229  
    406406
    407407
    408         public function decodeMPEGaudioHeader($offset, &$info, $recursivesearch = true, $ScanAsCBR = false, $FastMPEGheaderScan = false) {
     408        public function decodeMPEGaudioHeader($offset, &$info, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) {
    409409                static $MPEGaudioVersionLookup;
    410410                static $MPEGaudioLayerLookup;
     
    11291129        }
    11301130
    1131         public function FreeFormatFrameLength($offset, $deepscan = false) {
     1131        public function FreeFormatFrameLength($offset, $deepscan=false) {
    11321132                $info = &$this->getid3->info;
    11331133
     
    13541354
    13551355
    1356         public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram = false) {
     1356        public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) {
    13571357                // looks for synch, decodes MPEG audio header
    13581358
     
    16971697        }
    16981698
    1699         public static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15 = false) {
     1699        public static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) {
    17001700                return self::MPEGaudioHeaderValid(self::MPEGaudioHeaderDecode($head4), false, $allowBitrate15);
    17011701        }
    17021702
    1703         public static function MPEGaudioHeaderValid($rawarray, $echoerrors = false, $allowBitrate15 = false) {
     1703        public static function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) {
    17041704                if (($rawarray['synch'] & 0x0FFE) != 0x0FFE) {
    17051705                        return false;
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio.mpc.php

    r93092 r96229  
    465465        }
    466466
    467         public function SV8variableLengthInteger($data, &$packetLength, $maxHandledPacketLength = 9) {
     467        public function SV8variableLengthInteger($data, &$packetLength, $maxHandledPacketLength=9) {
    468468                $packet_size = 0;
    469469                for ($packetLength = 1; $packetLength <= $maxHandledPacketLength; $packetLength++) {
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.audio.ogg.php

    r93092 r96229  
    777777
    778778
    779         public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber = 1) {
     779        public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) {
    780780                for ($i = 0; $i < $SegmentNumber; $i++) {
    781781                        $segmentlength = 0;
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.graphic.png.php

    r85814 r96229  
    1818class getid3_png extends getid3_handler
    1919{
     20        public $max_data_bytes = 10000000; // if data chunk is larger than this do not read it completely (getID3 only needs the first few dozen bytes for parsing)
    2021
    2122        public function Analyze() {
     23
    2224                $info = &$this->getid3->info;
    2325
     
    4547                while ((($this->ftell() - (strlen($PNGfiledata) - $offset)) < $info['filesize'])) {
    4648                        $chunk['data_length'] = getid3_lib::BigEndian2Int(substr($PNGfiledata, $offset, 4));
     49                        if ($chunk['data_length'] === false) {
     50                                $info['error'][] = 'Failed to read data_length at offset '.$offset;
     51                                return false;
     52                        }
    4753                        $offset += 4;
     54                        $truncated_data = false;
    4855                        while (((strlen($PNGfiledata) - $offset) < ($chunk['data_length'] + 4)) && ($this->ftell() < $info['filesize'])) {
    49                                 $PNGfiledata .= $this->fread($this->getid3->fread_buffer_size());
     56                                if (strlen($PNGfiledata) < $this->max_data_bytes) {
     57                                        $PNGfiledata .= $this->fread($this->getid3->fread_buffer_size());
     58                                } else {
     59                                        $info['warning'][] = 'At offset '.$offset.' chunk "'.substr($PNGfiledata, $offset, 4).'" exceeded max_data_bytes value of '.$this->max_data_bytes.', data chunk will be truncated at '.(strlen($PNGfiledata) - 8).' bytes';
     60                                        break;
     61                                }
    5062                        }
    51                         $chunk['type_text']   =               substr($PNGfiledata, $offset, 4);
     63                        $chunk['type_text']   =                           substr($PNGfiledata, $offset, 4);
    5264                        $offset += 4;
    5365                        $chunk['type_raw']    = getid3_lib::BigEndian2Int($chunk['type_text']);
    54                         $chunk['data']        =               substr($PNGfiledata, $offset, $chunk['data_length']);
     66                        $chunk['data']        =                           substr($PNGfiledata, $offset, $chunk['data_length']);
    5567                        $offset += $chunk['data_length'];
    5668                        $chunk['crc']         = getid3_lib::BigEndian2Int(substr($PNGfiledata, $offset, 4));
     
    163175                                case 'iCCP': // Embedded ICC Profile
    164176                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    165                                         list($profilename, $compressiondata)                                 = explode("\x00", $chunk['data'], 2);
     177                                        list($profilename, $compressiondata)                     = explode("\x00", $chunk['data'], 2);
    166178                                        $thisfile_png_chunk_type_text['profile_name']            = $profilename;
    167179                                        $thisfile_png_chunk_type_text['compression_method']      = getid3_lib::BigEndian2Int(substr($compressiondata, 0, 1));
     
    174186                                case 'tEXt': // Textual Data
    175187                                        $thisfile_png_chunk_type_text['header']  = $chunk;
    176                                         list($keyword, $text)                                = explode("\x00", $chunk['data'], 2);
     188                                        list($keyword, $text) = explode("\x00", $chunk['data'], 2);
    177189                                        $thisfile_png_chunk_type_text['keyword'] = $keyword;
    178190                                        $thisfile_png_chunk_type_text['text']    = $text;
     
    184196                                case 'zTXt': // Compressed Textual Data
    185197                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    186                                         list($keyword, $otherdata)                                           = explode("\x00", $chunk['data'], 2);
     198                                        list($keyword, $otherdata)                               = explode("\x00", $chunk['data'], 2);
    187199                                        $thisfile_png_chunk_type_text['keyword']                 = $keyword;
    188200                                        $thisfile_png_chunk_type_text['compression_method']      = getid3_lib::BigEndian2Int(substr($otherdata, 0, 1));
     
    207219                                case 'iTXt': // International Textual Data
    208220                                        $thisfile_png_chunk_type_text['header']                  = $chunk;
    209                                         list($keyword, $otherdata)                                           = explode("\x00", $chunk['data'], 2);
     221                                        list($keyword, $otherdata)                               = explode("\x00", $chunk['data'], 2);
    210222                                        $thisfile_png_chunk_type_text['keyword']                 = $keyword;
    211223                                        $thisfile_png_chunk_type_text['compression']             = (bool) getid3_lib::BigEndian2Int(substr($otherdata, 0, 1));
     
    308320                                case 'sPLT': // Suggested Palette
    309321                                        $thisfile_png_chunk_type_text['header']                           = $chunk;
    310                                         list($palettename, $otherdata)                                                = explode("\x00", $chunk['data'], 2);
     322                                        list($palettename, $otherdata)                                    = explode("\x00", $chunk['data'], 2);
    311323                                        $thisfile_png_chunk_type_text['palette_name']                     = $palettename;
    312324                                        $sPLToffset = 0;
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.tag.id3v1.php

    r93092 r96229  
    108108        }
    109109
    110         public static function ArrayOfGenres($allowSCMPXextended = false) {
     110        public static function ArrayOfGenres($allowSCMPXextended=false) {
    111111                static $GenreLookup = array(
    112112                        0    => 'Blues',
     
    292292        }
    293293
    294         public static function LookupGenreName($genreid, $allowSCMPXextended = true) {
     294        public static function LookupGenreName($genreid, $allowSCMPXextended=true) {
    295295                switch ($genreid) {
    296296                        case 'RX':
     
    308308        }
    309309
    310         public static function LookupGenreID($genre, $allowSCMPXextended = false) {
     310        public static function LookupGenreID($genre, $allowSCMPXextended=false) {
    311311                $GenreLookup = self::ArrayOfGenres($allowSCMPXextended);
    312312                $LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre));
     
    326326        }
    327327
    328         public static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track = '') {
     328        public static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') {
    329329                $ID3v1Tag  = 'TAG';
    330330                $ID3v1Tag .= str_pad(trim(substr($title,  0, 30)), 30, "\x00", STR_PAD_RIGHT);
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.tag.id3v2.php

    r93092 r96229  
    515515                $genrestring = str_replace('Rock'."\x00".'Rock', 'Folk/Rock', $genrestring);
    516516
     517                // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
     518                $genrestring = str_replace(';', "\x00", $genrestring);
     519
    517520                $genre_elements = explode("\x00", $genrestring);
    518521                foreach ($genre_elements as $element) {
     
    647650                        }
    648651                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    649                         if (ord($frame_description) === 0) {
     652                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     653                                // if description only contains a BOM or terminator then make it blank
    650654                                $frame_description = '';
    651655                        }
     
    740744                        }
    741745                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    742 
    743                         if (ord($frame_description) === 0) {
     746                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     747                                // if description only contains a BOM or terminator then make it blank
    744748                                $frame_description = '';
    745749                        }
     
    983987                        }
    984988                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    985                         if (ord($frame_description) === 0) {
     989                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     990                                // if description only contains a BOM or terminator then make it blank
    986991                                $frame_description = '';
    987992                        }
     
    10901095                                }
    10911096                                $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1092                                 if (ord($frame_description) === 0) {
     1097                                if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1098                                        // if description only contains a BOM or terminator then make it blank
    10931099                                        $frame_description = '';
    10941100                                }
     
    13941400                                }
    13951401                                $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1396                                 if (ord($frame_description) === 0) {
     1402                                if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1403                                        // if description only contains a BOM or terminator then make it blank
    13971404                                        $frame_description = '';
    13981405                                }
     
    15191526                        }
    15201527                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1521                         if (ord($frame_description) === 0) {
     1528                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1529                                // if description only contains a BOM or terminator then make it blank
    15221530                                $frame_description = '';
    15231531                        }
     
    16011609                        $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
    16021610                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1603                         if (ord($frame_description) === 0) {
     1611                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1612                                // if description only contains a BOM or terminator then make it blank
    16041613                                $frame_description = '';
    16051614                        }
     
    16261635                        $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    16271636                        if (ord($frame_ownerid) === 0) {
    1628                                 $frame_ownerid == '';
     1637                                $frame_ownerid = '';
    16291638                        }
    16301639                        $frame_offset = $frame_terminatorpos + strlen("\x00");
     
    18011810                        }
    18021811                        $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1803                         if (ord($frame_description) === 0) {
     1812                        if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     1813                                // if description only contains a BOM or terminator then make it blank
    18041814                                $frame_description = '';
    18051815                        }
     
    26082618
    26092619
    2610         public static function LanguageLookup($languagecode, $casesensitive = false) {
     2620        public static function LanguageLookup($languagecode, $casesensitive=false) {
    26112621
    26122622                if (!$casesensitive) {
     
    31233133        }
    31243134
    3125         public static function APICPictureTypeLookup($index, $returnarray = false) {
     3135        public static function APICPictureTypeLookup($index, $returnarray=false) {
    31263136                static $APICPictureTypeLookup = array(
    31273137                        0x00 => 'Other',
     
    35883598        }
    35893599
    3590         public static function IsANumber($numberstring, $allowdecimal = false, $allownegative = false) {
     3600        public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) {
    35913601                for ($i = 0; $i < strlen($numberstring); $i++) {
    35923602                        if ((chr($numberstring{$i}) < chr('0')) || (chr($numberstring{$i}) > chr('9'))) {
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/module.tag.xmp.php

    r85814 r96229  
    400400        * @param string - Name of the image file to access and extract XMP information from.
    401401        */
    402         public function Image_XMP($sFilename)
     402        public function __construct($sFilename)
    403403        {
    404404                $this->_sFilename = $sFilename;
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.apetag.php

    r93092 r96229  
    2727        public $errors                     = array(); // any critical errors will be stored here
    2828
    29         public function getid3_write_apetag() {
     29        public function __construct() {
    3030                return true;
    3131        }
     
    161161        }
    162162
    163         public function GenerateAPEtagHeaderFooter(&$items, $isheader = false) {
     163        public function GenerateAPEtagHeaderFooter(&$items, $isheader=false) {
    164164                $tagdatalength = 0;
    165165                foreach ($items as $itemdata) {
     
    177177        }
    178178
    179         public function GenerateAPEtagFlags($header = true, $footer = true, $isheader = false, $encodingid = 0, $readonly = false) {
     179        public function GenerateAPEtagFlags($header=true, $footer=true, $isheader=false, $encodingid=0, $readonly=false) {
    180180                $APEtagFlags = array_fill(0, 4, 0);
    181181                if ($header) {
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.id3v1.php

    r85814 r96229  
    2525        public $errors   = array(); // any critical errors will be stored here
    2626
    27         public function getid3_write_id3v1() {
     27        public function __construct() {
    2828                return true;
    2929        }
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.id3v2.php

    r93092 r96229  
    3131        public $errors                      = array();  // any critical errors will be stored here
    3232
    33         public function getid3_write_id3v2() {
     33        public function __construct() {
    3434                return true;
    3535        }
     
    261261
    262262
    263         public function GenerateID3v2FrameFlags($TagAlter = false, $FileAlter = false, $ReadOnly = false, $Compression = false, $Encryption = false, $GroupingIdentity = false, $Unsynchronisation = false, $DataLengthIndicator = false) {
     263        public function GenerateID3v2FrameFlags($TagAlter=false, $FileAlter=false, $ReadOnly=false, $Compression=false, $Encryption=false, $GroupingIdentity=false, $Unsynchronisation=false, $DataLengthIndicator=false) {
    264264                switch ($this->majorversion) {
    265265                        case 4:
     
    15321532        }
    15331533
    1534         public function GenerateID3v2Tag($noerrorsonly = true) {
     1534        public function GenerateID3v2Tag($noerrorsonly=true) {
    15351535                $this->ID3v2FrameIsAllowed(null, ''); // clear static array in case this isn't the first call to $this->GenerateID3v2Tag()
    15361536
     
    17601760
    17611761        public function ID3v2IsValidTextEncoding($textencodingbyte) {
     1762                // 0 = ISO-8859-1
     1763                // 1 = UTF-16 with BOM
     1764                // 2 = UTF-16BE without BOM
     1765                // 3 = UTF-8
    17621766                static $ID3v2IsValidTextEncoding_cache = array(
    1763                         2 => array(true, true),
    1764                         3 => array(true, true),
    1765                         4 => array(true, true, true, true));
     1767                        2 => array(true, true),              // ID3v2.2 - allow 0=ISO-8859-1, 1=UTF-16
     1768                        3 => array(true, true),              // ID3v2.3 - allow 0=ISO-8859-1, 1=UTF-16
     1769                        4 => array(true, true, true, true),  // ID3v2.4 - allow 0=ISO-8859-1, 1=UTF-16, 2=UTF-16BE, 3=UTF-8
     1770                );
    17661771                return isset($ID3v2IsValidTextEncoding_cache[$this->majorversion][$textencodingbyte]);
    17671772        }
     
    18431848        }
    18441849
    1845         public function IsWithinBitRange($number, $maxbits, $signed = false) {
     1850        public function IsWithinBitRange($number, $maxbits, $signed=false) {
    18461851                if ($signed) {
    18471852                        if (($number > (0 - pow(2, $maxbits - 1))) && ($number <= pow(2, $maxbits - 1))) {
     
    18671872        }
    18681873
    1869         public function IsValidURL($url, $allowUserPass = false) {
     1874        public function IsValidURL($url, $allowUserPass=false) {
    18701875                if ($url == '') {
    18711876                        return false;
     
    19071912                        $ID3v2ShortFrameNameLookup[2]['album']                                            = 'TAL';
    19081913                        $ID3v2ShortFrameNameLookup[2]['beats_per_minute']                                 = 'TBP';
     1914                        $ID3v2ShortFrameNameLookup[2]['bpm']                                              = 'TBP';
    19091915                        $ID3v2ShortFrameNameLookup[2]['composer']                                         = 'TCM';
    19101916                        $ID3v2ShortFrameNameLookup[2]['genre']                                            = 'TCO';
     
    19671973                        $ID3v2ShortFrameNameLookup[3]['album']                                            = 'TALB';
    19681974                        $ID3v2ShortFrameNameLookup[3]['beats_per_minute']                                 = 'TBPM';
     1975                        $ID3v2ShortFrameNameLookup[3]['bpm']                                              = 'TBPM';
    19691976                        $ID3v2ShortFrameNameLookup[3]['itunescompilation']                                = 'TCMP';
    19701977                        $ID3v2ShortFrameNameLookup[3]['composer']                                         = 'TCOM';
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.lyrics3.php

    r85814 r96229  
    2424        public $errors          = array(); // any critical errors will be stored here
    2525
    26         public function getid3_write_lyrics3() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.metaflac.php

    r85814 r96229  
    2424        public $errors   = array(); // any critical errors will be stored here
    2525
    26         public function getid3_write_metaflac() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.php

    r85814 r96229  
    6565        private $ThisFileInfo; // analysis of file before writing
    6666
    67         public function getid3_writetags() {
     67        public function __construct() {
    6868                return true;
    6969        }
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.real.php

    r85814 r96229  
    2424        public $paddedlength      = 512;     // minimum length of CONT tag in bytes
    2525
    26         public function getid3_write_real() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _core_/branches/spip-3.1/plugins/medias/lib/getid3/write.vorbiscomment.php

    r85814 r96229  
    2424        public $errors   = array(); // any critical errors will be stored here
    2525
    26         public function getid3_write_vorbiscomment() {
     26        public function __construct() {
    2727                return true;
    2828        }
  • _core_/branches/spip-3.1/plugins/medias/paquet.xml

    r95517 r96229  
    22        prefix="medias"
    33        categorie="multimedia"
    4         version="2.10.28"
     4        version="2.10.29"
    55        etat="stable"
    66        compatibilite="[3.1.0;3.1.*]"
     
    1414        <auteur>Collectif SPIP</auteur>
    1515        <credit>C&#233;dric Morin, Romy Duhem-Verdi&#232;re pour la m&#233;diath&#232;que</credit>
     16        <credit lien="http://www.getid3.org/">getID3()</credit>
     17        <credit lien="http://mediaelementjs.com/">MediaElement.js</credit>
    1618
    1719        <traduire module="medias" reference="fr" gestionnaire="salvatore" />
Note: See TracChangeset for help on using the changeset viewer.