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