Make WordPress Core


Ignore:
Timestamp:
09/11/2014 07:06:33 PM (10 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.