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