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