Changeset 117918 in spip-zone


Ignore:
Timestamp:
Sep 20, 2019, 7:02:12 PM (4 weeks ago)
Author:
spip.franck@…
Message:

Mise à jour de la lib getid3 en 1.9.18, nous étions en 1.9.16.
Le changelog est dispo ici: https://github.com/JamesHeinrich/getID3/blob/v1.9.18/changelog.txt

Location:
_core_/plugins/medias
Files:
1 added
35 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/medias/lib/getid3/extension.cache.mysql.php

    r113161 r117918  
    168168        public function analyze($filename, $filesize=null, $original_filename='') {
    169169
    170         $filetime = 0;
     170                $filetime = 0;
    171171                if (file_exists($filename)) {
    172172
  • _core_/plugins/medias/lib/getid3/extension.cache.mysqli.php

    r113161 r117918  
    8888        private $table;
    8989
     90        /**
     91         * @var bool
     92         */
     93        private $db_structure_check;
     94
    9095
    9196        /**
     
    125130                $this->create_table();
    126131
     132                $this->db_structure_check = true; // set to false if you know your table structure has already been migrated to use `hash` as the primary key to avoid
     133                $this->migrate_db_structure();
     134
    127135                // Check version number and clear cache if changed
    128136                $version = '';
     
    130138                $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
    131139                $SQLquery .= ' WHERE (`filename` = \''.$this->mysqli->real_escape_string(getID3::VERSION).'\')';
    132                 $SQLquery .= ' AND (`filesize` = -1)';
    133                 $SQLquery .= ' AND (`filetime` = -1)';
    134                 $SQLquery .= ' AND (`analyzetime` = -1)';
     140                $SQLquery .= ' AND (`hash` = \'getID3::VERSION\')';
    135141                if ($this->cursor = $this->mysqli->query($SQLquery)) {
    136142                        list($version) = $this->cursor->fetch_array();
     
    148154         */
    149155        public function clear_cache() {
    150                 $this->mysqli->query('DELETE FROM `'.$this->mysqli->real_escape_string($this->table).'`');
    151                 $this->mysqli->query('INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (\''.getID3::VERSION.'\', -1, -1, -1, \''.getID3::VERSION.'\')');
     156                $this->mysqli->query('TRUNCATE TABLE `'.$this->mysqli->real_escape_string($this->table).'`');
     157                $this->mysqli->query('INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`hash`, `filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (\'getID3::VERSION\', \''.getID3::VERSION.'\', -1, -1, -1, \''.getID3::VERSION.'\')');
     158        }
     159
     160
     161        /**
     162         * migrate database structure if needed
     163         */
     164        public function migrate_db_structure() {
     165                // Check for table structure
     166                if ($this->db_structure_check) {
     167                        $SQLquery  = 'SHOW COLUMNS';
     168                        $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
     169                        $SQLquery .= ' LIKE \'hash\'';
     170                        $this->cursor = $this->mysqli->query($SQLquery);
     171                        if ($this->cursor->num_rows == 0) {
     172                                // table has not been migrated, add column, add hashes, change index
     173                                $SQLquery  = 'ALTER TABLE `getid3_cache` DROP PRIMARY KEY, ADD `hash` CHAR(32) NOT NULL DEFAULT \'\' FIRST, ADD PRIMARY KEY(`hash`)';
     174                                $this->mysqli->query($SQLquery);
     175
     176                                $SQLquery  = 'UPDATE `getid3_cache` SET';
     177                                $SQLquery .= ' `hash` = MD5(`filename`, `filesize`, `filetime`)';
     178                                $SQLquery .= ' WHERE (`filesize` > -1)';
     179                                $this->mysqli->query($SQLquery);
     180
     181                                $SQLquery  = 'UPDATE `getid3_cache` SET';
     182                                $SQLquery .= ' `hash` = \'getID3::VERSION\'';
     183                                $SQLquery .= ' WHERE (`filesize` = -1)';
     184                                $SQLquery .= '   AND (`filetime` = -1)';
     185                                $SQLquery .= '   AND (`filetime` = -1)';
     186                                $this->mysqli->query($SQLquery);
     187                        }
     188                }
    152189        }
    153190
     
    164201        public function analyze($filename, $filesize=null, $original_filename='') {
    165202
    166         $filetime = 0;
     203                $filetime = 0;
    167204                if (file_exists($filename)) {
    168205
     
    174211                        $SQLquery  = 'SELECT `value`';
    175212                        $SQLquery .= ' FROM `'.$this->mysqli->real_escape_string($this->table).'`';
    176                         $SQLquery .= ' WHERE (`filename` = \''.$this->mysqli->real_escape_string($filename).'\')';
    177                         $SQLquery .= '   AND (`filesize` = \''.$this->mysqli->real_escape_string($filesize).'\')';
    178                         $SQLquery .= '   AND (`filetime` = \''.$this->mysqli->real_escape_string($filetime).'\')';
     213                        $SQLquery .= ' WHERE (`hash` = \''.$this->mysqli->real_escape_string(md5($filename.$filesize.$filetime)).'\')';
    179214                        $this->cursor = $this->mysqli->query($SQLquery);
    180215                        if ($this->cursor->num_rows > 0) {
     
    190225                // Save result
    191226                if (file_exists($filename)) {
    192                         $SQLquery  = 'INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (';
    193                         $SQLquery .=   '\''.$this->mysqli->real_escape_string($filename).'\'';
     227                        $SQLquery  = 'INSERT INTO `'.$this->mysqli->real_escape_string($this->table).'` (`hash`, `filename`, `filesize`, `filetime`, `analyzetime`, `value`) VALUES (';
     228                        $SQLquery .=   '\''.$this->mysqli->real_escape_string(md5($filename.$filesize.$filetime)).'\'';
     229                        $SQLquery .= ', \''.$this->mysqli->real_escape_string($filename).'\'';
    194230                        $SQLquery .= ', \''.$this->mysqli->real_escape_string($filesize).'\'';
    195231                        $SQLquery .= ', \''.$this->mysqli->real_escape_string($filetime).'\'';
    196                         $SQLquery .= ', \''.$this->mysqli->real_escape_string(time()   ).'\'';
    197                         $SQLquery .= ', \''.$this->mysqli->real_escape_string(base64_encode(serialize($analysis))).'\')';
     232                        $SQLquery .= ', UNIX_TIMESTAMP()';
     233                        $SQLquery .= ', \''.$this->mysqli->real_escape_string(base64_encode(serialize($analysis))).'\'';
     234                        $SQLquery .= ')';
    198235                        $this->cursor = $this->mysqli->query($SQLquery);
    199236                }
     
    208245         */
    209246        private function create_table($drop=false) {
     247                if ($drop) {
     248                        $SQLquery  = 'DROP TABLE IF EXISTS `'.$this->mysqli->real_escape_string($this->table).'`';
     249                        $this->mysqli->query($SQLquery);
     250                }
    210251                $SQLquery  = 'CREATE TABLE IF NOT EXISTS `'.$this->mysqli->real_escape_string($this->table).'` (';
    211                 $SQLquery .=   '`filename` VARCHAR(990) NOT NULL DEFAULT \'\'';
     252                $SQLquery .=   '`hash` CHAR(32) NOT NULL DEFAULT \'\'';
     253                $SQLquery .= ', `filename` VARCHAR(1000) NOT NULL DEFAULT \'\'';
    212254                $SQLquery .= ', `filesize` INT(11) NOT NULL DEFAULT \'0\'';
    213255                $SQLquery .= ', `filetime` INT(11) NOT NULL DEFAULT \'0\'';
    214256                $SQLquery .= ', `analyzetime` INT(11) NOT NULL DEFAULT \'0\'';
    215257                $SQLquery .= ', `value` LONGTEXT NOT NULL';
    216                 $SQLquery .= ', PRIMARY KEY (`filename`, `filesize`, `filetime`))';
     258                $SQLquery .= ', PRIMARY KEY (`hash`))';
    217259                $this->cursor = $this->mysqli->query($SQLquery);
    218260                echo $this->mysqli->error;
  • _core_/plugins/medias/lib/getid3/getid3.lib.php

    r113161 r117918  
    2727                for ($i = 0; $i < strlen($string); $i++) {
    2828                        if ($hex) {
    29                                 $returnstring .= str_pad(dechex(ord($string{$i})), 2, '0', STR_PAD_LEFT);
     29                                $returnstring .= str_pad(dechex(ord($string[$i])), 2, '0', STR_PAD_LEFT);
    3030                        } else {
    31                                 $returnstring .= ' '.(preg_match("#[\x20-\x7E]#", $string{$i}) ? $string{$i} : '¤');
     31                                $returnstring .= ' '.(preg_match("#[\x20-\x7E]#", $string[$i]) ? $string[$i] : '¤');
    3232                        }
    3333                        if ($spaces) {
     
    153153                if (strpos($binarypointnumber, '.') === false) {
    154154                        $binarypointnumber = '0.'.$binarypointnumber;
    155                 } elseif ($binarypointnumber{0} == '.') {
     155                } elseif ($binarypointnumber[0] == '.') {
    156156                        $binarypointnumber = '0'.$binarypointnumber;
    157157                }
    158158                $exponent = 0;
    159                 while (($binarypointnumber{0} != '1') || (substr($binarypointnumber, 1, 1) != '.')) {
     159                while (($binarypointnumber[0] != '1') || (substr($binarypointnumber, 1, 1) != '.')) {
    160160                        if (substr($binarypointnumber, 1, 1) == '.') {
    161161                                $exponent--;
     
    165165                                $exponent += ($pointpos - 1);
    166166                                $binarypointnumber = str_replace('.', '', $binarypointnumber);
    167                                 $binarypointnumber = $binarypointnumber{0}.'.'.substr($binarypointnumber, 1);
     167                                $binarypointnumber = $binarypointnumber[0].'.'.substr($binarypointnumber, 1);
    168168                        }
    169169                }
     
    256256                        return 0;
    257257                }
    258                 $signbit = $bitword{0};
     258                $signbit = $bitword[0];
    259259                $floatvalue = 0;
    260260                $exponentbits = 0;
     
    276276                                // http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/
    277277                                $exponentstring = substr($bitword, 1, 15);
    278                                 $isnormalized = intval($bitword{16});
     278                                $isnormalized = intval($bitword[16]);
    279279                                $fractionstring = substr($bitword, 17, 63);
    280280                                $exponent = pow(2, self::Bin2Dec($exponentstring) - 16383);
     
    344344                        if ($synchsafe) { // disregard MSB, effectively 7-bit bytes
    345345                                //$intvalue = $intvalue | (ord($byteword{$i}) & 0x7F) << (($bytewordlen - 1 - $i) * 7); // faster, but runs into problems past 2^31 on 32-bit systems
    346                                 $intvalue += (ord($byteword{$i}) & 0x7F) * pow(2, ($bytewordlen - 1 - $i) * 7);
     346                                $intvalue += (ord($byteword[$i]) & 0x7F) * pow(2, ($bytewordlen - 1 - $i) * 7);
    347347                        } else {
    348                                 $intvalue += ord($byteword{$i}) * pow(256, ($bytewordlen - 1 - $i));
     348                                $intvalue += ord($byteword[$i]) * pow(256, ($bytewordlen - 1 - $i));
    349349                        }
    350350                }
     
    391391                $bytewordlen = strlen($byteword);
    392392                for ($i = 0; $i < $bytewordlen; $i++) {
    393                         $binvalue .= str_pad(decbin(ord($byteword{$i})), 8, '0', STR_PAD_LEFT);
     393                        $binvalue .= str_pad(decbin(ord($byteword[$i])), 8, '0', STR_PAD_LEFT);
    394394                }
    395395                return $binvalue;
     
    452452                $signmult = 1;
    453453                if ($signed) {
    454                         if ($binstring{0} == '1') {
     454                        if ($binstring[0] == '1') {
    455455                                $signmult = -1;
    456456                        }
     
    752752
    753753        /**
    754          * self::md5_data() - returns md5sum for a file from startuing position to absolute end position
    755          *
    756          * @author Allan Hansen <ahØartemis*dk>
     754         * Returns checksum for a file from starting position to absolute end position.
    757755         *
    758756         * @param string $file
     
    762760         *
    763761         * @return string|false
    764          * @throws Exception
    765762         * @throws getid3_exception
    766763         */
    767764        public static function hash_data($file, $offset, $end, $algorithm) {
    768                 static $tempdir = '';
    769                 $windows_call = null;
    770                 $unix_call = null;
    771                 $hash_length = null;
    772                 $hash_function = null;
    773765                if (!self::intValueSupported($end)) {
    774766                        return false;
    775767                }
    776                 switch ($algorithm) {
    777                         case 'md5':
    778                                 $hash_function = 'md5_file';
    779                                 $unix_call     = 'md5sum';
    780                                 $windows_call  = 'md5sum.exe';
    781                                 $hash_length   = 32;
    782                                 break;
    783 
    784                         case 'sha1':
    785                                 $hash_function = 'sha1_file';
    786                                 $unix_call     = 'sha1sum';
    787                                 $windows_call  = 'sha1sum.exe';
    788                                 $hash_length   = 40;
    789                                 break;
    790 
    791                         default:
    792                                 throw new Exception('Invalid algorithm ('.$algorithm.') in self::hash_data()');
    793                                 break;
    794                 }
     768                if (!in_array($algorithm, array('md5', 'sha1'))) {
     769                        throw new getid3_exception('Invalid algorithm ('.$algorithm.') in self::hash_data()');
     770                }
     771
    795772                $size = $end - $offset;
    796                 while (true) {
    797                         if (GETID3_OS_ISWINDOWS) {
    798 
    799                                 // It seems that sha1sum.exe for Windows only works on physical files, does not accept piped data
    800                                 // Fall back to create-temp-file method:
    801                                 if ($algorithm == 'sha1') {
    802                                         break;
    803                                 }
    804 
    805                                 $RequiredFiles = array('cygwin1.dll', 'head.exe', 'tail.exe', $windows_call);
    806                                 foreach ($RequiredFiles as $required_file) {
    807                                         if (!is_readable(GETID3_HELPERAPPSDIR.$required_file)) {
    808                                                 // helper apps not available - fall back to old method
    809                                                 break 2;
    810                                         }
    811                                 }
    812                                 $commandline  = GETID3_HELPERAPPSDIR.'head.exe -c '.$end.' '.escapeshellarg(str_replace('/', DIRECTORY_SEPARATOR, $file)).' | ';
    813                                 $commandline .= GETID3_HELPERAPPSDIR.'tail.exe -c '.$size.' | ';
    814                                 $commandline .= GETID3_HELPERAPPSDIR.$windows_call;
    815 
    816                         } else {
    817 
    818                                 $commandline  = 'head -c'.$end.' '.escapeshellarg($file).' | ';
    819                                 $commandline .= 'tail -c'.$size.' | ';
    820                                 $commandline .= $unix_call;
    821 
    822                         }
    823                         if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) {
    824                                 //throw new Exception('PHP running in Safe Mode - backtick operator not available, using slower non-system-call '.$algorithm.' algorithm');
    825                                 break;
    826                         }
    827                         return substr(`$commandline`, 0, $hash_length);
    828                 }
    829 
    830                 if (empty($tempdir)) {
    831                         // yes this is ugly, feel free to suggest a better way
    832                         require_once(dirname(__FILE__).'/getid3.php');
    833                         $getid3_temp = new getID3();
    834                         $tempdir = $getid3_temp->tempdir;
    835                         unset($getid3_temp);
    836                 }
    837                 // try to create a temporary file in the system temp directory - invalid dirname should force to system temp dir
    838                 if (($data_filename = tempnam($tempdir, 'gI3')) === false) {
    839                         // can't find anywhere to create a temp file, just fail
    840                         return false;
    841                 }
    842 
    843                 // Init
    844                 $result = false;
    845 
    846                 // copy parts of file
    847                 try {
    848                         self::CopyFileParts($file, $data_filename, $offset, $end - $offset);
    849                         $result = $hash_function($data_filename);
    850                 } catch (Exception $e) {
    851                         throw new Exception('self::CopyFileParts() failed in getid_lib::hash_data(): '.$e->getMessage());
    852                 }
    853                 unlink($data_filename);
    854                 return $result;
     773
     774                $fp = fopen($file, 'rb');
     775                fseek($fp, $offset);
     776                $ctx = hash_init($algorithm);
     777                while ($size > 0) {
     778                        $buffer = fread($fp, min($size, getID3::FREAD_BUFFER_SIZE));
     779                        hash_update($ctx, $buffer);
     780                        $size -= getID3::FREAD_BUFFER_SIZE;
     781                }
     782                $hash = hash_final($ctx);
     783                fclose($fp);
     784
     785                return $hash;
    855786        }
    856787
     
    863794         * @return bool
    864795         * @throws Exception
     796         *
     797         * @deprecated Unused, may be removed in future versions of getID3
    865798         */
    866799        public static function CopyFileParts($filename_source, $filename_dest, $offset, $length) {
     
    936869                }
    937870                for ($i = 0; $i < strlen($string); $i++) {
    938                         $charval = ord($string{$i});
     871                        $charval = ord($string[$i]);
    939872                        $newcharstring .= self::iconv_fallback_int_utf8($charval);
    940873                }
     
    956889                }
    957890                for ($i = 0; $i < strlen($string); $i++) {
    958                         $newcharstring .= "\x00".$string{$i};
     891                        $newcharstring .= "\x00".$string[$i];
    959892                }
    960893                return $newcharstring;
     
    975908                }
    976909                for ($i = 0; $i < strlen($string); $i++) {
    977                         $newcharstring .= $string{$i}."\x00";
     910                        $newcharstring .= $string[$i]."\x00";
    978911                }
    979912                return $newcharstring;
     
    1007940                $stringlength = strlen($string);
    1008941                while ($offset < $stringlength) {
    1009                         if ((ord($string{$offset}) | 0x07) == 0xF7) {
     942                        if ((ord($string[$offset]) | 0x07) == 0xF7) {
    1010943                                // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
    1011                                 $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &
    1012                                                    ((ord($string{($offset + 1)}) & 0x3F) << 12) &
    1013                                                    ((ord($string{($offset + 2)}) & 0x3F) <<  6) &
    1014                                                         (ord($string{($offset + 3)}) & 0x3F);
     944                                $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) &
     945                                                   ((ord($string[($offset + 1)]) & 0x3F) << 12) &
     946                                                   ((ord($string[($offset + 2)]) & 0x3F) <<  6) &
     947                                                        (ord($string[($offset + 3)]) & 0x3F);
    1015948                                $offset += 4;
    1016                         } elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {
     949                        } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) {
    1017950                                // 1110bbbb 10bbbbbb 10bbbbbb
    1018                                 $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &
    1019                                                    ((ord($string{($offset + 1)}) & 0x3F) <<  6) &
    1020                                                         (ord($string{($offset + 2)}) & 0x3F);
     951                                $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) &
     952                                                   ((ord($string[($offset + 1)]) & 0x3F) <<  6) &
     953                                                        (ord($string[($offset + 2)]) & 0x3F);
    1021954                                $offset += 3;
    1022                         } elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {
     955                        } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) {
    1023956                                // 110bbbbb 10bbbbbb
    1024                                 $charval = ((ord($string{($offset + 0)}) & 0x1F) <<  6) &
    1025                                                         (ord($string{($offset + 1)}) & 0x3F);
     957                                $charval = ((ord($string[($offset + 0)]) & 0x1F) <<  6) &
     958                                                        (ord($string[($offset + 1)]) & 0x3F);
    1026959                                $offset += 2;
    1027                         } elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {
     960                        } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) {
    1028961                                // 0bbbbbbb
    1029                                 $charval = ord($string{$offset});
     962                                $charval = ord($string[$offset]);
    1030963                                $offset += 1;
    1031964                        } else {
     
    1057990                $stringlength = strlen($string);
    1058991                while ($offset < $stringlength) {
    1059                         if ((ord($string{$offset}) | 0x07) == 0xF7) {
     992                        if ((ord($string[$offset]) | 0x07) == 0xF7) {
    1060993                                // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
    1061                                 $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &
    1062                                                    ((ord($string{($offset + 1)}) & 0x3F) << 12) &
    1063                                                    ((ord($string{($offset + 2)}) & 0x3F) <<  6) &
    1064                                                         (ord($string{($offset + 3)}) & 0x3F);
     994                                $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) &
     995                                                   ((ord($string[($offset + 1)]) & 0x3F) << 12) &
     996                                                   ((ord($string[($offset + 2)]) & 0x3F) <<  6) &
     997                                                        (ord($string[($offset + 3)]) & 0x3F);
    1065998                                $offset += 4;
    1066                         } elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {
     999                        } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) {
    10671000                                // 1110bbbb 10bbbbbb 10bbbbbb
    1068                                 $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &
    1069                                                    ((ord($string{($offset + 1)}) & 0x3F) <<  6) &
    1070                                                         (ord($string{($offset + 2)}) & 0x3F);
     1001                                $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) &
     1002                                                   ((ord($string[($offset + 1)]) & 0x3F) <<  6) &
     1003                                                        (ord($string[($offset + 2)]) & 0x3F);
    10711004                                $offset += 3;
    1072                         } elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {
     1005                        } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) {
    10731006                                // 110bbbbb 10bbbbbb
    1074                                 $charval = ((ord($string{($offset + 0)}) & 0x1F) <<  6) &
    1075                                                         (ord($string{($offset + 1)}) & 0x3F);
     1007                                $charval = ((ord($string[($offset + 0)]) & 0x1F) <<  6) &
     1008                                                        (ord($string[($offset + 1)]) & 0x3F);
    10761009                                $offset += 2;
    1077                         } elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {
     1010                        } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) {
    10781011                                // 0bbbbbbb
    1079                                 $charval = ord($string{$offset});
     1012                                $charval = ord($string[$offset]);
    10801013                                $offset += 1;
    10811014                        } else {
     
    11071040                $stringlength = strlen($string);
    11081041                while ($offset < $stringlength) {
    1109                         if ((ord($string{$offset}) | 0x07) == 0xF7) {
     1042                        if ((ord($string[$offset]) | 0x07) == 0xF7) {
    11101043                                // 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
    1111                                 $charval = ((ord($string{($offset + 0)}) & 0x07) << 18) &
    1112                                                    ((ord($string{($offset + 1)}) & 0x3F) << 12) &
    1113                                                    ((ord($string{($offset + 2)}) & 0x3F) <<  6) &
    1114                                                         (ord($string{($offset + 3)}) & 0x3F);
     1044                                $charval = ((ord($string[($offset + 0)]) & 0x07) << 18) &
     1045                                                   ((ord($string[($offset + 1)]) & 0x3F) << 12) &
     1046                                                   ((ord($string[($offset + 2)]) & 0x3F) <<  6) &
     1047                                                        (ord($string[($offset + 3)]) & 0x3F);
    11151048                                $offset += 4;
    1116                         } elseif ((ord($string{$offset}) | 0x0F) == 0xEF) {
     1049                        } elseif ((ord($string[$offset]) | 0x0F) == 0xEF) {
    11171050                                // 1110bbbb 10bbbbbb 10bbbbbb
    1118                                 $charval = ((ord($string{($offset + 0)}) & 0x0F) << 12) &
    1119                                                    ((ord($string{($offset + 1)}) & 0x3F) <<  6) &
    1120                                                         (ord($string{($offset + 2)}) & 0x3F);
     1051                                $charval = ((ord($string[($offset + 0)]) & 0x0F) << 12) &
     1052                                                   ((ord($string[($offset + 1)]) & 0x3F) <<  6) &
     1053                                                        (ord($string[($offset + 2)]) & 0x3F);
    11211054                                $offset += 3;
    1122                         } elseif ((ord($string{$offset}) | 0x1F) == 0xDF) {
     1055                        } elseif ((ord($string[$offset]) | 0x1F) == 0xDF) {
    11231056                                // 110bbbbb 10bbbbbb
    1124                                 $charval = ((ord($string{($offset + 0)}) & 0x1F) <<  6) &
    1125                                                         (ord($string{($offset + 1)}) & 0x3F);
     1057                                $charval = ((ord($string[($offset + 0)]) & 0x1F) <<  6) &
     1058                                                        (ord($string[($offset + 1)]) & 0x3F);
    11261059                                $offset += 2;
    1127                         } elseif ((ord($string{$offset}) | 0x7F) == 0x7F) {
     1060                        } elseif ((ord($string[$offset]) | 0x7F) == 0x7F) {
    11281061                                // 0bbbbbbb
    1129                                 $charval = ord($string{$offset});
     1062                                $charval = ord($string[$offset]);
    11301063                                $offset += 1;
    11311064                        } else {
     
    12821215                // mb_convert_encoding() available
    12831216                if (function_exists('mb_convert_encoding')) {
     1217                        if ((strtoupper($in_charset) == 'UTF-16') && (substr($string, 0, 2) != "\xFE\xFF") && (substr($string, 0, 2) != "\xFF\xFE")) {
     1218                                // if BOM missing, mb_convert_encoding will mishandle the conversion, assume UTF-16BE and prepend appropriate BOM
     1219                                $string = "\xFF\xFE".$string;
     1220                        }
     1221                        if ((strtoupper($in_charset) == 'UTF-16') && (strtoupper($out_charset) == 'UTF-8')) {
     1222                                if (($string == "\xFF\xFE") || ($string == "\xFE\xFF")) {
     1223                                        // if string consists of only BOM, mb_convert_encoding will return the BOM unmodified
     1224                                        return '';
     1225                                }
     1226                        }
    12841227                        if ($converted_string = @mb_convert_encoding($string, $out_charset, $in_charset)) {
    12851228                                switch ($out_charset) {
     
    12911234                        }
    12921235                        return $string;
    1293                 }
     1236
    12941237                // iconv() available
    1295                 else if (function_exists('iconv')) {
     1238                } elseif (function_exists('iconv')) {
    12961239                        if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) {
    12971240                                switch ($out_charset) {
     
    13981341                                $strlen = strlen($string);
    13991342                                for ($i = 0; $i < $strlen; $i++) {
    1400                                         $char_ord_val = ord($string{$i});
     1343                                        $char_ord_val = ord($string[$i]);
    14011344                                        $charval = 0;
    14021345                                        if ($char_ord_val < 0x80) {
     
    14041347                                        } elseif ((($char_ord_val & 0xF0) >> 4) == 0x0F  &&  $i+3 < $strlen) {
    14051348                                                $charval  = (($char_ord_val & 0x07) << 18);
    1406                                                 $charval += ((ord($string{++$i}) & 0x3F) << 12);
    1407                                                 $charval += ((ord($string{++$i}) & 0x3F) << 6);
    1408                                                 $charval +=  (ord($string{++$i}) & 0x3F);
     1349                                                $charval += ((ord($string[++$i]) & 0x3F) << 12);
     1350                                                $charval += ((ord($string[++$i]) & 0x3F) << 6);
     1351                                                $charval +=  (ord($string[++$i]) & 0x3F);
    14091352                                        } elseif ((($char_ord_val & 0xE0) >> 5) == 0x07  &&  $i+2 < $strlen) {
    14101353                                                $charval  = (($char_ord_val & 0x0F) << 12);
    1411                                                 $charval += ((ord($string{++$i}) & 0x3F) << 6);
    1412                                                 $charval +=  (ord($string{++$i}) & 0x3F);
     1354                                                $charval += ((ord($string[++$i]) & 0x3F) << 6);
     1355                                                $charval +=  (ord($string[++$i]) & 0x3F);
    14131356                                        } elseif ((($char_ord_val & 0xC0) >> 6) == 0x03  &&  $i+1 < $strlen) {
    14141357                                                $charval  = (($char_ord_val & 0x1F) << 6);
    1415                                                 $charval += (ord($string{++$i}) & 0x3F);
     1358                                                $charval += (ord($string[++$i]) & 0x3F);
    14161359                                        }
    14171360                                        if (($charval >= 32) && ($charval <= 127)) {
  • _core_/plugins/medias/lib/getid3/getid3.php

    r113161 r117918  
    11<?php
    2 
    32/////////////////////////////////////////////////////////////////
    43/// getID3() by James Heinrich <info@getid3.org>               //
     
    252251        protected $startup_warning = '';
    253252
    254         const VERSION           = '1.9.16-201810171314';
     253        const VERSION           = '1.9.18-201907240906';
    255254        const FREAD_BUFFER_SIZE = 32768;
    256255
     
    322321                // Needed for Windows only:
    323322                // Define locations of helper applications for Shorten, VorbisComment, MetaFLAC
    324                 //   as well as other helper functions such as head, tail, md5sum, etc
     323                //   as well as other helper functions such as head, etc
    325324                // This path cannot contain spaces, but the below code will attempt to get the
    326325                //   8.3-equivalent path automatically
     
    407406         * @throws getid3_exception
    408407         */
    409         public function openfile($filename, $filesize=null) {
     408        public function openfile($filename, $filesize=null, $fp=null) {
    410409                try {
    411410                        if (!empty($this->startup_error)) {
     
    434433                        // open local file
    435434                        //if (is_readable($filename) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { // see https://www.getid3.org/phpBB3/viewtopic.php?t=1720
    436                         if ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) {
     435                        if (($fp != null) && ((get_resource_type($fp) == 'file') || (get_resource_type($fp) == 'stream'))) {
     436                                $this->fp = $fp;
     437                        } elseif ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) {
    437438                                // great
    438439                        } else {
     
    515516         * @return array
    516517         */
    517         public function analyze($filename, $filesize=null, $original_filename='') {
     518        public function analyze($filename, $filesize=null, $original_filename='', $fp=null) {
    518519                try {
    519                         if (!$this->openfile($filename, $filesize)) {
     520                        if (!$this->openfile($filename, $filesize, $fp)) {
    520521                                return $this->info;
    521522                        }
     
    551552                                if ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) {
    552553                                        $this->info['id3v2']['header']        = true;
    553                                         $this->info['id3v2']['majorversion']  = ord($header{3});
    554                                         $this->info['id3v2']['minorversion']  = ord($header{4});
     554                                        $this->info['id3v2']['majorversion']  = ord($header[3]);
     555                                        $this->info['id3v2']['minorversion']  = ord($header[4]);
    555556                                        $this->info['avdataoffset']          += getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length
    556557                                }
     
    834835                                // DSS  - audio       - Digital Speech Standard
    835836                                'dss'  => array(
    836                                                         'pattern'   => '^[\\x02-\\x06]ds[s2]',
     837                                                        'pattern'   => '^[\\x02-\\x08]ds[s2]',
    837838                                                        'group'     => 'audio',
    838839                                                        'module'    => 'dss',
     
    12531254                                                ),
    12541255
     1256                                // XZ   - data         - XZ compressed data
     1257                                'xz'  => array(
     1258                                                        'pattern'   => '^\\xFD7zXZ\\x00',
     1259                                                        'group'     => 'archive',
     1260                                                        'module'    => 'xz',
     1261                                                        'mime_type' => 'application/x-xz',
     1262                                                        'fail_id3'  => 'ERROR',
     1263                                                        'fail_ape'  => 'ERROR',
     1264                                                ),
     1265
    12551266
    12561267                                // Misc other formats
     
    13241335
    13251336                if (preg_match('#\\.mp[123a]$#i', $filename)) {
    1326                         // Too many mp3 encoders on the market put gabage in front of mpeg files
     1337                        // Too many mp3 encoders on the market put garbage in front of mpeg files
    13271338                        // use assume format on these if format detection failed
    13281339                        $GetFileFormatArray = $this->GetFileFormatArray();
     
    14281439                                        }
    14291440                                        if ($tag_key == 'picture') {
     1441                                                // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere
    14301442                                                unset($this->info[$comment_name]['comments'][$tag_key]);
    14311443                                        }
     
    14411453                                if ($this->option_tags_html) {
    14421454                                        foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {
     1455                                                if ($tag_key == 'picture') {
     1456                                                        // Do not to try to convert binary picture data to HTML
     1457                                                        // https://github.com/JamesHeinrich/getID3/issues/178
     1458                                                        continue;
     1459                                                }
    14431460                                                $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $this->info[$comment_name]['encoding']);
    14441461                                        }
     
    14491466                }
    14501467
    1451                 // pictures can take up a lot of space, and we don't need multiple copies of them
    1452                 // let there be a single copy in [comments][picture], and not elsewhere
     1468                // pictures can take up a lot of space, and we don't need multiple copies of them; let there be a single copy in [comments][picture], and not elsewhere
    14531469                if (!empty($this->info['tags'])) {
    14541470                        $unset_keys = array('tags', 'tags_html');
     
    18251841         * @return bool
    18261842         */
    1827     public static function is_writable ($filename) {
    1828         $ret = is_writable($filename);
    1829 
    1830         if (!$ret) {
    1831             $perms = fileperms($filename);
    1832             $ret = ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002);
    1833         }
    1834 
    1835         return $ret;
    1836     }
     1843        public static function is_writable ($filename) {
     1844                $ret = is_writable($filename);
     1845                if (!$ret) {
     1846                        $perms = fileperms($filename);
     1847                        $ret = ($perms & 0x0080) || ($perms & 0x0010) || ($perms & 0x0002);
     1848                }
     1849                return $ret;
     1850        }
    18371851
    18381852}
     
    19771991                $contents = '';
    19781992                do {
    1979                         if (($this->getid3->memory_limit > 0) && ($bytes > $this->getid3->memory_limit)) {
     1993                        //if (($this->getid3->memory_limit > 0) && ($bytes > $this->getid3->memory_limit)) {
     1994                        if (($this->getid3->memory_limit > 0) && (($bytes / $this->getid3->memory_limit) > 0.99)) { // enable a more-fuzzy match to prevent close misses generating errors like "PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 33554464 bytes)"
    19801995                                throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') that is more than available PHP memory ('.$this->getid3->memory_limit.')', 10);
    19811996                        }
  • _core_/plugins/medias/lib/getid3/module.archive.tar.php

    r113161 r117918  
    4545                        $checksum = 0;
    4646                        for ($i = 0; $i < 148; $i++) {
    47                                 $checksum += ord($buffer{$i});
     47                                $checksum += ord($buffer[$i]);
    4848                        }
    4949                        for ($i = 148; $i < 156; $i++) {
     
    5151                        }
    5252                        for ($i = 156; $i < 512; $i++) {
    53                                 $checksum += ord($buffer{$i});
     53                                $checksum += ord($buffer[$i]);
    5454                        }
    5555                        $attr    = unpack($unpack_header, $buffer);
  • _core_/plugins/medias/lib/getid3/module.archive.zip.php

    r113161 r117918  
    9797                                            !empty($info['zip']['files']['docProps']['app.xml']) &&
    9898                                            !empty($info['zip']['files']['docProps']['core.xml'])) {
    99                                                    // http://technet.microsoft.com/en-us/library/cc179224.aspx
    100                                                    $info['fileformat'] = 'zip.msoffice';
    101                                                    if (!empty($ThisFileInfo['zip']['files']['ppt'])) {
    102                                                       $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
    103                                                    } elseif (!empty($ThisFileInfo['zip']['files']['xl'])) {
    104                                                       $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
    105                                                    } elseif (!empty($ThisFileInfo['zip']['files']['word'])) {
    106                                                       $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
    107                                                    }
     99                                                        // http://technet.microsoft.com/en-us/library/cc179224.aspx
     100                                                        $info['fileformat'] = 'zip.msoffice';
     101                                                        if (!empty($ThisFileInfo['zip']['files']['ppt'])) {
     102                                                                $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
     103                                                        } elseif (!empty($ThisFileInfo['zip']['files']['xl'])) {
     104                                                                $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
     105                                                        } elseif (!empty($ThisFileInfo['zip']['files']['word'])) {
     106                                                                $info['mime_type'] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
     107                                                        }
    108108                                        }
    109109
  • _core_/plugins/medias/lib/getid3/module.audio-video.asf.php

    r113161 r117918  
    798798                                                        case 'tracknumber':
    799799                                                                // be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character)
    800                                                                 $thisfile_asf_comments['track'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
    801                                                                 foreach ($thisfile_asf_comments['track'] as $key => $value) {
     800                                                                $thisfile_asf_comments['track_number'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
     801                                                                foreach ($thisfile_asf_comments['track_number'] as $key => $value) {
    802802                                                                        if (preg_match('/^[0-9\x00]+$/', $value)) {
    803                                                                                 $thisfile_asf_comments['track'][$key] = intval(str_replace("\x00", '', $value));
     803                                                                                $thisfile_asf_comments['track_number'][$key] = intval(str_replace("\x00", '', $value));
    804804                                                                        }
    805805                                                                }
     
    807807
    808808                                                        case 'wm/track':
    809                                                                 if (empty($thisfile_asf_comments['track'])) {
    810                                                                         $thisfile_asf_comments['track'] = array(1 + $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
     809                                                                if (empty($thisfile_asf_comments['track_number'])) {
     810                                                                        $thisfile_asf_comments['track_number'] = array(1 + $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']));
    811811                                                                }
    812812                                                                break;
     
    16541654         */
    16551655        public static function BytestringToGUID($Bytestring) {
    1656                 $GUIDstring  = str_pad(dechex(ord($Bytestring{3})),  2, '0', STR_PAD_LEFT);
    1657                 $GUIDstring .= str_pad(dechex(ord($Bytestring{2})),  2, '0', STR_PAD_LEFT);
    1658                 $GUIDstring .= str_pad(dechex(ord($Bytestring{1})),  2, '0', STR_PAD_LEFT);
    1659                 $GUIDstring .= str_pad(dechex(ord($Bytestring{0})),  2, '0', STR_PAD_LEFT);
     1656                $GUIDstring  = str_pad(dechex(ord($Bytestring[3])),  2, '0', STR_PAD_LEFT);
     1657                $GUIDstring .= str_pad(dechex(ord($Bytestring[2])),  2, '0', STR_PAD_LEFT);
     1658                $GUIDstring .= str_pad(dechex(ord($Bytestring[1])),  2, '0', STR_PAD_LEFT);
     1659                $GUIDstring .= str_pad(dechex(ord($Bytestring[0])),  2, '0', STR_PAD_LEFT);
    16601660                $GUIDstring .= '-';
    1661                 $GUIDstring .= str_pad(dechex(ord($Bytestring{5})),  2, '0', STR_PAD_LEFT);
    1662                 $GUIDstring .= str_pad(dechex(ord($Bytestring{4})),  2, '0', STR_PAD_LEFT);
     1661                $GUIDstring .= str_pad(dechex(ord($Bytestring[5])),  2, '0', STR_PAD_LEFT);
     1662                $GUIDstring .= str_pad(dechex(ord($Bytestring[4])),  2, '0', STR_PAD_LEFT);
    16631663                $GUIDstring .= '-';
    1664                 $GUIDstring .= str_pad(dechex(ord($Bytestring{7})),  2, '0', STR_PAD_LEFT);
    1665                 $GUIDstring .= str_pad(dechex(ord($Bytestring{6})),  2, '0', STR_PAD_LEFT);
     1664                $GUIDstring .= str_pad(dechex(ord($Bytestring[7])),  2, '0', STR_PAD_LEFT);
     1665                $GUIDstring .= str_pad(dechex(ord($Bytestring[6])),  2, '0', STR_PAD_LEFT);
    16661666                $GUIDstring .= '-';
    1667                 $GUIDstring .= str_pad(dechex(ord($Bytestring{8})),  2, '0', STR_PAD_LEFT);
    1668                 $GUIDstring .= str_pad(dechex(ord($Bytestring{9})),  2, '0', STR_PAD_LEFT);
     1667                $GUIDstring .= str_pad(dechex(ord($Bytestring[8])),  2, '0', STR_PAD_LEFT);
     1668                $GUIDstring .= str_pad(dechex(ord($Bytestring[9])),  2, '0', STR_PAD_LEFT);
    16691669                $GUIDstring .= '-';
    1670                 $GUIDstring .= str_pad(dechex(ord($Bytestring{10})), 2, '0', STR_PAD_LEFT);
    1671                 $GUIDstring .= str_pad(dechex(ord($Bytestring{11})), 2, '0', STR_PAD_LEFT);
    1672                 $GUIDstring .= str_pad(dechex(ord($Bytestring{12})), 2, '0', STR_PAD_LEFT);
    1673                 $GUIDstring .= str_pad(dechex(ord($Bytestring{13})), 2, '0', STR_PAD_LEFT);
    1674                 $GUIDstring .= str_pad(dechex(ord($Bytestring{14})), 2, '0', STR_PAD_LEFT);
    1675                 $GUIDstring .= str_pad(dechex(ord($Bytestring{15})), 2, '0', STR_PAD_LEFT);
     1670                $GUIDstring .= str_pad(dechex(ord($Bytestring[10])), 2, '0', STR_PAD_LEFT);
     1671                $GUIDstring .= str_pad(dechex(ord($Bytestring[11])), 2, '0', STR_PAD_LEFT);
     1672                $GUIDstring .= str_pad(dechex(ord($Bytestring[12])), 2, '0', STR_PAD_LEFT);
     1673                $GUIDstring .= str_pad(dechex(ord($Bytestring[13])), 2, '0', STR_PAD_LEFT);
     1674                $GUIDstring .= str_pad(dechex(ord($Bytestring[14])), 2, '0', STR_PAD_LEFT);
     1675                $GUIDstring .= str_pad(dechex(ord($Bytestring[15])), 2, '0', STR_PAD_LEFT);
    16761676
    16771677                return strtoupper($GUIDstring);
  • _core_/plugins/medias/lib/getid3/module.audio-video.matroska.php

    r113161 r117918  
    343343                                                        case 'A_PCM/INT/LIT':
    344344                                                        case 'A_PCM/INT/BIG':
    345                                                                 $track_info['bitrate'] = $trackarray['SamplingFrequency'] * $trackarray['Channels'] * $trackarray['BitDepth'];
     345                                                                $track_info['bitrate'] = $track_info['sample_rate'] * $track_info['channels'] * $trackarray['BitDepth'];
    346346                                                                break;
    347347
  • _core_/plugins/medias/lib/getid3/module.audio-video.mpeg.php

    r113161 r117918  
    9191
    9292                                case 0xB3: // sequence_header_code
    93                                         /*
    94                                         Note: purposely doing the less-pretty (and probably a bit slower) method of using string of bits rather than bitwise operations.
    95                                               Mostly because PHP 32-bit doesn't handle unsigned integers well for bitwise operation.
    96                                               Also the MPEG stream is designed as a bitstream and often doesn't align nicely with byte boundaries.
    97                                         */
     93                                        // Note: purposely doing the less-pretty (and probably a bit slower) method of using string of bits rather than bitwise operations.
     94                                        // Mostly because PHP 32-bit doesn't handle unsigned integers well for bitwise operation.
     95                                        // Also the MPEG stream is designed as a bitstream and often doesn't align nicely with byte boundaries.
    9896                                        $info['video']['codec'] = 'MPEG-1'; // will be updated if extension_start_code found
    9997
     
    623621        /**
    624622         * @param int $rawaspectratio
    625     * @param int $mpeg_version
     623        * @param int $mpeg_version
    626624         *
    627625         * @return string
  • _core_/plugins/medias/lib/getid3/module.audio-video.quicktime.php

    r113161 r117918  
    3939                $offset      = 0;
    4040                $atomcounter = 0;
    41                 $atom_data_read_buffer_size = max($this->getid3->option_fread_buffer_size * 1024, ($info['php_memory_limit'] ? round($info['php_memory_limit'] / 4) : 1024)); // set read buffer to 25% of PHP memory limit (if one is specified), otherwise use option_fread_buffer_size [default: 32MB]
     41                $atom_data_read_buffer_size = $info['php_memory_limit'] ? round($info['php_memory_limit'] / 4) : $this->getid3->option_fread_buffer_size * 1024; // set read buffer to 25% of PHP memory limit (if one is specified), otherwise use option_fread_buffer_size [default: 32MB]
    4242                while ($offset < $info['avdataend']) {
    4343                        if (!getid3_lib::intValueSupported($offset)) {
     
    569569                                                }
    570570                                        }
    571                                                 $this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']);
    572                                                 break;
     571                                        $this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']);
     572                                        break;
    573573
    574574
     
    26552655                        $handyatomtranslatorarray["\xA9".'swr'] = 'software';
    26562656                        $handyatomtranslatorarray["\xA9".'too'] = 'encoding_tool';       // iTunes 4.0
    2657                         $handyatomtranslatorarray["\xA9".'trk'] = 'track';
     2657                        $handyatomtranslatorarray["\xA9".'trk'] = 'track_number';
    26582658                        $handyatomtranslatorarray["\xA9".'url'] = 'url';
    26592659                        $handyatomtranslatorarray["\xA9".'wrn'] = 'warning';
     
    27532753         * @return string
    27542754         */
    2755     public function LociString($lstring, &$count) {
    2756             // Loci strings are UTF-8 or UTF-16 and null (x00/x0000) terminated. UTF-16 has a BOM
    2757             // Also need to return the number of bytes the string occupied so additional fields can be extracted
    2758             $len = strlen($lstring);
    2759             if ($len == 0) {
    2760                 $count = 0;
    2761                 return '';
    2762             }
    2763             if ($lstring[0] == "\x00") {
    2764                 $count = 1;
    2765                 return '';
    2766             }
    2767             //check for BOM
    2768             if ($len > 2 && (($lstring[0] == "\xFE" && $lstring[1] == "\xFF") || ($lstring[0] == "\xFF" && $lstring[1] == "\xFE"))) {
    2769                 //UTF-16
    2770                 if (preg_match('/(.*)\x00/', $lstring, $lmatches)){
    2771                      $count = strlen($lmatches[1]) * 2 + 2; //account for 2 byte characters and trailing \x0000
    2772                     return getid3_lib::iconv_fallback_utf16_utf8($lmatches[1]);
    2773                 } else {
    2774                     return '';
    2775                 }
    2776             } else {
    2777                 //UTF-8
    2778                 if (preg_match('/(.*)\x00/', $lstring, $lmatches)){
    2779                     $count = strlen($lmatches[1]) + 1; //account for trailing \x00
    2780                     return $lmatches[1];
    2781                 }else {
    2782                     return '';
    2783                 }
    2784 
    2785             }
    2786         }
     2755        public function LociString($lstring, &$count) {
     2756                // Loci strings are UTF-8 or UTF-16 and null (x00/x0000) terminated. UTF-16 has a BOM
     2757                // Also need to return the number of bytes the string occupied so additional fields can be extracted
     2758                $len = strlen($lstring);
     2759                if ($len == 0) {
     2760                        $count = 0;
     2761                        return '';
     2762                }
     2763                if ($lstring[0] == "\x00") {
     2764                        $count = 1;
     2765                        return '';
     2766                }
     2767                // check for BOM
     2768                if (($len > 2) && ((($lstring[0] == "\xFE") && ($lstring[1] == "\xFF")) || (($lstring[0] == "\xFF") && ($lstring[1] == "\xFE")))) {
     2769                        // UTF-16
     2770                        if (preg_match('/(.*)\x00/', $lstring, $lmatches)) {
     2771                                $count = strlen($lmatches[1]) * 2 + 2; //account for 2 byte characters and trailing \x0000
     2772                                return getid3_lib::iconv_fallback_utf16_utf8($lmatches[1]);
     2773                        } else {
     2774                                return '';
     2775                        }
     2776                }
     2777                // UTF-8
     2778                if (preg_match('/(.*)\x00/', $lstring, $lmatches)) {
     2779                        $count = strlen($lmatches[1]) + 1; //account for trailing \x00
     2780                        return $lmatches[1];
     2781                }
     2782                return '';
     2783        }
    27872784
    27882785        /**
  • _core_/plugins/medias/lib/getid3/module.audio-video.riff.php

    r113161 r117918  
    5252                $thisfile_riff_audio       = &$thisfile_riff['audio'];
    5353                $thisfile_riff_video       = &$thisfile_riff['video'];
    54         $thisfile_riff_WAVE        = array();
     54                $thisfile_riff_WAVE        = array();
    5555
    5656                $Original['avdataoffset'] = $info['avdataoffset'];
     
    704704                                                'copyrighted'  => 0x00020010,
    705705                                        );
    706                     foreach ($flags as $flag => $value) {
     706                                        foreach ($flags as $flag => $value) {
    707707                                                $thisfile_riff_raw_avih['flags'][$flag] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & $value);
    708708                                        }
     
    710710                                        // shortcut
    711711                                        $thisfile_riff_video[$streamindex] = array();
    712                     /** @var array $thisfile_riff_video_current */
     712                                        /** @var array $thisfile_riff_video_current */
    713713                                        $thisfile_riff_video_current = &$thisfile_riff_video[$streamindex];
    714714
     
    924924                        case 'CDDA':
    925925                                $info['fileformat'] = 'cda';
    926                             unset($info['mime_type']);
     926                                unset($info['mime_type']);
    927927
    928928                                $thisfile_audio_dataformat      = 'cda';
     
    944944                                        $thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75;
    945945                                        $thisfile_riff_CDDA_fmt_0['playtime_seconds']     = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75;
    946                                         $info['comments']['track']                = $thisfile_riff_CDDA_fmt_0['track_num'];
     946                                        $info['comments']['track_number']         = $thisfile_riff_CDDA_fmt_0['track_num'];
    947947                                        $info['playtime_seconds']                 = $thisfile_riff_CDDA_fmt_0['playtime_seconds'];
    948948
     
    957957                                break;
    958958
    959             // http://en.wikipedia.org/wiki/AIFF
     959                        // http://en.wikipedia.org/wiki/AIFF
    960960                        case 'AIFF':
    961961                        case 'AIFC':
     
    10671067                                        getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
    10681068                                        $getid3_temp = new getID3();
    1069                                         $getid3_temp->openfile($this->getid3->filename);
     1069                                        $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    10701070                                        $getid3_id3v2 = new getid3_id3v2($getid3_temp);
    10711071                                        $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8;
     
    11701170
    11711171                                        $getid3_temp = new getID3();
    1172                                         $getid3_temp->openfile($this->getid3->filename);
     1172                                        $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    11731173                                        $getid3_mpeg = new getid3_mpeg($getid3_temp);
    11741174                                        $getid3_mpeg->Analyze();
     
    12561256
    12571257                                        $getid3_temp = new getID3();
    1258                                         $getid3_temp->openfile($this->getid3->filename);
     1258                                        $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    12591259                                        $getid3_id3v2 = new getid3_id3v2($getid3_temp);
    12601260                                        $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8;
     
    15551555                                                                                if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) {
    15561556                                                                                        $getid3_temp = new getID3();
    1557                                                                                         $getid3_temp->openfile($this->getid3->filename);
     1557                                                                                        $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    15581558                                                                                        $getid3_temp->info['avdataoffset'] = $this->ftell() - 4;
    15591559                                                                                        $getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;
     
    15771577                                                                                // AC3
    15781578                                                                                $getid3_temp = new getID3();
    1579                                                                                 $getid3_temp->openfile($this->getid3->filename);
     1579                                                                                $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    15801580                                                                                $getid3_temp->info['avdataoffset'] = $this->ftell() - 4;
    15811581                                                                                $getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;
     
    16381638                                                                        if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) {
    16391639                                                                                $getid3_temp = new getID3();
    1640                                                                                 $getid3_temp->openfile($this->getid3->filename);
     1640                                                                                $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    16411641                                                                                $getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
    16421642                                                                                $getid3_temp->info['avdataend']    = $info['avdataend'];
     
    16551655                                                                        $getid3_temp = new getID3();
    16561656                                                                        if ($isRegularAC3) {
    1657                                                                                 $getid3_temp->openfile($this->getid3->filename);
     1657                                                                                $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    16581658                                                                                $getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
    16591659                                                                                $getid3_temp->info['avdataend']    = $info['avdataend'];
     
    16891689                                                                        // This is probably DTS data
    16901690                                                                        $getid3_temp = new getID3();
    1691                                                                         $getid3_temp->openfile($this->getid3->filename);
     1691                                                                        $getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
    16921692                                                                        $getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
    16931693                                                                        $getid3_dts = new getid3_dts($getid3_temp);
     
    17561756                                                        //      $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunksize));
    17571757                                                        //      break;
     1758
     1759                                                        case 'scot':
     1760                                                                // https://cmsdk.com/node-js/adding-scot-chunk-to-wav-file.html
     1761                                                                $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize);
     1762                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['alter']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],   0,   1);
     1763                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],   1,   1);
     1764                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['artnum']          = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],   2,   2));
     1765                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['title']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],   4,  43);  // "name" in other documentation
     1766                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['copy']            =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  47,   4);
     1767                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['padd']            =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  51,   1);
     1768                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['asclen']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  52,   5);
     1769                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['startseconds']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  57,   2));
     1770                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['starthundredths'] = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  59,   2));
     1771                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['endseconds']      = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  61,   2));
     1772                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['endhundreths']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  63,   2));
     1773                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['sdate']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  65,   6);
     1774                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['kdate']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  71,   6);
     1775                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['start_hr']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  77,   1);
     1776                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['kill_hr']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  78,   1);
     1777                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['digital']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  79,   1);
     1778                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['sample_rate']     = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  80,   2));
     1779                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['stereo']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  82,   1);
     1780                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['compress']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  83,   1);
     1781                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['eomstrt']         = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  84,   4));
     1782                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['eomlen']          = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  88,   2));
     1783                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['attrib2']         = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'],  90,   4));
     1784                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['future1']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'],  94,  12);
     1785                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['catfontcolor']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 106,   4));
     1786                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['catcolor']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 110,   4));
     1787                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['segeompos']       = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 114,   4));
     1788                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_startsecs']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 118,   2));
     1789                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['vt_starthunds']   = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 120,   2));
     1790                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcat']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 122,   3);
     1791                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['priorcopy']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 125,   4);
     1792                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['priorpadd']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 129,   1);
     1793                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['postcat']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 130,   3);
     1794                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['postcopy']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 133,   4);
     1795                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['postpadd']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 137,   1);
     1796                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['hrcanplay']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 138,  21);
     1797                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['future2']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 159, 108);
     1798                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['artist']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 267,  34);
     1799                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['comment']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 301,  34); // "trivia" in other documentation
     1800                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['intro']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 335,   2);
     1801                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['end']             =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 337,   1);
     1802                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['year']            =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 338,   4);
     1803                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['obsolete2']       =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 342,   1);
     1804                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['rec_hr']          =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 343,   1);
     1805                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['rdate']           =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 344,   6);
     1806                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['mpeg_bitrate']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 350,   2));
     1807                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['pitch']           = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 352,   2));
     1808                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['playlevel']       = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 354,   2));
     1809                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['lenvalid']        =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 356,   1);
     1810                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['filelength']      = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 357,   4));
     1811                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['newplaylevel']    = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 361,   2));
     1812                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['chopsize']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 363,   4));
     1813                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['vteomovr']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 367,   4));
     1814                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['desiredlen']      = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 371,   4));
     1815                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['triggers']        = getid3_lib::LittleEndian2Int(substr($RIFFchunk[$chunkname][$thisindex]['data'], 375,   4));
     1816                                                                $RIFFchunk[$chunkname][$thisindex]['parsed']['fillout']         =                              substr($RIFFchunk[$chunkname][$thisindex]['data'], 379,   33);
     1817
     1818                                                                foreach (array('title', 'artist', 'comment') as $key) {
     1819                                                                        if (trim($RIFFchunk[$chunkname][$thisindex]['parsed'][$key])) {
     1820                                                                                $info['riff']['comments'][$key] = array($RIFFchunk[$chunkname][$thisindex]['parsed'][$key]);
     1821                                                                        }
     1822                                                                }
     1823                                                                if ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] && !empty($info['filesize']) && ($RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'] != $info['filesize'])) {
     1824                                                                        $this->warning('RIFF.WAVE.scot.filelength ('.$RIFFchunk[$chunkname][$thisindex]['parsed']['filelength'].') different from actual filesize ('.$info['filesize'].')');
     1825                                                                }
     1826                                                                break;
    17581827
    17591828                                                        default:
  • _core_/plugins/medias/lib/getid3/module.audio.ac3.php

    r113161 r117918  
    2121         * @var array
    2222         */
    23     private $AC3header = array();
     23        private $AC3header = array();
    2424
    2525        /**
    2626         * @var int
    2727         */
    28     private $BSIoffset = 0;
    29 
    30     const syncword = 0x0B77;
     28        private $BSIoffset = 0;
     29
     30        const syncword = 0x0B77;
    3131
    3232        /**
     
    423423
    424424                        $this->error('Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 16. Please submit a support ticket with a sample file.');
    425                     unset($info['ac3']);
     425                        unset($info['ac3']);
    426426                        return false;
    427427
     
    688688
    689689                $fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT);
    690                 if ($fourbit{0} == '1') {
     690                if ($fourbit[0] == '1') {
    691691                        $log_gain = -8 + bindec(substr($fourbit, 1));
    692692                } else {
     
    759759                        );
    760760                }
     761                $paddingBytes = 0;
    761762                if (($fscod == 1) && $padding) {
    762763                        // frame lengths are padded by 1 word (16 bits) at 44100
    763                         $frameSizeLookup[$frmsizecod] += 2;
    764                 }
    765                 return (isset($frameSizeLookup[$framesizeid][$fscod]) ? $frameSizeLookup[$framesizeid][$fscod] : false);
     764                        // (fscode==1) means 44100Hz (see sampleRateCodeLookup)
     765                        $paddingBytes = 2;
     766                }
     767                return (isset($frameSizeLookup[$framesizeid][$fscod]) ? $frameSizeLookup[$framesizeid][$fscod] + $paddingBytes : false);
    766768        }
    767769
  • _core_/plugins/medias/lib/getid3/module.audio.bonk.php

    r113161 r117918  
    4545                                $BonkTagOffset = $this->ftell();
    4646                                $TagHeaderTest = $this->fread(5);
    47                                 if (($TagHeaderTest{0} != "\x00") || (substr($PossibleBonkTag, 4, 4) != strtolower(substr($PossibleBonkTag, 4, 4)))) {
     47                                if (($TagHeaderTest[0] != "\x00") || (substr($PossibleBonkTag, 4, 4) != strtolower(substr($PossibleBonkTag, 4, 4)))) {
    4848                                        $this->error('Expecting "'.getid3_lib::PrintHexBytes("\x00".strtoupper(substr($PossibleBonkTag, 4, 4))).'" at offset '.$BonkTagOffset.', found "'.getid3_lib::PrintHexBytes($TagHeaderTest).'"');
    4949                                        return false;
  • _core_/plugins/medias/lib/getid3/module.audio.dss.php

    r113161 r117918  
    2727                $DSSheader  = $this->fread(1540);
    2828
    29                 if (!preg_match('#^[\\x02-\\x06]ds[s2]#', $DSSheader)) {
    30                         $this->error('Expecting "[02-06] 64 73 [73|32]" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes(substr($DSSheader, 0, 4)).'"');
     29                if (!preg_match('#^[\\x02-\\x08]ds[s2]#', $DSSheader)) {
     30                        $this->error('Expecting "[02-08] 64 73 [73|32]" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes(substr($DSSheader, 0, 4)).'"');
    3131                        return false;
    3232                }
  • _core_/plugins/medias/lib/getid3/module.audio.dts.php

    r113161 r117918  
    5252                // check syncword
    5353                $sync = substr($DTSheader, 0, 4);
    54         if (($encoding = array_search($sync, self::$syncwords)) !== false) {
    55 
    56                 $info['dts']['raw']['magic'] = $sync;
     54                if (($encoding = array_search($sync, self::$syncwords)) !== false) {
     55
     56                        $info['dts']['raw']['magic'] = $sync;
    5757                        $this->readBinDataOffset = 32;
    5858
    59         } elseif ($this->isDependencyFor('matroska')) {
     59                } elseif ($this->isDependencyFor('matroska')) {
    6060
    6161                        // Matroska contains DTS without syncword encoded as raw big-endian format
     
    6363                        $this->readBinDataOffset = 0;
    6464
    65         } else {
     65                } else {
    6666
    6767                        unset($info['fileformat']);
  • _core_/plugins/medias/lib/getid3/module.audio.flac.php

    r113161 r117918  
    179179
    180180                        if ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) {
    181                 $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)');
     181                                $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)');
    182182                        }
    183183                        else {
  • _core_/plugins/medias/lib/getid3/module.audio.midi.php

    r113161 r117918  
    244244
    245245                                                        case 0x58: // Time signature
    246                                                                 $timesig_numerator   = getid3_lib::BigEndian2Int($METAeventData{0});
    247                                                                 $timesig_denominator = pow(2, getid3_lib::BigEndian2Int($METAeventData{1})); // $02 -> x/4, $03 -> x/8, etc
    248                                                                 $timesig_32inqnote   = getid3_lib::BigEndian2Int($METAeventData{2});         // number of 32nd notes to the quarter note
     246                                                                $timesig_numerator   = getid3_lib::BigEndian2Int($METAeventData[0]);
     247                                                                $timesig_denominator = pow(2, getid3_lib::BigEndian2Int($METAeventData[1])); // $02 -> x/4, $03 -> x/8, etc
     248                                                                $timesig_32inqnote   = getid3_lib::BigEndian2Int($METAeventData[2]);         // number of 32nd notes to the quarter note
    249249                                                                //$thisfile_midi_raw['events'][$tracknumber][$eventid]['timesig_32inqnote']   = $timesig_32inqnote;
    250250                                                                //$thisfile_midi_raw['events'][$tracknumber][$eventid]['timesig_numerator']   = $timesig_numerator;
     
    255255
    256256                                                        case 0x59: // Keysignature
    257                                                                 $keysig_sharpsflats = getid3_lib::BigEndian2Int($METAeventData{0});
     257                                                                $keysig_sharpsflats = getid3_lib::BigEndian2Int($METAeventData[0]);
    258258                                                                if ($keysig_sharpsflats & 0x80) {
    259259                                                                        // (-7 -> 7 flats, 0 ->key of C, 7 -> 7 sharps)
     
    261261                                                                }
    262262
    263                                                                 $keysig_majorminor  = getid3_lib::BigEndian2Int($METAeventData{1}); // 0 -> major, 1 -> minor
     263                                                                $keysig_majorminor  = getid3_lib::BigEndian2Int($METAeventData[1]); // 0 -> major, 1 -> minor
    264264                                                                $keysigs = array(-7=>'Cb', -6=>'Gb', -5=>'Db', -4=>'Ab', -3=>'Eb', -2=>'Bb', -1=>'F', 0=>'C', 1=>'G', 2=>'D', 3=>'A', 4=>'E', 5=>'B', 6=>'F#', 7=>'C#');
    265265                                                                //$thisfile_midi_raw['events'][$tracknumber][$eventid]['keysig_sharps'] = (($keysig_sharpsflats > 0) ? abs($keysig_sharpsflats) : 0);
  • _core_/plugins/medias/lib/getid3/module.audio.monkey.php

    r113161 r117918  
    163163                                $md5 = $thisfile_monkeysaudio_raw['cFileMD5'];
    164164                                for ($i = 0; $i < strlen($md5); $i++) {
    165                                         $info['md5_data_source'] .= str_pad(dechex(ord($md5{$i})), 2, '00', STR_PAD_LEFT);
     165                                        $info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT);
    166166                                }
    167167                                if (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) {
  • _core_/plugins/medias/lib/getid3/module.audio.mp3.php

    r113161 r117918  
    702702                                        $LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100);
    703703                                        for ($i = 0; $i < 100; $i++) {
    704                                                 $thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData{$i});
     704                                                $thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData[$i]);
    705705                                        }
    706706                                }
     
    11741174                $SyncPattern1 = substr($MPEGaudioData, 0, 4);
    11751175                // may be different pattern due to padding
    1176                 $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) | 0x02).$SyncPattern1{3};
     1176                $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) | 0x02).$SyncPattern1[3];
    11771177                if ($SyncPattern2 === $SyncPattern1) {
    1178                         $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) & 0xFD).$SyncPattern1{3};
     1178                        $SyncPattern2 = $SyncPattern1[0].$SyncPattern1[1].chr(ord($SyncPattern1[2]) & 0xFD).$SyncPattern1[3];
    11791179                }
    11801180
     
    12811281                                break;
    12821282                        }
    1283                         if ($head4{0} != "\xFF") {
     1283                        if ($head4[0] != "\xFF") {
    12841284                                for ($i = 1; $i < 4; $i++) {
    1285                                         if ($head4{$i} == "\xFF") {
     1285                                        if ($head4[$i] == "\xFF") {
    12861286                                                $this->fseek($i - 4, SEEK_CUR);
    12871287                                                continue 2;
     
    13151315                                        $this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR);
    13161316                                        $next4 = $this->fread(4);
    1317                                         if ($next4{0} == "\xFF") {
     1317                                        if ($next4[0] == "\xFF") {
    13181318                                                if (!isset($MPEGaudioHeaderDecodeCache[$next4])) {
    13191319                                                        $MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4);
     
    14081408                static $MPEGaudioBitrateLookup;
    14091409                if (empty($MPEGaudioVersionLookup)) {
    1410                    $MPEGaudioVersionLookup = self::MPEGaudioVersionArray();
    1411                    $MPEGaudioLayerLookup   = self::MPEGaudioLayerArray();
    1412                    $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray();
    1413 
     1410                        $MPEGaudioVersionLookup = self::MPEGaudioVersionArray();
     1411                        $MPEGaudioLayerLookup   = self::MPEGaudioLayerArray();
     1412                        $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray();
    14141413                }
    14151414
     
    14611460                        }
    14621461
    1463                         if (($header{$SynchSeekOffset} == "\xFF") && ($header{($SynchSeekOffset + 1)} > "\xE0")) { // synch detected
     1462                        if (($header[$SynchSeekOffset] == "\xFF") && ($header[($SynchSeekOffset + 1)] > "\xE0")) { // synch detected
    14641463                                $FirstFrameAVDataOffset = null;
    14651464                                if (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) {
     
    15561555                                                                $buffer_4k = $this->fread(4096);
    15571556                                                                for ($j = 0; $j < (strlen($buffer_4k) - 4); $j++) {
    1558                                                                         if (($buffer_4k{$j} == "\xFF") && ($buffer_4k{($j + 1)} > "\xE0")) { // synch detected
     1557                                                                        if (($buffer_4k[$j] == "\xFF") && ($buffer_4k[($j + 1)] > "\xE0")) { // synch detected
    15591558                                                                                if ($this->decodeMPEGaudioHeader($scan_start_offset[$current_segment] + $j, $dummy, false, false, $FastMode)) {
    15601559                                                                                        $calculated_next_offset = $scan_start_offset[$current_segment] + $j + $dummy['mpeg']['audio']['framelength'];
     
    18781877
    18791878                $MPEGrawHeader['synch']         = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4;
    1880                 $MPEGrawHeader['version']       = (ord($Header4Bytes{1}) & 0x18) >> 3; //    BB
    1881                 $MPEGrawHeader['layer']         = (ord($Header4Bytes{1}) & 0x06) >> 1; //      CC
    1882                 $MPEGrawHeader['protection']    = (ord($Header4Bytes{1}) & 0x01);      //        D
    1883                 $MPEGrawHeader['bitrate']       = (ord($Header4Bytes{2}) & 0xF0) >> 4; // EEEE
    1884                 $MPEGrawHeader['sample_rate']   = (ord($Header4Bytes{2}) & 0x0C) >> 2; //     FF
    1885                 $MPEGrawHeader['padding']       = (ord($Header4Bytes{2}) & 0x02) >> 1; //       G
    1886                 $MPEGrawHeader['private']       = (ord($Header4Bytes{2}) & 0x01);      //        H
    1887                 $MPEGrawHeader['channelmode']   = (ord($Header4Bytes{3}) & 0xC0) >> 6; // II
    1888                 $MPEGrawHeader['modeextension'] = (ord($Header4Bytes{3}) & 0x30) >> 4; //   JJ
    1889                 $MPEGrawHeader['copyright']     = (ord($Header4Bytes{3}) & 0x08) >> 3; //     K
    1890                 $MPEGrawHeader['original']      = (ord($Header4Bytes{3}) & 0x04) >> 2; //      L
    1891                 $MPEGrawHeader['emphasis']      = (ord($Header4Bytes{3}) & 0x03);      //       MM
     1879                $MPEGrawHeader['version']       = (ord($Header4Bytes[1]) & 0x18) >> 3; //    BB
     1880                $MPEGrawHeader['layer']         = (ord($Header4Bytes[1]) & 0x06) >> 1; //      CC
     1881                $MPEGrawHeader['protection']    = (ord($Header4Bytes[1]) & 0x01);      //        D
     1882                $MPEGrawHeader['bitrate']       = (ord($Header4Bytes[2]) & 0xF0) >> 4; // EEEE
     1883                $MPEGrawHeader['sample_rate']   = (ord($Header4Bytes[2]) & 0x0C) >> 2; //     FF
     1884                $MPEGrawHeader['padding']       = (ord($Header4Bytes[2]) & 0x02) >> 1; //       G
     1885                $MPEGrawHeader['private']       = (ord($Header4Bytes[2]) & 0x01);      //        H
     1886                $MPEGrawHeader['channelmode']   = (ord($Header4Bytes[3]) & 0xC0) >> 6; // II
     1887                $MPEGrawHeader['modeextension'] = (ord($Header4Bytes[3]) & 0x30) >> 4; //   JJ
     1888                $MPEGrawHeader['copyright']     = (ord($Header4Bytes[3]) & 0x08) >> 3; //     K
     1889                $MPEGrawHeader['original']      = (ord($Header4Bytes[3]) & 0x04) >> 2; //      L
     1890                $MPEGrawHeader['emphasis']      = (ord($Header4Bytes[3]) & 0x03);      //       MM
    18921891
    18931892                return $MPEGrawHeader;
     
    19981997                static $XingVBRidOffsetCache = array();
    19991998                if (empty($XingVBRidOffsetCache)) {
    2000             $XingVBRidOffsetCache = array (
     1999                        $XingVBRidOffsetCache = array (
    20012000                                '1'   => array ('mono'          => 0x15, // 4 + 17 = 21
    20022001                                                                'stereo'        => 0x24, // 4 + 32 = 36
  • _core_/plugins/medias/lib/getid3/module.audio.tta.php

    r113161 r117918  
    4242                }
    4343
    44                 switch ($ttaheader{3}) {
     44                switch ($ttaheader[3]) {
    4545                        case "\x01": // TTA v1.x
    4646                        case "\x02": // TTA v1.x
     
    5050                                $info['avdataoffset'] += 16;
    5151
    52                                 $info['tta']['compression_level']   = ord($ttaheader{3});
     52                                $info['tta']['compression_level']   = ord($ttaheader[3]);
    5353                                $info['tta']['channels']            = getid3_lib::LittleEndian2Int(substr($ttaheader,  4,  2));
    5454                                $info['tta']['bits_per_sample']     = getid3_lib::LittleEndian2Int(substr($ttaheader,  6,  2));
     
    9393
    9494                        default:
    95                                 $this->error('This version of getID3() ['.$this->getid3->version().'] only knows how to handle TTA v1 and v2 - it may not work correctly with this file which appears to be TTA v'.$ttaheader{3});
     95                                $this->error('This version of getID3() ['.$this->getid3->version().'] only knows how to handle TTA v1 and v2 - it may not work correctly with this file which appears to be TTA v'.$ttaheader[3]);
    9696                                return false;
    9797                                break;
  • _core_/plugins/medias/lib/getid3/module.audio.voc.php

    r113161 r117918  
    6262                        $BlockOffset    = $this->ftell();
    6363                        $BlockData      = $this->fread(4);
    64                         $BlockType      = ord($BlockData{0});
     64                        $BlockType      = ord($BlockData[0]);
    6565                        $BlockSize      = getid3_lib::LittleEndian2Int(substr($BlockData, 1, 3));
    6666                        $ThisBlock      = array();
  • _core_/plugins/medias/lib/getid3/module.audio.wavpack.php

    r113161 r117918  
    103103                                }
    104104
    105                                 $info['wavpack']['blockheader']['minor_version'] = ord($wavpackheader{8});
    106                                 $info['wavpack']['blockheader']['major_version'] = ord($wavpackheader{9});
     105                                $info['wavpack']['blockheader']['minor_version'] = ord($wavpackheader[8]);
     106                                $info['wavpack']['blockheader']['major_version'] = ord($wavpackheader[9]);
    107107
    108108                                if (($info['wavpack']['blockheader']['major_version'] != 4) ||
     
    123123                                }
    124124
    125                                 $info['wavpack']['blockheader']['track_number']  = ord($wavpackheader{10}); // unused
    126                                 $info['wavpack']['blockheader']['index_number']  = ord($wavpackheader{11}); // unused
     125                                $info['wavpack']['blockheader']['track_number']  = ord($wavpackheader[10]); // unused
     126                                $info['wavpack']['blockheader']['index_number']  = ord($wavpackheader[11]); // unused
    127127                                $info['wavpack']['blockheader']['total_samples'] = getid3_lib::LittleEndian2Int(substr($wavpackheader, 12,  4));
    128128                                $info['wavpack']['blockheader']['block_index']   = getid3_lib::LittleEndian2Int(substr($wavpackheader, 16,  4));
     
    154154                                        break;
    155155                                }
    156                                 $metablock['id'] = ord($metablockheader{0});
     156                                $metablock['id'] = ord($metablockheader[0]);
    157157                                $metablock['function_id'] = ($metablock['id'] & 0x3F);
    158158                                $metablock['function_name'] = $this->WavPackMetablockNameLookup($metablock['function_id']);
  • _core_/plugins/medias/lib/getid3/module.graphic.bmp.php

    r113161 r117918  
    335335                                                        for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) {
    336336                                                                for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col = $col) {
    337                                                                         $paletteindexbyte = ord($BMPpixelData{$pixeldataoffset++});
     337                                                                        $paletteindexbyte = ord($BMPpixelData[$pixeldataoffset++]);
    338338                                                                        for ($i = 7; $i >= 0; $i--) {
    339339                                                                                $paletteindex = ($paletteindexbyte & (0x01 << $i)) >> $i;
     
    352352                                                        for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) {
    353353                                                                for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col = $col) {
    354                                                                         $paletteindexbyte = ord($BMPpixelData{$pixeldataoffset++});
     354                                                                        $paletteindexbyte = ord($BMPpixelData[$pixeldataoffset++]);
    355355                                                                        for ($i = 1; $i >= 0; $i--) {
    356356                                                                                $paletteindex = ($paletteindexbyte & (0x0F << (4 * $i))) >> (4 * $i);
     
    369369                                                        for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) {
    370370                                                                for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col++) {
    371                                                                         $paletteindex = ord($BMPpixelData{$pixeldataoffset++});
     371                                                                        $paletteindex = ord($BMPpixelData[$pixeldataoffset++]);
    372372                                                                        $thisfile_bmp['data'][$row][$col] = $thisfile_bmp['palette'][$paletteindex];
    373373                                                                }
     
    382382                                                        for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) {
    383383                                                                for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col++) {
    384                                                                         $thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData{$pixeldataoffset+2}) << 16) | (ord($BMPpixelData{$pixeldataoffset+1}) << 8) | ord($BMPpixelData{$pixeldataoffset});
     384                                                                        $thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData[$pixeldataoffset+2]) << 16) | (ord($BMPpixelData[$pixeldataoffset+1]) << 8) | ord($BMPpixelData[$pixeldataoffset]);
    385385                                                                        $pixeldataoffset += 3;
    386386                                                                }
     
    395395                                                        for ($row = ($thisfile_bmp_header_raw['height'] - 1); $row >= 0; $row--) {
    396396                                                                for ($col = 0; $col < $thisfile_bmp_header_raw['width']; $col++) {
    397                                                                         $thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData{$pixeldataoffset+3}) << 24) | (ord($BMPpixelData{$pixeldataoffset+2}) << 16) | (ord($BMPpixelData{$pixeldataoffset+1}) << 8) | ord($BMPpixelData{$pixeldataoffset});
     397                                                                        $thisfile_bmp['data'][$row][$col] = (ord($BMPpixelData[$pixeldataoffset+3]) << 24) | (ord($BMPpixelData[$pixeldataoffset+2]) << 16) | (ord($BMPpixelData[$pixeldataoffset+1]) << 8) | ord($BMPpixelData[$pixeldataoffset]);
    398398                                                                        $pixeldataoffset += 4;
    399399                                                                }
  • _core_/plugins/medias/lib/getid3/module.graphic.gif.php

    r113161 r117918  
    4747                }
    4848
     49                //if (!$this->getid3->option_extra_info) {
     50                //      $this->warning('GIF Extensions and Global Color Table not returned due to !getid3->option_extra_info');
     51                //}
     52
    4953                $info['gif']['header']['raw']['version']               =                              substr($GIFheader, $offset, 3);
    5054                $offset += 3;
     
    8690                if ($info['gif']['header']['flags']['global_color_table']) {
    8791                        $GIFcolorTable = $this->fread(3 * $info['gif']['header']['global_color_size']);
    88                         $offset = 0;
    89                         for ($i = 0; $i < $info['gif']['header']['global_color_size']; $i++) {
    90                                 $red   = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1));
    91                                 $green = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1));
    92                                 $blue  = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1));
    93                                 $info['gif']['global_color_table'][$i] = (($red << 16) | ($green << 8) | ($blue));
     92                        if ($this->getid3->option_extra_info) {
     93                                $offset = 0;
     94                                for ($i = 0; $i < $info['gif']['header']['global_color_size']; $i++) {
     95                                        $red   = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1));
     96                                        $green = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1));
     97                                        $blue  = getid3_lib::LittleEndian2Int(substr($GIFcolorTable, $offset++, 1));
     98                                        $info['gif']['global_color_table'][$i] = (($red << 16) | ($green << 8) | ($blue));
     99                                        $info['gif']['global_color_table_rgb'][$i] = sprintf('%02X%02X%02X', $red, $green, $blue);
     100                                }
    94101                        }
    95102                }
     
    167174                                        }
    168175
    169                                         $info['gif']['extension_blocks'][] = $ExtensionBlock;
     176                                        if ($this->getid3->option_extra_info) {
     177                                                $info['gif']['extension_blocks'][] = $ExtensionBlock;
     178                                        }
    170179                                        break;
    171180
  • _core_/plugins/medias/lib/getid3/module.graphic.pcd.php

    r113161 r117918  
    7777                                for ($x = 0; $x < $PCD_width; $x++) {
    7878                                        if ($PCDisVertical) {
    79                                                 $info['pcd']['data'][$PCD_width - $x][$y]     = $this->YCbCr2RGB(ord($PCD_data_Y1{$x}), ord($PCD_data_Cb{(int) floor($x / 2)}), ord($PCD_data_Cr{(int) floor($x / 2)}));
    80                                                 $info['pcd']['data'][$PCD_width - $x][$y + 1] = $this->YCbCr2RGB(ord($PCD_data_Y2{$x}), ord($PCD_data_Cb{(int) floor($x / 2)}), ord($PCD_data_Cr{(int) floor($x / 2)}));
     79                                                $info['pcd']['data'][$PCD_width - $x][$y]     = $this->YCbCr2RGB(ord($PCD_data_Y1[$x]), ord($PCD_data_Cb[(int) floor($x / 2)]), ord($PCD_data_Cr[(int) floor($x / 2)]));
     80                                                $info['pcd']['data'][$PCD_width - $x][$y + 1] = $this->YCbCr2RGB(ord($PCD_data_Y2[$x]), ord($PCD_data_Cb[(int) floor($x / 2)]), ord($PCD_data_Cr[(int) floor($x / 2)]));
    8181                                        } else {
    82                                                 $info['pcd']['data'][$y][$x]                  = $this->YCbCr2RGB(ord($PCD_data_Y1{$x}), ord($PCD_data_Cb{(int) floor($x / 2)}), ord($PCD_data_Cr{(int) floor($x / 2)}));
    83                                                 $info['pcd']['data'][$y + 1][$x]              = $this->YCbCr2RGB(ord($PCD_data_Y2{$x}), ord($PCD_data_Cb{(int) floor($x / 2)}), ord($PCD_data_Cr{(int) floor($x / 2)}));
     82                                                $info['pcd']['data'][$y][$x]                  = $this->YCbCr2RGB(ord($PCD_data_Y1[$x]), ord($PCD_data_Cb[(int) floor($x / 2)]), ord($PCD_data_Cr[(int) floor($x / 2)]));
     83                                                $info['pcd']['data'][$y + 1][$x]              = $this->YCbCr2RGB(ord($PCD_data_Y2[$x]), ord($PCD_data_Cb[(int) floor($x / 2)]), ord($PCD_data_Cr[(int) floor($x / 2)]));
    8484                                        }
    8585                                }
  • _core_/plugins/medias/lib/getid3/module.graphic.tiff.php

    r113161 r117918  
    4444                $info['video']['lossless']   = true;
    4545                $info['tiff']['ifd']         = array();
    46                 $CurrentIFD                          = array();
     46                $CurrentIFD                  = array();
    4747
    4848                $FieldTypeByteLength = array(1=>1, 2=>1, 3=>2, 4=>4, 5=>8);
     
    5858
    5959                        for ($i = 0; $i < $CurrentIFD['fieldcount']; $i++) {
    60                                 $CurrentIFD['fields'][$i]['raw']['tag']    = $this->TIFFendian2Int($this->fread(2), $info['tiff']['byte_order']);
    61                                 $CurrentIFD['fields'][$i]['raw']['type']   = $this->TIFFendian2Int($this->fread(2), $info['tiff']['byte_order']);
    62                                 $CurrentIFD['fields'][$i]['raw']['length'] = $this->TIFFendian2Int($this->fread(4), $info['tiff']['byte_order']);
    63                                 $CurrentIFD['fields'][$i]['raw']['offset'] =                       $this->fread(4);
    64 
     60                                $CurrentIFD['fields'][$i]['raw']['tag']      = $this->TIFFendian2Int($this->fread(2), $info['tiff']['byte_order']);
     61                                $CurrentIFD['fields'][$i]['raw']['type']     = $this->TIFFendian2Int($this->fread(2), $info['tiff']['byte_order']);
     62                                $CurrentIFD['fields'][$i]['raw']['length']   = $this->TIFFendian2Int($this->fread(4), $info['tiff']['byte_order']);
     63                                $CurrentIFD['fields'][$i]['raw']['valoff']   =                       $this->fread(4); // To save time and space the Value Offset contains the Value instead of pointing to the Value if and only if the Value fits into 4 bytes. If the Value is shorter than 4 bytes, it is left-justified within the 4-byte Value Offset, i.e., stored in the lowernumbered bytes. Whether the Value fits within 4 bytes is determined by the Type and Count of the field.
    6564                                $CurrentIFD['fields'][$i]['raw']['tag_name'] = $this->TIFFcommentName($CurrentIFD['fields'][$i]['raw']['tag']);
    6665
     
    6867                                        case 1: // BYTE  An 8-bit unsigned integer.
    6968                                                if ($CurrentIFD['fields'][$i]['raw']['length'] <= 4) {
    70                                                         $CurrentIFD['fields'][$i]['value']  = $this->TIFFendian2Int(substr($CurrentIFD['fields'][$i]['raw']['offset'], 0, 1), $info['tiff']['byte_order']);
    71                                                 } else {
    72                                                         $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $info['tiff']['byte_order']);
     69                                                        $CurrentIFD['fields'][$i]['value']  = $this->TIFFendian2Int(substr($CurrentIFD['fields'][$i]['raw']['valoff'], 0, 1), $info['tiff']['byte_order']);
     70                                                } else {
     71                                                        $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['valoff'], $info['tiff']['byte_order']);
    7372                                                }
    7473                                                break;
     
    7675                                        case 2: // ASCII 8-bit bytes  that store ASCII codes; the last byte must be null.
    7776                                                if ($CurrentIFD['fields'][$i]['raw']['length'] <= 4) {
    78                                                         $CurrentIFD['fields'][$i]['value']  = substr($CurrentIFD['fields'][$i]['raw']['offset'], 3);
    79                                                 } else {
    80                                                         $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $info['tiff']['byte_order']);
     77                                                        $CurrentIFD['fields'][$i]['value']  = substr($CurrentIFD['fields'][$i]['raw']['valoff'], 3);
     78                                                } else {
     79                                                        $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['valoff'], $info['tiff']['byte_order']);
    8180                                                }
    8281                                                break;
     
    8483                                        case 3: // SHORT A 16-bit (2-byte) unsigned integer.
    8584                                                if ($CurrentIFD['fields'][$i]['raw']['length'] <= 2) {
    86                                                         $CurrentIFD['fields'][$i]['value']  = $this->TIFFendian2Int(substr($CurrentIFD['fields'][$i]['raw']['offset'], 0, 2), $info['tiff']['byte_order']);
    87                                                 } else {
    88                                                         $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $info['tiff']['byte_order']);
     85                                                        $CurrentIFD['fields'][$i]['value']  = $this->TIFFendian2Int(substr($CurrentIFD['fields'][$i]['raw']['valoff'], 0, 2), $info['tiff']['byte_order']);
     86                                                } else {
     87                                                        $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['valoff'], $info['tiff']['byte_order']);
    8988                                                }
    9089                                                break;
    9190
    9291                                        case 4: // LONG  A 32-bit (4-byte) unsigned integer.
    93                                                 if ($CurrentIFD['fields'][$i]['raw']['length'] <= 1) {
    94                                                         $CurrentIFD['fields'][$i]['value']  = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $info['tiff']['byte_order']);
    95                                                 } else {
    96                                                         $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['offset'], $info['tiff']['byte_order']);
     92                                                if ($CurrentIFD['fields'][$i]['raw']['length'] <= 4) {
     93                                                        $CurrentIFD['fields'][$i]['value']  = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['valoff'], $info['tiff']['byte_order']);
     94                                                } else {
     95                                                        $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['valoff'], $info['tiff']['byte_order']);
    9796                                                }
    9897                                                break;
    9998
    10099                                        case 5: // RATIONAL   Two LONG_s:  the first represents the numerator of a fraction, the second the denominator.
     100                                        case 7: // UNDEFINED An 8-bit byte that may contain anything, depending on the definition of the field.
     101                                                $CurrentIFD['fields'][$i]['offset'] = $this->TIFFendian2Int($CurrentIFD['fields'][$i]['raw']['valoff'], $info['tiff']['byte_order']);
     102                                                break;
     103
     104                                        // Warning: It is possible that other TIFF field types will be added in the future. Readers should skip over fields containing an unexpected field type.
     105                                        // In TIFF 6.0, some new field types have been defined:
     106                                        // These new field types are also governed by the byte order (II or MM) in the TIFF header.
     107                                        case 6: // SBYTE An 8-bit signed (twos-complement) integer.
     108                                        case 8: // SSHORT A 16-bit (2-byte) signed (twos-complement) integer.
     109                                        case 9: // SLONG A 32-bit (4-byte) signed (twos-complement) integer.
     110                                        case 10: // SRATIONAL Two SLONGs: the first represents the numerator of a fraction, the second the denominator.
     111                                        case 11: // FLOAT Single precision (4-byte) IEEE format
     112                                        case 12: // DOUBLE Double precision (8-byte) IEEE format
     113                                        default:
     114                                                $this->warning('unhandled IFD field type '.$CurrentIFD['fields'][$i]['raw']['type'].' for IFD entry '.$i);
    101115                                                break;
    102116                                }
     
    136150                                                        $info['tiff']['ifd'][$IFDid]['fields'][$key]['raw']['data'] = $this->fread($fieldarray['raw']['length'] * $FieldTypeByteLength[$fieldarray['raw']['type']]);
    137151
     152                                                }
     153                                                break;
     154                                        case 700:
     155                                                $XMPmagic = '<?xpacket';
     156                                                $this->fseek($fieldarray['offset']);
     157                                                $xmpkey = (isset($info['tiff']['XMP']) ? count($info['tiff']['XMP']) : 0);
     158                                                $info['tiff']['XMP'][$xmpkey]['raw'] = $this->fread($fieldarray['raw']['length']);
     159                                                if (substr($info['tiff']['XMP'][$xmpkey]['raw'], 0, strlen($XMPmagic)) != $XMPmagic) {
     160                                                        $this->warning('did not find expected XMP data at offset '.$fieldarray['offset']);
     161                                                        unset($info['tiff']['XMP'][$xmpkey]['raw']);
    138162                                                }
    139163                                                break;
     
    208232         */
    209233        public function TIFFcompressionMethod($id) {
     234                // https://en.wikipedia.org/wiki/TIFF#TIFF_Compression_Tag
    210235                static $TIFFcompressionMethod = array();
    211236                if (empty($TIFFcompressionMethod)) {
    212237                        $TIFFcompressionMethod = array(
    213                                 1     => 'Uncompressed',
    214                                 2     => 'Huffman',
    215                                 3     => 'Fax - CCITT 3',
    216                                 5     => 'LZW',
    217                                 32773 => 'PackBits',
     238                                0x0001 => 'Uncompressed',
     239                                0x0002 => 'Huffman',
     240                                0x0003 => 'CCITT T.4',
     241                                0x0004 => 'CCITT T.6',
     242                                0x0005 => 'LZW',
     243                                0x0006 => 'JPEG-old',
     244                                0x0007 => 'JPEG',
     245                                0x0008 => 'deflate',
     246                                0x0009 => 'JBIG ITU-T T.85',
     247                                0x000A => 'JBIG ITU-T T.43',
     248                                0x7FFE => 'NeXT RLE 2-bit',
     249                                0x8005 => 'PackBits',
     250                                0x8029 => 'ThunderScan RLE 4-bit',
     251                                0x807F => 'RasterPadding',
     252                                0x8080 => 'RLE-LW',
     253                                0x8081 => 'RLE-CT',
     254                                0x8082 => 'RLE-BL',
     255                                0x80B2 => 'deflate-PK',
     256                                0x80B3 => 'Kodak-DCS',
     257                                0x8765 => 'JBIG',
     258                                0x8798 => 'JPEG2000',
     259                                0x8799 => 'Nikon NEF',
     260                                0x879B => 'JBIG2',
    218261                        );
    219262                }
  • _core_/plugins/medias/lib/getid3/module.misc.iso.php

    r113161 r117918  
    3030                        $ISOheader = $this->fread(2048);
    3131                        if (substr($ISOheader, 1, 5) == 'CD001') {
    32                                 switch (ord($ISOheader{0})) {
     32                                switch (ord($ISOheader[0])) {
    3333                                        case 1:
    3434                                                $info['iso']['primary_volume_descriptor']['offset'] = 2048 * $i;
     
    297297                $DirectoryRecord = array();
    298298
    299                 while (ord($DirectoryRecordData{0}) > 33) {
    300 
    301                         $DirectoryRecordData .= $this->fread(ord($DirectoryRecordData{0}) - 1);
     299                while (ord($DirectoryRecordData[0]) > 33) {
     300
     301                        $DirectoryRecordData .= $this->fread(ord($DirectoryRecordData[0]) - 1);
    302302
    303303                        $ThisDirectoryRecord = array();
     
    390390                // 7: Offset from Greenwich Mean Time in number of 15 minute intervals from -48 (West) to +52 (East)
    391391
    392                 $UNIXyear   = ord($ISOtime{0}) + 1900;
    393                 $UNIXmonth  = ord($ISOtime{1});
    394                 $UNIXday    = ord($ISOtime{2});
    395                 $UNIXhour   = ord($ISOtime{3});
    396                 $UNIXminute = ord($ISOtime{4});
    397                 $UNIXsecond = ord($ISOtime{5});
    398                 $GMToffset  = $this->TwosCompliment2Decimal(ord($ISOtime{5}));
     392                $UNIXyear   = ord($ISOtime[0]) + 1900;
     393                $UNIXmonth  = ord($ISOtime[1]);
     394                $UNIXday    = ord($ISOtime[2]);
     395                $UNIXhour   = ord($ISOtime[3]);
     396                $UNIXminute = ord($ISOtime[4]);
     397                $UNIXsecond = ord($ISOtime[5]);
     398                $GMToffset  = $this->TwosCompliment2Decimal(ord($ISOtime[5]));
    399399
    400400                return gmmktime($UNIXhour, $UNIXminute, $UNIXsecond, $UNIXmonth, $UNIXday, $UNIXyear);
  • _core_/plugins/medias/lib/getid3/module.tag.apetag.php

    r113161 r117918  
    163163                                // http://wiki.hydrogenaud.io/index.php?title=ReplayGain#MP3Gain
    164164                                case 'replaygain_track_gain':
    165                                         if (preg_match('#^[\\-\\+][0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {
    166                                                 $thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero!
     165                                        if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) {
     166                                                $thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
    167167                                                $thisfile_replaygain['track']['originator'] = 'unspecified';
    168168                                        } else {
     
    172172
    173173                                case 'replaygain_track_peak':
    174                                         if (preg_match('#^[0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {
    175                                                 $thisfile_replaygain['track']['peak']       = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero!
     174                                        if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) {
     175                                                $thisfile_replaygain['track']['peak']       = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
    176176                                                $thisfile_replaygain['track']['originator'] = 'unspecified';
    177177                                                if ($thisfile_replaygain['track']['peak'] <= 0) {
     
    184184
    185185                                case 'replaygain_album_gain':
    186                                         if (preg_match('#^[\\-\\+][0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {
    187                                                 $thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero!
     186                                        if (preg_match('#^([\\-\\+][0-9\\.,]{8})( dB)?$#', $thisfile_ape_items_current['data'][0], $matches)) {
     187                                                $thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
    188188                                                $thisfile_replaygain['album']['originator'] = 'unspecified';
    189189                                        } else {
     
    193193
    194194                                case 'replaygain_album_peak':
    195                                         if (preg_match('#^[0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) {
    196                                                 $thisfile_replaygain['album']['peak']       = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero!
     195                                        if (preg_match('#^([0-9\\.,]{8})$#', $thisfile_ape_items_current['data'][0], $matches)) {
     196                                                $thisfile_replaygain['album']['peak']       = (float) str_replace(',', '.', $matches[1]); // float casting will see "0,95" as zero!
    197197                                                $thisfile_replaygain['album']['originator'] = 'unspecified';
    198198                                                if ($thisfile_replaygain['album']['peak'] <= 0) {
     
    238238                                        if (is_array($thisfile_ape_items_current['data'])) {
    239239                                                foreach ($thisfile_ape_items_current['data'] as $comment) {
    240                                                         $thisfile_ape['comments']['track'][] = $comment;
     240                                                        $thisfile_ape['comments']['track_number'][] = $comment;
    241241                                                }
    242242                                        }
  • _core_/plugins/medias/lib/getid3/module.tag.id3v1.php

    r113161 r117918  
    4646                        // If second-last byte of comment field is null and last byte of comment field is non-null
    4747                        // then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number
    48                         if (($id3v1tag{125} === "\x00") && ($id3v1tag{126} !== "\x00")) {
    49                                 $ParsedID3v1['track']  = ord(substr($ParsedID3v1['comment'], 29,  1));
    50                                 $ParsedID3v1['comment'] =     substr($ParsedID3v1['comment'],  0, 28);
     48                        if (($id3v1tag[125] === "\x00") && ($id3v1tag[126] !== "\x00")) {
     49                                $ParsedID3v1['track_number'] = ord(substr($ParsedID3v1['comment'], 29,  1));
     50                                $ParsedID3v1['comment']      =     substr($ParsedID3v1['comment'],  0, 28);
    5151                        }
    5252                        $ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']);
     
    6969                        foreach ($ParsedID3v1['comments'] as $tag_key => $valuearray) {
    7070                                foreach ($valuearray as $key => $value) {
    71                                         if (preg_match('#^[\\x00-\\x40\\xA8\\B8\\x80-\\xFF]+$#', $value)) {
     71                                        if (preg_match('#^[\\x00-\\x40\\xA8\\xB8\\x80-\\xFF]+$#', $value)) {
    7272                                                foreach (array('Windows-1251', 'KOI8-R') as $id3v1_bad_encoding) {
    7373                                                        if (function_exists('mb_convert_encoding') && @mb_convert_encoding($value, $id3v1_bad_encoding, $id3v1_bad_encoding) === $value) {
     
    9292                                                                                        (isset($ParsedID3v1['genre']) ? $this->LookupGenreID($ParsedID3v1['genre']) : false),
    9393                                                                                        $ParsedID3v1['comment'],
    94                                                                                         (!empty($ParsedID3v1['track']) ? $ParsedID3v1['track'] : ''));
     94                                                                                        (!empty($ParsedID3v1['track_number']) ? $ParsedID3v1['track_number'] : ''));
    9595                        $ParsedID3v1['padding_valid'] = true;
    9696                        if ($id3v1tag !== $GoodFormatID3v1tag) {
  • _core_/plugins/medias/lib/getid3/module.tag.id3v2.php

    r113161 r117918  
    6060                if (substr($header, 0, 3) == 'ID3'  &&  strlen($header) == 10) {
    6161
    62                         $thisfile_id3v2['majorversion'] = ord($header{3});
    63                         $thisfile_id3v2['minorversion'] = ord($header{4});
     62                        $thisfile_id3v2['majorversion'] = ord($header[3]);
     63                        $thisfile_id3v2['minorversion'] = ord($header[4]);
    6464
    6565                        // shortcut
     
    8080                }
    8181
    82                 $id3_flags = ord($header{5});
     82                $id3_flags = ord($header[5]);
    8383                switch ($id3v2_majorversion) {
    8484                        case 2:
     
    261261                                        $thisfile_id3v2['padding']['valid']  = true;
    262262                                        for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) {
    263                                                 if ($framedata{$i} != "\x00") {
     263                                                if ($framedata[$i] != "\x00") {
    264264                                                        $thisfile_id3v2['padding']['valid'] = false;
    265265                                                        $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;
     
    327327                                        $len = strlen($framedata);
    328328                                        for ($i = 0; $i < $len; $i++) {
    329                                                 if ($framedata{$i} != "\x00") {
     329                                                if ($framedata[$i] != "\x00") {
    330330                                                        $thisfile_id3v2['padding']['valid'] = false;
    331331                                                        $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i;
     
    435435                        if (substr($footer, 0, 3) == '3DI') {
    436436                                $thisfile_id3v2['footer'] = true;
    437                                 $thisfile_id3v2['majorversion_footer'] = ord($footer{3});
    438                                 $thisfile_id3v2['minorversion_footer'] = ord($footer{4});
     437                                $thisfile_id3v2['majorversion_footer'] = ord($footer[3]);
     438                                $thisfile_id3v2['minorversion_footer'] = ord($footer[4]);
    439439                        }
    440440                        if ($thisfile_id3v2['majorversion_footer'] <= 4) {
    441                                 $id3_flags = ord($footer{5});
     441                                $id3_flags = ord($footer[5]);
    442442                                $thisfile_id3v2_flags['unsynch_footer']  = (bool) ($id3_flags & 0x80);
    443443                                $thisfile_id3v2_flags['extfoot_footer']  = (bool) ($id3_flags & 0x40);
     
    460460                }
    461461
    462                 if (isset($thisfile_id3v2['comments']['track'])) {
    463                         foreach ($thisfile_id3v2['comments']['track'] as $key => $value) {
     462                if (isset($thisfile_id3v2['comments']['track_number'])) {
     463                        foreach ($thisfile_id3v2['comments']['track_number'] as $key => $value) {
    464464                                if (strstr($value, '/')) {
    465                                         list($thisfile_id3v2['comments']['tracknum'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track'][$key]);
     465                                        list($thisfile_id3v2['comments']['track_number'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track_number'][$key]);
    466466                                }
    467467                        }
     
    673673                                $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    674674                        }
    675                         $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    676                         if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    677                                 // if description only contains a BOM or terminator then make it blank
    678                                 $frame_description = '';
    679                         }
     675                        $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     676                        $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
    680677                        $parsedFrame['encodingid']  = $frame_textencoding;
    681678                        $parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);
    682679
    683                         $parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $frame_description));
     680                        $parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['description']));
    684681                        $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
     682                        $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator);
    685683                        if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
    686684                                $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0));
     
    694692
    695693
    696                 } elseif ($parsedFrame['frame_name']{0} == 'T') { // 4.2. T??[?] Text information frame
     694                } elseif ($parsedFrame['frame_name'][0] == 'T') { // 4.2. T??[?] Text information frame
    697695                        //   There may only be one text information frame of its kind in an tag.
    698696                        // <Header for 'Text information frame', ID: 'T000' - 'TZZZ',
     
    708706
    709707                        $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
     708                        $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding));
    710709
    711710                        $parsedFrame['encodingid'] = $frame_textencoding;
    712711                        $parsedFrame['encoding']   = $this->TextEncodingNameLookup($frame_textencoding);
    713 
    714712                        if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
    715713                                // ID3v2.3 specs say that TPE1 (and others) can contain multiple artist values separated with /
     
    767765                                $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    768766                        }
    769                         $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    770                         if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    771                                 // if description only contains a BOM or terminator then make it blank
    772                                 $frame_description = '';
    773                         }
    774                         $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
    775 
    776                         $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator);
    777                         if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
    778                                 $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    779                         }
    780                         if ($frame_terminatorpos) {
    781                                 // there are null bytes after the data - this is not according to spec
    782                                 // only use data up to first null byte
    783                                 $frame_urldata = (string) substr($parsedFrame['data'], 0, $frame_terminatorpos);
    784                         } else {
    785                                 // no null bytes following data, just use all data
    786                                 $frame_urldata = (string) $parsedFrame['data'];
    787                         }
    788 
    789767                        $parsedFrame['encodingid']  = $frame_textencoding;
    790768                        $parsedFrame['encoding']    = $this->TextEncodingNameLookup($frame_textencoding);
    791 
    792                         $parsedFrame['url']         = $frame_urldata;     // always ISO-8859-1
    793                         $parsedFrame['description'] = $frame_description; // according to the frame text encoding
     769                        $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);           // according to the frame text encoding
     770                        $parsedFrame['url']         = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); // always ISO-8859-1
     771                        $parsedFrame['description'] = $this->RemoveStringTerminator($parsedFrame['description'], $frame_textencoding_terminator);
     772                        $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
     773
    794774                        if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) {
    795775                                $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback('ISO-8859-1', $info['id3v2']['encoding'], $parsedFrame['url']);
     
    798778
    799779
    800                 } elseif ($parsedFrame['frame_name']{0} == 'W') { // 4.3. W??? URL link frames
     780                } elseif ($parsedFrame['frame_name'][0] == 'W') { // 4.3. W??? URL link frames
    801781                        //   There may only be one URL link frame of its kind in a tag,
    802782                        //   except when stated otherwise in the frame description
     
    1011991                                $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    1012992                        }
    1013                         $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1014                         if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    1015                                 // if description only contains a BOM or terminator then make it blank
    1016                                 $frame_description = '';
    1017                         }
     993                        $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     994                        $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
    1018995                        $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
     996                        $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator);
    1019997
    1020998                        $parsedFrame['encodingid']   = $frame_textencoding;
     
    10231001                        $parsedFrame['language']     = $frame_language;
    10241002                        $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
    1025                         $parsedFrame['description']  = $frame_description;
    10261003                        if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
    10271004                                $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
     
    10781055
    10791056                                        $frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator));
    1080                                         if (($timestampindex == 0) && (ord($frame_remainingdata{0}) != 0)) {
     1057                                        if (($timestampindex == 0) && (ord($frame_remainingdata[0]) != 0)) {
    10811058                                                // timestamp probably omitted for first data item
    10821059                                        } else {
     
    11191096                                        $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    11201097                                }
    1121                                 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1122                                 if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    1123                                         // if description only contains a BOM or terminator then make it blank
    1124                                         $frame_description = '';
    1125                                 }
     1098                                $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     1099                                $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
    11261100                                $frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
     1101                                $frame_text = $this->RemoveStringTerminator($frame_text, $frame_textencoding_terminator);
    11271102
    11281103                                $parsedFrame['encodingid']   = $frame_textencoding;
     
    11311106                                $parsedFrame['language']     = $frame_language;
    11321107                                $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
    1133                                 $parsedFrame['description']  = $frame_description;
    11341108                                $parsedFrame['data']         = $frame_text;
    11351109                                if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
     
    14241398                                        $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    14251399                                }
    1426                                 $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1427                                 if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    1428                                         // if description only contains a BOM or terminator then make it blank
    1429                                         $frame_description = '';
     1400                                $parsedFrame['description']   = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     1401                                $parsedFrame['description']   = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
     1402                                $parsedFrame['encodingid']    = $frame_textencoding;
     1403                                $parsedFrame['encoding']      = $this->TextEncodingNameLookup($frame_textencoding);
     1404
     1405                                if ($id3v2_majorversion == 2) {
     1406                                        $parsedFrame['imagetype'] = isset($frame_imagetype) ? $frame_imagetype : null;
     1407                                } else {
     1408                                        $parsedFrame['mime']      = isset($frame_mimetype) ? $frame_mimetype : null;
    14301409                                }
    1431                                 $parsedFrame['encodingid']       = $frame_textencoding;
    1432                                 $parsedFrame['encoding']         = $this->TextEncodingNameLookup($frame_textencoding);
    1433 
    1434                                 if ($id3v2_majorversion == 2) {
    1435                                         $parsedFrame['imagetype']    = isset($frame_imagetype) ? $frame_imagetype : null;
    1436                                 } else {
    1437                                         $parsedFrame['mime']         = isset($frame_mimetype) ? $frame_mimetype : null;
    1438                                 }
    1439                                 $parsedFrame['picturetypeid']    = $frame_picturetype;
    1440                                 $parsedFrame['picturetype']      = $this->APICPictureTypeLookup($frame_picturetype);
    1441                                 $parsedFrame['description']      = $frame_description;
    1442                                 $parsedFrame['data']             = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
    1443                                 $parsedFrame['datalength']       = strlen($parsedFrame['data']);
    1444 
    1445                                 $parsedFrame['image_mime'] = '';
     1410                                $parsedFrame['picturetypeid'] = $frame_picturetype;
     1411                                $parsedFrame['picturetype']   = $this->APICPictureTypeLookup($frame_picturetype);
     1412                                $parsedFrame['data']          = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
     1413                                $parsedFrame['datalength']    = strlen($parsedFrame['data']);
     1414
     1415                                $parsedFrame['image_mime']    = '';
    14461416                                $imageinfo = array();
    14471417                                if ($imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo)) {
     
    15511521                                $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    15521522                        }
    1553                         $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1554                         if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    1555                                 // if description only contains a BOM or terminator then make it blank
    1556                                 $frame_description = '';
    1557                         }
     1523                        $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     1524                        $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
    15581525                        $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);
    15591526
     
    15641531                        $parsedFrame['mime']        = $frame_mimetype;
    15651532                        $parsedFrame['filename']    = $frame_filename;
    1566                         $parsedFrame['description'] = $frame_description;
    15671533                        unset($parsedFrame['data']);
    15681534
     
    16341600
    16351601                        $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset);
    1636                         $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1637                         if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    1638                                 // if description only contains a BOM or terminator then make it blank
    1639                                 $frame_description = '';
    1640                         }
     1602                        $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     1603                        $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
    16411604                        $frame_offset = $frame_terminatorpos + strlen("\x00");
    16421605
    16431606                        $parsedFrame['ownerid']     = $frame_ownerid;
    16441607                        $parsedFrame['data']        = (string) substr($parsedFrame['data'], $frame_offset);
    1645                         $parsedFrame['description'] = $frame_description;
    16461608                        unset($parsedFrame['data']);
    16471609
     
    17391701                        $parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);
    17401702
    1741                         $parsedFrame['data']         = (string) substr($parsedFrame['data'], $frame_offset);
     1703                        $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset);
     1704                        $parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $this->TextEncodingTerminatorLookup($frame_textencoding));
    17421705                        if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
    17431706                                $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
     
    17771740
    17781741                        $parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset);
     1742                        $parsedFrame['seller'] = $this->RemoveStringTerminator($parsedFrame['seller'], $this->TextEncodingTerminatorLookup($frame_textencoding));
    17791743                        unset($parsedFrame['data']);
    17801744
     
    18351799                                $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
    18361800                        }
    1837                         $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
    1838                         if (in_array($frame_description, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
    1839                                 // if description only contains a BOM or terminator then make it blank
    1840                                 $frame_description = '';
    1841                         }
     1801                        $parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
     1802                        $parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
    18421803                        $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator);
    18431804
     
    18561817                        $parsedFrame['receivedas']        = $this->COMRReceivedAsLookup($frame_receivedasid);
    18571818                        $parsedFrame['sellername']        = $frame_sellername;
    1858                         $parsedFrame['description']       = $frame_description;
    18591819                        $parsedFrame['mime']              = $frame_mimetype;
    18601820                        $parsedFrame['logo']              = $frame_sellerlogo;
     
    20201980                        // Start time      $xx xx xx xx
    20211981                        // End time        $xx xx xx xx
    2022             // Start offset    $xx xx xx xx
    2023             // End offset      $xx xx xx xx
    2024             // <Optional embedded sub-frames>
     1982                        // Start offset    $xx xx xx xx
     1983                        // End offset      $xx xx xx xx
     1984                        // <Optional embedded sub-frames>
    20251985
    20261986                        $frame_offset = 0;
     
    20632023                                        $subframe['text']       =     substr($subframe_rawdata, 1);
    20642024                                        $subframe['encoding']   = $this->TextEncodingNameLookup($subframe['encodingid']);
    2065                                         $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));;
     2025                                        $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));
    20662026                                        switch (substr($encoding_converted_text, 0, 2)) {
    20672027                                                case "\xFF\xFE":
     
    20832043                                        }
    20842044
    2085                                         if (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) {
    2086                                                 if ($subframe['name'] == 'TIT2') {
     2045                                        switch ($subframe['name']) {
     2046                                                case 'TIT2':
    20872047                                                        $parsedFrame['chapter_name']        = $encoding_converted_text;
    2088                                                 } elseif ($subframe['name'] == 'TIT3') {
     2048                                                        $parsedFrame['subframes'][] = $subframe;
     2049                                                        break;
     2050                                                case 'TIT3':
    20892051                                                        $parsedFrame['chapter_description'] = $encoding_converted_text;
    2090                                                 }
    2091                                                 $parsedFrame['subframes'][] = $subframe;
    2092                                         } else {
    2093                                                 $this->warning('ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)');
     2052                                                        $parsedFrame['subframes'][] = $subframe;
     2053                                                        break;
     2054                                                case 'WXXX':
     2055                                                        list($subframe['chapter_url_description'], $subframe['chapter_url']) = explode("\x00", $encoding_converted_text, 2);
     2056                                                        $parsedFrame['chapter_url'][$subframe['chapter_url_description']] = $subframe['chapter_url'];
     2057                                                        $parsedFrame['subframes'][] = $subframe;
     2058                                                        break;
     2059                                                case 'APIC':
     2060                                                        if (preg_match('#^([^\\x00]+)*\\x00(.)([^\\x00]+)*\\x00(.+)$#s', $subframe['text'], $matches)) {
     2061                                                                list($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata) = $matches;
     2062                                                                $subframe['image_mime']   = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_mime));
     2063                                                                $subframe['picture_type'] = $this->APICPictureTypeLookup($subframe_apic_picturetype);
     2064                                                                $subframe['description']  = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe_apic_description));
     2065                                                                if (strlen($this->TextEncodingTerminatorLookup($subframe['encoding'])) == 2) {
     2066                                                                        // the null terminator between "description" and "picture data" could be either 1 byte (ISO-8859-1, UTF-8) or two bytes (UTF-16)
     2067                                                                        // the above regex assumes one byte, if it's actually two then strip the second one here
     2068                                                                        $subframe_apic_picturedata = substr($subframe_apic_picturedata, 1);
     2069                                                                }
     2070                                                                $subframe['data'] = $subframe_apic_picturedata;
     2071                                                                unset($dummy, $subframe_apic_mime, $subframe_apic_picturetype, $subframe_apic_description, $subframe_apic_picturedata);
     2072                                                                unset($subframe['text'], $parsedFrame['text']);
     2073                                                                $parsedFrame['subframes'][] = $subframe;
     2074                                                                $parsedFrame['picture_present'] = true;
     2075                                                        } else {
     2076                                                                $this->warning('ID3v2.CHAP subframe #'.(count($parsedFrame['subframes']) + 1).' "'.$subframe['name'].'" not in expected format');
     2077                                                        }
     2078                                                        break;
     2079                                                default:
     2080                                                        $this->warning('ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (supported: TIT2, TIT3, WXXX, APIC)');
     2081                                                        break;
    20942082                                        }
    20952083                                }
    20962084                                unset($subframe_rawdata, $subframe, $encoding_converted_text);
     2085                                unset($parsedFrame['data']); // debatable whether this this be here, without it the returned structure may contain a large amount of duplicate data if chapters contain APIC
    20972086                        }
    20982087
    20992088                        $id3v2_chapter_entry = array();
    2100                         foreach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description') as $id3v2_chapter_key) {
     2089                        foreach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description', 'chapter_url', 'picture_present') as $id3v2_chapter_key) {
    21012090                                if (isset($parsedFrame[$id3v2_chapter_key])) {
    21022091                                        $id3v2_chapter_entry[$id3v2_chapter_key] = $parsedFrame[$id3v2_chapter_key];
     
    21172106                        // Entry count       $xx
    21182107                        // Child Element ID  <string>$00   /* zero or more child CHAP or CTOC entries */
    2119             // <Optional embedded sub-frames>
     2108                        // <Optional embedded sub-frames>
    21202109
    21212110                        $frame_offset = 0;
     
    36973686
    36983687        /**
     3688         * @param string $string
     3689         * @param string $terminator
     3690         *
     3691         * @return string
     3692         */
     3693        public static function RemoveStringTerminator($string, $terminator) {
     3694                // Null terminator at end of comment string is somewhat ambiguous in the specification, may or may not be implemented by various taggers. Remove terminator only if present.
     3695                // https://github.com/JamesHeinrich/getID3/issues/121
     3696                // https://community.mp3tag.de/t/x-trailing-nulls-in-id3v2-comments/19227
     3697                if (substr($string, -strlen($terminator), strlen($terminator)) === $terminator) {
     3698                        $string = substr($string, 0, -strlen($terminator));
     3699                }
     3700                return $string;
     3701        }
     3702
     3703        /**
     3704         * @param string $string
     3705         *
     3706         * @return string
     3707         */
     3708        public static function MakeUTF16emptyStringEmpty($string) {
     3709                if (in_array($string, array("\x00", "\x00\x00", "\xFF\xFE", "\xFE\xFF"))) {
     3710                        // if string only contains a BOM or terminator then make it actually an empty string
     3711                        $string = '';
     3712                }
     3713                return $string;
     3714        }
     3715
     3716        /**
    36993717         * @param string $framename
    37003718         * @param int    $id3v2majorversion
     
    37253743        public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) {
    37263744                for ($i = 0; $i < strlen($numberstring); $i++) {
    3727                         if ((chr($numberstring{$i}) < chr('0')) || (chr($numberstring{$i}) > chr('9'))) {
    3728                                 if (($numberstring{$i} == '.') && $allowdecimal) {
     3745                        if ((chr($numberstring[$i]) < chr('0')) || (chr($numberstring[$i]) > chr('9'))) {
     3746                                if (($numberstring[$i] == '.') && $allowdecimal) {
    37293747                                        // allowed
    3730                                 } elseif (($numberstring{$i} == '-') && $allownegative && ($i == 0)) {
     3748                                } elseif (($numberstring[$i] == '-') && $allownegative && ($i == 0)) {
    37313749                                        // allowed
    37323750                                } else {
  • _core_/plugins/medias/lib/getid3/module.tag.xmp.php

    r113161 r117918  
    115115
    116116                // Check that the third character is 0xFF (Start of first segment header)
    117                 if ($data{0} != "\xFF")
     117                if ($data[0] != "\xFF")
    118118                {
    119119                        // NO FF found - close file and return - JPEG is probably corrupted
     
    125125                $hit_compressed_image_data = false;
    126126
    127         $headerdata = array();
     127                $headerdata = array();
    128128                // Cycle through the file until, one of: 1) an EOI (End of image) marker is hit,
    129129                //                                       2) we have hit the compressed image data (no more headers are allowed after data)
    130130                //                                       3) or end of file is hit
    131131
    132                 while (($data{1} != "\xD9") && (!$hit_compressed_image_data) && (!feof($filehnd)))
     132                while (($data[1] != "\xD9") && (!$hit_compressed_image_data) && (!feof($filehnd)))
    133133                {
    134134                        // Found a segment to look at.
    135135                        // Check that the segment marker is not a Restart marker - restart markers don't have size or data after them
    136                         if ((ord($data{1}) < 0xD0) || (ord($data{1}) > 0xD7))
     136                        if ((ord($data[1]) < 0xD0) || (ord($data[1]) > 0xD7))
    137137                        {
    138138                                // Segment isn't a Restart marker
     
    151151                                // Store the segment information in the output array
    152152                                $headerdata[] = array(
    153                                         'SegType'      => ord($data{1}),
    154                                         'SegName'      => $GLOBALS['JPEG_Segment_Names'][ord($data{1})],
     153                                        'SegType'      => ord($data[1]),
     154                                        'SegName'      => $GLOBALS['JPEG_Segment_Names'][ord($data[1])],
    155155                                        'SegDataStart' => $segdatastart,
    156156                                        'SegData'      => $segdata,
     
    159159
    160160                        // If this is a SOS (Start Of Scan) segment, then there is no more header data - the compressed image data follows
    161                         if ($data{1} == "\xDA")
     161                        if ($data[1] == "\xDA")
    162162                        {
    163163                                // Flag that we have hit the compressed image data - exit loop as no more headers available.
     
    170170
    171171                                // Check that the first byte of the two is 0xFF as it should be for a marker
    172                                 if ($data{0} != "\xFF")
     172                                if ($data[0] != "\xFF")
    173173                                {
    174174                                        // NO FF found - close file and return - JPEG is probably corrupted
  • _core_/plugins/medias/lib/getid3/write.id3v1.php

    r113161 r117918  
    6969                                        fseek($fp_source, 0, SEEK_END);    // append new ID3v1 tag
    7070                                }
    71                                 $this->tag_data['track'] = (isset($this->tag_data['track']) ? $this->tag_data['track'] : (isset($this->tag_data['track_number']) ? $this->tag_data['track_number'] : (isset($this->tag_data['tracknumber']) ? $this->tag_data['tracknumber'] : '')));
     71                                $this->tag_data['track_number'] = (isset($this->tag_data['track_number']) ? $this->tag_data['track_number'] : '');
    7272
    7373                                $new_id3v1_tag_data = getid3_id3v1::GenerateID3v1Tag(
    74                                                                                                                 (isset($this->tag_data['title']  ) ? $this->tag_data['title']   : ''),
    75                                                                                                                 (isset($this->tag_data['artist'] ) ? $this->tag_data['artist']  : ''),
    76                                                                                                                 (isset($this->tag_data['album']  ) ? $this->tag_data['album']   : ''),
    77                                                                                                                 (isset($this->tag_data['year']   ) ? $this->tag_data['year']    : ''),
    78                                                                                                                 (isset($this->tag_data['genreid']) ? $this->tag_data['genreid'] : ''),
    79                                                                                                                 (isset($this->tag_data['comment']) ? $this->tag_data['comment'] : ''),
    80                                                                                                                 (isset($this->tag_data['track']  ) ? $this->tag_data['track']  : ''));
     74                                                                                                                (isset($this->tag_data['title']       ) ? $this->tag_data['title']        : ''),
     75                                                                                                                (isset($this->tag_data['artist']      ) ? $this->tag_data['artist']       : ''),
     76                                                                                                                (isset($this->tag_data['album']       ) ? $this->tag_data['album']        : ''),
     77                                                                                                                (isset($this->tag_data['year']        ) ? $this->tag_data['year']         : ''),
     78                                                                                                                (isset($this->tag_data['genreid']     ) ? $this->tag_data['genreid']      : ''),
     79                                                                                                                (isset($this->tag_data['comment']     ) ? $this->tag_data['comment']      : ''),
     80                                                                                                                (isset($this->tag_data['track_number']) ? $this->tag_data['track_number'] : ''));
    8181                                fwrite($fp_source, $new_id3v1_tag_data, 128);
    8282                                fclose($fp_source);
  • _core_/plugins/medias/lib/getid3/write.id3v2.php

    r113161 r117918  
    346346                $flag1 = null;
    347347                $flag2 = null;
    348             switch ($this->majorversion) {
     348                switch ($this->majorversion) {
    349349                        case 4:
    350350                                // %0abc0000 %0h00kmnp
     
    12361236                                        if ((($this->majorversion == 2) && (strlen($frame_name) != 3)) || (($this->majorversion > 2) && (strlen($frame_name) != 4))) {
    12371237                                                $this->errors[] = 'Invalid frame name "'.$frame_name.'" for ID3v2.'.$this->majorversion;
    1238                                         } elseif ($frame_name{0} == 'T') {
     1238                                        } elseif ($frame_name[0] == 'T') {
    12391239                                                // 4.2. T???  Text information frames
    12401240                                                // Text encoding                $xx
     
    12471247                                                        $framedata .= $source_data_array['data'];
    12481248                                                }
    1249                                         } elseif ($frame_name{0} == 'W') {
     1249                                        } elseif ($frame_name[0] == 'W') {
    12501250                                                // 4.3. W???  URL link frames
    12511251                                                // URL              <text string>
     
    14031403
    14041404                                default:
    1405                                         if (($frame_name{0} != 'T') && ($frame_name{0} != 'W')) {
     1405                                        if (($frame_name[0] != 'T') && ($frame_name[0] != 'W')) {
    14061406                                                $this->errors[] = 'Frame not allowed in ID3v2.'.$this->majorversion.': '.$frame_name;
    14071407                                        }
     
    15261526
    15271527                                default:
    1528                                         if (($frame_name{0} != 'T') && ($frame_name{0} != 'W')) {
     1528                                        if (($frame_name[0] != 'T') && ($frame_name[0] != 'W')) {
    15291529                                                $this->errors[] = 'Frame not allowed in ID3v2.'.$this->majorversion.': '.$frame_name;
    15301530                                        }
     
    16181618
    16191619                                default:
    1620                                         if (($frame_name{0} != 'T') && ($frame_name{0} != 'W')) {
     1620                                        if (($frame_name[0] != 'T') && ($frame_name[0] != 'W')) {
    16211621                                                $this->errors[] = 'Frame not allowed in ID3v2.'.$this->majorversion.': '.$frame_name;
    16221622                                        }
     
    19591959                $datalength = strlen($data);
    19601960                for ($i = 0; $i < $datalength; $i++) {
    1961                         $thischar = $data{$i};
     1961                        $thischar = $data[$i];
    19621962                        $unsyncheddata .= $thischar;
    19631963                        if ($thischar == "\xFF") {
    1964                                 $nextchar = ord($data{$i + 1});
     1964                                $nextchar = ord($data[$i + 1]);
    19651965                                if (($nextchar & 0xE0) == 0xE0) {
    19661966                                        // previous byte = 11111111, this byte = 111?????
     
    23172317                        $ID3v2ShortFrameNameLookup[4]['title_sort_order']                  = 'TSOT';
    23182318                        $ID3v2ShortFrameNameLookup[4]['set_subtitle']                      = 'TSST';
     2319                        $ID3v2ShortFrameNameLookup[4]['year']                              = 'TDRC'; // subset of ISO 8601: valid timestamps are yyyy, yyyy-MM, yyyy-MM-dd, yyyy-MM-ddTHH, yyyy-MM-ddTHH:mm and yyyy-MM-ddTHH:mm:ss. All time stamps are UTC
    23192320                }
    23202321                return (isset($ID3v2ShortFrameNameLookup[$majorversion][strtolower($long_description)]) ? $ID3v2ShortFrameNameLookup[$majorversion][strtolower($long_description)] : '');
  • _core_/plugins/medias/lib/getid3/write.php

    r113161 r117918  
    312312                }
    313313
    314                 // Convert "TRACK" to "TRACKNUMBER" (if needed) for compatability with all formats
    315                 if (isset($this->tag_data['TRACK']) && !isset($this->tag_data['TRACKNUMBER'])) {
    316                         $this->tag_data['TRACKNUMBER'] = $this->tag_data['TRACK'];
     314                // Convert "TRACK" to "TRACK_NUMBER" (if needed) for compatability with all formats
     315                if (isset($this->tag_data['TRACK']) && !isset($this->tag_data['TRACK_NUMBER'])) {
     316                        $this->tag_data['TRACK_NUMBER'] = $this->tag_data['TRACK'];
    317317                        unset($this->tag_data['TRACK']);
    318318                }
     
    560560                        }
    561561                }
    562                 $tag_data_id3v1['title']   =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['TITLE']      ) ? $this->tag_data['TITLE']       : array())));
    563                 $tag_data_id3v1['artist']  =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['ARTIST']     ) ? $this->tag_data['ARTIST']      : array())));
    564                 $tag_data_id3v1['album']   =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['ALBUM']      ) ? $this->tag_data['ALBUM']       : array())));
    565                 $tag_data_id3v1['year']    =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['YEAR']       ) ? $this->tag_data['YEAR']        : array())));
    566                 $tag_data_id3v1['comment'] =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['COMMENT']    ) ? $this->tag_data['COMMENT']     : array())));
    567                 $tag_data_id3v1['track']   = intval(getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['TRACKNUMBER']) ? $this->tag_data['TRACKNUMBER'] : array()))));
    568                 if ($tag_data_id3v1['track'] <= 0) {
    569                         $tag_data_id3v1['track'] = '';
     562                $tag_data_id3v1['title']        =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['TITLE']       ) ? $this->tag_data['TITLE']        : array())));
     563                $tag_data_id3v1['artist']       =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['ARTIST']      ) ? $this->tag_data['ARTIST']       : array())));
     564                $tag_data_id3v1['album']        =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['ALBUM']       ) ? $this->tag_data['ALBUM']        : array())));
     565                $tag_data_id3v1['year']         =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['YEAR']        ) ? $this->tag_data['YEAR']         : array())));
     566                $tag_data_id3v1['comment']      =        getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['COMMENT']     ) ? $this->tag_data['COMMENT']      : array())));
     567                $tag_data_id3v1['track_number'] = intval(getid3_lib::iconv_fallback($this->tag_encoding, 'ISO-8859-1', implode(' ', (isset($this->tag_data['TRACK_NUMBER']) ? $this->tag_data['TRACK_NUMBER'] : array()))));
     568                if ($tag_data_id3v1['track_number'] <= 0) {
     569                        $tag_data_id3v1['track_number'] = '';
    570570                }
    571571
     
    676676                                                                                // if UTF-8 string does not include any characters above chr(127) then it is identical to ISO-8859-1
    677677                                                                                for ($i = 0; $i < strlen($value); $i++) {
    678                                                                                         if (ord($value{$i}) > 127) {
     678                                                                                        if (ord($value[$i]) > 127) {
    679679                                                                                                break 2;
    680680                                                                                        }
  • _core_/plugins/medias/paquet.xml

    r117580 r117918  
    22        prefix="medias"
    33        categorie="multimedia"
    4         version="2.25.2"
     4        version="2.25.3"
    55        etat="stable"
    66        compatibilite="[3.3.0-dev;3.3.*]"
Note: See TracChangeset for help on using the changeset viewer.