3 * This class is just a container for a big array
4 * used by XMPReader to determine which XMP items to
9 /** get the items array
10 * @return Array XMP item configuration array.
12 public static function getItems ( ) {
13 if( !self
::$ranHooks ) {
14 // This is for if someone makes a custom metadata extension.
15 // For example, a medical wiki might want to decode DICOM xmp properties.
16 wfRunHooks('XMPGetInfo', Array(&self
::$items));
17 self
::$ranHooks = true; // Only want to do this once.
22 static private $ranHooks = false;
25 * XMPInfo::$items keeps a list of all the items
26 * we are interested to extract, as well as
27 * information about the item like what type
30 * Format is an array of namespaces,
31 * each containing an array of tags
32 * each tag is an array of information about the
34 * * map_group - what group (used for precedence during conflicts)
35 * * mode - What type of item (self::MODE_SIMPLE usually, see above for all values)
36 * * validate - method to validate input. Could also post-process the input. A string value is assumed to be a static method of XMPValidate. Can also take a array( 'className', 'methodName' ).
37 * * choices - array of potential values (format of 'value' => true ). Only used with validateClosed
38 * * rangeLow and rangeHigh - alternative to choices for numeric ranges. Again for validateClosed only.
39 * * children - for MODE_STRUCT items, allowed children.
40 * * structPart - Indicates that this element can only appear as a member of a structure.
42 * currently this just has a bunch of exif values as this class is only half-done
45 static private $items = array(
46 'http://ns.adobe.com/exif/1.0/' => array(
47 'ApertureValue' => array(
48 'map_group' => 'exif',
49 'mode' => XMPReader
::MODE_SIMPLE
,
50 'validate' => 'validateRational'
52 'BrightnessValue' => array(
53 'map_group' => 'exif',
54 'mode' => XMPReader
::MODE_SIMPLE
,
55 'validate' => 'validateRational'
57 'CompressedBitsPerPixel' => array(
58 'map_group' => 'exif',
59 'mode' => XMPReader
::MODE_SIMPLE
,
60 'validate' => 'validateRational'
62 'DigitalZoomRatio' => array(
63 'map_group' => 'exif',
64 'mode' => XMPReader
::MODE_SIMPLE
,
65 'validate' => 'validateRational'
67 'ExposureBiasValue' => array(
68 'map_group' => 'exif',
69 'mode' => XMPReader
::MODE_SIMPLE
,
70 'validate' => 'validateRational'
72 'ExposureIndex' => array(
73 'map_group' => 'exif',
74 'mode' => XMPReader
::MODE_SIMPLE
,
75 'validate' => 'validateRational'
77 'ExposureTime' => array(
78 'map_group' => 'exif',
79 'mode' => XMPReader
::MODE_SIMPLE
,
80 'validate' => 'validateRational'
82 'FlashEnergy' => array(
83 'map_group' => 'exif',
84 'mode' => XMPReader
::MODE_SIMPLE
,
85 'validate' => 'validateRational',
88 'map_group' => 'exif',
89 'mode' => XMPReader
::MODE_SIMPLE
,
90 'validate' => 'validateRational'
92 'FocalLength' => array(
93 'map_group' => 'exif',
94 'mode' => XMPReader
::MODE_SIMPLE
,
95 'validate' => 'validateRational'
97 'FocalPlaneXResolution' => array(
98 'map_group' => 'exif',
99 'mode' => XMPReader
::MODE_SIMPLE
,
100 'validate' => 'validateRational'
102 'FocalPlaneYResolution' => array(
103 'map_group' => 'exif',
104 'mode' => XMPReader
::MODE_SIMPLE
,
105 'validate' => 'validateRational'
107 'GPSAltitude' => array(
108 'map_group' => 'exif',
109 'mode' => XMPReader
::MODE_SIMPLE
,
110 'validate' => 'validateRational',
112 'GPSDestBearing' => array(
113 'map_group' => 'exif',
114 'mode' => XMPReader
::MODE_SIMPLE
,
115 'validate' => 'validateRational'
117 'GPSDestDistance' => array(
118 'map_group' => 'exif',
119 'mode' => XMPReader
::MODE_SIMPLE
,
120 'validate' => 'validateRational'
123 'map_group' => 'exif',
124 'mode' => XMPReader
::MODE_SIMPLE
,
125 'validate' => 'validateRational'
127 'GPSImgDirection' => array(
128 'map_group' => 'exif',
129 'mode' => XMPReader
::MODE_SIMPLE
,
130 'validate' => 'validateRational'
133 'map_group' => 'exif',
134 'mode' => XMPReader
::MODE_SIMPLE
,
135 'validate' => 'validateRational'
138 'map_group' => 'exif',
139 'mode' => XMPReader
::MODE_SIMPLE
,
140 'validate' => 'validateRational'
142 'MaxApertureValue' => array(
143 'map_group' => 'exif',
144 'mode' => XMPReader
::MODE_SIMPLE
,
145 'validate' => 'validateRational'
147 'ShutterSpeedValue' => array(
148 'map_group' => 'exif',
149 'mode' => XMPReader
::MODE_SIMPLE
,
150 'validate' => 'validateRational'
152 'SubjectDistance' => array(
153 'map_group' => 'exif',
154 'mode' => XMPReader
::MODE_SIMPLE
,
155 'validate' => 'validateRational'
159 'mode' => XMPReader
::MODE_STRUCT
,
164 'RedEyeMode' => true,
167 'validate' => 'validateFlash',
168 'map_group' => 'exif',
171 'map_group' => 'exif',
172 'validate' => 'validateBoolean',
173 'mode' => XMPReader
::MODE_SIMPLE
,
177 'map_group' => 'exif',
178 'validate' => 'validateBoolean',
179 'mode' => XMPReader
::MODE_SIMPLE
,
183 'map_group' => 'exif',
184 'validate' => 'validateClosed',
185 'mode' => XMPReader
::MODE_SIMPLE
,
186 'choices' => array( '0' => true, '1' => true,
187 '2' => true, '3' => true ),
191 'map_group' => 'exif',
192 'validate' => 'validateClosed',
193 'mode' => XMPReader
::MODE_SIMPLE
,
194 'choices' => array( '0' => true,
195 '2' => true, '3' => true ),
198 'RedEyeMode' => array(
199 'map_group' => 'exif',
200 'validate' => 'validateBoolean',
201 'mode' => XMPReader
::MODE_SIMPLE
,
205 'ISOSpeedRatings' => array(
206 'map_group' => 'exif',
207 'mode' => XMPReader
::MODE_SEQ
,
208 'validate' => 'validateInteger'
210 /* end rational things */
211 'ColorSpace' => array(
212 'map_group' => 'exif',
213 'mode' => XMPReader
::MODE_SIMPLE
,
214 'validate' => 'validateClosed',
215 'choices' => array( '1' => true, '65535' => true ),
217 'ComponentsConfiguration' => array(
218 'map_group' => 'exif',
219 'mode' => XMPReader
::MODE_SEQ
,
220 'validate' => 'validateClosed',
221 'choices' => array( '1' => true, '2' => true, '3' => true, '4' => true,
222 '5' => true, '6' => true )
225 'map_group' => 'exif',
226 'mode' => XMPReader
::MODE_SIMPLE
,
227 'validate' => 'validateClosed',
228 'choices' => array( '0' => true, '1' => true, '2' => true )
230 'CustomRendered' => array(
231 'map_group' => 'exif',
232 'mode' => XMPReader
::MODE_SIMPLE
,
233 'validate' => 'validateClosed',
234 'choices' => array( '0' => true, '1' => true )
236 'DateTimeOriginal' => array(
237 'map_group' => 'exif',
238 'mode' => XMPReader
::MODE_SIMPLE
,
239 'validate' => 'validateDate',
241 'DateTimeDigitized' => array( /* xmp:CreateDate */
242 'map_group' => 'exif',
243 'mode' => XMPReader
::MODE_SIMPLE
,
244 'validate' => 'validateDate',
246 /* todo: there might be interesting information in
247 * exif:DeviceSettingDescription, but need to find an
250 'ExifVersion' => array(
251 'map_group' => 'exif',
252 'mode' => XMPReader
::MODE_SIMPLE
,
254 'ExposureMode' => array(
255 'map_group' => 'exif',
256 'mode' => XMPReader
::MODE_SIMPLE
,
257 'validate' => 'validateClosed',
261 'ExposureProgram' => array(
262 'map_group' => 'exif',
263 'mode' => XMPReader
::MODE_SIMPLE
,
264 'validate' => 'validateClosed',
268 'FileSource' => array(
269 'map_group' => 'exif',
270 'mode' => XMPReader
::MODE_SIMPLE
,
271 'validate' => 'validateClosed',
272 'choices' => array( '3' => true )
274 'FlashpixVersion' => array(
275 'map_group' => 'exif',
276 'mode' => XMPReader
::MODE_SIMPLE
,
278 'FocalLengthIn35mmFilm' => array(
279 'map_group' => 'exif',
280 'mode' => XMPReader
::MODE_SIMPLE
,
281 'validate' => 'validateInteger',
283 'FocalPlaneResolutionUnit' => array(
284 'map_group' => 'exif',
285 'mode' => XMPReader
::MODE_SIMPLE
,
286 'validate' => 'validateClosed',
287 'choices' => array( '2' => true, '3' => true ),
289 'GainControl' => array(
290 'map_group' => 'exif',
291 'mode' => XMPReader
::MODE_SIMPLE
,
292 'validate' => 'validateClosed',
296 /* this value is post-processed out later */
297 'GPSAltitudeRef' => array(
298 'map_group' => 'exif',
299 'mode' => XMPReader
::MODE_SIMPLE
,
300 'validate' => 'validateClosed',
301 'choices' => array( '0' => true, '1' => true ),
303 'GPSAreaInformation' => array(
304 'map_group' => 'exif',
305 'mode' => XMPReader
::MODE_SIMPLE
,
307 'GPSDestBearingRef' => array(
308 'map_group' => 'exif',
309 'mode' => XMPReader
::MODE_SIMPLE
,
310 'validate' => 'validateClosed',
311 'choices' => array( 'T' => true, 'M' => true ),
313 'GPSDestDistanceRef' => array(
314 'map_group' => 'exif',
315 'mode' => XMPReader
::MODE_SIMPLE
,
316 'validate' => 'validateClosed',
317 'choices' => array( 'K' => true, 'M' => true,
320 'GPSDestLatitude' => array(
321 'map_group' => 'exif',
322 'mode' => XMPReader
::MODE_SIMPLE
,
323 'validate' => 'validateGPS',
325 'GPSDestLongitude' => array(
326 'map_group' => 'exif',
327 'mode' => XMPReader
::MODE_SIMPLE
,
328 'validate' => 'validateGPS',
330 'GPSDifferential' => array(
331 'map_group' => 'exif',
332 'mode' => XMPReader
::MODE_SIMPLE
,
333 'validate' => 'validateClosed',
334 'choices' => array( '0' => true, '1' => true ),
336 'GPSImgDirectionRef' => array(
337 'map_group' => 'exif',
338 'mode' => XMPReader
::MODE_SIMPLE
,
339 'validate' => 'validateClosed',
340 'choices' => array( 'T' => true, 'M' => true ),
342 'GPSLatitude' => array(
343 'map_group' => 'exif',
344 'mode' => XMPReader
::MODE_SIMPLE
,
345 'validate' => 'validateGPS',
347 'GPSLongitude' => array(
348 'map_group' => 'exif',
349 'mode' => XMPReader
::MODE_SIMPLE
,
350 'validate' => 'validateGPS',
352 'GPSMapDatum' => array(
353 'map_group' => 'exif',
354 'mode' => XMPReader
::MODE_SIMPLE
,
356 'GPSMeasureMode' => array(
357 'map_group' => 'exif',
358 'mode' => XMPReader
::MODE_SIMPLE
,
359 'validate' => 'validateClosed',
360 'choices' => array( '2' => true, '3' => true )
362 'GPSProcessingMethod' => array(
363 'map_group' => 'exif',
364 'mode' => XMPReader
::MODE_SIMPLE
,
366 'GPSSatellites' => array(
367 'map_group' => 'exif',
368 'mode' => XMPReader
::MODE_SIMPLE
,
370 'GPSSpeedRef' => array(
371 'map_group' => 'exif',
372 'mode' => XMPReader
::MODE_SIMPLE
,
373 'validate' => 'validateClosed',
374 'choices' => array( 'K' => true, 'M' => true,
377 'GPSStatus' => array(
378 'map_group' => 'exif',
379 'mode' => XMPReader
::MODE_SIMPLE
,
380 'validate' => 'validateClosed',
381 'choices' => array( 'A' => true, 'V' => true )
383 'GPSTimeStamp' => array(
384 'map_group' => 'exif',
385 // Note: in exif, GPSDateStamp does not include
386 // the time, where here it does.
387 'map_name' => 'GPSDateStamp',
388 'mode' => XMPReader
::MODE_SIMPLE
,
389 'validate' => 'validateDate',
391 'GPSTrackRef' => array(
392 'map_group' => 'exif',
393 'mode' => XMPReader
::MODE_SIMPLE
,
394 'validate' => 'validateClosed',
395 'choices' => array( 'T' => true, 'M' => true )
397 'GPSVersionID' => array(
398 'map_group' => 'exif',
399 'mode' => XMPReader
::MODE_SIMPLE
,
401 'ImageUniqueID' => array(
402 'map_group' => 'exif',
403 'mode' => XMPReader
::MODE_SIMPLE
,
405 'LightSource' => array(
406 'map_group' => 'exif',
407 'mode' => XMPReader
::MODE_SIMPLE
,
408 'validate' => 'validateClosed',
409 /* can't use a range, as it skips... */
410 'choices' => array( '0' => true, '1' => true,
411 '2' => true, '3' => true, '4' => true,
412 '9' => true, '10' => true, '11' => true,
413 '12' => true, '13' => true,
414 '14' => true, '15' => true,
415 '17' => true, '18' => true,
416 '19' => true, '20' => true,
417 '21' => true, '22' => true,
418 '23' => true, '24' => true,
422 'MeteringMode' => array(
423 'map_group' => 'exif',
424 'mode' => XMPReader
::MODE_SIMPLE
,
425 'validate' => 'validateClosed',
428 'choices' => array( '255' => true ),
430 /* Pixel(X|Y)Dimension are rather useless, but for
431 * completeness since we do it with exif.
433 'PixelXDimension' => array(
434 'map_group' => 'exif',
435 'mode' => XMPReader
::MODE_SIMPLE
,
436 'validate' => 'validateInteger',
438 'PixelYDimension' => array(
439 'map_group' => 'exif',
440 'mode' => XMPReader
::MODE_SIMPLE
,
441 'validate' => 'validateInteger',
443 'Saturation' => array(
444 'map_group' => 'exif',
445 'mode' => XMPReader
::MODE_SIMPLE
,
446 'validate' => 'validateClosed',
450 'SceneCaptureType' => array(
451 'map_group' => 'exif',
452 'mode' => XMPReader
::MODE_SIMPLE
,
453 'validate' => 'validateClosed',
457 'SceneType' => array(
458 'map_group' => 'exif',
459 'mode' => XMPReader
::MODE_SIMPLE
,
460 'validate' => 'validateClosed',
461 'choices' => array( '1' => true ),
463 // Note, 6 is not valid SensingMethod.
464 'SensingMethod' => array(
465 'map_group' => 'exif',
466 'mode' => XMPReader
::MODE_SIMPLE
,
467 'validate' => 'validateClosed',
470 'choices' => array( '7' => true, 8 => true ),
472 'Sharpness' => array(
473 'map_group' => 'exif',
474 'mode' => XMPReader
::MODE_SIMPLE
,
475 'validate' => 'validateClosed',
479 'SpectralSensitivity' => array(
480 'map_group' => 'exif',
481 'mode' => XMPReader
::MODE_SIMPLE
,
483 // This tag should perhaps be displayed to user better.
484 'SubjectArea' => array(
485 'map_group' => 'exif',
486 'mode' => XMPReader
::MODE_SEQ
,
487 'validate' => 'validateInteger',
489 'SubjectDistanceRange' => array(
490 'map_group' => 'exif',
491 'mode' => XMPReader
::MODE_SIMPLE
,
492 'validate' => 'validateClosed',
496 'SubjectLocation' => array(
497 'map_group' => 'exif',
498 'mode' => XMPReader
::MODE_SEQ
,
499 'validate' => 'validateInteger',
501 'UserComment' => array(
502 'map_group' => 'exif',
503 'mode' => XMPReader
::MODE_LANG
,
505 'WhiteBalance' => array(
506 'map_group' => 'exif',
507 'mode' => XMPReader
::MODE_SIMPLE
,
508 'validate' => 'validateClosed',
509 'choices' => array( '0' => true, '1' => true )
512 'http://ns.adobe.com/tiff/1.0/' => array(
514 'map_group' => 'exif',
515 'mode' => XMPReader
::MODE_SIMPLE
,
517 'BitsPerSample' => array(
518 'map_group' => 'exif',
519 'mode' => XMPReader
::MODE_SEQ
,
520 'validate' => 'validateInteger',
522 'Compression' => array(
523 'map_group' => 'exif',
524 'mode' => XMPReader
::MODE_SIMPLE
,
525 'validate' => 'validateClosed',
526 'choices' => array( '1' => true, '6' => true ),
528 /* this prop should not be used in XMP. dc:rights is the correct prop */
529 'Copyright' => array(
530 'map_group' => 'exif',
531 'mode' => XMPReader
::MODE_LANG
,
533 'DateTime' => array( /* proper prop is xmp:ModifyDate */
534 'map_group' => 'exif',
535 'mode' => XMPReader
::MODE_SIMPLE
,
536 'validate' => 'validateDate',
538 'ImageDescription' => array( /* proper one is dc:description */
539 'map_group' => 'exif',
540 'mode' => XMPReader
::MODE_LANG
,
542 'ImageLength' => array(
543 'map_group' => 'exif',
544 'mode' => XMPReader
::MODE_SIMPLE
,
545 'validate' => 'validateInteger',
547 'ImageWidth' => array(
548 'map_group' => 'exif',
549 'mode' => XMPReader
::MODE_SIMPLE
,
550 'validate' => 'validateInteger',
553 'map_group' => 'exif',
554 'mode' => XMPReader
::MODE_SIMPLE
,
557 'map_group' => 'exif',
558 'mode' => XMPReader
::MODE_SIMPLE
,
560 'Orientation' => array(
561 'map_group' => 'exif',
562 'mode' => XMPReader
::MODE_SIMPLE
,
563 'validate' => 'validateClosed',
564 'choices' => array( '1' => true, '2' => true, '3' => true, '4' => true, 5 => true,
565 '6' => true, '7' => true, '8' => true ),
567 'PhotometricInterpretation' => array(
568 'map_group' => 'exif',
569 'mode' => XMPReader
::MODE_SIMPLE
,
570 'validate' => 'validateClosed',
571 'choices' => array( '2' => true, '6' => true ),
573 'PlanerConfiguration' => array(
574 'map_group' => 'exif',
575 'mode' => XMPReader
::MODE_SIMPLE
,
576 'validate' => 'validateClosed',
577 'choices' => array( '1' => true, '2' => true ),
579 'PrimaryChromaticities' => array(
580 'map_group' => 'exif',
581 'mode' => XMPReader
::MODE_SEQ
,
582 'validate' => 'validateRational',
584 'ReferenceBlackWhite' => array(
585 'map_group' => 'exif',
586 'mode' => XMPReader
::MODE_SEQ
,
587 'validate' => 'validateRational',
589 'ResolutionUnit' => array(
590 'map_group' => 'exif',
591 'mode' => XMPReader
::MODE_SIMPLE
,
592 'validate' => 'validateClosed',
593 'choices' => array( '2' => true, '3' => true ),
595 'SamplesPerPixel' => array(
596 'map_group' => 'exif',
597 'mode' => XMPReader
::MODE_SIMPLE
,
598 'validate' => 'validateInteger',
600 'Software' => array( /* see xmp:CreatorTool */
601 'map_group' => 'exif',
602 'mode' => XMPReader
::MODE_SIMPLE
,
604 /* ignore TransferFunction */
605 'WhitePoint' => array(
606 'map_group' => 'exif',
607 'mode' => XMPReader
::MODE_SEQ
,
608 'validate' => 'validateRational',
610 'XResolution' => array(
611 'map_group' => 'exif',
612 'mode' => XMPReader
::MODE_SIMPLE
,
613 'validate' => 'validateRational',
615 'YResolution' => array(
616 'map_group' => 'exif',
617 'mode' => XMPReader
::MODE_SIMPLE
,
618 'validate' => 'validateRational',
620 'YCbCrCoefficients' => array(
621 'map_group' => 'exif',
622 'mode' => XMPReader
::MODE_SEQ
,
623 'validate' => 'validateRational',
625 'YCbCrPositioning' => array(
626 'map_group' => 'exif',
627 'mode' => XMPReader
::MODE_SIMPLE
,
628 'validate' => 'validateClosed',
629 'choices' => array( '1' => true, '2' => true ),
631 'YCbCrSubSampling' => array(
632 'map_group' => 'exif',
633 'mode' => XMPReader
::MODE_SEQ
,
634 'validate' => 'validateClosed',
635 'choices' => array( '1' => true, '2' => true ),
638 'http://ns.adobe.com/exif/1.0/aux/' => array(
640 'map_group' => 'exif',
641 'mode' => XMPReader
::MODE_SIMPLE
,
643 'SerialNumber' => array(
644 'map_group' => 'exif',
645 'mode' => XMPReader
::MODE_SIMPLE
,
647 'OwnerName' => array(
648 'map_group' => 'exif',
649 'map_name' => 'CameraOwnerName',
650 'mode' => XMPReader
::MODE_SIMPLE
,
653 'http://purl.org/dc/elements/1.1/' => array(
655 'map_group' => 'general',
656 'map_name' => 'ObjectName',
657 'mode' => XMPReader
::MODE_LANG
659 'description' => array(
660 'map_group' => 'general',
661 'map_name' => 'ImageDescription',
662 'mode' => XMPReader
::MODE_LANG
664 'contributor' => array(
665 'map_group' => 'general',
666 'map_name' => 'dc-contributor',
667 'mode' => XMPReader
::MODE_BAG
670 'map_group' => 'general',
671 'map_name' => 'dc-coverage',
672 'mode' => XMPReader
::MODE_SIMPLE
,
675 'map_group' => 'general',
676 'map_name' => 'Artist', //map with exif Artist, iptc byline (2:80)
677 'mode' => XMPReader
::MODE_SEQ
,
680 'map_group' => 'general',
681 // Note, not mapped with other date properties, as this type of date is
682 // non-specific: "A point or period of time associated with an event in
683 // the lifecycle of the resource"
684 'map_name' => 'dc-date',
685 'mode' => XMPReader
::MODE_SEQ
,
686 'validate' => 'validateDate',
688 /* Do not extract dc:format, as we've got better ways to determine mimetype */
689 'identifier' => array(
690 'map_group' => 'deprecated',
691 'map_name' => 'Identifier',
692 'mode' => XMPReader
::MODE_SIMPLE
,
695 'map_group' => 'general',
696 'map_name' => 'LanguageCode', /* mapped with iptc 2:135 */
697 'mode' => XMPReader
::MODE_BAG
,
698 'validate' => 'validateLangCode',
700 'publisher' => array(
701 'map_group' => 'general',
702 'map_name' => 'dc-publisher',
703 'mode' => XMPReader
::MODE_BAG
,
705 // for related images/resources
707 'map_group' => 'general',
708 'map_name' => 'dc-relation',
709 'mode' => XMPReader
::MODE_BAG
,
712 'map_group' => 'general',
713 'map_name' => 'Copyright',
714 'mode' => XMPReader
::MODE_LANG
,
716 // Note: source is not mapped with iptc source, since iptc
717 // source describes the source of the image in terms of a person
718 // who provided the image, where this is to describe an image that the
719 // current one is based on.
721 'map_group' => 'general',
722 'map_name' => 'dc-source',
723 'mode' => XMPReader
::MODE_SIMPLE
,
726 'map_group' => 'general',
727 'map_name' => 'Keywords', /* maps to iptc 2:25 */
728 'mode' => XMPReader
::MODE_BAG
,
731 'map_group' => 'general',
732 'map_name' => 'dc-type',
733 'mode' => XMPReader
::MODE_BAG
,
736 'http://ns.adobe.com/xap/1.0/' => array(
737 'CreateDate' => array(
738 'map_group' => 'general',
739 'map_name' => 'DateTimeDigitized',
740 'mode' => XMPReader
::MODE_SIMPLE
,
741 'validate' => 'validateDate',
743 'CreatorTool' => array(
744 'map_group' => 'general',
745 'map_name' => 'Software',
746 'mode' => XMPReader
::MODE_SIMPLE
748 'Identifier' => array(
749 'map_group' => 'general',
750 'mode' => XMPReader
::MODE_BAG
,
753 'map_group' => 'general',
754 'mode' => XMPReader
::MODE_SIMPLE
,
756 'ModifyDate' => array(
757 'map_group' => 'general',
758 'mode' => XMPReader
::MODE_SIMPLE
,
759 'map_name' => 'DateTime',
760 'validate' => 'validateDate',
762 'MetadataDate' => array(
763 'map_group' => 'general',
764 'mode' => XMPReader
::MODE_SIMPLE
,
765 // map_name to be consistent with other date names.
766 'map_name' => 'DateTimeMetadata',
767 'validate' => 'validateDate',
770 'map_group' => 'general',
771 'mode' => XMPReader
::MODE_SIMPLE
,
774 'map_group' => 'general',
775 'mode' => XMPReader
::MODE_SIMPLE
,
776 'validate' => 'validateRating',
779 'http://ns.adobe.com/xap/1.0/rights/' => array(
780 'Certificate' => array(
781 'map_group' => 'general',
782 'map_name' => 'RightsCertificate',
783 'mode' => XMPReader
::MODE_SIMPLE
,
786 'map_group' => 'general',
787 'map_name' => 'Copyrighted',
788 'mode' => XMPReader
::MODE_SIMPLE
,
789 'validate' => 'validateBoolean',
792 'map_group' => 'general',
793 'map_name' => 'CopyrightOwner',
794 'mode' => XMPReader
::MODE_BAG
,
796 // this seems similar to dc:rights.
797 'UsageTerms' => array(
798 'map_group' => 'general',
799 'mode' => XMPReader
::MODE_LANG
,
801 'WebStatement' => array(
802 'map_group' => 'general',
803 'mode' => XMPReader
::MODE_SIMPLE
,
806 // XMP media management.
807 'http://ns.adobe.com/xap/1.0/mm/' => array(
808 // if we extract the exif UniqueImageID, might
809 // as well do this too.
810 'OriginalDocumentID' => array(
811 'map_group' => 'general',
812 'mode' => XMPReader
::MODE_SIMPLE
,
814 // It might also be useful to do xmpMM:LastURL
815 // and xmpMM:DerivedFrom as you can potentially,
816 // get the url of this document/source for this
817 // document. However whats more likely is you'd
818 // get a file:// url for the path of the doc,
819 // which is somewhat of a privacy issue.
821 'http://creativecommons.org/ns#' => array(
823 'map_name' => 'LicenseUrl',
824 'map_group' => 'general',
825 'mode' => XMPReader
::MODE_SIMPLE
,
827 'morePermissions' => array(
828 'map_name' => 'MorePermissionsUrl',
829 'map_group' => 'general',
830 'mode' => XMPReader
::MODE_SIMPLE
,
832 'attributionURL' => array(
833 'map_group' => 'general',
834 'map_name' => 'AttributionUrl',
835 'mode' => XMPReader
::MODE_SIMPLE
,
837 'attributionName' => array(
838 'map_group' => 'general',
839 'map_name' => 'PreferredAttributionName',
840 'mode' => XMPReader
::MODE_SIMPLE
,
843 //Note, this property affects how jpeg metadata is extracted.
844 'http://ns.adobe.com/xmp/note/' => array(
845 'HasExtendedXMP' => array(
846 'map_group' => 'special',
847 'mode' => XMPReader
::MODE_SIMPLE
,
850 /* Note, in iptc schemas, the legacy properties are denoted
851 * as deprecated, since other properties should used instead,
852 * and properties marked as deprecated in the standard are
853 * are marked as general here as they don't have replacements
855 'http://ns.adobe.com/photoshop/1.0/' => array(
857 'map_group' => 'deprecated',
858 'mode' => XMPReader
::MODE_SIMPLE
,
859 'map_name' => 'CityDest',
862 'map_group' => 'deprecated',
863 'mode' => XMPReader
::MODE_SIMPLE
,
864 'map_name' => 'CountryDest',
867 'map_group' => 'deprecated',
868 'mode' => XMPReader
::MODE_SIMPLE
,
869 'map_name' => 'ProvinceOrStateDest',
871 'DateCreated' => array(
872 'map_group' => 'deprecated',
873 // marking as deprecated as the xmp prop preferred
874 'mode' => XMPReader
::MODE_SIMPLE
,
875 'map_name' => 'DateTimeOriginal',
876 'validate' => 'validateDate',
877 // note this prop is an XMP, not IPTC date
879 'CaptionWriter' => array(
880 'map_group' => 'general',
881 'mode' => XMPReader
::MODE_SIMPLE
,
882 'map_name' => 'Writer',
884 'Instructions' => array(
885 'map_group' => 'general',
886 'mode' => XMPReader
::MODE_SIMPLE
,
887 'map_name' => 'SpecialInstructions',
889 'TransmissionReference' => array(
890 'map_group' => 'general',
891 'mode' => XMPReader
::MODE_SIMPLE
,
892 'map_name' => 'OriginalTransmissionRef',
894 'AuthorsPosition' => array(
895 /* This corresponds with 2:85
896 * By-line Title, which needs to be
897 * handled weirdly to correspond
899 'map_group' => 'special',
900 'mode' => XMPReader
::MODE_SIMPLE
903 'map_group' => 'general',
904 'mode' => XMPReader
::MODE_SIMPLE
,
907 'map_group' => 'general',
908 'mode' => XMPReader
::MODE_SIMPLE
,
911 'map_group' => 'general',
912 'mode' => XMPReader
::MODE_SIMPLE
,
915 // Note, this prop is deprecated, but in general
916 // group since it doesn't have a replacement.
917 'map_group' => 'general',
918 'mode' => XMPReader
::MODE_SIMPLE
,
919 'map_name' => 'iimCategory',
921 'SupplementalCategories' => array(
922 'map_group' => 'general',
923 'mode' => XMPReader
::MODE_BAG
,
924 'map_name' => 'iimSupplementalCategory',
927 'map_group' => 'general',
928 'mode' => XMPReader
::MODE_SIMPLE
931 'http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/' => array(
932 'CountryCode' => array(
933 'map_group' => 'deprecated',
934 'mode' => XMPReader
::MODE_SIMPLE
,
935 'map_name' => 'CountryCodeDest',
937 'IntellectualGenre' => array(
938 'map_group' => 'general',
939 'mode' => XMPReader
::MODE_SIMPLE
,
941 // Note, this is a six digit code.
942 // See: http://cv.iptc.org/newscodes/scene/
943 // Since these aren't really all that common,
944 // we just show the number.
946 'map_group' => 'general',
947 'mode' => XMPReader
::MODE_BAG
,
948 'validate' => 'validateInteger',
949 'map_name' => 'SceneCode',
951 /* Note: SubjectCode should be an 8 ascii digits.
952 * it is not really an integer (has leading 0's,
953 * cannot have a +/- sign), but validateInteger
954 * will let it through.
956 'SubjectCode' => array(
957 'map_group' => 'general',
958 'mode' => XMPReader
::MODE_BAG
,
959 'map_name' => 'SubjectNewsCode',
960 'validate' => 'validateInteger'
963 'map_group' => 'deprecated',
964 'mode' => XMPReader
::MODE_SIMPLE
,
965 'map_name' => 'SublocationDest',
967 'CreatorContactInfo' => array(
968 /* Note this maps to 2:118 in iim
969 * (Contact) field. However those field
970 * types are slightly different - 2:118
971 * is free form text field, where this
972 * is more structured.
974 'map_group' => 'general',
975 'mode' => XMPReader
::MODE_STRUCT
,
976 'map_name' => 'Contact',
978 'CiAdrExtadr' => true,
981 'CiEmailWork' => true,
983 'CiAdrPcode' => true,
984 'CiAdrRegion' => true,
988 'CiAdrExtadr' => array( /* address */
989 'map_group' => 'general',
990 'mode' => XMPReader
::MODE_SIMPLE
,
993 'CiAdrCity' => array( /* city */
994 'map_group' => 'general',
995 'mode' => XMPReader
::MODE_SIMPLE
,
998 'CiAdrCtry' => array( /* country */
999 'map_group' => 'general',
1000 'mode' => XMPReader
::MODE_SIMPLE
,
1001 'structPart'=> true,
1003 'CiEmailWork' => array( /* email (possibly separated by ',') */
1004 'map_group' => 'general',
1005 'mode' => XMPReader
::MODE_SIMPLE
,
1006 'structPart'=> true,
1008 'CiTelWork' => array( /* telephone */
1009 'map_group' => 'general',
1010 'mode' => XMPReader
::MODE_SIMPLE
,
1011 'structPart'=> true,
1013 'CiAdrPcode' => array( /* postal code */
1014 'map_group' => 'general',
1015 'mode' => XMPReader
::MODE_SIMPLE
,
1016 'structPart'=> true,
1018 'CiAdrRegion' => array( /* province/state */
1019 'map_group' => 'general',
1020 'mode' => XMPReader
::MODE_SIMPLE
,
1021 'structPart'=> true,
1023 'CiUrlWork' => array( /* url. Multiple may be separated by comma. */
1024 'map_group' => 'general',
1025 'mode' => XMPReader
::MODE_SIMPLE
,
1026 'structPart'=> true,
1028 /* End contact info struct properties */
1030 'http://iptc.org/std/Iptc4xmpExt/2008-02-29/' => array(
1032 'map_group' => 'general',
1033 'mode' => XMPReader
::MODE_SIMPLE
,
1035 'OrganisationInImageName' => array(
1036 'map_group' => 'general',
1037 'mode' => XMPReader
::MODE_BAG
,
1038 'map_name' => 'OrganisationInImage'
1040 'PersonInImage' => array(
1041 'map_group' => 'general',
1042 'mode' => XMPReader
::MODE_BAG
,
1044 'MaxAvailHeight' => array(
1045 'map_group' => 'general',
1046 'mode' => XMPReader
::MODE_SIMPLE
,
1047 'validate' => 'validateInteger',
1048 'map_name' => 'OriginalImageHeight',
1050 'MaxAvailWidth' => array(
1051 'map_group' => 'general',
1052 'mode' => XMPReader
::MODE_SIMPLE
,
1053 'validate' => 'validateInteger',
1054 'map_name' => 'OriginalImageWidth',
1056 // LocationShown and LocationCreated are handled
1057 // specially because they are hierarchical, but we
1058 // also want to merge with the old non-hierarchical.
1059 'LocationShown' => array(
1060 'map_group' => 'special',
1061 'mode' => XMPReader
::MODE_BAGSTRUCT
,
1062 'children' => array(
1063 'WorldRegion' => true,
1064 'CountryCode' => true, /* iso code */
1065 'CountryName' => true,
1066 'ProvinceState' => true,
1068 'Sublocation' => true,
1071 'LocationCreated' => array(
1072 'map_group' => 'special',
1073 'mode' => XMPReader
::MODE_BAGSTRUCT
,
1074 'children' => array(
1075 'WorldRegion' => true,
1076 'CountryCode' => true, /* iso code */
1077 'CountryName' => true,
1078 'ProvinceState' => true,
1080 'Sublocation' => true,
1083 'WorldRegion' => array(
1084 'map_group' => 'special',
1085 'mode' => XMPReader
::MODE_SIMPLE
,
1086 'structPart'=> true,
1088 'CountryCode' => array(
1089 'map_group' => 'special',
1090 'mode' => XMPReader
::MODE_SIMPLE
,
1091 'structPart'=> true,
1093 'CountryName' => array(
1094 'map_group' => 'special',
1095 'mode' => XMPReader
::MODE_SIMPLE
,
1096 'structPart'=> true,
1097 'map_name' => 'Country',
1099 'ProvinceState' => array(
1100 'map_group' => 'special',
1101 'mode' => XMPReader
::MODE_SIMPLE
,
1102 'structPart'=> true,
1103 'map_name' => 'ProvinceOrState',
1106 'map_group' => 'special',
1107 'mode' => XMPReader
::MODE_SIMPLE
,
1108 'structPart'=> true,
1110 'Sublocation' => array(
1111 'map_group' => 'special',
1112 'mode' => XMPReader
::MODE_SIMPLE
,
1113 'structPart'=> true,
1116 /* Other props that might be interesting but
1117 * Not currently extracted:
1118 * ArtworkOrObject, (info about objects in picture)
1124 /* Plus props we might want to consider:
1125 * (Note: some of these have unclear/incomplete definitions
1126 * from the iptc4xmp standard).
1127 * ImageSupplier (kind of like iptc source field)
1128 * ImageSupplierId (id code for image from supplier)
1132 * Various model release fields
1133 * Property release fields.