Changeset 103224 in spip-zone


Ignore:
Timestamp:
Mar 10, 2017, 10:11:16 PM (3 years ago)
Author:
kent1@…
Message:

version 1.9.13 de la lib https://github.com/JamesHeinrich/getID3/releases

Location:
_plugins_/getID3/trunk/getid3
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/getID3/trunk/getid3/extension.cache.mysql.php

    r96419 r103224  
    179179
    180180                $SQLquery  = 'CREATE TABLE IF NOT EXISTS `'.mysql_real_escape_string($this->table).'` (';
    181                 $SQLquery .=   '`filename` VARCHAR(500) NOT NULL DEFAULT \'\'';
     181                $SQLquery .=   '`filename` VARCHAR(990) NOT NULL DEFAULT \'\'';
    182182                $SQLquery .= ', `filesize` INT(11) NOT NULL DEFAULT \'0\'';
    183183                $SQLquery .= ', `filetime` INT(11) NOT NULL DEFAULT \'0\'';
    184184                $SQLquery .= ', `analyzetime` INT(11) NOT NULL DEFAULT \'0\'';
    185185                $SQLquery .= ', `value` LONGTEXT NOT NULL';
    186                 $SQLquery .= ', PRIMARY KEY (`filename`, `filesize`, `filetime`)) ENGINE=MyISAM';
     186                $SQLquery .= ', PRIMARY KEY (`filename`, `filesize`, `filetime`)) ENGINE=MyISAM CHARACTER SET=latin1 COLLATE=latin1_general_ci';
    187187                $this->cursor = mysql_query($SQLquery, $this->connection);
    188188                echo mysql_error($this->connection);
  • _plugins_/getID3/trunk/getid3/getid3.lib.php

    r96419 r103224  
    961961                }
    962962
     963                // mb_convert_encoding() availble
     964                if (function_exists('mb_convert_encoding')) {
     965                        if ($converted_string = @mb_convert_encoding($string, $out_charset, $in_charset)) {
     966                                switch ($out_charset) {
     967                                        case 'ISO-8859-1':
     968                                                $converted_string = rtrim($converted_string, "\x00");
     969                                                break;
     970                                }
     971                                return $converted_string;
     972                        }
     973                        return $string;
     974                }
    963975                // iconv() availble
    964                 if (function_exists('iconv')) {
     976                else if (function_exists('iconv')) {
    965977                        if ($converted_string = @iconv($in_charset, $out_charset.'//TRANSLIT', $string)) {
    966978                                switch ($out_charset) {
     
    978990
    979991
    980                 // iconv() not available
     992                // neither mb_convert_encoding or iconv() is available
    981993                static $ConversionFunctionList = array();
    982994                if (empty($ConversionFunctionList)) {
     
    10001012                        return self::$ConversionFunction($string);
    10011013                }
    1002                 throw new Exception('PHP does not have iconv() support - cannot convert from '.$in_charset.' to '.$out_charset);
     1014                throw new Exception('PHP does not has mb_convert_encoding() or iconv() support - cannot convert from '.$in_charset.' to '.$out_charset);
    10031015        }
    10041016
     
    10211033                $HTMLstring = '';
    10221034
    1023                 switch ($charset) {
     1035                switch (strtolower($charset)) {
    10241036                        case '1251':
    10251037                        case '1252':
     
    10281040                        case '936':
    10291041                        case '950':
    1030                         case 'BIG5':
    1031                         case 'BIG5-HKSCS':
     1042                        case 'big5':
     1043                        case 'big5-hkscs':
    10321044                        case 'cp1251':
    10331045                        case 'cp1252':
    10341046                        case 'cp866':
    1035                         case 'EUC-JP':
    1036                         case 'EUCJP':
    1037                         case 'GB2312':
     1047                        case 'euc-jp':
     1048                        case 'eucjp':
     1049                        case 'gb2312':
    10381050                        case 'ibm866':
    1039                         case 'ISO-8859-1':
    1040                         case 'ISO-8859-15':
    1041                         case 'ISO8859-1':
    1042                         case 'ISO8859-15':
    1043                         case 'KOI8-R':
     1051                        case 'iso-8859-1':
     1052                        case 'iso-8859-15':
     1053                        case 'iso8859-1':
     1054                        case 'iso8859-15':
     1055                        case 'koi8-r':
    10441056                        case 'koi8-ru':
    10451057                        case 'koi8r':
    1046                         case 'Shift_JIS':
    1047                         case 'SJIS':
     1058                        case 'shift_jis':
     1059                        case 'sjis':
    10481060                        case 'win-1251':
    1049                         case 'Windows-1251':
    1050                         case 'Windows-1252':
     1061                        case 'windows-1251':
     1062                        case 'windows-1252':
    10511063                                $HTMLstring = htmlentities($string, ENT_COMPAT, $charset);
    10521064                                break;
    10531065
    1054                         case 'UTF-8':
     1066                        case 'utf-8':
    10551067                                $strlen = strlen($string);
    10561068                                for ($i = 0; $i < $strlen; $i++) {
     
    10801092                                break;
    10811093
    1082                         case 'UTF-16LE':
     1094                        case 'utf-16le':
    10831095                                for ($i = 0; $i < strlen($string); $i += 2) {
    10841096                                        $charval = self::LittleEndian2Int(substr($string, $i, 2));
     
    10911103                                break;
    10921104
    1093                         case 'UTF-16BE':
     1105                        case 'utf-16be':
    10941106                                for ($i = 0; $i < strlen($string); $i += 2) {
    10951107                                        $charval = self::BigEndian2Int(substr($string, $i, 2));
     
    12631275                                                        if (is_array($value) || empty($ThisFileInfo['comments'][$tagname]) || !in_array(trim($value), $ThisFileInfo['comments'][$tagname])) {
    12641276                                                                $value = (is_string($value) ? trim($value) : $value);
    1265                                                                 if (!is_numeric($key)) {
     1277                                                                if (!is_int($key) && !ctype_digit($key)) {
    12661278                                                                        $ThisFileInfo['comments'][$tagname][$key] = $value;
    12671279                                                                } else {
    1268                                                                         $ThisFileInfo['comments'][$tagname][]     = $value;
     1280                                                                        if (isset($ThisFileInfo['comments'][$tagname])) {
     1281                                                                                $ThisFileInfo['comments'][$tagname] = array($value);
     1282                                                                        } else {
     1283                                                                                $ThisFileInfo['comments'][$tagname][] = $value;
     1284                                                                        }
    12691285                                                                }
    12701286                                                        }
    12711287                                                }
    12721288                                        }
     1289                                }
     1290                        }
     1291
     1292                        // attempt to standardize spelling of returned keys
     1293                        $StandardizeFieldNames = array(
     1294                                'tracknumber' => 'track_number',
     1295                                'track'       => 'track_number',
     1296                        );
     1297                        foreach ($StandardizeFieldNames as $badkey => $goodkey) {
     1298                                if (array_key_exists($badkey, $ThisFileInfo['comments']) && !array_key_exists($goodkey, $ThisFileInfo['comments'])) {
     1299                                        $ThisFileInfo['comments'][$goodkey] = $ThisFileInfo['comments'][$badkey];
     1300                                        unset($ThisFileInfo['comments'][$badkey]);
    12731301                                }
    12741302                        }
  • _plugins_/getID3/trunk/getid3/getid3.php

    r96419 r103224  
    2222if (!defined('IMG_JPG') && defined('IMAGETYPE_JPEG')) {
    2323        define('IMG_JPG', IMAGETYPE_JPEG);
     24}
     25if (!defined('ENT_SUBSTITUTE')) { // PHP5.3 adds ENT_IGNORE, PHP5.4 adds ENT_SUBSTITUTE
     26        define('ENT_SUBSTITUTE', (defined('ENT_IGNORE') ? ENT_IGNORE : 8));
    2427}
    2528
     
    110113        protected $startup_warning = '';
    111114
    112         const VERSION           = '1.9.12-201602240818';
     115        const VERSION           = '1.9.13-201612051806';
    113116        const FREAD_BUFFER_SIZE = 32768;
    114117
     
    122125                $required_php_version = '5.3.0';
    123126                if (version_compare(PHP_VERSION, $required_php_version, '<')) {
    124                         $this->startup_error .= 'getID3() requires PHP v'.$required_php_version.' or higher - you are running v'.PHP_VERSION;
     127                        $this->startup_error .= 'getID3() requires PHP v'.$required_php_version.' or higher - you are running v'.PHP_VERSION."\n";
    125128                        return false;
    126129                }
     
    138141                        // memory limits probably disabled
    139142                } elseif ($this->memory_limit <= 4194304) {
    140                         $this->startup_error .= 'PHP has less than 4MB available memory and will very likely run out. Increase memory_limit in php.ini';
     143                        $this->startup_error .= 'PHP has less than 4MB available memory and will very likely run out. Increase memory_limit in php.ini'."\n";
    141144                } elseif ($this->memory_limit <= 12582912) {
    142                         $this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini';
     145                        $this->startup_warning .= 'PHP has less than 12MB available memory and might run out if all modules are loaded. Increase memory_limit in php.ini'."\n";
    143146                }
    144147
     
    148151                }
    149152
    150                 if (intval(ini_get('mbstring.func_overload')) > 0) {
    151                         $this->warning('WARNING: php.ini contains "mbstring.func_overload = '.ini_get('mbstring.func_overload').'", this may break things.');
     153                if (($mbstring_func_overload = ini_get('mbstring.func_overload')) && ($mbstring_func_overload & 0x02)) {
     154                        // http://php.net/manual/en/mbstring.overload.php
     155                        // "mbstring.func_overload in php.ini is a positive value that represents a combination of bitmasks specifying the categories of functions to be overloaded. It should be set to 1 to overload the mail() function. 2 for string functions, 4 for regular expression functions"
     156                        // getID3 cannot run when string functions are overloaded. It doesn't matter if mail() or ereg* functions are overloaded since getID3 does not use those.
     157                        $this->startup_error .= 'WARNING: php.ini contains "mbstring.func_overload = '.ini_get('mbstring.func_overload').'", getID3 cannot run with this setting (bitmask 2 (string functions) cannot be set). Recommended to disable entirely.'."\n";
    152158                }
    153159
     
    155161                if (function_exists('get_magic_quotes_runtime')) {
    156162                        if (get_magic_quotes_runtime()) {
    157                                 return $this->startup_error('magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).');
     163                                $this->startup_error .= 'magic_quotes_runtime must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_runtime(0) and set_magic_quotes_runtime(1).'."\n";
    158164                        }
    159165                }
     
    162168                if (function_exists('magic_quotes_gpc')) {
    163169                        if (get_magic_quotes_gpc()) {
    164                                 return $this->startup_error('magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).');
     170                                $this->startup_error .= 'magic_quotes_gpc must be disabled before running getID3(). Surround getid3 block by set_magic_quotes_gpc(0) and set_magic_quotes_gpc(1).'."\n";
    165171                        }
    166172                }
     
    168174                // Load support library
    169175                if (!include_once(GETID3_INCLUDEPATH.'getid3.lib.php')) {
    170                         $this->startup_error .= 'getid3.lib.php is missing or corrupt';
     176                        $this->startup_error .= 'getid3.lib.php is missing or corrupt'."\n";
    171177                }
    172178
     
    187193
    188194                        if (!is_dir($helperappsdir)) {
    189                                 $this->startup_warning .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist';
     195                                $this->startup_warning .= '"'.$helperappsdir.'" cannot be defined as GETID3_HELPERAPPSDIR because it does not exist'."\n";
    190196                        } elseif (strpos(realpath($helperappsdir), ' ') !== false) {
    191197                                $DirPieces = explode(DIRECTORY_SEPARATOR, realpath($helperappsdir));
     
    207213                                                        }
    208214                                                } else {
    209                                                         $this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run "dir /x" from the commandline to see the correct 8.3-style names.';
     215                                                        $this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run "dir /x" from the commandline to see the correct 8.3-style names.'."\n";
    210216                                                }
    211217                                        }
     
    215221                        }
    216222                        define('GETID3_HELPERAPPSDIR', $helperappsdir.DIRECTORY_SEPARATOR);
     223                }
     224
     225                if (!empty($this->startup_error)) {
     226                        echo $this->startup_error;
     227                        throw new getid3_exception($this->startup_error);
    217228                }
    218229
     
    250261                        }
    251262                        if (!empty($this->startup_warning)) {
    252                                 $this->warning($this->startup_warning);
     263                                foreach (explode("\n", $this->startup_warning) as $startup_warning) {
     264                                        $this->warning($startup_warning);
     265                                }
    253266                        }
    254267
     
    260273
    261274                        // remote files not supported
    262                         if (preg_match('/^(ht|f)tp:\/\//', $filename)) {
     275                        if (preg_match('#^(ht|f)tp://#', $filename)) {
    263276                                throw new getid3_exception('Remote files are not supported - please copy the file locally first');
    264277                        }
     
    427440                        }
    428441
    429                         // module requires iconv support
     442                        // module requires mb_convert_encoding/iconv support
    430443                        // Check encoding/iconv support
    431                         if (!empty($determined_format['iconv_req']) && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) {
    432                                 $errormessage = 'iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. ';
     444                        if (!empty($determined_format['iconv_req']) && !function_exists('mb_convert_encoding') && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) {
     445                                $errormessage = 'mb_convert_encoding() or iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. ';
    433446                                if (GETID3_OS_ISWINDOWS) {
    434                                         $errormessage .= 'PHP does not have iconv() support. Please enable php_iconv.dll in php.ini, and copy iconv.dll from c:/php/dlls to c:/windows/system32';
     447                                        $errormessage .= 'PHP does not have mb_convert_encoding() or iconv() support. Please enable php_mbstring.dll / php_iconv.dll in php.ini, and copy php_mbstring.dll / iconv.dll from c:/php/dlls to c:/windows/system32';
    435448                                } else {
    436                                         $errormessage .= 'PHP is not compiled with iconv() support. Please recompile with the --with-iconv switch';
     449                                        $errormessage .= 'PHP is not compiled with mb_convert_encoding() or iconv() support. Please recompile with the --enable-mbstring / --with-iconv switch';
    437450                                }
    438451                                return $this->error($errormessage);
     
    569582                                // AC-3   - audio      - Dolby AC-3 / Dolby Digital
    570583                                'ac3'  => array(
    571                                                         'pattern'   => '^\x0B\x77',
     584                                                        'pattern'   => '^\\x0B\\x77',
    572585                                                        'group'     => 'audio',
    573586                                                        'module'    => 'ac3',
     
    587600                                // AA   - audio       - Audible Audiobook
    588601                                'aa'   => array(
    589                                                         'pattern'   => '^.{4}\x57\x90\x75\x36',
     602                                                        'pattern'   => '^.{4}\\x57\\x90\\x75\\x36',
    590603                                                        'group'     => 'audio',
    591604                                                        'module'    => 'aa',
     
    595608                                // AAC  - audio       - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3)
    596609                                'adts' => array(
    597                                                         'pattern'   => '^\xFF[\xF0-\xF1\xF8-\xF9]',
     610                                                        'pattern'   => '^\\xFF[\\xF0-\\xF1\\xF8-\\xF9]',
    598611                                                        'group'     => 'audio',
    599612                                                        'module'    => 'aac',
     
    605618                                // AU   - audio       - NeXT/Sun AUdio (AU)
    606619                                'au'   => array(
    607                                                         'pattern'   => '^\.snd',
     620                                                        'pattern'   => '^\\.snd',
    608621                                                        'group'     => 'audio',
    609622                                                        'module'    => 'au',
     
    613626                                // AMR  - audio       - Adaptive Multi Rate
    614627                                'amr'  => array(
    615                                                         'pattern'   => '^\x23\x21AMR\x0A', // #!AMR[0A]
     628                                                        'pattern'   => '^\\x23\\x21AMR\\x0A', // #!AMR[0A]
    616629                                                        'group'     => 'audio',
    617630                                                        'module'    => 'amr',
     
    629642                                // BONK - audio       - Bonk v0.9+
    630643                                'bonk' => array(
    631                                                         'pattern'   => '^\x00(BONK|INFO|META| ID3)',
     644                                                        'pattern'   => '^\\x00(BONK|INFO|META| ID3)',
    632645                                                        'group'     => 'audio',
    633646                                                        'module'    => 'bonk',
     
    645658                                // DSS  - audio       - Digital Speech Standard
    646659                                'dss'  => array(
    647                                                         'pattern'   => '^[\x02-\x03]ds[s2]',
     660                                                        'pattern'   => '^[\\x02-\\x06]ds[s2]',
    648661                                                        'group'     => 'audio',
    649662                                                        'module'    => 'dss',
     
    653666                                // DTS  - audio       - Dolby Theatre System
    654667                                'dts'  => array(
    655                                                         'pattern'   => '^\x7F\xFE\x80\x01',
     668                                                        'pattern'   => '^\\x7F\\xFE\\x80\\x01',
    656669                                                        'group'     => 'audio',
    657670                                                        'module'    => 'dts',
     
    738751                                // MPC  - audio       - Musepack / MPEGplus
    739752                                'mpc'  => array(
    740                                                         'pattern'   => '^(MPCK|MP\+|[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0])',
     753                                                        'pattern'   => '^(MPCK|MP\\+|[\\x00\\x01\\x10\\x11\\x40\\x41\\x50\\x51\\x80\\x81\\x90\\x91\\xC0\\xC1\\xD0\\xD1][\\x20-\\x37][\\x00\\x20\\x40\\x60\\x80\\xA0\\xC0\\xE0])',
    741754                                                        'group'     => 'audio',
    742755                                                        'module'    => 'mpc',
     
    746759                                // MP3  - audio       - MPEG-audio Layer 3 (very similar to AAC-ADTS)
    747760                                'mp3'  => array(
    748                                                         'pattern'   => '^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\x0B\x10-\x1B\x20-\x2B\x30-\x3B\x40-\x4B\x50-\x5B\x60-\x6B\x70-\x7B\x80-\x8B\x90-\x9B\xA0-\xAB\xB0-\xBB\xC0-\xCB\xD0-\xDB\xE0-\xEB\xF0-\xFB]',
     761                                                        'pattern'   => '^\\xFF[\\xE2-\\xE7\\xF2-\\xF7\\xFA-\\xFF][\\x00-\\x0B\\x10-\\x1B\\x20-\\x2B\\x30-\\x3B\\x40-\\x4B\\x50-\\x5B\\x60-\\x6B\\x70-\\x7B\\x80-\\x8B\\x90-\\x9B\\xA0-\\xAB\\xB0-\\xBB\\xC0-\\xCB\\xD0-\\xDB\\xE0-\\xEB\\xF0-\\xFB]',
    749762                                                        'group'     => 'audio',
    750763                                                        'module'    => 'mp3',
     
    754767                                // OFR  - audio       - OptimFROG
    755768                                'ofr'  => array(
    756                                                         'pattern'   => '^(\*RIFF|OFR)',
     769                                                        'pattern'   => '^(\\*RIFF|OFR)',
    757770                                                        'group'     => 'audio',
    758771                                                        'module'    => 'optimfrog',
     
    780793                                // TTA  - audio       - TTA Lossless Audio Compressor (http://tta.corecodec.org)
    781794                                'tta'  => array(
    782                                                         'pattern'   => '^TTA',  // could also be '^TTA(\x01|\x02|\x03|2|1)'
     795                                                        'pattern'   => '^TTA',  // could also be '^TTA(\\x01|\\x02|\\x03|2|1)'
    783796                                                        'group'     => 'audio',
    784797                                                        'module'    => 'tta',
     
    815828                                // ASF  - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio
    816829                                'asf'  => array(
    817                                                         'pattern'   => '^\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C',
     830                                                        'pattern'   => '^\\x30\\x26\\xB2\\x75\\x8E\\x66\\xCF\\x11\\xA6\\xD9\\x00\\xAA\\x00\\x62\\xCE\\x6C',
    818831                                                        'group'     => 'audio-video',
    819832                                                        'module'    => 'asf',
     
    832845                                // FLV  - audio/video - FLash Video
    833846                                'flv' => array(
    834                                                         'pattern'   => '^FLV\x01',
     847                                                        'pattern'   => '^FLV[\\x01]',
    835848                                                        'group'     => 'audio-video',
    836849                                                        'module'    => 'flv',
     
    840853                                // MKAV - audio/video - Mastroka
    841854                                'matroska' => array(
    842                                                         'pattern'   => '^\x1A\x45\xDF\xA3',
     855                                                        'pattern'   => '^\\x1A\\x45\\xDF\\xA3',
    843856                                                        'group'     => 'audio-video',
    844857                                                        'module'    => 'matroska',
     
    848861                                // MPEG - audio/video - MPEG (Moving Pictures Experts Group)
    849862                                'mpeg' => array(
    850                                                         'pattern'   => '^\x00\x00\x01(\xBA|\xB3)',
     863                                                        'pattern'   => '^\\x00\\x00\\x01[\\xB3\\xBA]',
    851864                                                        'group'     => 'audio-video',
    852865                                                        'module'    => 'mpeg',
     
    891904                                // Real - audio/video - RealAudio, RealVideo
    892905                                'real' => array(
    893                                                         'pattern'   => '^(\\.RMF|\\.ra)',
     906                                                        'pattern'   => '^\\.(RMF|ra)',
    894907                                                        'group'     => 'audio-video',
    895908                                                        'module'    => 'real',
     
    907920                                // TS - audio/video - MPEG-2 Transport Stream
    908921                                'ts' => array(
    909                                                         'pattern'   => '^(\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 "G".  Check for at least 10 packets matching this pattern
     922                                                        'pattern'   => '^(\\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 "G".  Check for at least 10 packets matching this pattern
    910923                                                        'group'     => 'audio-video',
    911924                                                        'module'    => 'ts',
     
    938951                                // JPEG - still image - Joint Photographic Experts Group (JPEG)
    939952                                'jpg'  => array(
    940                                                         'pattern'   => '^\xFF\xD8\xFF',
     953                                                        'pattern'   => '^\\xFF\\xD8\\xFF',
    941954                                                        'group'     => 'graphic',
    942955                                                        'module'    => 'jpg',
     
    948961                                // PCD  - still image - Kodak Photo CD
    949962                                'pcd'  => array(
    950                                                         'pattern'   => '^.{2048}PCD_IPI\x00',
     963                                                        'pattern'   => '^.{2048}PCD_IPI\\x00',
    951964                                                        'group'     => 'graphic',
    952965                                                        'module'    => 'pcd',
     
    959972                                // PNG  - still image - Portable Network Graphics (PNG)
    960973                                'png'  => array(
    961                                                         'pattern'   => '^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A',
     974                                                        'pattern'   => '^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A',
    962975                                                        'group'     => 'graphic',
    963976                                                        'module'    => 'png',
     
    970983                                // SVG  - still image - Scalable Vector Graphics (SVG)
    971984                                'svg'  => array(
    972                                                         'pattern'   => '(<!DOCTYPE svg PUBLIC |xmlns="http:\/\/www\.w3\.org\/2000\/svg")',
     985                                                        'pattern'   => '(<!DOCTYPE svg PUBLIC |xmlns="http://www\\.w3\\.org/2000/svg")',
    973986                                                        'group'     => 'graphic',
    974987                                                        'module'    => 'svg',
     
    981994                                // TIFF - still image - Tagged Information File Format (TIFF)
    982995                                'tiff' => array(
    983                                                         'pattern'   => '^(II\x2A\x00|MM\x00\x2A)',
     996                                                        'pattern'   => '^(II\\x2A\\x00|MM\\x00\\x2A)',
    984997                                                        'group'     => 'graphic',
    985998                                                        'module'    => 'tiff',
     
    9921005                                // EFAX - still image - eFax (TIFF derivative)
    9931006                                'efax'  => array(
    994                                                         'pattern'   => '^\xDC\xFE',
     1007                                                        'pattern'   => '^\\xDC\\xFE',
    9951008                                                        'group'     => 'graphic',
    9961009                                                        'module'    => 'efax',
     
    10161029                                // RAR  - data        - RAR compressed data
    10171030                                'rar'  => array(
    1018                                                         'pattern'   => '^Rar\!',
     1031                                                        'pattern'   => '^Rar\\!',
    10191032                                                        'group'     => 'archive',
    10201033                                                        'module'    => 'rar',
     
    10261039                                // SZIP - audio/data  - SZIP compressed data
    10271040                                'szip' => array(
    1028                                                         'pattern'   => '^SZ\x0A\x04',
     1041                                                        'pattern'   => '^SZ\\x0A\\x04',
    10291042                                                        'group'     => 'archive',
    10301043                                                        'module'    => 'szip',
     
    10361049                                // TAR  - data        - TAR compressed data
    10371050                                'tar'  => array(
    1038                                                         'pattern'   => '^.{100}[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20\x00]{12}[0-9\x20\x00]{12}',
     1051                                                        'pattern'   => '^.{100}[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20]{7}\\x00[0-9\\x20\\x00]{12}[0-9\\x20\\x00]{12}',
    10391052                                                        'group'     => 'archive',
    10401053                                                        'module'    => 'tar',
     
    10461059                                // GZIP  - data        - GZIP compressed data
    10471060                                'gz'  => array(
    1048                                                         'pattern'   => '^\x1F\x8B\x08',
     1061                                                        'pattern'   => '^\\x1F\\x8B\\x08',
    10491062                                                        'group'     => 'archive',
    10501063                                                        'module'    => 'gzip',
     
    10561069                                // ZIP  - data         - ZIP compressed data
    10571070                                'zip'  => array(
    1058                                                         'pattern'   => '^PK\x03\x04',
     1071                                                        'pattern'   => '^PK\\x03\\x04',
    10591072                                                        'group'     => 'archive',
    10601073                                                        'module'    => 'zip',
     
    10691082                                // PAR2 - data        - Parity Volume Set Specification 2.0
    10701083                                'par2' => array (
    1071                                                         'pattern'   => '^PAR2\x00PKT',
     1084                                                        'pattern'   => '^PAR2\\x00PKT',
    10721085                                                        'group'     => 'misc',
    10731086                                                        'module'    => 'par2',
     
    10791092                                // PDF  - data        - Portable Document Format
    10801093                                'pdf'  => array(
    1081                                                         'pattern'   => '^\x25PDF',
     1094                                                        'pattern'   => '^\\x25PDF',
    10821095                                                        'group'     => 'misc',
    10831096                                                        'module'    => 'pdf',
     
    10891102                                // MSOFFICE  - data   - ZIP compressed data
    10901103                                'msoffice' => array(
    1091                                                         'pattern'   => '^\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1', // D0CF11E == DOCFILE == Microsoft Office Document
     1104                                                        'pattern'   => '^\\xD0\\xCF\\x11\\xE0\\xA1\\xB1\\x1A\\xE1', // D0CF11E == DOCFILE == Microsoft Office Document
    10921105                                                        'group'     => 'misc',
    10931106                                                        'module'    => 'msoffice',
     
    11301143
    11311144
    1132                 if (preg_match('#\.mp[123a]$#i', $filename)) {
     1145                if (preg_match('#\\.mp[123a]$#i', $filename)) {
    11331146                        // Too many mp3 encoders on the market put gabage in front of mpeg files
    11341147                        // use assume format on these if format detection failed
     
    11371150                        $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php';
    11381151                        return $info;
    1139                 } elseif (preg_match('/\.cue$/i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) {
     1152                } elseif (preg_match('#\\.cue$#i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) {
    11401153                        // there's not really a useful consistent "magic" at the beginning of .cue files to identify them
    11411154                        // so until I think of something better, just go by filename if all other format checks fail
     
    12381251                                }
    12391252
     1253                                $this->CharConvert($this->info['tags'][$tag_name], $this->info[$comment_name]['encoding']);           // only copy gets converted!
     1254
    12401255                                if ($this->option_tags_html) {
    12411256                                        foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {
    1242                                                 $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $encoding);
     1257                                                $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $this->info[$comment_name]['encoding']);
    12431258                                        }
    12441259                                }
    12451260
    1246                                 // ID3v1 encoding detection hack start
    1247                                 // ID3v1 is defined as always using ISO-8859-1 encoding, but it is not uncommon to find files tagged with ID3v1 using Windows-1251 or other character sets
    1248                                 // Since ID3v1 has no concept of character sets there is no certain way to know we have the correct non-ISO-8859-1 character set, but we can guess
    1249                                 if ($comment_name == 'id3v1') {
    1250                                         if ($encoding == 'ISO-8859-1') {
    1251                                                 if (function_exists('iconv')) {
    1252                                                         foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) {
    1253                                                                 foreach ($valuearray as $key => $value) {
    1254                                                                         if (preg_match('#^[\\x80-\\xFF]+$#', $value)) {
    1255                                                                                 foreach (array('windows-1251', 'KOI8-R') as $id3v1_bad_encoding) {
    1256                                                                                         if (@iconv($id3v1_bad_encoding, $id3v1_bad_encoding, $value) === $value) {
    1257                                                                                                 $encoding = $id3v1_bad_encoding;
    1258                                                                                                 break 3;
    1259                                                                                         }
    1260                                                                                 }
    1261                                                                         }
    1262                                                                 }
    1263                                                         }
    1264                                                 }
    1265                                         }
    1266                                 }
    1267                                 // ID3v1 encoding detection hack end
    1268 
    1269                                 $this->CharConvert($this->info['tags'][$tag_name], $encoding);           // only copy gets converted!
    12701261                        }
    12711262
     
    17001691                        throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10);
    17011692                }
    1702                 return fread($this->getid3->fp, $bytes);
     1693
     1694                //return fread($this->getid3->fp, $bytes);
     1695                /*
     1696                * http://www.getid3.org/phpBB3/viewtopic.php?t=1930
     1697                * "I found out that the root cause for the problem was how getID3 uses the PHP system function fread().
     1698                * It seems to assume that fread() would always return as many bytes as were requested.
     1699                * However, according the PHP manual (http://php.net/manual/en/function.fread.php), this is the case only with regular local files, but not e.g. with Linux pipes.
     1700                * The call may return only part of the requested data and a new call is needed to get more."
     1701                */
     1702                $contents = '';
     1703                do {
     1704                        $part = fread($this->getid3->fp, $bytes);
     1705                        $partLength  = strlen($part);
     1706                        $bytes      -= $partLength;
     1707                        $contents   .= $part;
     1708                } while (($bytes > 0) && ($partLength > 0));
     1709                return $contents;
    17031710        }
    17041711
  • _plugins_/getID3/trunk/getid3/module.audio-video.asf.php

    r92618 r103224  
    350350
    351351                                                        if (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) {
    352                                                                 $info['warning'][] = '[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-seperated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"';
     352                                                                $info['warning'][] = '[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-separated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"';
    353353                                                        } else {
    354354
  • _plugins_/getID3/trunk/getid3/module.audio-video.matroska.php

    r92618 r103224  
    567567                                                                                                                break;
    568568                                                                                        }
    569 
    570                                                                                         if ($seek_entry['target_id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required
     569                                                                                        if (!isset($seek_entry['target_id'])) {
     570                                                                                                $this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']);
     571                                                                                                break;
     572                                                                                        }
     573                                                                                        if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !self::$hide_clusters) { // collect clusters only if required
    571574                                                                                                $info['matroska']['seek'][] = $seek_entry;
    572575                                                                                        }
  • _plugins_/getID3/trunk/getid3/module.audio-video.quicktime.php

    r96419 r103224  
    3636                $offset      = 0;
    3737                $atomcounter = 0;
    38                 $atom_data_read_buffer_size = ($info['php_memory_limit'] ? round($info['php_memory_limit'] / 2) : $this->getid3->option_fread_buffer_size * 1024); // allow [default: 32MB] if PHP configured with no memory_limit
     38                $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]
    3939                while ($offset < $info['avdataend']) {
    4040                        if (!getid3_lib::intValueSupported($offset)) {
     
    174174                        }
    175175                }
    176                 if (($info['audio']['dataformat'] == 'mp4') && empty($info['video']['resolution_x'])) {
     176                if ($info['audio']['dataformat'] == 'mp4') {
    177177                        $info['fileformat'] = 'mp4';
    178                         $info['mime_type']  = 'audio/mp4';
    179                         unset($info['video']['dataformat']);
     178                        if (empty($info['video']['resolution_x'])) {
     179                                $info['mime_type']  = 'audio/mp4';
     180                                unset($info['video']['dataformat']);
     181                        } else {
     182                                $info['mime_type']  = 'video/mp4';
     183                        }
    180184                }
    181185
  • _plugins_/getID3/trunk/getid3/module.audio.dss.php

    r92618 r103224  
    2525                $DSSheader  = $this->fread(1540);
    2626
    27                 if (!preg_match('#^(\x02|\x03)ds[s2]#', $DSSheader)) {
    28                         $info['error'][] = 'Expecting "[02-03] 64 73 [73|32]" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes(substr($DSSheader, 0, 4)).'"';
     27                if (!preg_match('#^[\\x02-\\x06]ds[s2]#', $DSSheader)) {
     28                        $info['error'][] = 'Expecting "[02-06] 64 73 [73|32]" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes(substr($DSSheader, 0, 4)).'"';
    2929                        return false;
    3030                }
     
    3939                $info['audio']['bitrate_mode'] = 'cbr';
    4040
    41                 $info['dss']['version']           =                            ord(substr($DSSheader,    0,   1));
    42                 $info['dss']['hardware']          =                           trim(substr($DSSheader,   12,  16)); // identification string for hardware used to create the file, e.g. "DPM 9600", "DS2400"
    43                 $info['dss']['unknown1']          =   getid3_lib::LittleEndian2Int(substr($DSSheader,   28,   4));
     41                $info['dss']['version']            =                            ord(substr($DSSheader,    0,   1));
     42                $info['dss']['hardware']           =                           trim(substr($DSSheader,   12,  16)); // identification string for hardware used to create the file, e.g. "DPM 9600", "DS2400"
     43                $info['dss']['unknown1']           =   getid3_lib::LittleEndian2Int(substr($DSSheader,   28,   4));
    4444                // 32-37 = "FE FF FE FF F7 FF" in all the sample files I've seen
    45                 $info['dss']['date_create']       = $this->DSSdateStringToUnixDate(substr($DSSheader,   38,  12));
    46                 $info['dss']['date_complete']     = $this->DSSdateStringToUnixDate(substr($DSSheader,   50,  12));
    47                 $info['dss']['playtime_sec']      = intval((substr($DSSheader,  62, 2) * 3600) + (substr($DSSheader,  64, 2) * 60) + substr($DSSheader,  66, 2)); // approximate file playtime in HHMMSS
    48                 $info['dss']['playtime_ms']       =   getid3_lib::LittleEndian2Int(substr($DSSheader,  512,   4)); // exact file playtime in milliseconds. Has also been observed at offset 530 in one sample file, with something else (unknown) at offset 512
    49                 $info['dss']['priority']          =                            ord(substr($DSSheader,  793,   1));
    50                 $info['dss']['comments']          =                           trim(substr($DSSheader,  798, 100));
    51                 $info['dss']['sample_rate_index'] =                            ord(substr($DSSheader, 1538,   1));  // this isn't certain, this may or may not be where the sample rate info is stored, but it seems consistent on my small selection of sample files
     45                $info['dss']['date_create_unix']   = $this->DSSdateStringToUnixDate(substr($DSSheader,   38,  12));
     46                $info['dss']['date_complete_unix'] = $this->DSSdateStringToUnixDate(substr($DSSheader,   50,  12));
     47                $info['dss']['playtime_sec']       = intval((substr($DSSheader,  62, 2) * 3600) + (substr($DSSheader,  64, 2) * 60) + substr($DSSheader,  66, 2)); // approximate file playtime in HHMMSS
     48                if ($info['dss']['version'] <= 3) {
     49                        $info['dss']['playtime_ms']        =   getid3_lib::LittleEndian2Int(substr($DSSheader,  512,   4)); // exact file playtime in milliseconds. Has also been observed at offset 530 in one sample file, with something else (unknown) at offset 512
     50                        $info['dss']['priority']           =                            ord(substr($DSSheader,  793,   1));
     51                        $info['dss']['comments']           =                           trim(substr($DSSheader,  798, 100));
     52                        $info['dss']['sample_rate_index']  =                            ord(substr($DSSheader, 1538,   1));  // this isn't certain, this may or may not be where the sample rate info is stored, but it seems consistent on my small selection of sample files
     53                        $info['audio']['sample_rate']      = $this->DSSsampleRateLookup($info['dss']['sample_rate_index']);
     54                } else {
     55                        $this->getid3->warning('DSS above version 3 not fully supported in this version of getID3. Any additional documentation or format specifications would be welcome. This file is version '.$info['dss']['version']);
     56                }
    5257
    5358                $info['audio']['bits_per_sample']  = 16; // maybe, maybe not -- most compressed audio formats don't have a fixed bits-per-sample value, but this is a reasonable approximation
    54                 $info['audio']['sample_rate']      = $this->DSSsampleRateLookup($info['dss']['sample_rate_index']);
    5559                $info['audio']['channels']         = 1;
    5660
    57                 $info['playtime_seconds'] = $info['dss']['playtime_ms'] / 1000;
    58                 if (floor($info['dss']['playtime_ms'] / 1000) != $info['dss']['playtime_sec']) {
    59                         // *should* just be playtime_ms / 1000 but at least one sample file has playtime_ms at offset 530 instead of offset 512, so safety check
     61                if (!empty($info['dss']['playtime_ms']) && (floor($info['dss']['playtime_ms'] / 1000) == $info['dss']['playtime_sec'])) { // *should* just be playtime_ms / 1000 but at least one sample file has playtime_ms at offset 530 instead of offset 512, so safety check
     62                        $info['playtime_seconds'] = $info['dss']['playtime_ms'] / 1000;
     63                } else {
    6064                        $info['playtime_seconds'] = $info['dss']['playtime_sec'];
    61                         $this->getid3->warning('playtime_ms ('.number_format($info['dss']['playtime_ms'] / 1000, 3).') does not match playtime_sec ('.number_format($info['dss']['playtime_sec']).') - using playtime_sec value');
     65                        if (!empty($info['dss']['playtime_ms'])) {
     66                                $this->getid3->warning('playtime_ms ('.number_format($info['dss']['playtime_ms'] / 1000, 3).') does not match playtime_sec ('.number_format($info['dss']['playtime_sec']).') - using playtime_sec value');
     67                        }
    6268                }
    6369                $info['audio']['bitrate'] = ($info['filesize'] * 8) / $info['playtime_seconds'];
     
    8591                );
    8692                if (!array_key_exists($sample_rate_index, $dssSampleRateLookup)) {
    87                         $this->getid3->warning('unknown sample_rate_index: '.$sample_rate_index);
     93                        $this->getid3->warning('unknown sample_rate_index: 0x'.strtoupper(dechex($sample_rate_index)));
    8894                        return false;
    8995                }
  • _plugins_/getID3/trunk/getid3/module.graphic.jpg.php

    r92618 r103224  
    6969//$info['warning'][] = 'known issue: https://bugs.php.net/bug.php?id=62523';
    7070//return false;
     71                                                        set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
     72                                                                if (!(error_reporting() & $errno)) {
     73                                                                        // error is not specified in the error_reporting setting, so we ignore it
     74                                                                        return false;
     75                                                                }
     76
     77                                                                $errcontext['info']['warning'][] = 'Error parsing EXIF data ('.$errstr.')';
     78                                                        });
     79
    7180                                                        $info['jpg']['exif'] = exif_read_data($info['filenamepath'], null, true, false);
     81
     82                                                        restore_error_handler();
    7283                                                } else {
    7384                                                        $info['warning'][] = 'exif_read_data() cannot parse non-EXIF data in APP1 (expected "Exif", found "'.substr($imageinfo['APP1'], 0, 4).'")';
  • _plugins_/getID3/trunk/getid3/module.tag.apetag.php

    r92618 r103224  
    120120                        $offset += 4;
    121121                        if (strstr(substr($APEtagData, $offset), "\x00") === false) {
    122                                 $info['error'][] = 'Cannot find null-byte (0x00) seperator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset);
     122                                $info['error'][] = 'Cannot find null-byte (0x00) separator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset);
    123123                                return false;
    124124                        }
  • _plugins_/getID3/trunk/getid3/module.tag.id3v1.php

    r92618 r103224  
    6161                                $ParsedID3v1['comments'][$key][0] = $value;
    6262                        }
     63                        // ID3v1 encoding detection hack START
     64                        // ID3v1 is defined as always using ISO-8859-1 encoding, but it is not uncommon to find files tagged with ID3v1 using Windows-1251 or other character sets
     65                        // Since ID3v1 has no concept of character sets there is no certain way to know we have the correct non-ISO-8859-1 character set, but we can guess
     66                        $ID3v1encoding = 'ISO-8859-1';
     67                        foreach ($ParsedID3v1['comments'] as $tag_key => $valuearray) {
     68                                foreach ($valuearray as $key => $value) {
     69                                        if (preg_match('#^[\\x00-\\x40\\xA8\\B8\\x80-\\xFF]+$#', $value)) {
     70                                                foreach (array('Windows-1251', 'KOI8-R') as $id3v1_bad_encoding) {
     71                                                        if (function_exists('mb_convert_encoding') && @mb_convert_encoding($value, $id3v1_bad_encoding, $id3v1_bad_encoding) === $value) {
     72                                                                $ID3v1encoding = $id3v1_bad_encoding;
     73                                                                break 3;
     74                                                        } elseif (function_exists('iconv') && @iconv($id3v1_bad_encoding, $id3v1_bad_encoding, $value) === $value) {
     75                                                                $ID3v1encoding = $id3v1_bad_encoding;
     76                                                                break 3;
     77                                                        }
     78                                                }
     79                                        }
     80                                }
     81                        }
     82                        // ID3v1 encoding detection hack END
    6383
    6484                        // ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces
     
    81101
    82102                        $info['id3v1'] = $ParsedID3v1;
     103                        $info['id3v1']['encoding'] = $ID3v1encoding;
    83104                }
    84105
  • _plugins_/getID3/trunk/getid3/module.tag.id3v2.php

    r96419 r103224  
    330330                                }
    331331
    332                                 if ($frame_name == 'COM ') {
    333                                         $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably others too)]';
    334                                         $frame_name = 'COMM';
     332                                if ($iTunesBrokenFrameNameFixed = self::ID3v22iTunesBrokenFrameName($frame_name)) {
     333                                        $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1", "v7.0.0.70" are known-guilty, probably others too)]. Translated frame name from "'.str_replace("\x00", ' ', $frame_name).'" to "'.$iTunesBrokenFrameNameFixed.'" for parsing.';
     334                                        $frame_name = $iTunesBrokenFrameNameFixed;
    335335                                }
    336336                                if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) {
     
    505505                // ID3v2.4.x: '21' $00 'Eurodisco' $00
    506506                $clean_genres = array();
     507
     508                // hack-fixes for some badly-written ID3v2.3 taggers, while trying not to break correctly-written tags
     509                if (($this->getid3->info['id3v2']['majorversion'] == 3) && !preg_match('#[\x00]#', $genrestring)) {
     510                        // note: MusicBrainz Picard incorrectly stores plaintext genres separated by "/" when writing in ID3v2.3 mode, hack-fix here:
     511                        // replace / with NULL, then replace back the two ID3v1 genres that legitimately have "/" as part of the single genre name
     512                        if (preg_match('#/#', $genrestring)) {
     513                                $genrestring = str_replace('/', "\x00", $genrestring);
     514                                $genrestring = str_replace('Pop'."\x00".'Funk', 'Pop/Funk', $genrestring);
     515                                $genrestring = str_replace('Rock'."\x00".'Rock', 'Folk/Rock', $genrestring);
     516                        }
     517
     518                        // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
     519                        if (preg_match('#;#', $genrestring)) {
     520                                $genrestring = str_replace(';', "\x00", $genrestring);
     521                        }
     522                }
     523
     524
    507525                if (strpos($genrestring, "\x00") === false) {
    508526                        $genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring);
    509527                }
    510 
    511                 // note: MusicBrainz Picard incorrectly stores plaintext genres separated by "/" when writing in ID3v2.3 mode, hack-fix here:
    512                 // replace / with NULL, then replace back the two ID3v1 genres that legitimately have "/" as part of the single genre name
    513                 $genrestring = str_replace('/', "\x00", $genrestring);
    514                 $genrestring = str_replace('Pop'."\x00".'Funk', 'Pop/Funk', $genrestring);
    515                 $genrestring = str_replace('Rock'."\x00".'Rock', 'Folk/Rock', $genrestring);
    516 
    517                 // some other taggers separate multiple genres with semicolon, e.g. "Heavy Metal;Thrash Metal;Metal"
    518                 $genrestring = str_replace(';', "\x00", $genrestring);
    519528
    520529                $genre_elements = explode("\x00", $genrestring);
     
    17451754
    17461755                        $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8);
    1747                         if (!$this->IsValidDateStampString($parsedFrame['purchasedate'])) {
     1756                        if ($this->IsValidDateStampString($parsedFrame['purchasedate'])) {
    17481757                                $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4));
    17491758                        }
     
    36453654        }
    36463655
     3656        public static function ID3v22iTunesBrokenFrameName($frame_name) {
     3657                // iTunes (multiple versions) has been known to write ID3v2.3 style frames
     3658                // but use ID3v2.2 frame names, right-padded using either [space] or [null]
     3659                // to make them fit in the 4-byte frame name space of the ID3v2.3 frame.
     3660                // This function will detect and translate the corrupt frame name into ID3v2.3 standard.
     3661                static $ID3v22_iTunes_BrokenFrames = array(
     3662                        'BUF' => 'RBUF', // Recommended buffer size
     3663                        'CNT' => 'PCNT', // Play counter
     3664                        'COM' => 'COMM', // Comments
     3665                        'CRA' => 'AENC', // Audio encryption
     3666                        'EQU' => 'EQUA', // Equalisation
     3667                        'ETC' => 'ETCO', // Event timing codes
     3668                        'GEO' => 'GEOB', // General encapsulated object
     3669                        'IPL' => 'IPLS', // Involved people list
     3670                        'LNK' => 'LINK', // Linked information
     3671                        'MCI' => 'MCDI', // Music CD identifier
     3672                        'MLL' => 'MLLT', // MPEG location lookup table
     3673                        'PIC' => 'APIC', // Attached picture
     3674                        'POP' => 'POPM', // Popularimeter
     3675                        'REV' => 'RVRB', // Reverb
     3676                        'RVA' => 'RVAD', // Relative volume adjustment
     3677                        'SLT' => 'SYLT', // Synchronised lyric/text
     3678                        'STC' => 'SYTC', // Synchronised tempo codes
     3679                        'TAL' => 'TALB', // Album/Movie/Show title
     3680                        'TBP' => 'TBPM', // BPM (beats per minute)
     3681                        'TCM' => 'TCOM', // Composer
     3682                        'TCO' => 'TCON', // Content type
     3683                        'TCP' => 'TCMP', // Part of a compilation
     3684                        'TCR' => 'TCOP', // Copyright message
     3685                        'TDA' => 'TDAT', // Date
     3686                        'TDY' => 'TDLY', // Playlist delay
     3687                        'TEN' => 'TENC', // Encoded by
     3688                        'TFT' => 'TFLT', // File type
     3689                        'TIM' => 'TIME', // Time
     3690                        'TKE' => 'TKEY', // Initial key
     3691                        'TLA' => 'TLAN', // Language(s)
     3692                        'TLE' => 'TLEN', // Length
     3693                        'TMT' => 'TMED', // Media type
     3694                        'TOA' => 'TOPE', // Original artist(s)/performer(s)
     3695                        'TOF' => 'TOFN', // Original filename
     3696                        'TOL' => 'TOLY', // Original lyricist(s)/text writer(s)
     3697                        'TOR' => 'TORY', // Original release year
     3698                        'TOT' => 'TOAL', // Original album/movie/show title
     3699                        'TP1' => 'TPE1', // Lead performer(s)/Soloist(s)
     3700                        'TP2' => 'TPE2', // Band/orchestra/accompaniment
     3701                        'TP3' => 'TPE3', // Conductor/performer refinement
     3702                        'TP4' => 'TPE4', // Interpreted, remixed, or otherwise modified by
     3703                        'TPA' => 'TPOS', // Part of a set
     3704                        'TPB' => 'TPUB', // Publisher
     3705                        'TRC' => 'TSRC', // ISRC (international standard recording code)
     3706                        'TRD' => 'TRDA', // Recording dates
     3707                        'TRK' => 'TRCK', // Track number/Position in set
     3708                        'TS2' => 'TSO2', // Album-Artist sort order
     3709                        'TSA' => 'TSOA', // Album sort order
     3710                        'TSC' => 'TSOC', // Composer sort order
     3711                        'TSI' => 'TSIZ', // Size
     3712                        'TSP' => 'TSOP', // Performer sort order
     3713                        'TSS' => 'TSSE', // Software/Hardware and settings used for encoding
     3714                        'TST' => 'TSOT', // Title sort order
     3715                        'TT1' => 'TIT1', // Content group description
     3716                        'TT2' => 'TIT2', // Title/songname/content description
     3717                        'TT3' => 'TIT3', // Subtitle/Description refinement
     3718                        'TXT' => 'TEXT', // Lyricist/Text writer
     3719                        'TXX' => 'TXXX', // User defined text information frame
     3720                        'TYE' => 'TYER', // Year
     3721                        'UFI' => 'UFID', // Unique file identifier
     3722                        'ULT' => 'USLT', // Unsynchronised lyric/text transcription
     3723                        'WAF' => 'WOAF', // Official audio file webpage
     3724                        'WAR' => 'WOAR', // Official artist/performer webpage
     3725                        'WAS' => 'WOAS', // Official audio source webpage
     3726                        'WCM' => 'WCOM', // Commercial information
     3727                        'WCP' => 'WCOP', // Copyright/Legal information
     3728                        'WPB' => 'WPUB', // Publishers official webpage
     3729                        'WXX' => 'WXXX', // User defined URL link frame
     3730                );
     3731                if (strlen($frame_name) == 4) {
     3732                        if ((substr($frame_name, 3, 1) == ' ') || (substr($frame_name, 3, 1) == "\x00")) {
     3733                                if (isset($ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)])) {
     3734                                        return $ID3v22_iTunes_BrokenFrames[substr($frame_name, 0, 3)];
     3735                                }
     3736                        }
     3737                }
     3738                return false;
     3739        }
     3740
    36473741}
    36483742
  • _plugins_/getID3/trunk/getid3/write.id3v2.php

    r96419 r103224  
    816816                                        if (!$this->IsWithinBitRange($source_data_array['rating'], 8, false)) {
    817817                                                $this->errors[] = 'Invalid Rating byte in '.$frame_name.' ('.$source_data_array['rating'].') (range = 0 to 255)';
    818                                         } elseif (!IsValidEmail($source_data_array['email'])) {
     818                                        } elseif (!$this->IsValidEmail($source_data_array['email'])) {
    819819                                                $this->errors[] = 'Invalid Email in '.$frame_name.' ('.$source_data_array['email'].')';
    820820                                        } else {
     
    11841184                        return true;
    11851185                }
    1186 
    11871186                if ($this->majorversion == 4) {
    11881187                        switch ($frame_name) {
     
    17451744        }
    17461745
    1747         public function ID3v2IsValidRGADname($RGADname) {
     1746        public static function ID3v2IsValidRGADname($RGADname) {
    17481747                if (($RGADname >= 0) && ($RGADname <= 2)) {
    17491748                        return true;
     
    17521751        }
    17531752
    1754         public function ID3v2IsValidRGADoriginator($RGADoriginator) {
     1753        public static function ID3v2IsValidRGADoriginator($RGADoriginator) {
    17551754                if (($RGADoriginator >= 0) && ($RGADoriginator <= 3)) {
    17561755                        return true;
     
    17721771        }
    17731772
    1774         public function Unsynchronise($data) {
     1773        public static function Unsynchronise($data) {
    17751774                // Whenever a false synchronisation is found within the tag, one zeroed
    17761775                // byte is inserted after the first false synchronisation byte. The
     
    18411840        }
    18421841
    1843         public function IsValidMIMEstring($mimestring) {
    1844                 if ((strlen($mimestring) >= 3) && (strpos($mimestring, '/') > 0) && (strpos($mimestring, '/') < (strlen($mimestring) - 1))) {
    1845                         return true;
    1846                 }
    1847                 return false;
    1848         }
    1849 
    1850         public function IsWithinBitRange($number, $maxbits, $signed=false) {
     1842        public static function IsValidMIMEstring($mimestring) {
     1843                return preg_match('#^.+/.+$#', $mimestring);
     1844        }
     1845
     1846        public static function IsWithinBitRange($number, $maxbits, $signed=false) {
    18511847                if ($signed) {
    18521848                        if (($number > (0 - pow(2, $maxbits - 1))) && ($number <= pow(2, $maxbits - 1))) {
     
    18611857        }
    18621858
    1863         public function safe_parse_url($url) {
    1864                 $parts = @parse_url($url);
    1865                 $parts['scheme'] = (isset($parts['scheme']) ? $parts['scheme'] : '');
    1866                 $parts['host']   = (isset($parts['host'])   ? $parts['host']   : '');
    1867                 $parts['user']   = (isset($parts['user'])   ? $parts['user']   : '');
    1868                 $parts['pass']   = (isset($parts['pass'])   ? $parts['pass']   : '');
    1869                 $parts['path']   = (isset($parts['path'])   ? $parts['path']   : '');
    1870                 $parts['query']  = (isset($parts['query'])  ? $parts['query']  : '');
    1871                 return $parts;
    1872         }
    1873 
    1874         public function IsValidURL($url, $allowUserPass=false) {
     1859        public static function IsValidEmail($email) {
     1860                if (function_exists('filter_var')) {
     1861                        return filter_var($email, FILTER_VALIDATE_EMAIL);
     1862                }
     1863                // VERY crude email validation
     1864                return preg_match('#^[^ ]+@[a-z\\-\\.]+\\.[a-z]{2,}$#', $email);
     1865        }
     1866
     1867        public static function IsValidURL($url, $allowUserPass=false) {
    18751868                if ($url == '') {
    18761869                        return false;
     
    18831876                        }
    18841877                }
     1878                // 2016-06-08: relax URL checking to avoid falsely rejecting valid URLs, leave URL validation to the user
     1879                // http://www.getid3.org/phpBB3/viewtopic.php?t=1926
     1880                return true;
     1881                /*
    18851882                if ($parts = $this->safe_parse_url($url)) {
    18861883                        if (($parts['scheme'] != 'http') && ($parts['scheme'] != 'https') && ($parts['scheme'] != 'ftp') && ($parts['scheme'] != 'gopher')) {
     
    19011898                }
    19021899                return false;
     1900                */
     1901        }
     1902
     1903        public static function safe_parse_url($url) {
     1904                $parts = @parse_url($url);
     1905                $parts['scheme'] = (isset($parts['scheme']) ? $parts['scheme'] : '');
     1906                $parts['host']   = (isset($parts['host'])   ? $parts['host']   : '');
     1907                $parts['user']   = (isset($parts['user'])   ? $parts['user']   : '');
     1908                $parts['pass']   = (isset($parts['pass'])   ? $parts['pass']   : '');
     1909                $parts['path']   = (isset($parts['path'])   ? $parts['path']   : '');
     1910                $parts['query']  = (isset($parts['query'])  ? $parts['query']  : '');
     1911                return $parts;
    19031912        }
    19041913
     
    19091918
    19101919                        // The following are unique to ID3v2.2
    1911                         $ID3v2ShortFrameNameLookup[2]['comment']                                          = 'COM';
    1912                         $ID3v2ShortFrameNameLookup[2]['album']                                            = 'TAL';
    1913                         $ID3v2ShortFrameNameLookup[2]['beats_per_minute']                                 = 'TBP';
    1914                         $ID3v2ShortFrameNameLookup[2]['bpm']                                              = 'TBP';
    1915                         $ID3v2ShortFrameNameLookup[2]['composer']                                         = 'TCM';
    1916                         $ID3v2ShortFrameNameLookup[2]['genre']                                            = 'TCO';
    1917                         $ID3v2ShortFrameNameLookup[2]['itunescompilation']                                = 'TCP';
    1918                         $ID3v2ShortFrameNameLookup[2]['copyright']                                        = 'TCR';
    1919                         $ID3v2ShortFrameNameLookup[2]['encoded_by']                                       = 'TEN';
    1920                         $ID3v2ShortFrameNameLookup[2]['language']                                         = 'TLA';
    1921                         $ID3v2ShortFrameNameLookup[2]['length']                                           = 'TLE';
    1922                         $ID3v2ShortFrameNameLookup[2]['original_artist']                                  = 'TOA';
    1923                         $ID3v2ShortFrameNameLookup[2]['original_filename']                                = 'TOF';
    1924                         $ID3v2ShortFrameNameLookup[2]['original_lyricist']                                = 'TOL';
    1925                         $ID3v2ShortFrameNameLookup[2]['original_album_title']                             = 'TOT';
    1926                         $ID3v2ShortFrameNameLookup[2]['artist']                                           = 'TP1';
    1927                         $ID3v2ShortFrameNameLookup[2]['band']                                             = 'TP2';
    1928                         $ID3v2ShortFrameNameLookup[2]['conductor']                                        = 'TP3';
    1929                         $ID3v2ShortFrameNameLookup[2]['remixer']                                          = 'TP4';
    1930                         $ID3v2ShortFrameNameLookup[2]['publisher']                                        = 'TPB';
    1931                         $ID3v2ShortFrameNameLookup[2]['isrc']                                             = 'TRC';
    1932                         $ID3v2ShortFrameNameLookup[2]['tracknumber']                                      = 'TRK';
    1933                         $ID3v2ShortFrameNameLookup[2]['track_number']                                     = 'TRK';
    1934                         $ID3v2ShortFrameNameLookup[2]['size']                                             = 'TSI';
    1935                         $ID3v2ShortFrameNameLookup[2]['encoder_settings']                                 = 'TSS';
    1936                         $ID3v2ShortFrameNameLookup[2]['description']                                      = 'TT1';
    1937                         $ID3v2ShortFrameNameLookup[2]['title']                                            = 'TT2';
    1938                         $ID3v2ShortFrameNameLookup[2]['subtitle']                                         = 'TT3';
    1939                         $ID3v2ShortFrameNameLookup[2]['lyricist']                                         = 'TXT';
    1940                         $ID3v2ShortFrameNameLookup[2]['user_text']                                        = 'TXX';
    1941                         $ID3v2ShortFrameNameLookup[2]['year']                                             = 'TYE';
    1942                         $ID3v2ShortFrameNameLookup[2]['unique_file_identifier']                           = 'UFI';
    1943                         $ID3v2ShortFrameNameLookup[2]['unsynchronised_lyrics']                            = 'ULT';
    1944                         $ID3v2ShortFrameNameLookup[2]['url_file']                                         = 'WAF';
    1945                         $ID3v2ShortFrameNameLookup[2]['url_artist']                                       = 'WAR';
    1946                         $ID3v2ShortFrameNameLookup[2]['url_source']                                       = 'WAS';
    1947                         $ID3v2ShortFrameNameLookup[2]['copyright_information']                            = 'WCP';
    1948                         $ID3v2ShortFrameNameLookup[2]['url_publisher']                                    = 'WPB';
    1949                         $ID3v2ShortFrameNameLookup[2]['url_user']                                         = 'WXX';
     1920                        $ID3v2ShortFrameNameLookup[2]['recommended_buffer_size']           = 'BUF';
     1921                        $ID3v2ShortFrameNameLookup[2]['comment']                           = 'COM';
     1922                        $ID3v2ShortFrameNameLookup[2]['audio_encryption']                  = 'CRA';
     1923                        $ID3v2ShortFrameNameLookup[2]['encrypted_meta_frame']              = 'CRM';
     1924                        $ID3v2ShortFrameNameLookup[2]['equalisation']                      = 'EQU';
     1925                        $ID3v2ShortFrameNameLookup[2]['event_timing_codes']                = 'ETC';
     1926                        $ID3v2ShortFrameNameLookup[2]['general_encapsulated_object']       = 'GEO';
     1927                        $ID3v2ShortFrameNameLookup[2]['involved_people_list']              = 'IPL';
     1928                        $ID3v2ShortFrameNameLookup[2]['linked_information']                = 'LNK';
     1929                        $ID3v2ShortFrameNameLookup[2]['music_cd_identifier']               = 'MCI';
     1930                        $ID3v2ShortFrameNameLookup[2]['mpeg_location_lookup_table']        = 'MLL';
     1931                        $ID3v2ShortFrameNameLookup[2]['attached_picture']                  = 'PIC';
     1932                        $ID3v2ShortFrameNameLookup[2]['popularimeter']                     = 'POP';
     1933                        $ID3v2ShortFrameNameLookup[2]['reverb']                            = 'REV';
     1934                        $ID3v2ShortFrameNameLookup[2]['relative_volume_adjustment']        = 'RVA';
     1935                        $ID3v2ShortFrameNameLookup[2]['synchronised_lyric']                = 'SLT';
     1936                        $ID3v2ShortFrameNameLookup[2]['synchronised_tempo_codes']          = 'STC';
     1937                        $ID3v2ShortFrameNameLookup[2]['album']                             = 'TAL';
     1938                        $ID3v2ShortFrameNameLookup[2]['beats_per_minute']                  = 'TBP';
     1939                        $ID3v2ShortFrameNameLookup[2]['bpm']                               = 'TBP';
     1940                        $ID3v2ShortFrameNameLookup[2]['composer']                          = 'TCM';
     1941                        $ID3v2ShortFrameNameLookup[2]['genre']                             = 'TCO';
     1942                        $ID3v2ShortFrameNameLookup[2]['part_of_a_compilation']             = 'TCP';
     1943                        $ID3v2ShortFrameNameLookup[2]['copyright_message']                 = 'TCR';
     1944                        $ID3v2ShortFrameNameLookup[2]['date']                              = 'TDA';
     1945                        $ID3v2ShortFrameNameLookup[2]['playlist_delay']                    = 'TDY';
     1946                        $ID3v2ShortFrameNameLookup[2]['encoded_by']                        = 'TEN';
     1947                        $ID3v2ShortFrameNameLookup[2]['file_type']                         = 'TFT';
     1948                        $ID3v2ShortFrameNameLookup[2]['time']                              = 'TIM';
     1949                        $ID3v2ShortFrameNameLookup[2]['initial_key']                       = 'TKE';
     1950                        $ID3v2ShortFrameNameLookup[2]['language']                          = 'TLA';
     1951                        $ID3v2ShortFrameNameLookup[2]['length']                            = 'TLE';
     1952                        $ID3v2ShortFrameNameLookup[2]['media_type']                        = 'TMT';
     1953                        $ID3v2ShortFrameNameLookup[2]['original_artist']                   = 'TOA';
     1954                        $ID3v2ShortFrameNameLookup[2]['original_filename']                 = 'TOF';
     1955                        $ID3v2ShortFrameNameLookup[2]['original_lyricist']                 = 'TOL';
     1956                        $ID3v2ShortFrameNameLookup[2]['original_year']                     = 'TOR';
     1957                        $ID3v2ShortFrameNameLookup[2]['original_album']                    = 'TOT';
     1958                        $ID3v2ShortFrameNameLookup[2]['artist']                            = 'TP1';
     1959                        $ID3v2ShortFrameNameLookup[2]['band']                              = 'TP2';
     1960                        $ID3v2ShortFrameNameLookup[2]['conductor']                         = 'TP3';
     1961                        $ID3v2ShortFrameNameLookup[2]['remixer']                           = 'TP4';
     1962                        $ID3v2ShortFrameNameLookup[2]['part_of_a_set']                     = 'TPA';
     1963                        $ID3v2ShortFrameNameLookup[2]['publisher']                         = 'TPB';
     1964                        $ID3v2ShortFrameNameLookup[2]['isrc']                              = 'TRC';
     1965                        $ID3v2ShortFrameNameLookup[2]['recording_dates']                   = 'TRD';
     1966                        $ID3v2ShortFrameNameLookup[2]['tracknumber']                       = 'TRK';
     1967                        $ID3v2ShortFrameNameLookup[2]['track_number']                      = 'TRK';
     1968                        $ID3v2ShortFrameNameLookup[2]['album_artist_sort_order']           = 'TS2';
     1969                        $ID3v2ShortFrameNameLookup[2]['album_sort_order']                  = 'TSA';
     1970                        $ID3v2ShortFrameNameLookup[2]['composer_sort_order']               = 'TSC';
     1971                        $ID3v2ShortFrameNameLookup[2]['size']                              = 'TSI';
     1972                        $ID3v2ShortFrameNameLookup[2]['performer_sort_order']              = 'TSP';
     1973                        $ID3v2ShortFrameNameLookup[2]['encoder_settings']                  = 'TSS';
     1974                        $ID3v2ShortFrameNameLookup[2]['title_sort_order']                  = 'TST';
     1975                        $ID3v2ShortFrameNameLookup[2]['content_group_description']         = 'TT1';
     1976                        $ID3v2ShortFrameNameLookup[2]['title']                             = 'TT2';
     1977                        $ID3v2ShortFrameNameLookup[2]['subtitle']                          = 'TT3';
     1978                        $ID3v2ShortFrameNameLookup[2]['lyricist']                          = 'TXT';
     1979                        $ID3v2ShortFrameNameLookup[2]['text']                              = 'TXX';
     1980                        $ID3v2ShortFrameNameLookup[2]['year']                              = 'TYE';
     1981                        $ID3v2ShortFrameNameLookup[2]['unique_file_identifier']            = 'UFI';
     1982                        $ID3v2ShortFrameNameLookup[2]['unsychronised_lyric']               = 'ULT';
     1983                        $ID3v2ShortFrameNameLookup[2]['url_file']                          = 'WAF';
     1984                        $ID3v2ShortFrameNameLookup[2]['url_artist']                        = 'WAR';
     1985                        $ID3v2ShortFrameNameLookup[2]['url_source']                        = 'WAS';
     1986                        $ID3v2ShortFrameNameLookup[2]['commercial_information']            = 'WCM';
     1987                        $ID3v2ShortFrameNameLookup[2]['copyright']                         = 'WCP';
     1988                        $ID3v2ShortFrameNameLookup[2]['url_publisher']                     = 'WPB';
     1989                        $ID3v2ShortFrameNameLookup[2]['url_user']                          = 'WXX';
    19501990
    19511991                        // The following are common to ID3v2.3 and ID3v2.4
    1952                         $ID3v2ShortFrameNameLookup[3]['audio_encryption']                                 = 'AENC';
    1953                         $ID3v2ShortFrameNameLookup[3]['attached_picture']                                 = 'APIC';
    1954                         $ID3v2ShortFrameNameLookup[3]['picture']                                          = 'APIC';
    1955                         $ID3v2ShortFrameNameLookup[3]['comment']                                          = 'COMM';
    1956                         $ID3v2ShortFrameNameLookup[3]['commercial']                                       = 'COMR';
    1957                         $ID3v2ShortFrameNameLookup[3]['encryption_method_registration']                   = 'ENCR';
    1958                         $ID3v2ShortFrameNameLookup[3]['event_timing_codes']                               = 'ETCO';
    1959                         $ID3v2ShortFrameNameLookup[3]['general_encapsulated_object']                      = 'GEOB';
    1960                         $ID3v2ShortFrameNameLookup[3]['group_identification_registration']                = 'GRID';
    1961                         $ID3v2ShortFrameNameLookup[3]['linked_information']                               = 'LINK';
    1962                         $ID3v2ShortFrameNameLookup[3]['music_cd_identifier']                              = 'MCDI';
    1963                         $ID3v2ShortFrameNameLookup[3]['mpeg_location_lookup_table']                       = 'MLLT';
    1964                         $ID3v2ShortFrameNameLookup[3]['ownership']                                        = 'OWNE';
    1965                         $ID3v2ShortFrameNameLookup[3]['play_counter']                                     = 'PCNT';
    1966                         $ID3v2ShortFrameNameLookup[3]['popularimeter']                                    = 'POPM';
    1967                         $ID3v2ShortFrameNameLookup[3]['position_synchronisation']                         = 'POSS';
    1968                         $ID3v2ShortFrameNameLookup[3]['private']                                          = 'PRIV';
    1969                         $ID3v2ShortFrameNameLookup[3]['recommended_buffer_size']                          = 'RBUF';
    1970                         $ID3v2ShortFrameNameLookup[3]['reverb']                                           = 'RVRB';
    1971                         $ID3v2ShortFrameNameLookup[3]['synchronised_lyrics']                              = 'SYLT';
    1972                         $ID3v2ShortFrameNameLookup[3]['synchronised_tempo_codes']                         = 'SYTC';
    1973                         $ID3v2ShortFrameNameLookup[3]['album']                                            = 'TALB';
    1974                         $ID3v2ShortFrameNameLookup[3]['beats_per_minute']                                 = 'TBPM';
    1975                         $ID3v2ShortFrameNameLookup[3]['bpm']                                              = 'TBPM';
    1976                         $ID3v2ShortFrameNameLookup[3]['itunescompilation']                                = 'TCMP';
    1977                         $ID3v2ShortFrameNameLookup[3]['composer']                                         = 'TCOM';
    1978                         $ID3v2ShortFrameNameLookup[3]['genre']                                            = 'TCON';
    1979                         $ID3v2ShortFrameNameLookup[3]['copyright']                                        = 'TCOP';
    1980                         $ID3v2ShortFrameNameLookup[3]['playlist_delay']                                   = 'TDLY';
    1981                         $ID3v2ShortFrameNameLookup[3]['encoded_by']                                       = 'TENC';
    1982                         $ID3v2ShortFrameNameLookup[3]['lyricist']                                         = 'TEXT';
    1983                         $ID3v2ShortFrameNameLookup[3]['file_type']                                        = 'TFLT';
    1984                         $ID3v2ShortFrameNameLookup[3]['content_group_description']                        = 'TIT1';
    1985                         $ID3v2ShortFrameNameLookup[3]['title']                                            = 'TIT2';
    1986                         $ID3v2ShortFrameNameLookup[3]['subtitle']                                         = 'TIT3';
    1987                         $ID3v2ShortFrameNameLookup[3]['initial_key']                                      = 'TKEY';
    1988                         $ID3v2ShortFrameNameLookup[3]['language']                                         = 'TLAN';
    1989                         $ID3v2ShortFrameNameLookup[3]['length']                                           = 'TLEN';
    1990                         $ID3v2ShortFrameNameLookup[3]['media_type']                                       = 'TMED';
    1991                         $ID3v2ShortFrameNameLookup[3]['original_album_title']                             = 'TOAL';
    1992                         $ID3v2ShortFrameNameLookup[3]['original_filename']                                = 'TOFN';
    1993                         $ID3v2ShortFrameNameLookup[3]['original_lyricist']                                = 'TOLY';
    1994                         $ID3v2ShortFrameNameLookup[3]['original_artist']                                  = 'TOPE';
    1995                         $ID3v2ShortFrameNameLookup[3]['file_owner']                                       = 'TOWN';
    1996                         $ID3v2ShortFrameNameLookup[3]['artist']                                           = 'TPE1';
    1997                         $ID3v2ShortFrameNameLookup[3]['band']                                             = 'TPE2';
    1998                         $ID3v2ShortFrameNameLookup[3]['conductor']                                        = 'TPE3';
    1999                         $ID3v2ShortFrameNameLookup[3]['remixer']                                          = 'TPE4';
    2000                         $ID3v2ShortFrameNameLookup[3]['part_of_a_set']                                    = 'TPOS';
    2001                         $ID3v2ShortFrameNameLookup[3]['publisher']                                        = 'TPUB';
    2002                         $ID3v2ShortFrameNameLookup[3]['tracknumber']                                      = 'TRCK';
    2003                         $ID3v2ShortFrameNameLookup[3]['track_number']                                     = 'TRCK';
    2004                         $ID3v2ShortFrameNameLookup[3]['internet_radio_station_name']                      = 'TRSN';
    2005                         $ID3v2ShortFrameNameLookup[3]['internet_radio_station_owner']                     = 'TRSO';
    2006                         $ID3v2ShortFrameNameLookup[3]['isrc']                                             = 'TSRC';
    2007                         $ID3v2ShortFrameNameLookup[3]['encoder_settings']                                 = 'TSSE';
    2008                         $ID3v2ShortFrameNameLookup[3]['user_text']                                        = 'TXXX';
    2009                         $ID3v2ShortFrameNameLookup[3]['unique_file_identifier']                           = 'UFID';
    2010                         $ID3v2ShortFrameNameLookup[3]['terms_of_use']                                     = 'USER';
    2011                         $ID3v2ShortFrameNameLookup[3]['unsynchronised_lyrics']                            = 'USLT';
    2012                         $ID3v2ShortFrameNameLookup[3]['commercial']                                       = 'WCOM';
    2013                         $ID3v2ShortFrameNameLookup[3]['copyright_information']                            = 'WCOP';
    2014                         $ID3v2ShortFrameNameLookup[3]['url_file']                                         = 'WOAF';
    2015                         $ID3v2ShortFrameNameLookup[3]['url_artist']                                       = 'WOAR';
    2016                         $ID3v2ShortFrameNameLookup[3]['url_source']                                       = 'WOAS';
    2017                         $ID3v2ShortFrameNameLookup[3]['url_station']                                      = 'WORS';
    2018                         $ID3v2ShortFrameNameLookup[3]['payment']                                          = 'WPAY';
    2019                         $ID3v2ShortFrameNameLookup[3]['url_publisher']                                    = 'WPUB';
    2020                         $ID3v2ShortFrameNameLookup[3]['url_user']                                         = 'WXXX';
     1992                        $ID3v2ShortFrameNameLookup[3]['audio_encryption']                  = 'AENC';
     1993                        $ID3v2ShortFrameNameLookup[3]['attached_picture']                  = 'APIC';
     1994                        $ID3v2ShortFrameNameLookup[3]['picture']                           = 'APIC';
     1995                        $ID3v2ShortFrameNameLookup[3]['comment']                           = 'COMM';
     1996                        $ID3v2ShortFrameNameLookup[3]['commercial_frame']                  = 'COMR';
     1997                        $ID3v2ShortFrameNameLookup[3]['encryption_method_registration']    = 'ENCR';
     1998                        $ID3v2ShortFrameNameLookup[3]['event_timing_codes']                = 'ETCO';
     1999                        $ID3v2ShortFrameNameLookup[3]['general_encapsulated_object']       = 'GEOB';
     2000                        $ID3v2ShortFrameNameLookup[3]['group_identification_registration'] = 'GRID';
     2001                        $ID3v2ShortFrameNameLookup[3]['linked_information']                = 'LINK';
     2002                        $ID3v2ShortFrameNameLookup[3]['music_cd_identifier']               = 'MCDI';
     2003                        $ID3v2ShortFrameNameLookup[3]['mpeg_location_lookup_table']        = 'MLLT';
     2004                        $ID3v2ShortFrameNameLookup[3]['ownership_frame']                   = 'OWNE';
     2005                        $ID3v2ShortFrameNameLookup[3]['play_counter']                      = 'PCNT';
     2006                        $ID3v2ShortFrameNameLookup[3]['popularimeter']                     = 'POPM';
     2007                        $ID3v2ShortFrameNameLookup[3]['position_synchronisation_frame']    = 'POSS';
     2008                        $ID3v2ShortFrameNameLookup[3]['private_frame']                     = 'PRIV';
     2009                        $ID3v2ShortFrameNameLookup[3]['recommended_buffer_size']           = 'RBUF';
     2010                        $ID3v2ShortFrameNameLookup[3]['replay_gain_adjustment']            = 'RGAD';
     2011                        $ID3v2ShortFrameNameLookup[3]['reverb']                            = 'RVRB';
     2012                        $ID3v2ShortFrameNameLookup[3]['synchronised_lyric']                = 'SYLT';
     2013                        $ID3v2ShortFrameNameLookup[3]['synchronised_tempo_codes']          = 'SYTC';
     2014                        $ID3v2ShortFrameNameLookup[3]['album']                             = 'TALB';
     2015                        $ID3v2ShortFrameNameLookup[3]['beats_per_minute']                  = 'TBPM';
     2016                        $ID3v2ShortFrameNameLookup[3]['bpm']                               = 'TBPM';
     2017                        $ID3v2ShortFrameNameLookup[3]['part_of_a_compilation']             = 'TCMP';
     2018                        $ID3v2ShortFrameNameLookup[3]['composer']                          = 'TCOM';
     2019                        $ID3v2ShortFrameNameLookup[3]['genre']                             = 'TCON';
     2020                        $ID3v2ShortFrameNameLookup[3]['copyright_message']                 = 'TCOP';
     2021                        $ID3v2ShortFrameNameLookup[3]['playlist_delay']                    = 'TDLY';
     2022                        $ID3v2ShortFrameNameLookup[3]['encoded_by']                        = 'TENC';
     2023                        $ID3v2ShortFrameNameLookup[3]['lyricist']                          = 'TEXT';
     2024                        $ID3v2ShortFrameNameLookup[3]['file_type']                         = 'TFLT';
     2025                        $ID3v2ShortFrameNameLookup[3]['content_group_description']         = 'TIT1';
     2026                        $ID3v2ShortFrameNameLookup[3]['title']                             = 'TIT2';
     2027                        $ID3v2ShortFrameNameLookup[3]['subtitle']                          = 'TIT3';
     2028                        $ID3v2ShortFrameNameLookup[3]['initial_key']                       = 'TKEY';
     2029                        $ID3v2ShortFrameNameLookup[3]['language']                          = 'TLAN';
     2030                        $ID3v2ShortFrameNameLookup[3]['length']                            = 'TLEN';
     2031                        $ID3v2ShortFrameNameLookup[3]['media_type']                        = 'TMED';
     2032                        $ID3v2ShortFrameNameLookup[3]['original_album']                    = 'TOAL';
     2033                        $ID3v2ShortFrameNameLookup[3]['original_filename']                 = 'TOFN';
     2034                        $ID3v2ShortFrameNameLookup[3]['original_lyricist']                 = 'TOLY';
     2035                        $ID3v2ShortFrameNameLookup[3]['original_artist']                   = 'TOPE';
     2036                        $ID3v2ShortFrameNameLookup[3]['file_owner']                        = 'TOWN';
     2037                        $ID3v2ShortFrameNameLookup[3]['artist']                            = 'TPE1';
     2038                        $ID3v2ShortFrameNameLookup[3]['band']                              = 'TPE2';
     2039                        $ID3v2ShortFrameNameLookup[3]['conductor']                         = 'TPE3';
     2040                        $ID3v2ShortFrameNameLookup[3]['remixer']                           = 'TPE4';
     2041                        $ID3v2ShortFrameNameLookup[3]['part_of_a_set']                     = 'TPOS';
     2042                        $ID3v2ShortFrameNameLookup[3]['publisher']                         = 'TPUB';
     2043                        $ID3v2ShortFrameNameLookup[3]['tracknumber']                       = 'TRCK';
     2044                        $ID3v2ShortFrameNameLookup[3]['track_number']                      = 'TRCK';
     2045                        $ID3v2ShortFrameNameLookup[3]['internet_radio_station_name']       = 'TRSN';
     2046                        $ID3v2ShortFrameNameLookup[3]['internet_radio_station_owner']      = 'TRSO';
     2047                        $ID3v2ShortFrameNameLookup[3]['album_artist_sort_order']           = 'TSO2';
     2048                        $ID3v2ShortFrameNameLookup[3]['album_sort_order']                  = 'TSOA';
     2049                        $ID3v2ShortFrameNameLookup[3]['composer_sort_order']               = 'TSOC';
     2050                        $ID3v2ShortFrameNameLookup[3]['performer_sort_order']              = 'TSOP';
     2051                        $ID3v2ShortFrameNameLookup[3]['title_sort_order']                  = 'TSOT';
     2052                        $ID3v2ShortFrameNameLookup[3]['isrc']                              = 'TSRC';
     2053                        $ID3v2ShortFrameNameLookup[3]['encoder_settings']                  = 'TSSE';
     2054                        $ID3v2ShortFrameNameLookup[3]['text']                              = 'TXXX';
     2055                        $ID3v2ShortFrameNameLookup[3]['unique_file_identifier']            = 'UFID';
     2056                        $ID3v2ShortFrameNameLookup[3]['terms_of_use']                      = 'USER';
     2057                        $ID3v2ShortFrameNameLookup[3]['unsychronised_lyric']               = 'USLT';
     2058                        $ID3v2ShortFrameNameLookup[3]['commercial_information']            = 'WCOM';
     2059                        $ID3v2ShortFrameNameLookup[3]['copyright']                         = 'WCOP';
     2060                        $ID3v2ShortFrameNameLookup[3]['url_file']                          = 'WOAF';
     2061                        $ID3v2ShortFrameNameLookup[3]['url_artist']                        = 'WOAR';
     2062                        $ID3v2ShortFrameNameLookup[3]['url_source']                        = 'WOAS';
     2063                        $ID3v2ShortFrameNameLookup[3]['url_station']                       = 'WORS';
     2064                        $ID3v2ShortFrameNameLookup[3]['url_payment']                       = 'WPAY';
     2065                        $ID3v2ShortFrameNameLookup[3]['url_publisher']                     = 'WPUB';
     2066                        $ID3v2ShortFrameNameLookup[3]['url_user']                          = 'WXXX';
    20212067
    20222068                        // The above are common to ID3v2.3 and ID3v2.4
     
    20252071
    20262072                        // The following are unique to ID3v2.3
    2027                         $ID3v2ShortFrameNameLookup[3]['equalisation']                                     = 'EQUA';
    2028                         $ID3v2ShortFrameNameLookup[3]['involved_people_list']                             = 'IPLS';
    2029                         $ID3v2ShortFrameNameLookup[3]['relative_volume_adjustment']                       = 'RVAD';
    2030                         $ID3v2ShortFrameNameLookup[3]['date']                                             = 'TDAT';
    2031                         $ID3v2ShortFrameNameLookup[3]['time']                                             = 'TIME';
    2032                         $ID3v2ShortFrameNameLookup[3]['original_release_year']                            = 'TORY';
    2033                         $ID3v2ShortFrameNameLookup[3]['recording_dates']                                  = 'TRDA';
    2034                         $ID3v2ShortFrameNameLookup[3]['size']                                             = 'TSIZ';
    2035                         $ID3v2ShortFrameNameLookup[3]['year']                                             = 'TYER';
     2073                        $ID3v2ShortFrameNameLookup[3]['equalisation']                      = 'EQUA';
     2074                        $ID3v2ShortFrameNameLookup[3]['involved_people_list']              = 'IPLS';
     2075                        $ID3v2ShortFrameNameLookup[3]['relative_volume_adjustment']        = 'RVAD';
     2076                        $ID3v2ShortFrameNameLookup[3]['date']                              = 'TDAT';
     2077                        $ID3v2ShortFrameNameLookup[3]['time']                              = 'TIME';
     2078                        $ID3v2ShortFrameNameLookup[3]['original_year']                     = 'TORY';
     2079                        $ID3v2ShortFrameNameLookup[3]['recording_dates']                   = 'TRDA';
     2080                        $ID3v2ShortFrameNameLookup[3]['size']                              = 'TSIZ';
     2081                        $ID3v2ShortFrameNameLookup[3]['year']                              = 'TYER';
    20362082
    20372083
    20382084                        // The following are unique to ID3v2.4
    2039                         $ID3v2ShortFrameNameLookup[4]['audio_seek_point_index']                           = 'ASPI';
    2040                         $ID3v2ShortFrameNameLookup[4]['equalisation']                                     = 'EQU2';
    2041                         $ID3v2ShortFrameNameLookup[4]['relative_volume_adjustment']                       = 'RVA2';
    2042                         $ID3v2ShortFrameNameLookup[4]['seek']                                             = 'SEEK';
    2043                         $ID3v2ShortFrameNameLookup[4]['signature']                                        = 'SIGN';
    2044                         $ID3v2ShortFrameNameLookup[4]['encoding_time']                                    = 'TDEN';
    2045                         $ID3v2ShortFrameNameLookup[4]['original_release_time']                            = 'TDOR';
    2046                         $ID3v2ShortFrameNameLookup[4]['recording_time']                                   = 'TDRC';
    2047                         $ID3v2ShortFrameNameLookup[4]['release_time']                                     = 'TDRL';
    2048                         $ID3v2ShortFrameNameLookup[4]['tagging_time']                                     = 'TDTG';
    2049                         $ID3v2ShortFrameNameLookup[4]['involved_people_list']                             = 'TIPL';
    2050                         $ID3v2ShortFrameNameLookup[4]['musician_credits_list']                            = 'TMCL';
    2051                         $ID3v2ShortFrameNameLookup[4]['mood']                                             = 'TMOO';
    2052                         $ID3v2ShortFrameNameLookup[4]['produced_notice']                                  = 'TPRO';
    2053                         $ID3v2ShortFrameNameLookup[4]['album_sort_order']                                 = 'TSOA';
    2054                         $ID3v2ShortFrameNameLookup[4]['performer_sort_order']                             = 'TSOP';
    2055                         $ID3v2ShortFrameNameLookup[4]['title_sort_order']                                 = 'TSOT';
    2056                         $ID3v2ShortFrameNameLookup[4]['set_subtitle']                                     = 'TSST';
     2085                        $ID3v2ShortFrameNameLookup[4]['audio_seek_point_index']            = 'ASPI';
     2086                        $ID3v2ShortFrameNameLookup[4]['equalisation']                      = 'EQU2';
     2087                        $ID3v2ShortFrameNameLookup[4]['relative_volume_adjustment']        = 'RVA2';
     2088                        $ID3v2ShortFrameNameLookup[4]['seek_frame']                        = 'SEEK';
     2089                        $ID3v2ShortFrameNameLookup[4]['signature_frame']                   = 'SIGN';
     2090                        $ID3v2ShortFrameNameLookup[4]['encoding_time']                     = 'TDEN';
     2091                        $ID3v2ShortFrameNameLookup[4]['original_release_time']             = 'TDOR';
     2092                        $ID3v2ShortFrameNameLookup[4]['recording_time']                    = 'TDRC';
     2093                        $ID3v2ShortFrameNameLookup[4]['release_time']                      = 'TDRL';
     2094                        $ID3v2ShortFrameNameLookup[4]['tagging_time']                      = 'TDTG';
     2095                        $ID3v2ShortFrameNameLookup[4]['involved_people_list']              = 'TIPL';
     2096                        $ID3v2ShortFrameNameLookup[4]['musician_credits_list']             = 'TMCL';
     2097                        $ID3v2ShortFrameNameLookup[4]['mood']                              = 'TMOO';
     2098                        $ID3v2ShortFrameNameLookup[4]['produced_notice']                   = 'TPRO';
     2099                        $ID3v2ShortFrameNameLookup[4]['album_sort_order']                  = 'TSOA';
     2100                        $ID3v2ShortFrameNameLookup[4]['performer_sort_order']              = 'TSOP';
     2101                        $ID3v2ShortFrameNameLookup[4]['title_sort_order']                  = 'TSOT';
     2102                        $ID3v2ShortFrameNameLookup[4]['set_subtitle']                      = 'TSST';
    20572103                }
    20582104                return (isset($ID3v2ShortFrameNameLookup[$majorversion][strtolower($long_description)]) ? $ID3v2ShortFrameNameLookup[$majorversion][strtolower($long_description)] : '');
  • _plugins_/getID3/trunk/getid3/write.php

    r96419 r103224  
    495495                                                        return false;
    496496                                                }
     497                                        }
     498                                        break;
     499
     500                                case 'POPM':
     501                                        if (isset($valuearray['email']) &&
     502                                                isset($valuearray['rating']) &&
     503                                                isset($valuearray['data'])) {
     504                                                        $tag_data_id3v2['POPM'][] = $valuearray;
     505                                        } else {
     506                                                $this->errors[] = 'ID3v2 POPM data is not properly structured';
     507                                                return false;
     508                                        }
     509                                        break;
     510
     511                                case 'GRID':
     512                                        if (
     513                                                isset($valuearray['groupsymbol']) &&
     514                                                isset($valuearray['ownerid']) &&
     515                                                isset($valuearray['data'])
     516                                        ) {
     517                                                        $tag_data_id3v2['GRID'][] = $valuearray;
     518                                        } else {
     519                                                $this->errors[] = 'ID3v2 GRID data is not properly structured';
     520                                                return false;
     521                                        }
     522                                        break;
     523
     524                                case 'UFID':
     525                                        if (isset($valuearray['ownerid']) &&
     526                                                isset($valuearray['data'])) {
     527                                                        $tag_data_id3v2['UFID'][] = $valuearray;
     528                                        } else {
     529                                                $this->errors[] = 'ID3v2 UFID data is not properly structured';
     530                                                return false;
    497531                                        }
    498532                                        break;
Note: See TracChangeset for help on using the changeset viewer.