- Timestamp:
- 09/11/2014 07:06:33 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/ID3/module.audio-video.quicktime.php
r24696 r29734 4 4 // available at http://getid3.sourceforge.net // 5 5 // or http://www.getid3.org // 6 // also https://github.com/JamesHeinrich/getID3 // 6 7 ///////////////////////////////////////////////////////////////// 7 8 // See readme.txt for more details // … … 31 32 $info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present 32 33 33 fseek($this->getid3->fp, $info['avdataoffset'], SEEK_SET);34 $this->fseek($info['avdataoffset']); 34 35 35 36 $offset = 0; … … 41 42 break; 42 43 } 43 fseek($this->getid3->fp, $offset, SEEK_SET);44 $AtomHeader = fread($this->getid3->fp,8);44 $this->fseek($offset); 45 $AtomHeader = $this->fread(8); 45 46 46 47 $atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4)); … … 49 50 // 64-bit MOV patch by jlegateØktnc*com 50 51 if ($atomsize == 1) { 51 $atomsize = getid3_lib::BigEndian2Int( fread($this->getid3->fp,8));52 $atomsize = getid3_lib::BigEndian2Int($this->fread(8)); 52 53 } 53 54 … … 67 68 break; 68 69 } 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); 121 72 122 73 $offset += $atomsize; … … 173 124 $info = &$this->getid3->info; 174 125 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 177 127 array_push($atomHierarchy, $atomname); 178 128 $atom_structure['hierarchy'] = implode(' ', $atomHierarchy); … … 180 130 $atom_structure['size'] = $atomsize; 181 131 $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>';184 132 switch ($atomname) { 185 133 case 'moov': // MOVie container atom … … 201 149 202 150 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; 215 154 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; 219 157 break; 220 158 } 221 159 } 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 } 224 172 } 225 173 break; … … 309 257 case 'plID': 310 258 case 'sfID': // iTunes store country 311 case '©alb': // ALBum312 case '©art': // ARTist313 case '©ART':314 case '©aut':315 case '©cmt': // CoMmenT316 case '©com': // COMposer317 case '©cpy':318 case '©day': // content created year319 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': // GENre332 case '©grp': // GRouPing333 case '©hst':334 case '©inf':335 case '©lyr': // LYRics336 case '©mak':337 case '©mod':338 case '©nam': // full NAMe339 case '©ope':340 case '©PRD':341 case '©prd':342 case '©prf':343 case '©req':344 case '©src':345 case '©swr':346 case '©too': // encoder347 case '©trk': // TRacK348 case '©url':349 case '©wrn':350 case '©wrt': // WRiTer259 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 351 299 case '----': // itunes specific 352 300 if ($atom_parent == 'udta') { … … 371 319 $boxsmalldata = substr($atom_data, $atomoffset + 4, $boxsmallsize); 372 320 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); 374 322 $atom_structure['data'] = null; 375 323 $atomoffset = strlen($atom_data); … … 381 329 break; 382 330 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; 384 332 $atom_structure['data'] = $atom_data; 385 333 break; … … 393 341 $boxdata = substr($atom_data, $atomoffset + 8, $boxsize - 8); 394 342 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); 396 344 $atom_structure['data'] = null; 397 345 $atomoffset = strlen($atom_data); … … 410 358 $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata, 1, 3)); 411 359 switch ($atom_structure['flags_raw']) { 412 case 0:// data flag360 case 0: // data flag 413 361 case 21: // tmpo/cpil flag 414 362 switch ($atomname) { … … 461 409 break; 462 410 463 case 1:// text flag411 case 1: // text flag 464 412 case 13: // image flag 465 413 default: 466 414 $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 } 467 425 break; 468 426 … … 471 429 472 430 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; 474 432 $atom_structure['data'] = $atom_data; 475 433 … … 841 799 //$FrameRateCalculatorArray = array(); 842 800 $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++) { 844 807 $atom_structure['time_to_sample_table'][$i]['sample_count'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4)); 845 808 $sttsEntriesDataOffset += 4; … … 1087 1050 case 'scpt': // tranSCriPT atom 1088 1051 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)); 1091 1054 } 1092 1055 break; … … 1261 1224 1262 1225 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 1263 1293 case 'free': // FREE space atom 1264 1294 case 'skip': // SKIP atom 1265 1295 case 'wide': // 64-bit expansion placeholder atom 1266 // 'mdat' data is too big to deal with, contains no useful metadata1267 1296 // 'free', 'skip' and 'wide' are just padding, contains no useful data at all 1268 1297 … … 1330 1359 break; 1331 1360 1332 case '©xyz': // GPS latitude+longitude+altitude1361 case "\xA9".'xyz': // GPS latitude+longitude+altitude 1333 1362 $atom_structure['data'] = $atom_data; 1334 1363 if (preg_match('#([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)?/$#i', $atom_data, $matches)) { … … 1359 1388 } 1360 1389 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 1367 1391 $atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data); 1368 1392 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 1371 1396 $atom_structure['data'] = $atom_data; 1372 1397 break; … … 1394 1419 1395 1420 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; 1397 1422 $atom_structure['data'] = $atom_data; 1398 1423 break; … … 2089 2114 static $handyatomtranslatorarray = array(); 2090 2115 if (empty($handyatomtranslatorarray)) { 2091 $handyatomtranslatorarray[ '©cpy'] = 'copyright';2092 $handyatomtranslatorarray[ '©day'] = 'creation_date'; // iTunes 4.02093 $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'; 2110 2135 2111 2136 // http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt 2112 $handyatomtranslatorarray[ '©nam'] = 'title'; // iTunes 4.02113 $handyatomtranslatorarray[ '©cmt'] = 'comment'; // iTunes 4.02114 $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.02124 $handyatomtranslatorarray[ '©com'] = 'comment';2125 $handyatomtranslatorarray[ '©gen'] = 'genre'; // iTunes 4.02126 $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'; 2129 2154 2130 2155 // http://atomicparsley.sourceforge.net/mpeg-4files.html 2131 $handyatomtranslatorarray[ '©art'] = 'artist'; // iTunes 4.02156 $handyatomtranslatorarray["\xA9".'art'] = 'artist'; // iTunes 4.0 2132 2157 $handyatomtranslatorarray['aART'] = 'album_artist'; 2133 2158 $handyatomtranslatorarray['trkn'] = 'track_number'; // iTunes 4.0 2134 2159 $handyatomtranslatorarray['disk'] = 'disc_number'; // iTunes 4.0 2135 2160 $handyatomtranslatorarray['gnre'] = 'genre'; // iTunes 4.0 2136 $handyatomtranslatorarray[ '©too'] = 'encoder'; // iTunes 4.02161 $handyatomtranslatorarray["\xA9".'too'] = 'encoder'; // iTunes 4.0 2137 2162 $handyatomtranslatorarray['tmpo'] = 'bpm'; // iTunes 4.0 2138 2163 $handyatomtranslatorarray['cprt'] = 'copyright'; // iTunes 4.0? … … 2140 2165 $handyatomtranslatorarray['covr'] = 'picture'; // iTunes 4.0 2141 2166 $handyatomtranslatorarray['rtng'] = 'rating'; // iTunes 4.0 2142 $handyatomtranslatorarray[ '©grp'] = 'grouping'; // iTunes 4.22167 $handyatomtranslatorarray["\xA9".'grp'] = 'grouping'; // iTunes 4.2 2143 2168 $handyatomtranslatorarray['stik'] = 'stik'; // iTunes 4.9 2144 2169 $handyatomtranslatorarray['pcst'] = 'podcast'; // iTunes 4.9 … … 2148 2173 $handyatomtranslatorarray['egid'] = 'episode_guid'; // iTunes 4.9 2149 2174 $handyatomtranslatorarray['desc'] = 'description'; // iTunes 5.0 2150 $handyatomtranslatorarray[ '©lyr'] = 'lyrics'; // iTunes 5.02175 $handyatomtranslatorarray["\xA9".'lyr'] = 'lyrics'; // iTunes 5.0 2151 2176 $handyatomtranslatorarray['tvnn'] = 'tv_network_name'; // iTunes 6.0 2152 2177 $handyatomtranslatorarray['tvsh'] = 'tv_show_name'; // iTunes 6.0
Note: See TracChangeset
for help on using the changeset viewer.