Make WordPress Core


Ignore:
Timestamp:
09/11/2014 07:06:33 PM (12 years ago)
Author:
wonderboymusic
Message:

Update getID3 library to 1.9.8.

Changes:
https://github.com/JamesHeinrich/getID3/compare/1.9.7...v1.9.8

Fixes #29627.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/ID3/module.audio-video.quicktime.php

    r24696 r29734  
    44//  available at http://getid3.sourceforge.net                 //
    55//            or http://www.getid3.org                         //
     6//          also https://github.com/JamesHeinrich/getID3       //
    67/////////////////////////////////////////////////////////////////
    78// See readme.txt for more details                             //
     
    3132                $info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present
    3233
    33                 fseek($this->getid3->fp, $info['avdataoffset'], SEEK_SET);
     34                $this->fseek($info['avdataoffset']);
    3435
    3536                $offset      = 0;
     
    4142                                break;
    4243                        }
    43                         fseek($this->getid3->fp, $offset, SEEK_SET);
    44                         $AtomHeader = fread($this->getid3->fp, 8);
     44                        $this->fseek($offset);
     45                        $AtomHeader = $this->fread(8);
    4546
    4647                        $atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4));
     
    4950                        // 64-bit MOV patch by jlegateØktnc*com
    5051                        if ($atomsize == 1) {
    51                                 $atomsize = getid3_lib::BigEndian2Int(fread($this->getid3->fp, 8));
     52                                $atomsize = getid3_lib::BigEndian2Int($this->fread(8));
    5253                        }
    5354
     
    6768                                break;
    6869                        }
    69                         switch ($atomname) {
    70                                 case 'mdat': // Media DATa atom
    71                                         // 'mdat' contains the actual data for the audio/video
    72                                         if (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) {
    73 
    74                                                 $info['avdataoffset'] = $info['quicktime'][$atomname]['offset'] + 8;
    75                                                 $OldAVDataEnd         = $info['avdataend'];
    76                                                 $info['avdataend']    = $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size'];
    77 
    78                                                 $getid3_temp = new getID3();
    79                                                 $getid3_temp->openfile($this->getid3->filename);
    80                                                 $getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
    81                                                 $getid3_temp->info['avdataend']    = $info['avdataend'];
    82                                                 $getid3_mp3 = new getid3_mp3($getid3_temp);
    83                                                 if ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode(fread($this->getid3->fp, 4)))) {
    84                                                         $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false);
    85                                                         if (!empty($getid3_temp->info['warning'])) {
    86                                                                 foreach ($getid3_temp->info['warning'] as $value) {
    87                                                                         $info['warning'][] = $value;
    88                                                                 }
    89                                                         }
    90                                                         if (!empty($getid3_temp->info['mpeg'])) {
    91                                                                 $info['mpeg'] = $getid3_temp->info['mpeg'];
    92                                                                 if (isset($info['mpeg']['audio'])) {
    93                                                                         $info['audio']['dataformat']   = 'mp3';
    94                                                                         $info['audio']['codec']        = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3')));
    95                                                                         $info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];
    96                                                                         $info['audio']['channels']     = $info['mpeg']['audio']['channels'];
    97                                                                         $info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];
    98                                                                         $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
    99                                                                         $info['bitrate']               = $info['audio']['bitrate'];
    100                                                                 }
    101                                                         }
    102                                                 }
    103                                                 unset($getid3_mp3, $getid3_temp);
    104                                                 $info['avdataend'] = $OldAVDataEnd;
    105                                                 unset($OldAVDataEnd);
    106 
    107                                         }
    108                                         break;
    109 
    110                                 case 'free': // FREE space atom
    111                                 case 'skip': // SKIP atom
    112                                 case 'wide': // 64-bit expansion placeholder atom
    113                                         // 'free', 'skip' and 'wide' are just padding, contains no useful data at all
    114                                         break;
    115 
    116                                 default:
    117                                         $atomHierarchy = array();
    118                                         $info['quicktime'][$atomname] = $this->QuicktimeParseAtom($atomname, $atomsize, fread($this->getid3->fp, $atomsize), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms);
    119                                         break;
    120                         }
     70                        $atomHierarchy = array();
     71                        $info['quicktime'][$atomname] = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize, round($this->getid3->memory_limit / 2))), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms);
    12172
    12273                        $offset += $atomsize;
     
    173124                $info = &$this->getid3->info;
    174125
    175                 //$atom_parent = array_pop($atomHierarchy);
    176                 $atom_parent = end($atomHierarchy); // http://www.getid3.org/phpBB3/viewtopic.php?t=1717
     126                $atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see http://www.getid3.org/phpBB3/viewtopic.php?t=1717
    177127                array_push($atomHierarchy, $atomname);
    178128                $atom_structure['hierarchy'] = implode(' ', $atomHierarchy);
     
    180130                $atom_structure['size']      = $atomsize;
    181131                $atom_structure['offset']    = $baseoffset;
    182 //echo getid3_lib::PrintHexBytes(substr($atom_data, 0, 8)).'<br>';
    183 //echo getid3_lib::PrintHexBytes(substr($atom_data, 0, 8), false).'<br><br>';
    184132                switch ($atomname) {
    185133                        case 'moov': // MOVie container atom
     
    201149
    202150                        case 'ilst': // Item LiST container atom
    203                                 $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms);
    204 
    205                                 // some "ilst" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted
    206                                 $allnumericnames = true;
    207                                 foreach ($atom_structure['subatoms'] as $subatomarray) {
    208                                         if (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) {
    209                                                 $allnumericnames = false;
    210                                                 break;
    211                                         }
    212                                 }
    213                                 if ($allnumericnames) {
    214                                         $newData = array();
     151                                if ($atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms)) {
     152                                        // some "ilst" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted
     153                                        $allnumericnames = true;
    215154                                        foreach ($atom_structure['subatoms'] as $subatomarray) {
    216                                                 foreach ($subatomarray['subatoms'] as $newData_subatomarray) {
    217                                                         unset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']);
    218                                                         $newData[$subatomarray['name']] = $newData_subatomarray;
     155                                                if (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) {
     156                                                        $allnumericnames = false;
    219157                                                        break;
    220158                                                }
    221159                                        }
    222                                         $atom_structure['data'] = $newData;
    223                                         unset($atom_structure['subatoms']);
     160                                        if ($allnumericnames) {
     161                                                $newData = array();
     162                                                foreach ($atom_structure['subatoms'] as $subatomarray) {
     163                                                        foreach ($subatomarray['subatoms'] as $newData_subatomarray) {
     164                                                                unset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']);
     165                                                                $newData[$subatomarray['name']] = $newData_subatomarray;
     166                                                                break;
     167                                                        }
     168                                                }
     169                                                $atom_structure['data'] = $newData;
     170                                                unset($atom_structure['subatoms']);
     171                                        }
    224172                                }
    225173                                break;
     
    309257                        case 'plID':
    310258                        case 'sfID': // iTunes store country
    311                         case alb': // ALBum
    312                         case art': // ARTist
    313                         case ART':
    314                         case aut':
    315                         case cmt': // CoMmenT
    316                         case com': // COMposer
    317                         case cpy':
    318                         case day': // content created year
    319                         case dir':
    320                         case ed1':
    321                         case ed2':
    322                         case ed3':
    323                         case ed4':
    324                         case ed5':
    325                         case ed6':
    326                         case ed7':
    327                         case ed8':
    328                         case ed9':
    329                         case enc':
    330                         case fmt':
    331                         case gen': // GENre
    332                         case grp': // GRouPing
    333                         case hst':
    334                         case inf':
    335                         case lyr': // LYRics
    336                         case mak':
    337                         case mod':
    338                         case nam': // full NAMe
    339                         case ope':
    340                         case PRD':
    341                         case prd':
    342                         case prf':
    343                         case req':
    344                         case src':
    345                         case swr':
    346                         case too': // encoder
    347                         case trk': // TRacK
    348                         case url':
    349                         case wrn':
    350                         case wrt': // WRiTer
     259                        case "\xA9".'alb': // ALBum
     260                        case "\xA9".'art': // ARTist
     261                        case "\xA9".'ART':
     262                        case "\xA9".'aut':
     263                        case "\xA9".'cmt': // CoMmenT
     264                        case "\xA9".'com': // COMposer
     265                        case "\xA9".'cpy':
     266                        case "\xA9".'day': // content created year
     267                        case "\xA9".'dir':
     268                        case "\xA9".'ed1':
     269                        case "\xA9".'ed2':
     270                        case "\xA9".'ed3':
     271                        case "\xA9".'ed4':
     272                        case "\xA9".'ed5':
     273                        case "\xA9".'ed6':
     274                        case "\xA9".'ed7':
     275                        case "\xA9".'ed8':
     276                        case "\xA9".'ed9':
     277                        case "\xA9".'enc':
     278                        case "\xA9".'fmt':
     279                        case "\xA9".'gen': // GENre
     280                        case "\xA9".'grp': // GRouPing
     281                        case "\xA9".'hst':
     282                        case "\xA9".'inf':
     283                        case "\xA9".'lyr': // LYRics
     284                        case "\xA9".'mak':
     285                        case "\xA9".'mod':
     286                        case "\xA9".'nam': // full NAMe
     287                        case "\xA9".'ope':
     288                        case "\xA9".'PRD':
     289                        case "\xA9".'prd':
     290                        case "\xA9".'prf':
     291                        case "\xA9".'req':
     292                        case "\xA9".'src':
     293                        case "\xA9".'swr':
     294                        case "\xA9".'too': // encoder
     295                        case "\xA9".'trk': // TRacK
     296                        case "\xA9".'url':
     297                        case "\xA9".'wrn':
     298                        case "\xA9".'wrt': // WRiTer
    351299                        case '----': // itunes specific
    352300                                if ($atom_parent == 'udta') {
     
    371319                                                        $boxsmalldata =                           substr($atom_data, $atomoffset + 4, $boxsmallsize);
    372320                                                        if ($boxsmallsize <= 1) {
    373                                                                 $info['warning'][] = 'Invalid QuickTime atom smallbox size "'.$boxsmallsize.'" in atom "'.$atomname.'" at offset: '.($atom_structure['offset'] + $atomoffset);
     321                                                                $info['warning'][] = 'Invalid QuickTime atom smallbox size "'.$boxsmallsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset);
    374322                                                                $atom_structure['data'] = null;
    375323                                                                $atomoffset = strlen($atom_data);
     
    381329                                                                        break;
    382330                                                                default:
    383                                                                         $info['warning'][] = 'Unknown QuickTime smallbox type: "'.getid3_lib::PrintHexBytes($boxsmalltype).'" at offset '.$baseoffset;
     331                                                                        $info['warning'][] = 'Unknown QuickTime smallbox type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxsmalltype).'" ('.trim(getid3_lib::PrintHexBytes($boxsmalltype)).') at offset '.$baseoffset;
    384332                                                                        $atom_structure['data'] = $atom_data;
    385333                                                                        break;
     
    393341                                                        $boxdata =                           substr($atom_data, $atomoffset + 8, $boxsize - 8);
    394342                                                        if ($boxsize <= 1) {
    395                                                                 $info['warning'][] = 'Invalid QuickTime atom box size "'.$boxsize.'" in atom "'.$atomname.'" at offset: '.($atom_structure['offset'] + $atomoffset);
     343                                                                $info['warning'][] = 'Invalid QuickTime atom box size "'.$boxsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset);
    396344                                                                $atom_structure['data'] = null;
    397345                                                                $atomoffset = strlen($atom_data);
     
    410358                                                                        $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata,  1, 3));
    411359                                                                        switch ($atom_structure['flags_raw']) {
    412                                                                                 case 0: // data flag
     360                                                                                case  0: // data flag
    413361                                                                                case 21: // tmpo/cpil flag
    414362                                                                                        switch ($atomname) {
     
    461409                                                                                        break;
    462410
    463                                                                                 case 1: // text flag
     411                                                                                case  1: // text flag
    464412                                                                                case 13: // image flag
    465413                                                                                default:
    466414                                                                                        $atom_structure['data'] = substr($boxdata, 8);
     415                                                                                        if ($atomname == 'covr') {
     416                                                                                                // not a foolproof check, but better than nothing
     417                                                                                                if (preg_match('#^\xFF\xD8\xFF#', $atom_structure['data'])) {
     418                                                                                                        $atom_structure['image_mime'] = 'image/jpeg';
     419                                                                                                } elseif (preg_match('#^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A#', $atom_structure['data'])) {
     420                                                                                                        $atom_structure['image_mime'] = 'image/png';
     421                                                                                                } elseif (preg_match('#^GIF#', $atom_structure['data'])) {
     422                                                                                                        $atom_structure['image_mime'] = 'image/gif';
     423                                                                                                }
     424                                                                                        }
    467425                                                                                        break;
    468426
     
    471429
    472430                                                                default:
    473                                                                         $info['warning'][] = 'Unknown QuickTime box type: "'.getid3_lib::PrintHexBytes($boxtype).'" at offset '.$baseoffset;
     431                                                                        $info['warning'][] = 'Unknown QuickTime box type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxtype).'" ('.trim(getid3_lib::PrintHexBytes($boxtype)).') at offset '.$baseoffset;
    474432                                                                        $atom_structure['data'] = $atom_data;
    475433
     
    841799                                //$FrameRateCalculatorArray = array();
    842800                                $frames_count = 0;
    843                                 for ($i = 0; $i < $atom_structure['number_entries']; $i++) {
     801
     802                                $max_stts_entries_to_scan = min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']);
     803                                if ($max_stts_entries_to_scan < $atom_structure['number_entries']) {
     804                                        $info['warning'][] = 'QuickTime atom "stts" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($this->getid3->memory_limit / 1048576).'MB).';
     805                                }
     806                                for ($i = 0; $i < $max_stts_entries_to_scan; $i++) {
    844807                                        $atom_structure['time_to_sample_table'][$i]['sample_count']    = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4));
    845808                                        $sttsEntriesDataOffset += 4;
     
    10871050                        case 'scpt': // tranSCriPT atom
    10881051                        case 'ssrc': // non-primary SouRCe atom
    1089                                 for ($i = 0; $i < (strlen($atom_data) % 4); $i++) {
    1090                                         $atom_structure['track_id'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $i * 4, 4));
     1052                                for ($i = 0; $i < strlen($atom_data); $i += 4) {
     1053                                        @$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4));
    10911054                                }
    10921055                                break;
     
    12611224
    12621225                        case 'mdat': // Media DATa atom
     1226                                // 'mdat' contains the actual data for the audio/video, possibly also subtitles
     1227
     1228/* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */
     1229
     1230                                // first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?)
     1231                                $mdat_offset = 0;
     1232                                while (true) {
     1233                                        if (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x08".'wide') {
     1234                                                $mdat_offset += 8;
     1235                                        } elseif (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x00".'mdat') {
     1236                                                $mdat_offset += 8;
     1237                                        } else {
     1238                                                break;
     1239                                        }
     1240                                }
     1241
     1242                                // check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field
     1243                                while  (($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2)))
     1244                                        && ($chapter_string_length < 1000)
     1245                                        && ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2))
     1246                                        && preg_match('#^[\x20-\xFF]+$#', substr($atom_data, $mdat_offset + 2, $chapter_string_length), $chapter_matches)) {
     1247                                                $mdat_offset += (2 + $chapter_string_length);
     1248                                                @$info['quicktime']['comments']['chapters'][] = $chapter_matches[0];
     1249                                }
     1250
     1251
     1252
     1253                                if (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) {
     1254
     1255                                        $info['avdataoffset'] = $atom_structure['offset'] + 8;                       // $info['quicktime'][$atomname]['offset'] + 8;
     1256                                        $OldAVDataEnd         = $info['avdataend'];
     1257                                        $info['avdataend']    = $atom_structure['offset'] + $atom_structure['size']; // $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size'];
     1258
     1259                                        $getid3_temp = new getID3();
     1260                                        $getid3_temp->openfile($this->getid3->filename);
     1261                                        $getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
     1262                                        $getid3_temp->info['avdataend']    = $info['avdataend'];
     1263                                        $getid3_mp3 = new getid3_mp3($getid3_temp);
     1264                                        if ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode($this->fread(4)))) {
     1265                                                $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false);
     1266                                                if (!empty($getid3_temp->info['warning'])) {
     1267                                                        foreach ($getid3_temp->info['warning'] as $value) {
     1268                                                                $info['warning'][] = $value;
     1269                                                        }
     1270                                                }
     1271                                                if (!empty($getid3_temp->info['mpeg'])) {
     1272                                                        $info['mpeg'] = $getid3_temp->info['mpeg'];
     1273                                                        if (isset($info['mpeg']['audio'])) {
     1274                                                                $info['audio']['dataformat']   = 'mp3';
     1275                                                                $info['audio']['codec']        = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3')));
     1276                                                                $info['audio']['sample_rate']  = $info['mpeg']['audio']['sample_rate'];
     1277                                                                $info['audio']['channels']     = $info['mpeg']['audio']['channels'];
     1278                                                                $info['audio']['bitrate']      = $info['mpeg']['audio']['bitrate'];
     1279                                                                $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
     1280                                                                $info['bitrate']               = $info['audio']['bitrate'];
     1281                                                        }
     1282                                                }
     1283                                        }
     1284                                        unset($getid3_mp3, $getid3_temp);
     1285                                        $info['avdataend'] = $OldAVDataEnd;
     1286                                        unset($OldAVDataEnd);
     1287
     1288                                }
     1289
     1290                                unset($mdat_offset, $chapter_string_length, $chapter_matches);
     1291                                break;
     1292
    12631293                        case 'free': // FREE space atom
    12641294                        case 'skip': // SKIP atom
    12651295                        case 'wide': // 64-bit expansion placeholder atom
    1266                                 // 'mdat' data is too big to deal with, contains no useful metadata
    12671296                                // 'free', 'skip' and 'wide' are just padding, contains no useful data at all
    12681297
     
    13301359                                break;
    13311360
    1332                         case xyz':  // GPS latitude+longitude+altitude
     1361                        case "\xA9".'xyz':  // GPS latitude+longitude+altitude
    13331362                                $atom_structure['data'] = $atom_data;
    13341363                                if (preg_match('#([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)?/$#i', $atom_data, $matches)) {
     
    13591388                                }
    13601389                                break;
    1361                         case 'NCHD': // MakerNoteVersion
    1362                                 // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
    1363                                 $atom_structure['data'] = $atom_data;
    1364                                 break;
    1365                         case 'NCTG': // NikonTags
    1366                                 // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG
     1390                        case 'NCTG': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG
    13671391                                $atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data);
    13681392                                break;
    1369                         case 'NCDB': // NikonTags
    1370                                 // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
     1393                        case 'NCHD': // Nikon:MakerNoteVersion  - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
     1394                        case 'NCDB': // Nikon                   - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
     1395                        case 'CNCV': // Canon:CompressorVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html
    13711396                                $atom_structure['data'] = $atom_data;
    13721397                                break;
     
    13941419
    13951420                        default:
    1396                                 $info['warning'][] = 'Unknown QuickTime atom type: "'.$atomname.'" ('.trim(getid3_lib::PrintHexBytes($atomname)).') at offset '.$baseoffset;
     1421                                $info['warning'][] = 'Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).') at offset '.$baseoffset;
    13971422                                $atom_structure['data'] = $atom_data;
    13981423                                break;
     
    20892114                static $handyatomtranslatorarray = array();
    20902115                if (empty($handyatomtranslatorarray)) {
    2091                         $handyatomtranslatorarray[cpy'] = 'copyright';
    2092                         $handyatomtranslatorarray[day'] = 'creation_date';    // iTunes 4.0
    2093                         $handyatomtranslatorarray[dir'] = 'director';
    2094                         $handyatomtranslatorarray[ed1'] = 'edit1';
    2095                         $handyatomtranslatorarray[ed2'] = 'edit2';
    2096                         $handyatomtranslatorarray[ed3'] = 'edit3';
    2097                         $handyatomtranslatorarray[ed4'] = 'edit4';
    2098                         $handyatomtranslatorarray[ed5'] = 'edit5';
    2099                         $handyatomtranslatorarray[ed6'] = 'edit6';
    2100                         $handyatomtranslatorarray[ed7'] = 'edit7';
    2101                         $handyatomtranslatorarray[ed8'] = 'edit8';
    2102                         $handyatomtranslatorarray[ed9'] = 'edit9';
    2103                         $handyatomtranslatorarray[fmt'] = 'format';
    2104                         $handyatomtranslatorarray[inf'] = 'information';
    2105                         $handyatomtranslatorarray[prd'] = 'producer';
    2106                         $handyatomtranslatorarray[prf'] = 'performers';
    2107                         $handyatomtranslatorarray[req'] = 'system_requirements';
    2108                         $handyatomtranslatorarray[src'] = 'source_credit';
    2109                         $handyatomtranslatorarray[wrt'] = 'writer';
     2116                        $handyatomtranslatorarray["\xA9".'cpy'] = 'copyright';
     2117                        $handyatomtranslatorarray["\xA9".'day'] = 'creation_date';    // iTunes 4.0
     2118                        $handyatomtranslatorarray["\xA9".'dir'] = 'director';
     2119                        $handyatomtranslatorarray["\xA9".'ed1'] = 'edit1';
     2120                        $handyatomtranslatorarray["\xA9".'ed2'] = 'edit2';
     2121                        $handyatomtranslatorarray["\xA9".'ed3'] = 'edit3';
     2122                        $handyatomtranslatorarray["\xA9".'ed4'] = 'edit4';
     2123                        $handyatomtranslatorarray["\xA9".'ed5'] = 'edit5';
     2124                        $handyatomtranslatorarray["\xA9".'ed6'] = 'edit6';
     2125                        $handyatomtranslatorarray["\xA9".'ed7'] = 'edit7';
     2126                        $handyatomtranslatorarray["\xA9".'ed8'] = 'edit8';
     2127                        $handyatomtranslatorarray["\xA9".'ed9'] = 'edit9';
     2128                        $handyatomtranslatorarray["\xA9".'fmt'] = 'format';
     2129                        $handyatomtranslatorarray["\xA9".'inf'] = 'information';
     2130                        $handyatomtranslatorarray["\xA9".'prd'] = 'producer';
     2131                        $handyatomtranslatorarray["\xA9".'prf'] = 'performers';
     2132                        $handyatomtranslatorarray["\xA9".'req'] = 'system_requirements';
     2133                        $handyatomtranslatorarray["\xA9".'src'] = 'source_credit';
     2134                        $handyatomtranslatorarray["\xA9".'wrt'] = 'writer';
    21102135
    21112136                        // http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt
    2112                         $handyatomtranslatorarray[nam'] = 'title';           // iTunes 4.0
    2113                         $handyatomtranslatorarray[cmt'] = 'comment';         // iTunes 4.0
    2114                         $handyatomtranslatorarray[wrn'] = 'warning';
    2115                         $handyatomtranslatorarray[hst'] = 'host_computer';
    2116                         $handyatomtranslatorarray[mak'] = 'make';
    2117                         $handyatomtranslatorarray[mod'] = 'model';
    2118                         $handyatomtranslatorarray[PRD'] = 'product';
    2119                         $handyatomtranslatorarray[swr'] = 'software';
    2120                         $handyatomtranslatorarray[aut'] = 'author';
    2121                         $handyatomtranslatorarray[ART'] = 'artist';
    2122                         $handyatomtranslatorarray[trk'] = 'track';
    2123                         $handyatomtranslatorarray[alb'] = 'album';           // iTunes 4.0
    2124                         $handyatomtranslatorarray[com'] = 'comment';
    2125                         $handyatomtranslatorarray[gen'] = 'genre';           // iTunes 4.0
    2126                         $handyatomtranslatorarray[ope'] = 'composer';
    2127                         $handyatomtranslatorarray[url'] = 'url';
    2128                         $handyatomtranslatorarray[enc'] = 'encoder';
     2137                        $handyatomtranslatorarray["\xA9".'nam'] = 'title';           // iTunes 4.0
     2138                        $handyatomtranslatorarray["\xA9".'cmt'] = 'comment';         // iTunes 4.0
     2139                        $handyatomtranslatorarray["\xA9".'wrn'] = 'warning';
     2140                        $handyatomtranslatorarray["\xA9".'hst'] = 'host_computer';
     2141                        $handyatomtranslatorarray["\xA9".'mak'] = 'make';
     2142                        $handyatomtranslatorarray["\xA9".'mod'] = 'model';
     2143                        $handyatomtranslatorarray["\xA9".'PRD'] = 'product';
     2144                        $handyatomtranslatorarray["\xA9".'swr'] = 'software';
     2145                        $handyatomtranslatorarray["\xA9".'aut'] = 'author';
     2146                        $handyatomtranslatorarray["\xA9".'ART'] = 'artist';
     2147                        $handyatomtranslatorarray["\xA9".'trk'] = 'track';
     2148                        $handyatomtranslatorarray["\xA9".'alb'] = 'album';           // iTunes 4.0
     2149                        $handyatomtranslatorarray["\xA9".'com'] = 'comment';
     2150                        $handyatomtranslatorarray["\xA9".'gen'] = 'genre';           // iTunes 4.0
     2151                        $handyatomtranslatorarray["\xA9".'ope'] = 'composer';
     2152                        $handyatomtranslatorarray["\xA9".'url'] = 'url';
     2153                        $handyatomtranslatorarray["\xA9".'enc'] = 'encoder';
    21292154
    21302155                        // http://atomicparsley.sourceforge.net/mpeg-4files.html
    2131                         $handyatomtranslatorarray[art'] = 'artist';           // iTunes 4.0
     2156                        $handyatomtranslatorarray["\xA9".'art'] = 'artist';           // iTunes 4.0
    21322157                        $handyatomtranslatorarray['aART'] = 'album_artist';
    21332158                        $handyatomtranslatorarray['trkn'] = 'track_number';     // iTunes 4.0
    21342159                        $handyatomtranslatorarray['disk'] = 'disc_number';      // iTunes 4.0
    21352160                        $handyatomtranslatorarray['gnre'] = 'genre';            // iTunes 4.0
    2136                         $handyatomtranslatorarray[too'] = 'encoder';          // iTunes 4.0
     2161                        $handyatomtranslatorarray["\xA9".'too'] = 'encoder';          // iTunes 4.0
    21372162                        $handyatomtranslatorarray['tmpo'] = 'bpm';              // iTunes 4.0
    21382163                        $handyatomtranslatorarray['cprt'] = 'copyright';        // iTunes 4.0?
     
    21402165                        $handyatomtranslatorarray['covr'] = 'picture';          // iTunes 4.0
    21412166                        $handyatomtranslatorarray['rtng'] = 'rating';           // iTunes 4.0
    2142                         $handyatomtranslatorarray[grp'] = 'grouping';         // iTunes 4.2
     2167                        $handyatomtranslatorarray["\xA9".'grp'] = 'grouping';         // iTunes 4.2
    21432168                        $handyatomtranslatorarray['stik'] = 'stik';             // iTunes 4.9
    21442169                        $handyatomtranslatorarray['pcst'] = 'podcast';          // iTunes 4.9
     
    21482173                        $handyatomtranslatorarray['egid'] = 'episode_guid';     // iTunes 4.9
    21492174                        $handyatomtranslatorarray['desc'] = 'description';      // iTunes 5.0
    2150                         $handyatomtranslatorarray[lyr'] = 'lyrics';           // iTunes 5.0
     2175                        $handyatomtranslatorarray["\xA9".'lyr'] = 'lyrics';           // iTunes 5.0
    21512176                        $handyatomtranslatorarray['tvnn'] = 'tv_network_name';  // iTunes 6.0
    21522177                        $handyatomtranslatorarray['tvsh'] = 'tv_show_name';     // iTunes 6.0
Note: See TracChangeset for help on using the changeset viewer.