MediaWiki
REL1_24
|
00001 <?php 00029 class XMPInfo { 00033 public static function getItems() { 00034 if ( !self::$ranHooks ) { 00035 // This is for if someone makes a custom metadata extension. 00036 // For example, a medical wiki might want to decode DICOM xmp properties. 00037 wfRunHooks( 'XMPGetInfo', array( &self::$items ) ); 00038 self::$ranHooks = true; // Only want to do this once. 00039 } 00040 00041 return self::$items; 00042 } 00043 00044 static private $ranHooks = false; 00045 00072 static private $items = array( 00073 'http://ns.adobe.com/exif/1.0/' => array( 00074 'ApertureValue' => array( 00075 'map_group' => 'exif', 00076 'mode' => XMPReader::MODE_SIMPLE, 00077 'validate' => 'validateRational' 00078 ), 00079 'BrightnessValue' => array( 00080 'map_group' => 'exif', 00081 'mode' => XMPReader::MODE_SIMPLE, 00082 'validate' => 'validateRational' 00083 ), 00084 'CompressedBitsPerPixel' => array( 00085 'map_group' => 'exif', 00086 'mode' => XMPReader::MODE_SIMPLE, 00087 'validate' => 'validateRational' 00088 ), 00089 'DigitalZoomRatio' => array( 00090 'map_group' => 'exif', 00091 'mode' => XMPReader::MODE_SIMPLE, 00092 'validate' => 'validateRational' 00093 ), 00094 'ExposureBiasValue' => array( 00095 'map_group' => 'exif', 00096 'mode' => XMPReader::MODE_SIMPLE, 00097 'validate' => 'validateRational' 00098 ), 00099 'ExposureIndex' => array( 00100 'map_group' => 'exif', 00101 'mode' => XMPReader::MODE_SIMPLE, 00102 'validate' => 'validateRational' 00103 ), 00104 'ExposureTime' => array( 00105 'map_group' => 'exif', 00106 'mode' => XMPReader::MODE_SIMPLE, 00107 'validate' => 'validateRational' 00108 ), 00109 'FlashEnergy' => array( 00110 'map_group' => 'exif', 00111 'mode' => XMPReader::MODE_SIMPLE, 00112 'validate' => 'validateRational', 00113 ), 00114 'FNumber' => array( 00115 'map_group' => 'exif', 00116 'mode' => XMPReader::MODE_SIMPLE, 00117 'validate' => 'validateRational' 00118 ), 00119 'FocalLength' => array( 00120 'map_group' => 'exif', 00121 'mode' => XMPReader::MODE_SIMPLE, 00122 'validate' => 'validateRational' 00123 ), 00124 'FocalPlaneXResolution' => array( 00125 'map_group' => 'exif', 00126 'mode' => XMPReader::MODE_SIMPLE, 00127 'validate' => 'validateRational' 00128 ), 00129 'FocalPlaneYResolution' => array( 00130 'map_group' => 'exif', 00131 'mode' => XMPReader::MODE_SIMPLE, 00132 'validate' => 'validateRational' 00133 ), 00134 'GPSAltitude' => array( 00135 'map_group' => 'exif', 00136 'mode' => XMPReader::MODE_SIMPLE, 00137 'validate' => 'validateRational', 00138 ), 00139 'GPSDestBearing' => array( 00140 'map_group' => 'exif', 00141 'mode' => XMPReader::MODE_SIMPLE, 00142 'validate' => 'validateRational' 00143 ), 00144 'GPSDestDistance' => array( 00145 'map_group' => 'exif', 00146 'mode' => XMPReader::MODE_SIMPLE, 00147 'validate' => 'validateRational' 00148 ), 00149 'GPSDOP' => array( 00150 'map_group' => 'exif', 00151 'mode' => XMPReader::MODE_SIMPLE, 00152 'validate' => 'validateRational' 00153 ), 00154 'GPSImgDirection' => array( 00155 'map_group' => 'exif', 00156 'mode' => XMPReader::MODE_SIMPLE, 00157 'validate' => 'validateRational' 00158 ), 00159 'GPSSpeed' => array( 00160 'map_group' => 'exif', 00161 'mode' => XMPReader::MODE_SIMPLE, 00162 'validate' => 'validateRational' 00163 ), 00164 'GPSTrack' => array( 00165 'map_group' => 'exif', 00166 'mode' => XMPReader::MODE_SIMPLE, 00167 'validate' => 'validateRational' 00168 ), 00169 'MaxApertureValue' => array( 00170 'map_group' => 'exif', 00171 'mode' => XMPReader::MODE_SIMPLE, 00172 'validate' => 'validateRational' 00173 ), 00174 'ShutterSpeedValue' => array( 00175 'map_group' => 'exif', 00176 'mode' => XMPReader::MODE_SIMPLE, 00177 'validate' => 'validateRational' 00178 ), 00179 'SubjectDistance' => array( 00180 'map_group' => 'exif', 00181 'mode' => XMPReader::MODE_SIMPLE, 00182 'validate' => 'validateRational' 00183 ), 00184 /* Flash */ 00185 'Flash' => array( 00186 'mode' => XMPReader::MODE_STRUCT, 00187 'children' => array( 00188 'Fired' => true, 00189 'Function' => true, 00190 'Mode' => true, 00191 'RedEyeMode' => true, 00192 'Return' => true, 00193 ), 00194 'validate' => 'validateFlash', 00195 'map_group' => 'exif', 00196 ), 00197 'Fired' => array( 00198 'map_group' => 'exif', 00199 'validate' => 'validateBoolean', 00200 'mode' => XMPReader::MODE_SIMPLE, 00201 'structPart' => true, 00202 ), 00203 'Function' => array( 00204 'map_group' => 'exif', 00205 'validate' => 'validateBoolean', 00206 'mode' => XMPReader::MODE_SIMPLE, 00207 'structPart' => true, 00208 ), 00209 'Mode' => array( 00210 'map_group' => 'exif', 00211 'validate' => 'validateClosed', 00212 'mode' => XMPReader::MODE_SIMPLE, 00213 'choices' => array( '0' => true, '1' => true, 00214 '2' => true, '3' => true ), 00215 'structPart' => true, 00216 ), 00217 'Return' => array( 00218 'map_group' => 'exif', 00219 'validate' => 'validateClosed', 00220 'mode' => XMPReader::MODE_SIMPLE, 00221 'choices' => array( '0' => true, 00222 '2' => true, '3' => true ), 00223 'structPart' => true, 00224 ), 00225 'RedEyeMode' => array( 00226 'map_group' => 'exif', 00227 'validate' => 'validateBoolean', 00228 'mode' => XMPReader::MODE_SIMPLE, 00229 'structPart' => true, 00230 ), 00231 /* End Flash */ 00232 'ISOSpeedRatings' => array( 00233 'map_group' => 'exif', 00234 'mode' => XMPReader::MODE_SEQ, 00235 'validate' => 'validateInteger' 00236 ), 00237 /* end rational things */ 00238 'ColorSpace' => array( 00239 'map_group' => 'exif', 00240 'mode' => XMPReader::MODE_SIMPLE, 00241 'validate' => 'validateClosed', 00242 'choices' => array( '1' => true, '65535' => true ), 00243 ), 00244 'ComponentsConfiguration' => array( 00245 'map_group' => 'exif', 00246 'mode' => XMPReader::MODE_SEQ, 00247 'validate' => 'validateClosed', 00248 'choices' => array( '1' => true, '2' => true, '3' => true, '4' => true, 00249 '5' => true, '6' => true ) 00250 ), 00251 'Contrast' => array( 00252 'map_group' => 'exif', 00253 'mode' => XMPReader::MODE_SIMPLE, 00254 'validate' => 'validateClosed', 00255 'choices' => array( '0' => true, '1' => true, '2' => true ) 00256 ), 00257 'CustomRendered' => array( 00258 'map_group' => 'exif', 00259 'mode' => XMPReader::MODE_SIMPLE, 00260 'validate' => 'validateClosed', 00261 'choices' => array( '0' => true, '1' => true ) 00262 ), 00263 'DateTimeOriginal' => array( 00264 'map_group' => 'exif', 00265 'mode' => XMPReader::MODE_SIMPLE, 00266 'validate' => 'validateDate', 00267 ), 00268 'DateTimeDigitized' => array( /* xmp:CreateDate */ 00269 'map_group' => 'exif', 00270 'mode' => XMPReader::MODE_SIMPLE, 00271 'validate' => 'validateDate', 00272 ), 00273 /* todo: there might be interesting information in 00274 * exif:DeviceSettingDescription, but need to find an 00275 * example 00276 */ 00277 'ExifVersion' => array( 00278 'map_group' => 'exif', 00279 'mode' => XMPReader::MODE_SIMPLE, 00280 ), 00281 'ExposureMode' => array( 00282 'map_group' => 'exif', 00283 'mode' => XMPReader::MODE_SIMPLE, 00284 'validate' => 'validateClosed', 00285 'rangeLow' => 0, 00286 'rangeHigh' => 2, 00287 ), 00288 'ExposureProgram' => array( 00289 'map_group' => 'exif', 00290 'mode' => XMPReader::MODE_SIMPLE, 00291 'validate' => 'validateClosed', 00292 'rangeLow' => 0, 00293 'rangeHigh' => 8, 00294 ), 00295 'FileSource' => array( 00296 'map_group' => 'exif', 00297 'mode' => XMPReader::MODE_SIMPLE, 00298 'validate' => 'validateClosed', 00299 'choices' => array( '3' => true ) 00300 ), 00301 'FlashpixVersion' => array( 00302 'map_group' => 'exif', 00303 'mode' => XMPReader::MODE_SIMPLE, 00304 ), 00305 'FocalLengthIn35mmFilm' => array( 00306 'map_group' => 'exif', 00307 'mode' => XMPReader::MODE_SIMPLE, 00308 'validate' => 'validateInteger', 00309 ), 00310 'FocalPlaneResolutionUnit' => array( 00311 'map_group' => 'exif', 00312 'mode' => XMPReader::MODE_SIMPLE, 00313 'validate' => 'validateClosed', 00314 'choices' => array( '2' => true, '3' => true ), 00315 ), 00316 'GainControl' => array( 00317 'map_group' => 'exif', 00318 'mode' => XMPReader::MODE_SIMPLE, 00319 'validate' => 'validateClosed', 00320 'rangeLow' => 0, 00321 'rangeHigh' => 4, 00322 ), 00323 /* this value is post-processed out later */ 00324 'GPSAltitudeRef' => array( 00325 'map_group' => 'exif', 00326 'mode' => XMPReader::MODE_SIMPLE, 00327 'validate' => 'validateClosed', 00328 'choices' => array( '0' => true, '1' => true ), 00329 ), 00330 'GPSAreaInformation' => array( 00331 'map_group' => 'exif', 00332 'mode' => XMPReader::MODE_SIMPLE, 00333 ), 00334 'GPSDestBearingRef' => array( 00335 'map_group' => 'exif', 00336 'mode' => XMPReader::MODE_SIMPLE, 00337 'validate' => 'validateClosed', 00338 'choices' => array( 'T' => true, 'M' => true ), 00339 ), 00340 'GPSDestDistanceRef' => array( 00341 'map_group' => 'exif', 00342 'mode' => XMPReader::MODE_SIMPLE, 00343 'validate' => 'validateClosed', 00344 'choices' => array( 'K' => true, 'M' => true, 00345 'N' => true ), 00346 ), 00347 'GPSDestLatitude' => array( 00348 'map_group' => 'exif', 00349 'mode' => XMPReader::MODE_SIMPLE, 00350 'validate' => 'validateGPS', 00351 ), 00352 'GPSDestLongitude' => array( 00353 'map_group' => 'exif', 00354 'mode' => XMPReader::MODE_SIMPLE, 00355 'validate' => 'validateGPS', 00356 ), 00357 'GPSDifferential' => array( 00358 'map_group' => 'exif', 00359 'mode' => XMPReader::MODE_SIMPLE, 00360 'validate' => 'validateClosed', 00361 'choices' => array( '0' => true, '1' => true ), 00362 ), 00363 'GPSImgDirectionRef' => array( 00364 'map_group' => 'exif', 00365 'mode' => XMPReader::MODE_SIMPLE, 00366 'validate' => 'validateClosed', 00367 'choices' => array( 'T' => true, 'M' => true ), 00368 ), 00369 'GPSLatitude' => array( 00370 'map_group' => 'exif', 00371 'mode' => XMPReader::MODE_SIMPLE, 00372 'validate' => 'validateGPS', 00373 ), 00374 'GPSLongitude' => array( 00375 'map_group' => 'exif', 00376 'mode' => XMPReader::MODE_SIMPLE, 00377 'validate' => 'validateGPS', 00378 ), 00379 'GPSMapDatum' => array( 00380 'map_group' => 'exif', 00381 'mode' => XMPReader::MODE_SIMPLE, 00382 ), 00383 'GPSMeasureMode' => array( 00384 'map_group' => 'exif', 00385 'mode' => XMPReader::MODE_SIMPLE, 00386 'validate' => 'validateClosed', 00387 'choices' => array( '2' => true, '3' => true ) 00388 ), 00389 'GPSProcessingMethod' => array( 00390 'map_group' => 'exif', 00391 'mode' => XMPReader::MODE_SIMPLE, 00392 ), 00393 'GPSSatellites' => array( 00394 'map_group' => 'exif', 00395 'mode' => XMPReader::MODE_SIMPLE, 00396 ), 00397 'GPSSpeedRef' => array( 00398 'map_group' => 'exif', 00399 'mode' => XMPReader::MODE_SIMPLE, 00400 'validate' => 'validateClosed', 00401 'choices' => array( 'K' => true, 'M' => true, 00402 'N' => true ), 00403 ), 00404 'GPSStatus' => array( 00405 'map_group' => 'exif', 00406 'mode' => XMPReader::MODE_SIMPLE, 00407 'validate' => 'validateClosed', 00408 'choices' => array( 'A' => true, 'V' => true ) 00409 ), 00410 'GPSTimeStamp' => array( 00411 'map_group' => 'exif', 00412 // Note: in exif, GPSDateStamp does not include 00413 // the time, where here it does. 00414 'map_name' => 'GPSDateStamp', 00415 'mode' => XMPReader::MODE_SIMPLE, 00416 'validate' => 'validateDate', 00417 ), 00418 'GPSTrackRef' => array( 00419 'map_group' => 'exif', 00420 'mode' => XMPReader::MODE_SIMPLE, 00421 'validate' => 'validateClosed', 00422 'choices' => array( 'T' => true, 'M' => true ) 00423 ), 00424 'GPSVersionID' => array( 00425 'map_group' => 'exif', 00426 'mode' => XMPReader::MODE_SIMPLE, 00427 ), 00428 'ImageUniqueID' => array( 00429 'map_group' => 'exif', 00430 'mode' => XMPReader::MODE_SIMPLE, 00431 ), 00432 'LightSource' => array( 00433 'map_group' => 'exif', 00434 'mode' => XMPReader::MODE_SIMPLE, 00435 'validate' => 'validateClosed', 00436 /* can't use a range, as it skips... */ 00437 'choices' => array( '0' => true, '1' => true, 00438 '2' => true, '3' => true, '4' => true, 00439 '9' => true, '10' => true, '11' => true, 00440 '12' => true, '13' => true, 00441 '14' => true, '15' => true, 00442 '17' => true, '18' => true, 00443 '19' => true, '20' => true, 00444 '21' => true, '22' => true, 00445 '23' => true, '24' => true, 00446 '255' => true, 00447 ), 00448 ), 00449 'MeteringMode' => array( 00450 'map_group' => 'exif', 00451 'mode' => XMPReader::MODE_SIMPLE, 00452 'validate' => 'validateClosed', 00453 'rangeLow' => 0, 00454 'rangeHigh' => 6, 00455 'choices' => array( '255' => true ), 00456 ), 00457 /* Pixel(X|Y)Dimension are rather useless, but for 00458 * completeness since we do it with exif. 00459 */ 00460 'PixelXDimension' => array( 00461 'map_group' => 'exif', 00462 'mode' => XMPReader::MODE_SIMPLE, 00463 'validate' => 'validateInteger', 00464 ), 00465 'PixelYDimension' => array( 00466 'map_group' => 'exif', 00467 'mode' => XMPReader::MODE_SIMPLE, 00468 'validate' => 'validateInteger', 00469 ), 00470 'Saturation' => array( 00471 'map_group' => 'exif', 00472 'mode' => XMPReader::MODE_SIMPLE, 00473 'validate' => 'validateClosed', 00474 'rangeLow' => 0, 00475 'rangeHigh' => 2, 00476 ), 00477 'SceneCaptureType' => array( 00478 'map_group' => 'exif', 00479 'mode' => XMPReader::MODE_SIMPLE, 00480 'validate' => 'validateClosed', 00481 'rangeLow' => 0, 00482 'rangeHigh' => 3, 00483 ), 00484 'SceneType' => array( 00485 'map_group' => 'exif', 00486 'mode' => XMPReader::MODE_SIMPLE, 00487 'validate' => 'validateClosed', 00488 'choices' => array( '1' => true ), 00489 ), 00490 // Note, 6 is not valid SensingMethod. 00491 'SensingMethod' => array( 00492 'map_group' => 'exif', 00493 'mode' => XMPReader::MODE_SIMPLE, 00494 'validate' => 'validateClosed', 00495 'rangeLow' => 1, 00496 'rangeHigh' => 5, 00497 'choices' => array( '7' => true, 8 => true ), 00498 ), 00499 'Sharpness' => array( 00500 'map_group' => 'exif', 00501 'mode' => XMPReader::MODE_SIMPLE, 00502 'validate' => 'validateClosed', 00503 'rangeLow' => 0, 00504 'rangeHigh' => 2, 00505 ), 00506 'SpectralSensitivity' => array( 00507 'map_group' => 'exif', 00508 'mode' => XMPReader::MODE_SIMPLE, 00509 ), 00510 // This tag should perhaps be displayed to user better. 00511 'SubjectArea' => array( 00512 'map_group' => 'exif', 00513 'mode' => XMPReader::MODE_SEQ, 00514 'validate' => 'validateInteger', 00515 ), 00516 'SubjectDistanceRange' => array( 00517 'map_group' => 'exif', 00518 'mode' => XMPReader::MODE_SIMPLE, 00519 'validate' => 'validateClosed', 00520 'rangeLow' => 0, 00521 'rangeHigh' => 3, 00522 ), 00523 'SubjectLocation' => array( 00524 'map_group' => 'exif', 00525 'mode' => XMPReader::MODE_SEQ, 00526 'validate' => 'validateInteger', 00527 ), 00528 'UserComment' => array( 00529 'map_group' => 'exif', 00530 'mode' => XMPReader::MODE_LANG, 00531 ), 00532 'WhiteBalance' => array( 00533 'map_group' => 'exif', 00534 'mode' => XMPReader::MODE_SIMPLE, 00535 'validate' => 'validateClosed', 00536 'choices' => array( '0' => true, '1' => true ) 00537 ), 00538 ), 00539 'http://ns.adobe.com/tiff/1.0/' => array( 00540 'Artist' => array( 00541 'map_group' => 'exif', 00542 'mode' => XMPReader::MODE_SIMPLE, 00543 ), 00544 'BitsPerSample' => array( 00545 'map_group' => 'exif', 00546 'mode' => XMPReader::MODE_SEQ, 00547 'validate' => 'validateInteger', 00548 ), 00549 'Compression' => array( 00550 'map_group' => 'exif', 00551 'mode' => XMPReader::MODE_SIMPLE, 00552 'validate' => 'validateClosed', 00553 'choices' => array( '1' => true, '6' => true ), 00554 ), 00555 /* this prop should not be used in XMP. dc:rights is the correct prop */ 00556 'Copyright' => array( 00557 'map_group' => 'exif', 00558 'mode' => XMPReader::MODE_LANG, 00559 ), 00560 'DateTime' => array( /* proper prop is xmp:ModifyDate */ 00561 'map_group' => 'exif', 00562 'mode' => XMPReader::MODE_SIMPLE, 00563 'validate' => 'validateDate', 00564 ), 00565 'ImageDescription' => array( /* proper one is dc:description */ 00566 'map_group' => 'exif', 00567 'mode' => XMPReader::MODE_LANG, 00568 ), 00569 'ImageLength' => array( 00570 'map_group' => 'exif', 00571 'mode' => XMPReader::MODE_SIMPLE, 00572 'validate' => 'validateInteger', 00573 ), 00574 'ImageWidth' => array( 00575 'map_group' => 'exif', 00576 'mode' => XMPReader::MODE_SIMPLE, 00577 'validate' => 'validateInteger', 00578 ), 00579 'Make' => array( 00580 'map_group' => 'exif', 00581 'mode' => XMPReader::MODE_SIMPLE, 00582 ), 00583 'Model' => array( 00584 'map_group' => 'exif', 00585 'mode' => XMPReader::MODE_SIMPLE, 00586 ), 00587 /**** Do not extract this property 00588 * It interferes with auto exif rotation. 00589 * 'Orientation' => array( 00590 * 'map_group' => 'exif', 00591 * 'mode' => XMPReader::MODE_SIMPLE, 00592 * 'validate' => 'validateClosed', 00593 * 'choices' => array( '1' => true, '2' => true, '3' => true, '4' => true, 5 => true, 00594 * '6' => true, '7' => true, '8' => true ), 00595 *), 00596 ******/ 00597 'PhotometricInterpretation' => array( 00598 'map_group' => 'exif', 00599 'mode' => XMPReader::MODE_SIMPLE, 00600 'validate' => 'validateClosed', 00601 'choices' => array( '2' => true, '6' => true ), 00602 ), 00603 'PlanerConfiguration' => array( 00604 'map_group' => 'exif', 00605 'mode' => XMPReader::MODE_SIMPLE, 00606 'validate' => 'validateClosed', 00607 'choices' => array( '1' => true, '2' => true ), 00608 ), 00609 'PrimaryChromaticities' => array( 00610 'map_group' => 'exif', 00611 'mode' => XMPReader::MODE_SEQ, 00612 'validate' => 'validateRational', 00613 ), 00614 'ReferenceBlackWhite' => array( 00615 'map_group' => 'exif', 00616 'mode' => XMPReader::MODE_SEQ, 00617 'validate' => 'validateRational', 00618 ), 00619 'ResolutionUnit' => array( 00620 'map_group' => 'exif', 00621 'mode' => XMPReader::MODE_SIMPLE, 00622 'validate' => 'validateClosed', 00623 'choices' => array( '2' => true, '3' => true ), 00624 ), 00625 'SamplesPerPixel' => array( 00626 'map_group' => 'exif', 00627 'mode' => XMPReader::MODE_SIMPLE, 00628 'validate' => 'validateInteger', 00629 ), 00630 'Software' => array( /* see xmp:CreatorTool */ 00631 'map_group' => 'exif', 00632 'mode' => XMPReader::MODE_SIMPLE, 00633 ), 00634 /* ignore TransferFunction */ 00635 'WhitePoint' => array( 00636 'map_group' => 'exif', 00637 'mode' => XMPReader::MODE_SEQ, 00638 'validate' => 'validateRational', 00639 ), 00640 'XResolution' => array( 00641 'map_group' => 'exif', 00642 'mode' => XMPReader::MODE_SIMPLE, 00643 'validate' => 'validateRational', 00644 ), 00645 'YResolution' => array( 00646 'map_group' => 'exif', 00647 'mode' => XMPReader::MODE_SIMPLE, 00648 'validate' => 'validateRational', 00649 ), 00650 'YCbCrCoefficients' => array( 00651 'map_group' => 'exif', 00652 'mode' => XMPReader::MODE_SEQ, 00653 'validate' => 'validateRational', 00654 ), 00655 'YCbCrPositioning' => array( 00656 'map_group' => 'exif', 00657 'mode' => XMPReader::MODE_SIMPLE, 00658 'validate' => 'validateClosed', 00659 'choices' => array( '1' => true, '2' => true ), 00660 ), 00661 /******** 00662 * Disable extracting this property (bug 31944) 00663 * Several files have a string instead of a Seq 00664 * for this property. XMPReader doesn't handle 00665 * mismatched types very gracefully (it marks 00666 * the entire file as invalid, instead of just 00667 * the relavent prop). Since this prop 00668 * doesn't communicate all that useful information 00669 * just disable this prop for now, until such 00670 * XMPReader is more graceful (bug 32172) 00671 * 'YCbCrSubSampling' => array( 00672 * 'map_group' => 'exif', 00673 * 'mode' => XMPReader::MODE_SEQ, 00674 * 'validate' => 'validateClosed', 00675 * 'choices' => array( '1' => true, '2' => true ), 00676 * ), 00677 */ 00678 ), 00679 'http://ns.adobe.com/exif/1.0/aux/' => array( 00680 'Lens' => array( 00681 'map_group' => 'exif', 00682 'mode' => XMPReader::MODE_SIMPLE, 00683 ), 00684 'SerialNumber' => array( 00685 'map_group' => 'exif', 00686 'mode' => XMPReader::MODE_SIMPLE, 00687 ), 00688 'OwnerName' => array( 00689 'map_group' => 'exif', 00690 'map_name' => 'CameraOwnerName', 00691 'mode' => XMPReader::MODE_SIMPLE, 00692 ), 00693 ), 00694 'http://purl.org/dc/elements/1.1/' => array( 00695 'title' => array( 00696 'map_group' => 'general', 00697 'map_name' => 'ObjectName', 00698 'mode' => XMPReader::MODE_LANG 00699 ), 00700 'description' => array( 00701 'map_group' => 'general', 00702 'map_name' => 'ImageDescription', 00703 'mode' => XMPReader::MODE_LANG 00704 ), 00705 'contributor' => array( 00706 'map_group' => 'general', 00707 'map_name' => 'dc-contributor', 00708 'mode' => XMPReader::MODE_BAG 00709 ), 00710 'coverage' => array( 00711 'map_group' => 'general', 00712 'map_name' => 'dc-coverage', 00713 'mode' => XMPReader::MODE_SIMPLE, 00714 ), 00715 'creator' => array( 00716 'map_group' => 'general', 00717 'map_name' => 'Artist', //map with exif Artist, iptc byline (2:80) 00718 'mode' => XMPReader::MODE_SEQ, 00719 ), 00720 'date' => array( 00721 'map_group' => 'general', 00722 // Note, not mapped with other date properties, as this type of date is 00723 // non-specific: "A point or period of time associated with an event in 00724 // the lifecycle of the resource" 00725 'map_name' => 'dc-date', 00726 'mode' => XMPReader::MODE_SEQ, 00727 'validate' => 'validateDate', 00728 ), 00729 /* Do not extract dc:format, as we've got better ways to determine MIME type */ 00730 'identifier' => array( 00731 'map_group' => 'deprecated', 00732 'map_name' => 'Identifier', 00733 'mode' => XMPReader::MODE_SIMPLE, 00734 ), 00735 'language' => array( 00736 'map_group' => 'general', 00737 'map_name' => 'LanguageCode', /* mapped with iptc 2:135 */ 00738 'mode' => XMPReader::MODE_BAG, 00739 'validate' => 'validateLangCode', 00740 ), 00741 'publisher' => array( 00742 'map_group' => 'general', 00743 'map_name' => 'dc-publisher', 00744 'mode' => XMPReader::MODE_BAG, 00745 ), 00746 // for related images/resources 00747 'relation' => array( 00748 'map_group' => 'general', 00749 'map_name' => 'dc-relation', 00750 'mode' => XMPReader::MODE_BAG, 00751 ), 00752 'rights' => array( 00753 'map_group' => 'general', 00754 'map_name' => 'Copyright', 00755 'mode' => XMPReader::MODE_LANG, 00756 ), 00757 // Note: source is not mapped with iptc source, since iptc 00758 // source describes the source of the image in terms of a person 00759 // who provided the image, where this is to describe an image that the 00760 // current one is based on. 00761 'source' => array( 00762 'map_group' => 'general', 00763 'map_name' => 'dc-source', 00764 'mode' => XMPReader::MODE_SIMPLE, 00765 ), 00766 'subject' => array( 00767 'map_group' => 'general', 00768 'map_name' => 'Keywords', /* maps to iptc 2:25 */ 00769 'mode' => XMPReader::MODE_BAG, 00770 ), 00771 'type' => array( 00772 'map_group' => 'general', 00773 'map_name' => 'dc-type', 00774 'mode' => XMPReader::MODE_BAG, 00775 ), 00776 ), 00777 'http://ns.adobe.com/xap/1.0/' => array( 00778 'CreateDate' => array( 00779 'map_group' => 'general', 00780 'map_name' => 'DateTimeDigitized', 00781 'mode' => XMPReader::MODE_SIMPLE, 00782 'validate' => 'validateDate', 00783 ), 00784 'CreatorTool' => array( 00785 'map_group' => 'general', 00786 'map_name' => 'Software', 00787 'mode' => XMPReader::MODE_SIMPLE 00788 ), 00789 'Identifier' => array( 00790 'map_group' => 'general', 00791 'mode' => XMPReader::MODE_BAG, 00792 ), 00793 'Label' => array( 00794 'map_group' => 'general', 00795 'mode' => XMPReader::MODE_SIMPLE, 00796 ), 00797 'ModifyDate' => array( 00798 'map_group' => 'general', 00799 'mode' => XMPReader::MODE_SIMPLE, 00800 'map_name' => 'DateTime', 00801 'validate' => 'validateDate', 00802 ), 00803 'MetadataDate' => array( 00804 'map_group' => 'general', 00805 'mode' => XMPReader::MODE_SIMPLE, 00806 // map_name to be consistent with other date names. 00807 'map_name' => 'DateTimeMetadata', 00808 'validate' => 'validateDate', 00809 ), 00810 'Nickname' => array( 00811 'map_group' => 'general', 00812 'mode' => XMPReader::MODE_SIMPLE, 00813 ), 00814 'Rating' => array( 00815 'map_group' => 'general', 00816 'mode' => XMPReader::MODE_SIMPLE, 00817 'validate' => 'validateRating', 00818 ), 00819 ), 00820 'http://ns.adobe.com/xap/1.0/rights/' => array( 00821 'Certificate' => array( 00822 'map_group' => 'general', 00823 'map_name' => 'RightsCertificate', 00824 'mode' => XMPReader::MODE_SIMPLE, 00825 ), 00826 'Marked' => array( 00827 'map_group' => 'general', 00828 'map_name' => 'Copyrighted', 00829 'mode' => XMPReader::MODE_SIMPLE, 00830 'validate' => 'validateBoolean', 00831 ), 00832 'Owner' => array( 00833 'map_group' => 'general', 00834 'map_name' => 'CopyrightOwner', 00835 'mode' => XMPReader::MODE_BAG, 00836 ), 00837 // this seems similar to dc:rights. 00838 'UsageTerms' => array( 00839 'map_group' => 'general', 00840 'mode' => XMPReader::MODE_LANG, 00841 ), 00842 'WebStatement' => array( 00843 'map_group' => 'general', 00844 'mode' => XMPReader::MODE_SIMPLE, 00845 ), 00846 ), 00847 // XMP media management. 00848 'http://ns.adobe.com/xap/1.0/mm/' => array( 00849 // if we extract the exif UniqueImageID, might 00850 // as well do this too. 00851 'OriginalDocumentID' => array( 00852 'map_group' => 'general', 00853 'mode' => XMPReader::MODE_SIMPLE, 00854 ), 00855 // It might also be useful to do xmpMM:LastURL 00856 // and xmpMM:DerivedFrom as you can potentially, 00857 // get the url of this document/source for this 00858 // document. However whats more likely is you'd 00859 // get a file:// url for the path of the doc, 00860 // which is somewhat of a privacy issue. 00861 ), 00862 'http://creativecommons.org/ns#' => array( 00863 'license' => array( 00864 'map_name' => 'LicenseUrl', 00865 'map_group' => 'general', 00866 'mode' => XMPReader::MODE_SIMPLE, 00867 ), 00868 'morePermissions' => array( 00869 'map_name' => 'MorePermissionsUrl', 00870 'map_group' => 'general', 00871 'mode' => XMPReader::MODE_SIMPLE, 00872 ), 00873 'attributionURL' => array( 00874 'map_group' => 'general', 00875 'map_name' => 'AttributionUrl', 00876 'mode' => XMPReader::MODE_SIMPLE, 00877 ), 00878 'attributionName' => array( 00879 'map_group' => 'general', 00880 'map_name' => 'PreferredAttributionName', 00881 'mode' => XMPReader::MODE_SIMPLE, 00882 ), 00883 ), 00884 //Note, this property affects how jpeg metadata is extracted. 00885 'http://ns.adobe.com/xmp/note/' => array( 00886 'HasExtendedXMP' => array( 00887 'map_group' => 'special', 00888 'mode' => XMPReader::MODE_SIMPLE, 00889 ), 00890 ), 00891 /* Note, in iptc schemas, the legacy properties are denoted 00892 * as deprecated, since other properties should used instead, 00893 * and properties marked as deprecated in the standard are 00894 * are marked as general here as they don't have replacements 00895 */ 00896 'http://ns.adobe.com/photoshop/1.0/' => array( 00897 'City' => array( 00898 'map_group' => 'deprecated', 00899 'mode' => XMPReader::MODE_SIMPLE, 00900 'map_name' => 'CityDest', 00901 ), 00902 'Country' => array( 00903 'map_group' => 'deprecated', 00904 'mode' => XMPReader::MODE_SIMPLE, 00905 'map_name' => 'CountryDest', 00906 ), 00907 'State' => array( 00908 'map_group' => 'deprecated', 00909 'mode' => XMPReader::MODE_SIMPLE, 00910 'map_name' => 'ProvinceOrStateDest', 00911 ), 00912 'DateCreated' => array( 00913 'map_group' => 'deprecated', 00914 // marking as deprecated as the xmp prop preferred 00915 'mode' => XMPReader::MODE_SIMPLE, 00916 'map_name' => 'DateTimeOriginal', 00917 'validate' => 'validateDate', 00918 // note this prop is an XMP, not IPTC date 00919 ), 00920 'CaptionWriter' => array( 00921 'map_group' => 'general', 00922 'mode' => XMPReader::MODE_SIMPLE, 00923 'map_name' => 'Writer', 00924 ), 00925 'Instructions' => array( 00926 'map_group' => 'general', 00927 'mode' => XMPReader::MODE_SIMPLE, 00928 'map_name' => 'SpecialInstructions', 00929 ), 00930 'TransmissionReference' => array( 00931 'map_group' => 'general', 00932 'mode' => XMPReader::MODE_SIMPLE, 00933 'map_name' => 'OriginalTransmissionRef', 00934 ), 00935 'AuthorsPosition' => array( 00936 /* This corresponds with 2:85 00937 * By-line Title, which needs to be 00938 * handled weirdly to correspond 00939 * with iptc/exif. */ 00940 'map_group' => 'special', 00941 'mode' => XMPReader::MODE_SIMPLE 00942 ), 00943 'Credit' => array( 00944 'map_group' => 'general', 00945 'mode' => XMPReader::MODE_SIMPLE, 00946 ), 00947 'Source' => array( 00948 'map_group' => 'general', 00949 'mode' => XMPReader::MODE_SIMPLE, 00950 ), 00951 'Urgency' => array( 00952 'map_group' => 'general', 00953 'mode' => XMPReader::MODE_SIMPLE, 00954 ), 00955 'Category' => array( 00956 // Note, this prop is deprecated, but in general 00957 // group since it doesn't have a replacement. 00958 'map_group' => 'general', 00959 'mode' => XMPReader::MODE_SIMPLE, 00960 'map_name' => 'iimCategory', 00961 ), 00962 'SupplementalCategories' => array( 00963 'map_group' => 'general', 00964 'mode' => XMPReader::MODE_BAG, 00965 'map_name' => 'iimSupplementalCategory', 00966 ), 00967 'Headline' => array( 00968 'map_group' => 'general', 00969 'mode' => XMPReader::MODE_SIMPLE 00970 ), 00971 ), 00972 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/' => array( 00973 'CountryCode' => array( 00974 'map_group' => 'deprecated', 00975 'mode' => XMPReader::MODE_SIMPLE, 00976 'map_name' => 'CountryCodeDest', 00977 ), 00978 'IntellectualGenre' => array( 00979 'map_group' => 'general', 00980 'mode' => XMPReader::MODE_SIMPLE, 00981 ), 00982 // Note, this is a six digit code. 00983 // See: http://cv.iptc.org/newscodes/scene/ 00984 // Since these aren't really all that common, 00985 // we just show the number. 00986 'Scene' => array( 00987 'map_group' => 'general', 00988 'mode' => XMPReader::MODE_BAG, 00989 'validate' => 'validateInteger', 00990 'map_name' => 'SceneCode', 00991 ), 00992 /* Note: SubjectCode should be an 8 ascii digits. 00993 * it is not really an integer (has leading 0's, 00994 * cannot have a +/- sign), but validateInteger 00995 * will let it through. 00996 */ 00997 'SubjectCode' => array( 00998 'map_group' => 'general', 00999 'mode' => XMPReader::MODE_BAG, 01000 'map_name' => 'SubjectNewsCode', 01001 'validate' => 'validateInteger' 01002 ), 01003 'Location' => array( 01004 'map_group' => 'deprecated', 01005 'mode' => XMPReader::MODE_SIMPLE, 01006 'map_name' => 'SublocationDest', 01007 ), 01008 'CreatorContactInfo' => array( 01009 /* Note this maps to 2:118 in iim 01010 * (Contact) field. However those field 01011 * types are slightly different - 2:118 01012 * is free form text field, where this 01013 * is more structured. 01014 */ 01015 'map_group' => 'general', 01016 'mode' => XMPReader::MODE_STRUCT, 01017 'map_name' => 'Contact', 01018 'children' => array( 01019 'CiAdrExtadr' => true, 01020 'CiAdrCity' => true, 01021 'CiAdrCtry' => true, 01022 'CiEmailWork' => true, 01023 'CiTelWork' => true, 01024 'CiAdrPcode' => true, 01025 'CiAdrRegion' => true, 01026 'CiUrlWork' => true, 01027 ), 01028 ), 01029 'CiAdrExtadr' => array( /* address */ 01030 'map_group' => 'general', 01031 'mode' => XMPReader::MODE_SIMPLE, 01032 'structPart' => true, 01033 ), 01034 'CiAdrCity' => array( /* city */ 01035 'map_group' => 'general', 01036 'mode' => XMPReader::MODE_SIMPLE, 01037 'structPart' => true, 01038 ), 01039 'CiAdrCtry' => array( /* country */ 01040 'map_group' => 'general', 01041 'mode' => XMPReader::MODE_SIMPLE, 01042 'structPart' => true, 01043 ), 01044 'CiEmailWork' => array( /* email (possibly separated by ',') */ 01045 'map_group' => 'general', 01046 'mode' => XMPReader::MODE_SIMPLE, 01047 'structPart' => true, 01048 ), 01049 'CiTelWork' => array( /* telephone */ 01050 'map_group' => 'general', 01051 'mode' => XMPReader::MODE_SIMPLE, 01052 'structPart' => true, 01053 ), 01054 'CiAdrPcode' => array( /* postal code */ 01055 'map_group' => 'general', 01056 'mode' => XMPReader::MODE_SIMPLE, 01057 'structPart' => true, 01058 ), 01059 'CiAdrRegion' => array( /* province/state */ 01060 'map_group' => 'general', 01061 'mode' => XMPReader::MODE_SIMPLE, 01062 'structPart' => true, 01063 ), 01064 'CiUrlWork' => array( /* url. Multiple may be separated by comma. */ 01065 'map_group' => 'general', 01066 'mode' => XMPReader::MODE_SIMPLE, 01067 'structPart' => true, 01068 ), 01069 /* End contact info struct properties */ 01070 ), 01071 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/' => array( 01072 'Event' => array( 01073 'map_group' => 'general', 01074 'mode' => XMPReader::MODE_SIMPLE, 01075 ), 01076 'OrganisationInImageName' => array( 01077 'map_group' => 'general', 01078 'mode' => XMPReader::MODE_BAG, 01079 'map_name' => 'OrganisationInImage' 01080 ), 01081 'PersonInImage' => array( 01082 'map_group' => 'general', 01083 'mode' => XMPReader::MODE_BAG, 01084 ), 01085 'MaxAvailHeight' => array( 01086 'map_group' => 'general', 01087 'mode' => XMPReader::MODE_SIMPLE, 01088 'validate' => 'validateInteger', 01089 'map_name' => 'OriginalImageHeight', 01090 ), 01091 'MaxAvailWidth' => array( 01092 'map_group' => 'general', 01093 'mode' => XMPReader::MODE_SIMPLE, 01094 'validate' => 'validateInteger', 01095 'map_name' => 'OriginalImageWidth', 01096 ), 01097 // LocationShown and LocationCreated are handled 01098 // specially because they are hierarchical, but we 01099 // also want to merge with the old non-hierarchical. 01100 'LocationShown' => array( 01101 'map_group' => 'special', 01102 'mode' => XMPReader::MODE_BAGSTRUCT, 01103 'children' => array( 01104 'WorldRegion' => true, 01105 'CountryCode' => true, /* iso code */ 01106 'CountryName' => true, 01107 'ProvinceState' => true, 01108 'City' => true, 01109 'Sublocation' => true, 01110 ), 01111 ), 01112 'LocationCreated' => array( 01113 'map_group' => 'special', 01114 'mode' => XMPReader::MODE_BAGSTRUCT, 01115 'children' => array( 01116 'WorldRegion' => true, 01117 'CountryCode' => true, /* iso code */ 01118 'CountryName' => true, 01119 'ProvinceState' => true, 01120 'City' => true, 01121 'Sublocation' => true, 01122 ), 01123 ), 01124 'WorldRegion' => array( 01125 'map_group' => 'special', 01126 'mode' => XMPReader::MODE_SIMPLE, 01127 'structPart' => true, 01128 ), 01129 'CountryCode' => array( 01130 'map_group' => 'special', 01131 'mode' => XMPReader::MODE_SIMPLE, 01132 'structPart' => true, 01133 ), 01134 'CountryName' => array( 01135 'map_group' => 'special', 01136 'mode' => XMPReader::MODE_SIMPLE, 01137 'structPart' => true, 01138 'map_name' => 'Country', 01139 ), 01140 'ProvinceState' => array( 01141 'map_group' => 'special', 01142 'mode' => XMPReader::MODE_SIMPLE, 01143 'structPart' => true, 01144 'map_name' => 'ProvinceOrState', 01145 ), 01146 'City' => array( 01147 'map_group' => 'special', 01148 'mode' => XMPReader::MODE_SIMPLE, 01149 'structPart' => true, 01150 ), 01151 'Sublocation' => array( 01152 'map_group' => 'special', 01153 'mode' => XMPReader::MODE_SIMPLE, 01154 'structPart' => true, 01155 ), 01156 01157 /* Other props that might be interesting but 01158 * Not currently extracted: 01159 * ArtworkOrObject, (info about objects in picture) 01160 * DigitalSourceType 01161 * RegistryId 01162 */ 01163 ), 01164 01165 /* Plus props we might want to consider: 01166 * (Note: some of these have unclear/incomplete definitions 01167 * from the iptc4xmp standard). 01168 * ImageSupplier (kind of like iptc source field) 01169 * ImageSupplierId (id code for image from supplier) 01170 * CopyrightOwner 01171 * ImageCreator 01172 * Licensor 01173 * Various model release fields 01174 * Property release fields. 01175 */ 01176 ); 01177 }