Ignore:
Timestamp:
2021-02-26T19:39:51+13:00 (3 years ago)
Author:
anupama
Message:

Committing the improvements to EmbeddedMetaPlugin's processing of Keywords vs other metadata fields. Keywords were literally stored as arrays of words rather than phrases in PDFs (at least in Diego's sample PDF), whereas other meta fields like Subjects and Creators stored them as arrays of phrases. To get both to work, Kathy updated EXIF to a newer version, to retrieve the actual EXIF values stored in the PDF. And Kathy and Dr Bainbridge came up with a new option that I added called apply_join_before_split_to_metafields that's a regex which can list the metadata fields to apply the join_before_split to and whcih previously always got applied to all metadata fields. Now it's applied to any *Keywords metafields by default, as that's the metafield we have experience of that behaves differently to the others, as it stores by word instead of phrases. Tested on Diego's sample PDF. Diego has double-checked it to works on his sample PDF too, setting the split char to ; and turning on the join_before_split and leaving apply_join_before_split_to_metafields at its default of .*Keywords. File changes are strings.properties for the tooltip, the plugin introducing the option and working with it and Kathy's EXIF updates affecting cpan/File and cpan/Image.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/cpan/Image/ExifTool/Microsoft.pm

    r24107 r34921  
    55#
    66# Revisions:    2010/10/01 - P. Harvey Created
     7#               2011/10/05 - PH Added ProcessXtra()
    78#
    89# References:   1) http://research.microsoft.com/en-us/um/redmond/groups/ivm/hdview/hdmetadataspec.htm
     
    1314use strict;
    1415use vars qw($VERSION);
     16use Image::ExifTool qw(:DataAccess :Utils);
    1517use Image::ExifTool::XMP;
    1618
    17 $VERSION = '1.03';
     19$VERSION = '1.20';
     20
     21sub ProcessXtra($$$);
    1822
    1923# tags written by Microsoft HDView (ref 1)
     
    7175        Microsoft Photo 1.0 schema XMP tags.  This is likely not a complete list,
    7276        but represents tags which have been observed in sample images.  The actual
    73         namespace prefix is "MicrosoftPhoto", but ExifTool shortens this to
    74         "XMP-microsoft" in the family 1 group name.
     77        namespace prefix is "MicrosoftPhoto", but ExifTool shortens this in the
     78        family 1 group name.
    7579    },
    7680    CameraSerialNumber => { },
     
    8185    LastKeywordXMP     => { List => 'Bag' },
    8286    LensManufacturer   => { },
    83     LensModel          => { },
     87    LensModel          => { Avoid => 1 },
    8488    Rating => {
    8589        Name => 'RatingPercent',
    8690        Notes => q{
    87             normal Rating values of 1,2,3,4 and 5 stars correspond to RatingPercent
     91            XMP-xmp:Rating values of 1,2,3,4 and 5 stars correspond to RatingPercent
    8892            values of 1,25,50,75 and 99 respectively
    8993        },
    9094    },
     95    CreatorAppId             => { Name => 'CreatorAppID' },
     96    CreatorOpenWithUIOptions => { },
     97    ItemSubType              => { },
    9198);
    9299
     
    122129    PanoramicStitchTheta0 => { Writable => 'real' },
    123130    PanoramicStitchTheta1 => { Writable => 'real' },
     131    WhiteBalance0         => { Writable => 'real' },
     132    WhiteBalance1         => { Writable => 'real' },
     133    WhiteBalance2         => { Writable => 'real' },
     134    Brightness            => { Avoid => 1 },
     135    Contrast              => { Avoid => 1 },
     136    CameraModelID         => { Avoid => 1 },
     137    ExposureCompensation  => { Avoid => 1 },
     138    PipelineVersion       => { },
     139    StreamType            => { },
    124140);
    125141
    126142# Microsoft Photo 1.2 schema properties (MP) (ref PH)
     143# (also ref http://msdn.microsoft.com/en-us/library/windows/desktop/ee719905(v=vs.85).aspx)
    127144my %sRegions = (
    128     STRUCT_NAME => 'Regions',
     145    STRUCT_NAME => 'Microsoft Regions',
    129146    NAMESPACE   => 'MPReg',
    130     Rectangle => { },
     147    NOTES => q{
     148        Note that PersonLiveIdCID element is called PersonLiveCID according to the
     149        Microsoft specification, but in practice their software actually writes
     150        PersonLiveIdCID, so ExifTool uses this too.
     151    },
     152    Rectangle         => { },
    131153    PersonDisplayName => { },
     154    PersonEmailDigest => { },
     155    PersonLiveIdCID   => { },  # (see https://exiftool.org/forum/index.php?topic=4274.msg20368#msg20368)
     156    PersonSourceID    => { },
    132157);
    133158%Image::ExifTool::Microsoft::MP = (
     
    143168        Name => 'RegionInfoMP',
    144169        Struct => {
    145             STRUCT_NAME => 'RegionInfoMP',
     170            STRUCT_NAME => 'Microsoft RegionInfo',
    146171            NAMESPACE   => 'MPRI',
    147172            Regions   => { Struct => \%sRegions, List => 'Bag' },
     173            DateRegionsValid => {
     174                Writable => 'date',
     175                Shift => 'Time',
     176                Groups => { 2 => 'Time'},
     177                PrintConv => '$self->ConvertDateTime($val)',
     178                PrintConvInv => '$self->InverseDateTime($val,undef,1)',
     179            },
    148180        },
    149181    },
    150     RegionInfoRegionsRectangle => {
    151         Name => 'RegionRectangle',
    152         Flat => 1,
    153     },
    154     RegionInfoRegionsPersonDisplayName => {
    155         Name => 'RegionPersonDisplayName',
    156         Flat => 1,
    157     },
     182    # remove "MP" from tag name (was added only to avoid conflict with XMP-mwg-rs:RegionInfo)
     183    RegionInfoRegions                  => { Flat => 1, Name => 'RegionInfoRegions' },
     184    RegionInfoDateRegionsValid         => { Flat => 1, Name => 'RegionInfoDateRegionsValid' },
     185    # shorten flattened Regions tag names to make them easier to use
     186    RegionInfoRegionsRectangle         => { Flat => 1, Name => 'RegionRectangle' },
     187    RegionInfoRegionsPersonDisplayName => { Flat => 1, Name => 'RegionPersonDisplayName' },
     188    RegionInfoRegionsPersonEmailDigest => { Flat => 1, Name => 'RegionPersonEmailDigest' },
     189    RegionInfoRegionsPersonLiveIdCID   => { Flat => 1, Name => 'RegionPersonLiveIdCID' },
     190    RegionInfoRegionsPersonSourceID    => { Flat => 1, Name => 'RegionPersonSourceID' },
    158191);
    159192
     193# Xtra tags written in MP4 files written by Microsoft Windows Media Player
     194# (ref http://msdn.microsoft.com/en-us/library/windows/desktop/dd562330(v=VS.85).aspx)
     195# Note: These tags are closely related to tags in Image::ExifTool::ASF::ExtendedDescr
     196#       and Image::ExifTool::WTV::Metadata
     197%Image::ExifTool::Microsoft::Xtra = (
     198    PROCESS_PROC => \&ProcessXtra,
     199    GROUPS => { 0 => 'QuickTime', 2 => 'Video' },
     200    VARS => { NO_ID => 1 },
     201    NOTES => q{
     202        Tags extracted from the Microsoft "Xtra" atom of QuickTime videos.  Tag ID's
     203        are not shown because some are unruly GUID's.
     204    },
     205    Abstract                    => { },
     206    AcquisitionTime             => { Groups => { 2 => 'Time' } },
     207    AcquisitionTimeDay          => { Groups => { 2 => 'Time' } },
     208    AcquisitionTimeMonth        => { Groups => { 2 => 'Time' } },
     209    AcquisitionTimeYear         => { Groups => { 2 => 'Time' } },
     210    AcquisitionTimeYearMonth    => { Groups => { 2 => 'Time' } },
     211    AcquisitionTimeYearMonthDay => { Groups => { 2 => 'Time' } },
     212    AlbumArtistSortOrder        => { },
     213    AlbumID                     => { },
     214    AlbumIDAlbumArtist          => { },
     215    AlbumTitleSortOrder         => { },
     216    AlternateSourceURL          => { },
     217    AudioBitrate                => { },
     218    AudioFormat                 => { },
     219    Author                      => { Groups => { 2 => 'Author' } },
     220    AuthorSortOrder             => { },
     221    AverageLevel                => { },
     222    Bitrate                     => { },
     223    BuyNow                      => { },
     224    BuyTickets                  => { },
     225    CallLetters                 => { },
     226    CameraManufacturer          => { },
     227    CameraModel                 => { },
     228    CDTrackEnabled              => { },
     229    Channels                    => { },
     230    chapterNum                  => { },
     231    Comment                     => { },
     232    ContentDistributorDuration  => { },
     233    Copyright                   => { Groups => { 2 => 'Author' } },
     234    Count                       => { },
     235    CurrentBitrate              => { },
     236    Description                 => { },
     237    DisplayArtist               => { },
     238    DLNAServerUDN               => { },
     239    DLNASourceURI               => { },
     240    DRMKeyID                    => { },
     241    DRMIndividualizedVersion    => { },
     242    DTCPIPHost                  => { },
     243    DTCPIPPort                  => { },
     244    Duration                    => { },
     245    DVDID                       => { },
     246    Event                       => { },
     247    FileSize                    => { },
     248    FileType                    => { },
     249    FourCC                      => { },
     250    FormatTag                   => { },
     251    FrameRate                   => { },
     252    Frequency                   => { },
     253    IsNetworkFeed               => { },
     254    Is_Protected                => 'IsProtected',
     255    IsVBR                       => { },
     256    LeadPerformer               => { },
     257    LibraryID                   => { },
     258    LibraryName                 => { },
     259    Location                    => { },
     260    MediaContentTypes           => { },
     261    MediaType                   => { },
     262    ModifiedBy                  => { },
     263    MoreInfo                    => { },
     264    PartOfSet                   => { },
     265    PeakValue                   => { },
     266    PixelAspectRatioX           => { },
     267    PixelAspectRatioY           => { },
     268    PlaylistIndex               => { },
     269    Provider                    => { },
     270    ProviderLogoURL             => { },
     271    ProviderURL                 => { },
     272    RadioBand                   => { },
     273    RadioFormat                 => { },
     274    RatingOrg                   => { },
     275    RecordingTime               => { Groups => { 2 => 'Time' } },
     276    RecordingTimeDay            => { Groups => { 2 => 'Time' } },
     277    RecordingTimeMonth          => { Groups => { 2 => 'Time' } },
     278    RecordingTimeYear           => { Groups => { 2 => 'Time' } },
     279    RecordingTimeYearMonth      => { Groups => { 2 => 'Time' } },
     280    RecordingTimeYearMonthDay   => { Groups => { 2 => 'Time' } },
     281    ReleaseDate                 => { Groups => { 2 => 'Time' } },
     282    ReleaseDateDay              => { Groups => { 2 => 'Time' } },
     283    ReleaseDateMonth            => { Groups => { 2 => 'Time' } },
     284    ReleaseDateYear             => { Groups => { 2 => 'Time' } },
     285    ReleaseDateYearMonth        => { Groups => { 2 => 'Time' } },
     286    ReleaseDateYearMonthDay     => { Groups => { 2 => 'Time' } },
     287    RequestState                => { },
     288    ShadowFilePath              => { },
     289    SourceURL                   => { },
     290    Subject                     => { },
     291    SyncState                   => { },
     292    Sync01                      => { },
     293    Sync02                      => { },
     294    Sync03                      => { },
     295    Sync04                      => { },
     296    Sync05                      => { },
     297    Sync06                      => { },
     298    Sync07                      => { },
     299    Sync08                      => { },
     300    Sync09                      => { },
     301    Sync10                      => { },
     302    Sync11                      => { },
     303    Sync12                      => { },
     304    Sync13                      => { },
     305    Sync14                      => { },
     306    Sync15                      => { },
     307    Sync16                      => { },
     308    SyncOnly                    => { },
     309    Temporary                   => { },
     310    Title                       => { },
     311    titleNum                    => { },
     312    TitleSortOrder              => { },
     313    TotalDuration               => { },
     314    TrackingID                  => { },
     315    UserCustom1                 => { },
     316    UserCustom2                 => { },
     317    UserEffectiveRating         => { },
     318    UserLastPlayedTime          => { },
     319    UserPlayCount               => { },
     320    UserPlaycountAfternoon      => { },
     321    UserPlaycountEvening        => { },
     322    UserPlaycountMorning        => { },
     323    UserPlaycountNight          => { },
     324    UserPlaycountWeekday        => { },
     325    UserPlaycountWeekend        => { },
     326    UserRating                  => { },
     327    UserServiceRating           => { },
     328    VideoBitrate                => { },
     329    VideoFormat                 => { },
     330    'WM/AlbumArtist'            => 'AlbumArtist',
     331    'WM/AlbumCoverURL'          => 'AlbumCoverURL',
     332    'WM/AlbumTitle'             => 'AlbumTitle',
     333    'WM/BeatsPerMinute'         => 'BeatsPerMinute',
     334    'WM/Category'               => 'Category',
     335    'WM/Composer'               => 'Composer',
     336    'WM/Conductor'              => 'Conductor',
     337    'WM/ContentDistributor'     => 'ContentDistributor',
     338    'WM/ContentDistributorType' => 'ContentDistributorType',
     339    'WM/ContentGroupDescription'=> 'ContentGroupDescription',
     340    'WM/Director'               => 'Director',
     341    'WM/EncodingTime'           => {
     342        Name => 'EncodingTime',
     343        Groups => { 2 => 'Time' },
     344        PrintConv => '$self->ConvertDateTime($val)',
     345    },
     346    'WM/Genre'                  => 'Genre',
     347    'WM/GenreID'                => 'GenreID',
     348    'WM/InitialKey'             => 'InitialKey',
     349    'WM/Language'               => 'Language',
     350    'WM/Lyrics'                 => 'Lyrics',
     351    'WM/MCDI'                   => 'MCDI',
     352    'WM/MediaClassPrimaryID'    => {
     353        Name => 'MediaClassPrimaryID',
     354        PrintConv => { #http://msdn.microsoft.com/en-us/library/windows/desktop/dd757960(v=vs.85).aspx
     355            'D1607DBC-E323-4BE2-86A1-48A42A28441E' => 'Music',
     356            'DB9830BD-3AB3-4FAB-8A37-1A995F7FF74B' => 'Video',
     357            '01CD0F29-DA4E-4157-897B-6275D50C4F11' => 'Audio (not music)',
     358            'FCF24A76-9A57-4036-990D-E35DD8B244E1' => 'Other (not audio or video)',
     359        },
     360    },
     361    'WM/MediaClassSecondaryID' => {
     362        Name => 'MediaClassSecondaryID',
     363        PrintConv => { #http://msdn.microsoft.com/en-us/library/windows/desktop/dd757960(v=vs.85).aspx
     364            'E0236BEB-C281-4EDE-A36D-7AF76A3D45B5' => 'Audio Book',
     365            '3A172A13-2BD9-4831-835B-114F6A95943F' => 'Spoken Word',
     366            '6677DB9B-E5A0-4063-A1AD-ACEB52840CF1' => 'Audio News',
     367            '1B824A67-3F80-4E3E-9CDE-F7361B0F5F1B' => 'Talk Show',
     368            '1FE2E091-4E1E-40CE-B22D-348C732E0B10' => 'Video News',
     369            'D6DE1D88-C77C-4593-BFBC-9C61E8C373E3' => 'Web-based Video',
     370            '00033368-5009-4AC3-A820-5D2D09A4E7C1' => 'Sound Clip from Game',
     371            'F24FF731-96FC-4D0F-A2F5-5A3483682B1A' => 'Song from Game',
     372            'E3E689E2-BA8C-4330-96DF-A0EEEFFA6876' => 'Music Video',
     373            'B76628F4-300D-443D-9CB5-01C285109DAF' => 'Home Movie',
     374            'A9B87FC9-BD47-4BF0-AC4F-655B89F7D868' => 'Feature Film',
     375            'BA7F258A-62F7-47A9-B21F-4651C42A000E' => 'TV Show',
     376            '44051B5B-B103-4B5C-92AB-93060A9463F0' => 'Corporate Video',
     377            '0B710218-8C0C-475E-AF73-4C41C0C8F8CE' => 'Home Video from Pictures',
     378            '00000000-0000-0000-0000-000000000000' => 'Unknown Content', #PH
     379        },
     380    },
     381    'WM/MediaOriginalBroadcastDateTime' => {
     382        Name => 'MediaOriginalBroadcastDateTime',
     383        Groups => { 2 => 'Time' },
     384        PrintConv => '$self->ConvertDateTime($val)',
     385    },
     386    'WM/MediaOriginalChannel'   => 'MediaOriginalChannel',
     387    'WM/MediaStationName'       => 'MediaStationName',
     388    'WM/Mood'                   => 'Mood',
     389    'WM/OriginalAlbumTitle'     => 'OriginalAlbumTitle',
     390    'WM/OriginalArtist'         => 'OriginalArtist',
     391    'WM/OriginalLyricist'       => 'OriginalLyricist',
     392    'WM/ParentalRating'         => 'ParentalRating',
     393    'WM/PartOfSet'              => 'PartOfSet',
     394    'WM/Period'                 => 'Period',
     395    'WM/Producer'               => 'Producer',
     396    'WM/ProtectionType'         => 'ProtectionType',
     397    'WM/Provider'               => 'Provider',
     398    'WM/ProviderRating'         => 'ProviderRating',
     399    'WM/ProviderStyle'          => 'ProviderStyle',
     400    'WM/Publisher'              => 'Publisher',
     401    'WM/SharedUserRating'       => 'SharedUserRating',
     402    'WM/SubscriptionContentID'  => 'SubscriptionContentID',
     403    'WM/SubTitle'               => 'Subtitle',
     404    'WM/SubTitleDescription'    => 'SubtitleDescription',
     405    'WM/TrackNumber'            => 'TrackNumber',
     406    'WM/UniqueFileIdentifier'   => 'UniqueFileIdentifier',
     407    'WM/VideoFrameRate'         => 'VideoFrameRate',
     408    'WM/VideoHeight'            => 'VideoHeight',
     409    'WM/VideoWidth'             => 'VideoWidth',
     410    'WM/WMCollectionGroupID'    => 'WMCollectionGroupID',
     411    'WM/WMCollectionID'         => 'WMCollectionID',
     412    'WM/WMContentID'            => 'WMContentID',
     413    'WM/WMShadowFileSourceDRMType' => 'WMShadowFileSourceDRMType',
     414    'WM/WMShadowFileSourceFileType' => 'WMShadowFileSourceFileType',
     415    'WM/Writer'                 => 'Writer',
     416    'WM/Year'                   => { Name => 'Year', Groups => { 2 => 'Time' } },
     417
     418    # I can't find documentation for the following tags in videos,
     419    # but the tag ID's correspond to Microsoft property GUID+ID's
     420    # References:
     421    #  http://msdn.microsoft.com/en-us/library/cc251929%28v=prot.10%29.aspx
     422    #  http://multi-rename-script.googlecode.com/svn-history/r4/trunk/plugins/ShellDetails/ShellDetails.ini
     423    # I have observed only 1 so far:
     424    '{2CBAA8F5-D81F-47CA-B17A-F8D822300131} 100' => {
     425        Name => 'DateAcquired',
     426        Groups => { 2 => 'Time' },
     427        PrintConv => '$self->ConvertDateTime($val)',
     428    },
     429    # the following have not yet been observed...
     430    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 10'    => 'Name',
     431    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 12'    => 'Size',
     432    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 4'     => 'Type',
     433    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 14'    => {
     434        Name => 'DateModified',
     435        Groups => { 2 => 'Time' },
     436        PrintConv => '$self->ConvertDateTime($val)',
     437    },
     438    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 15'    => {
     439        Name => 'DateCreated',
     440        Groups => { 2 => 'Time' },
     441        PrintConv => '$self->ConvertDateTime($val)',
     442    },
     443    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 16'    => {
     444        Name => 'DateAccessed',
     445        Groups => { 2 => 'Time' },
     446        PrintConv => '$self->ConvertDateTime($val)',
     447    },
     448    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 13'    => 'Attributes',
     449    '{D8C3986F-813B-449C-845D-87B95D674ADE} 2'     => 'Status',
     450    '{9B174B34-40FF-11D2-A27E-00C04FC30871} 4'     => 'Owner',
     451    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 4'     => {
     452        Name => 'Author',
     453        Groups => { 2 => 'Author' },
     454    },
     455    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 2'     => 'Title',
     456    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 3'     => 'Subject',
     457    '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 2'     => 'Category',
     458    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 14'    => 'Pages',
     459    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 6'     => 'Comments',
     460    '{64440492-4C8B-11D1-8B70-080036B11A03} 11'    => {
     461        Name => 'Copyright',
     462        Groups => { 2 => 'Author' },
     463    },
     464    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 2'     => 'Artist',
     465    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 4'     => 'AlbumTitle',
     466    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 5'     => {
     467        Name => 'Year',
     468        Groups => { 2 => 'Time' },
     469    },
     470    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 7'     => 'TrackNumber',
     471    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 11'    => 'Genre',
     472    '{64440490-4C8B-11D1-8B70-080036B11A03} 3'     => 'Duration',
     473    '{64440490-4C8B-11D1-8B70-080036B11A03} 4'     => 'Bitrate',
     474    '{AEAC19E4-89AE-4508-B9B7-BB867ABEE2ED} 2'     => 'Protected',
     475    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 272'   => 'CameraModel',
     476    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 36867' => {
     477        Name => 'DatePictureTaken',
     478        Groups => { 2 => 'Time' },
     479        PrintConv => '$self->ConvertDateTime($val)',
     480    },
     481    '{6444048F-4C8B-11D1-8B70-080036B11A03} 13'    => 'Dimensions',
     482    '{6444048F-4C8B-11D1-8B70-080036B11A03} 3'     => 'Untitled0',
     483    '{6444048F-4C8B-11D1-8B70-080036B11A03} 4'     => 'Untitled1',
     484    '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 2'     => 'EpisodeName',
     485    '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 3'     => 'ProgramDescription',
     486    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 12'    => 'Untitled2',
     487    '{64440490-4C8B-11D1-8B70-080036B11A03} 6'     => 'AudioSampleSize',
     488    '{64440490-4C8B-11D1-8B70-080036B11A03} 5'     => 'AudioSampleRate',
     489    '{64440490-4C8B-11D1-8B70-080036B11A03} 7'     => 'Channels',
     490    '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 15'    => 'Company',
     491    '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 3'     => 'Description',
     492    '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 4'     => 'FileVersion',
     493    '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 7'     => 'ProductName',
     494    '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 8'     => 'ProductVersion',
     495    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 5'     => 'Keywords',
     496    '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 11'    => 'Type',
     497    '{6D24888F-4718-4BDA-AFED-EA0FB4386CD8} 100'   => 'OfflineStatus',
     498    '{A94688B6-7D9F-4570-A648-E3DFC0AB2B3F} 100'   => 'OfflineAvailability',
     499    '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 9'     => 'PerceivedType',
     500    '{1E3EE840-BC2B-476C-8237-2ACD1A839B22} 3'     => 'Kinds',
     501    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 36'    => 'Conductors',
     502    '{64440492-4C8B-11D1-8B70-080036B11A03} 9'     => 'Rating',
     503    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 271'   => 'CameraMaker',
     504    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 18'    => 'ProgramName',
     505    '{293CA35A-09AA-4DD2-B180-1FE245728A52} 100'   => 'Duration',
     506    '{BFEE9149-E3E2-49A7-A862-C05988145CEC} 100'   => 'IsOnline',
     507    '{315B9C8D-80A9-4EF9-AE16-8E746DA51D70} 100'   => 'IsRecurring',
     508    '{F6272D18-CECC-40B1-B26A-3911717AA7BD} 100'   => 'Location',
     509    '{D55BAE5A-3892-417A-A649-C6AC5AAAEAB3} 100'   => 'OptionalAttendeeAddresses',
     510    '{09429607-582D-437F-84C3-DE93A2B24C3C} 100'   => 'OptionalAttendees',
     511    '{744C8242-4DF5-456C-AB9E-014EFB9021E3} 100'   => 'OrganizerAddress',
     512    '{AAA660F9-9865-458E-B484-01BC7FE3973E} 100'   => 'OrganizerName',
     513    '{72FC5BA4-24F9-4011-9F3F-ADD27AFAD818} 100'   => 'ReminderTime',
     514    '{0BA7D6C3-568D-4159-AB91-781A91FB71E5} 100'   => 'RequiredAttendeeAddresses',
     515    '{B33AF30B-F552-4584-936C-CB93E5CDA29F} 100'   => 'RequiredAttendees',
     516    '{00F58A38-C54B-4C40-8696-97235980EAE1} 100'   => 'Resources',
     517    '{5BF396D4-5EB2-466F-BDE9-2FB3F2361D6E} 100'   => 'Free-busyStatus',
     518    '{9B174B35-40FF-11D2-A27E-00C04FC30871} 3'     => 'TotalSize',
     519    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 9'     => 'AccountName',
     520    '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 5'     => 'Computer',
     521    '{9AD5BADB-CEA7-4470-A03D-B84E51B9949E} 100'   => 'Anniversary',
     522    '{CD102C9C-5540-4A88-A6F6-64E4981C8CD1} 100'   => 'AssistantsName',
     523    '{9A93244D-A7AD-4FF8-9B99-45EE4CC09AF6} 100'   => 'AssistantsPhone',
     524    '{176DC63C-2688-4E89-8143-A347800F25E9} 47'    => 'Birthday',
     525    '{730FB6DD-CF7C-426B-A03F-BD166CC9EE24} 100'   => 'BusinessAddress',
     526    '{402B5934-EC5A-48C3-93E6-85E86A2D934E} 100'   => 'BusinessCity',
     527    '{B0B87314-FCF6-4FEB-8DFF-A50DA6AF561C} 100'   => 'BusinessCountry-Region',
     528    '{BC4E71CE-17F9-48D5-BEE9-021DF0EA5409} 100'   => 'BusinessPOBox',
     529    '{E1D4A09E-D758-4CD1-B6EC-34A8B5A73F80} 100'   => 'BusinessPostalCode',
     530    '{446F787F-10C4-41CB-A6C4-4D0343551597} 100'   => 'BusinessStateOrProvince',
     531    '{DDD1460F-C0BF-4553-8CE4-10433C908FB0} 100'   => 'BusinessStreet',
     532    '{91EFF6F3-2E27-42CA-933E-7C999FBE310B} 100'   => 'BusinessFax',
     533    '{56310920-2491-4919-99CE-EADB06FAFDB2} 100'   => 'BusinessHomePage',
     534    '{6A15E5A0-0A1E-4CD7-BB8C-D2F1B0C929BC} 100'   => 'BusinessPhone',
     535    '{BF53D1C3-49E0-4F7F-8567-5A821D8AC542} 100'   => 'CallbackNumber',
     536    '{8FDC6DEA-B929-412B-BA90-397A257465FE} 100'   => 'CarPhone',
     537    '{D4729704-8EF1-43EF-9024-2BD381187FD5} 100'   => 'Children',
     538    '{8589E481-6040-473D-B171-7FA89C2708ED} 100'   => 'CompanyMainPhone',
     539    '{FC9F7306-FF8F-4D49-9FB6-3FFE5C0951EC} 100'   => 'Department',
     540    '{F8FA7FA3-D12B-4785-8A4E-691A94F7A3E7} 100'   => 'E-mailAddress',
     541    '{38965063-EDC8-4268-8491-B7723172CF29} 100'   => 'E-mail2',
     542    '{644D37B4-E1B3-4BAD-B099-7E7C04966ACA} 100'   => 'E-mail3',
     543    '{84D8F337-981D-44B3-9615-C7596DBA17E3} 100'   => 'E-mailList',
     544    '{CC6F4F24-6083-4BD4-8754-674D0DE87AB8} 100'   => 'E-mailDisplayName',
     545    '{F1A24AA7-9CA7-40F6-89EC-97DEF9FFE8DB} 100'   => 'FileAs',
     546    '{14977844-6B49-4AAD-A714-A4513BF60460} 100'   => 'FirstName',
     547    '{635E9051-50A5-4BA2-B9DB-4ED056C77296} 100'   => 'FullName',
     548    '{3C8CEE58-D4F0-4CF9-B756-4E5D24447BCD} 100'   => 'Gender',
     549    '{176DC63C-2688-4E89-8143-A347800F25E9} 70'    => 'GivenName',
     550    '{5DC2253F-5E11-4ADF-9CFE-910DD01E3E70} 100'   => 'Hobbies',
     551    '{98F98354-617A-46B8-8560-5B1B64BF1F89} 100'   => 'HomeAddress',
     552    '{176DC63C-2688-4E89-8143-A347800F25E9} 65'    => 'HomeCity',
     553    '{08A65AA1-F4C9-43DD-9DDF-A33D8E7EAD85} 100'   => 'HomeCountry-Region',
     554    '{7B9F6399-0A3F-4B12-89BD-4ADC51C918AF} 100'   => 'HomePOBox',
     555    '{8AFCC170-8A46-4B53-9EEE-90BAE7151E62} 100'   => 'HomePostalCode',
     556    '{C89A23D0-7D6D-4EB8-87D4-776A82D493E5} 100'   => 'HomeStateOrProvince',
     557    '{0ADEF160-DB3F-4308-9A21-06237B16FA2A} 100'   => 'HomeStreet',
     558    '{660E04D6-81AB-4977-A09F-82313113AB26} 100'   => 'HomeFax',
     559    '{176DC63C-2688-4E89-8143-A347800F25E9} 20'    => 'HomePhone',
     560    '{D68DBD8A-3374-4B81-9972-3EC30682DB3D} 100'   => 'IMAddresses',
     561    '{F3D8F40D-50CB-44A2-9718-40CB9119495D} 100'   => 'Initials',
     562    '{176DC63C-2688-4E89-8143-A347800F25E9} 6'     => 'JobTitle',
     563    '{97B0AD89-DF49-49CC-834E-660974FD755B} 100'   => 'Label',
     564    '{8F367200-C270-457C-B1D4-E07C5BCD90C7} 100'   => 'LastName',
     565    '{C0AC206A-827E-4650-95AE-77E2BB74FCC9} 100'   => 'MailingAddress',
     566    '{176DC63C-2688-4E89-8143-A347800F25E9} 71'    => 'MiddleName',
     567    '{176DC63C-2688-4E89-8143-A347800F25E9} 35'    => 'CellPhone',
     568    '{176DC63C-2688-4E89-8143-A347800F25E9} 74'    => 'Nickname',
     569    '{176DC63C-2688-4E89-8143-A347800F25E9} 7'     => 'OfficeLocation',
     570    '{508161FA-313B-43D5-83A1-C1ACCF68622C} 100'   => 'OtherAddress',
     571    '{6E682923-7F7B-4F0C-A337-CFCA296687BF} 100'   => 'OtherCity',
     572    '{8F167568-0AAE-4322-8ED9-6055B7B0E398} 100'   => 'OtherCountry-Region',
     573    '{8B26EA41-058F-43F6-AECC-4035681CE977} 100'   => 'OtherPOBox',
     574    '{95C656C1-2ABF-4148-9ED3-9EC602E3B7CD} 100'   => 'OtherPostalCode',
     575    '{71B377D6-E570-425F-A170-809FAE73E54E} 100'   => 'OtherStateOrProvince',
     576    '{FF962609-B7D6-4999-862D-95180D529AEA} 100'   => 'OtherStreet',
     577    '{D6304E01-F8F5-4F45-8B15-D024A6296789} 100'   => 'Pager',
     578    '{176DC63C-2688-4E89-8143-A347800F25E9} 69'    => 'PersonalTitle',
     579    '{C8EA94F0-A9E3-4969-A94B-9C62A95324E0} 100'   => 'City',
     580    '{E53D799D-0F3F-466E-B2FF-74634A3CB7A4} 100'   => 'Country-Region',
     581    '{DE5EF3C7-46E1-484E-9999-62C5308394C1} 100'   => 'POBox',
     582    '{18BBD425-ECFD-46EF-B612-7B4A6034EDA0} 100'   => 'PostalCode',
     583    '{F1176DFE-7138-4640-8B4C-AE375DC70A6D} 100'   => 'StateOrProvince',
     584    '{63C25B20-96BE-488F-8788-C09C407AD812} 100'   => 'Street',
     585    '{176DC63C-2688-4E89-8143-A347800F25E9} 48'    => 'PrimaryE-mail',
     586    '{176DC63C-2688-4E89-8143-A347800F25E9} 25'    => 'PrimaryPhone',
     587    '{7268AF55-1CE4-4F6E-A41F-B6E4EF10E4A9} 100'   => 'Profession',
     588    '{9D2408B6-3167-422B-82B0-F583B7A7CFE3} 100'   => 'Spouse',
     589    '{176DC63C-2688-4E89-8143-A347800F25E9} 73'    => 'Suffix',
     590    '{AAF16BAC-2B55-45E6-9F6D-415EB94910DF} 100'   => 'TTY-TTDPhone',
     591    '{C554493C-C1F7-40C1-A76C-EF8C0614003E} 100'   => 'Telex',
     592    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 18'    => 'Webpage',
     593    '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 27'    => 'Status',
     594    '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 26'    => 'ContentType',
     595    '{43F8D7B7-A444-4F87-9383-52271C9B915C} 100'   => {
     596        Name => 'DateArchived',
     597        Groups => { 2 => 'Time' },
     598        PrintConv => '$self->ConvertDateTime($val)',
     599    },
     600    '{72FAB781-ACDA-43E5-B155-B2434F85E678} 100'   => {
     601        Name => 'DateCompleted',
     602        Groups => { 2 => 'Time' },
     603        PrintConv => '$self->ConvertDateTime($val)',
     604    },
     605    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 18258' => {
     606        Name => 'DateImported',
     607        Groups => { 2 => 'Time' },
     608        PrintConv => '$self->ConvertDateTime($val)',
     609    },
     610    '{276D7BB0-5B34-4FB0-AA4B-158ED12A1809} 100'   => 'ClientID',
     611    '{F334115E-DA1B-4509-9B3D-119504DC7ABB} 100'   => 'Contributors',
     612    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 11'    => 'LastPrinted',
     613    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 13'    => {
     614        Name => 'DateLastSaved',
     615        Groups => { 2 => 'Time' },
     616        PrintConv => '$self->ConvertDateTime($val)',
     617    },
     618    '{1E005EE6-BF27-428B-B01C-79676ACD2870} 100'   => 'Division',
     619    '{E08805C8-E395-40DF-80D2-54F0D6C43154} 100'   => 'DocumentID',
     620    '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 7'     => 'Slides',
     621    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 10'    => 'TotalEditingTime',
     622    '{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 15'    => 'WordCount',
     623    '{3F8472B5-E0AF-4DB2-8071-C53FE76AE7CE} 100'   => 'DueDate',
     624    '{C75FAA05-96FD-49E7-9CB4-9F601082D553} 100'   => 'EndDate',
     625    '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 12'    => 'FileCount',
     626    '{41CF5AE0-F75A-4806-BD87-59C7D9248EB9} 100'   => 'WindowsFileName',
     627    '{67DF94DE-0CA7-4D6F-B792-053A3E4F03CF} 100'   => 'FlagColor',
     628    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 12'    => 'FlagStatus',
     629    '{9B174B35-40FF-11D2-A27E-00C04FC30871} 2'     => 'SpaceFree',
     630    '{6444048F-4C8B-11D1-8B70-080036B11A03} 7'     => 'BitDepth',
     631    '{6444048F-4C8B-11D1-8B70-080036B11A03} 5'     => 'HorizontalResolution',
     632    '{6444048F-4C8B-11D1-8B70-080036B11A03} 6'     => 'VerticalResolution',
     633    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 11'    => 'Importance',
     634    '{F23F425C-71A1-4FA8-922F-678EA4A60408} 100'   => 'IsAttachment',
     635    '{5CDA5FC8-33EE-4FF3-9094-AE7BD8868C4D} 100'   => 'IsDeleted',
     636    '{5DA84765-E3FF-4278-86B0-A27967FBDD03} 100'   => 'HasFlag',
     637    '{A6F360D2-55F9-48DE-B909-620E090A647C} 100'   => 'IsCompleted',
     638    '{346C8BD1-2E6A-4C45-89A4-61B78E8E700F} 100'   => 'Incomplete',
     639    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 10'    => 'ReadStatus',
     640    '{EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902} 100'   => 'Shared',
     641    '{D0A04F0A-462A-48A4-BB2F-3706E88DBD7D} 100'   => {
     642        Name => 'Creator',
     643        Groups => { 2 => 'Author' },
     644    },
     645    '{F7DB74B4-4287-4103-AFBA-F1B13DCD75CF} 100'   => {
     646        Name => 'Date',
     647        Groups => { 2 => 'Time' },
     648        PrintConv => '$self->ConvertDateTime($val)',
     649    },
     650    '{B725F130-47EF-101A-A5F1-02608C9EEBAC} 2'     => 'FolderName',
     651    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 6'     => 'FolderPath',
     652    '{DABD30ED-0043-4789-A7F8-D013A4736622} 100'   => 'Folder',
     653    '{D4D0AA16-9948-41A4-AA85-D97FF9646993} 100'   => 'Participants',
     654    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 7'     => 'Path',
     655    '{DEA7C82C-1D89-4A66-9427-A4E3DEBABCB1} 100'   => 'ContactNames',
     656    '{95BEB1FC-326D-4644-B396-CD3ED90E6DDF} 100'   => 'EntryType',
     657    '{D5CDD502-2E9C-101B-9397-08002B2CF9AE} 28'    => 'Language',
     658    '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 23'    => {
     659        Name => 'DateVisited',
     660        Groups => { 2 => 'Time' },
     661        PrintConv => '$self->ConvertDateTime($val)',
     662    },
     663    '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 21'    => 'Description',
     664    '{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25} 3'     => 'LinkStatus',
     665    '{B9B4B3FC-2B51-4A42-B5D8-324146AFCF25} 2'     => 'LinkTarget',
     666    '{5CBF2787-48CF-4208-B90E-EE5E5D420294} 2'     => 'URL',
     667    '{2E4B640D-5019-46D8-8881-55414CC5CAA0} 100'   => 'MediaCreated',
     668    '{DE41CC29-6971-4290-B472-F59F2E2F31E2} 100'   => {
     669        Name => 'DateReleased',
     670        Groups => { 2 => 'Time' },
     671        PrintConv => '$self->ConvertDateTime($val)',
     672    },
     673    '{64440492-4C8B-11D1-8B70-080036B11A03} 36'    => 'EncodedBy',
     674    '{64440492-4C8B-11D1-8B70-080036B11A03} 22'    => 'Producers',
     675    '{64440492-4C8B-11D1-8B70-080036B11A03} 30'    => 'Publisher',
     676    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 38'    => 'Subtitle',
     677    '{64440492-4C8B-11D1-8B70-080036B11A03} 34'    => 'UserWebURL',
     678    '{64440492-4C8B-11D1-8B70-080036B11A03} 23'    => 'Writers',
     679    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 21'    => 'Attachments',
     680    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 2'     => 'BccAddresses',
     681    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 3'     => 'BccNames',
     682    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 4'     => 'CcAddresses',
     683    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 5'     => 'CcNames',
     684    '{DC8F80BD-AF1E-4289-85B6-3DFC1B493992} 100'   => 'ConversationID',
     685    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 20'    => {
     686        Name => 'DateReceived',
     687        Groups => { 2 => 'Time' },
     688        PrintConv => '$self->ConvertDateTime($val)',
     689    },
     690    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 19'    => {
     691        Name => 'DateSent',
     692        Groups => { 2 => 'Time' },
     693        PrintConv => '$self->ConvertDateTime($val)',
     694    },
     695    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 13'    => 'FromAddresses',
     696    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 14'    => 'FromNames',
     697    '{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4} 8'     => 'HasAttachments',
     698    '{0BE1C8E7-1981-4676-AE14-FDD78F05A6E7} 100'   => 'SenderAddress',
     699    '{0DA41CFA-D224-4A18-AE2F-596158DB4B3A} 100'   => 'SenderName',
     700    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 15'    => 'Store',
     701    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 16'    => 'ToAddresses',
     702    '{BCCC8A3C-8CEF-42E5-9B1C-C69079398BC7} 100'   => 'ToDoTitle',
     703    '{E3E0584C-B788-4A5A-BB20-7F5A44C9ACDD} 17'    => 'ToNames',
     704    '{FDF84370-031A-4ADD-9E91-0D775F1C6605} 100'   => 'Mileage',
     705    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 13'    => 'AlbumArtist',
     706    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 35'    => 'Beats-per-minute',
     707    '{64440492-4C8B-11D1-8B70-080036B11A03} 19'    => 'Composers',
     708    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 34'    => 'InitialKey',
     709    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 39'    => 'Mood',
     710    '{56A3372E-CE9C-11D2-9F0E-006097C686F6} 37'    => 'PartOfSet',
     711    '{64440492-4C8B-11D1-8B70-080036B11A03} 31'    => 'Period',
     712    '{4776CAFA-BCE4-4CB1-A23E-265E76D8EB11} 100'   => 'Color',
     713    '{64440492-4C8B-11D1-8B70-080036B11A03} 21'    => 'ParentalRating',
     714    '{10984E0A-F9F2-4321-B7EF-BAF195AF4319} 100'   => 'ParentalRatingReason',
     715    '{9B174B35-40FF-11D2-A27E-00C04FC30871} 5'     => 'SpaceUsed',
     716    '{D35F743A-EB2E-47F2-A286-844132CB1427} 100'   => 'ExifVersion',
     717    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 18248' => 'Event',
     718    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37380' => 'ExposureBias',
     719    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 34850' => 'ExposureProgram',
     720    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 33434' => 'ExposureTime',
     721    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 33437' => 'F-stop',
     722    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37385' => 'FlashMode',
     723    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37386' => 'FocalLength',
     724    '{A0E74609-B84D-4F49-B860-462BD9971F98} 100'   => 'FocalLength35mm',
     725    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 34855' => 'ISOSpeed',
     726    '{E6DDCAF7-29C5-4F0A-9A68-D19412EC7090} 100'   => 'LensMaker',
     727    '{E1277516-2B5F-4869-89B1-2E585BD38B7A} 100'   => 'LensModel',
     728    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37384' => 'LightSource',
     729    '{08F6D7C2-E3F2-44FC-AF1E-5AA5C81A2D3E} 100'   => 'MaxAperture',
     730    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37383' => 'MeteringMode',
     731    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 274'   => 'Orientation',
     732    '{6D217F6D-3F6A-4825-B470-5F03CA2FBE9B} 100'   => 'ProgramMode',
     733    '{49237325-A95A-4F67-B211-816B2D45D2E0} 100'   => 'Saturation',
     734    '{14B81DA1-0135-4D31-96D9-6CBFC9671A99} 37382' => 'SubjectDistance',
     735    '{EE3D3D8A-5381-4CFA-B13B-AAF66B5F4EC9} 100'   => 'WhiteBalance',
     736    '{9C1FCF74-2D97-41BA-B4AE-CB2E3661A6E4} 5'     => 'Priority',
     737    '{39A7F922-477C-48DE-8BC8-B28441E342E3} 100'   => 'Project',
     738    '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 7'     => 'ChannelNumber',
     739    '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 12'    => 'ClosedCaptioning',
     740    '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 13'    => 'Rerun',
     741    '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 14'    => 'SAP',
     742    '{4684FE97-8765-4842-9C13-F006447B178C} 100'   => 'BroadcastDate',
     743    '{A5477F61-7A82-4ECA-9DDE-98B69B2479B3} 100'   => 'RecordingTime',
     744    '{6D748DE2-8D38-4CC3-AC60-F009B057C557} 5'     => 'StationCallSign',
     745    '{1B5439E7-EBA1-4AF8-BDD7-7AF1D4549493} 100'   => 'StationName',
     746    '{560C36C0-503A-11CF-BAA1-00004C752A9A} 2'     => 'AutoSummary',
     747    '{560C36C0-503A-11CF-BAA1-00004C752A9A} 3'     => 'Summary',
     748    '{49691C90-7E17-101A-A91C-08002B2ECDA9} 3'     => 'SearchRanking',
     749    '{F8D3F6AC-4874-42CB-BE59-AB454B30716A} 100'   => 'Sensitivity',
     750    '{EF884C5B-2BFE-41BB-AAE5-76EEDF4F9902} 200'   => 'SharedWith',
     751    '{668CDFA5-7A1B-4323-AE4B-E527393A1D81} 100'   => 'Source',
     752    '{48FD6EC8-8A12-4CDF-A03E-4EC5A511EDDE} 100'   => 'StartDate',
     753    '{D37D52C6-261C-4303-82B3-08B926AC6F12} 100'   => 'BillingInformation',
     754    '{084D8A0A-E6D5-40DE-BF1F-C8820E7C877C} 100'   => 'Complete',
     755    '{08C7CC5F-60F2-4494-AD75-55E3E0B5ADD0} 100'   => 'TaskOwner',
     756    '{28636AA6-953D-11D2-B5D6-00C04FD918D0} 14'    => 'TotalFileSize',
     757    '{0CEF7D53-FA64-11D1-A203-0000F81FEDEE} 9'     => 'LegalTrademarks',
     758    '{64440491-4C8B-11D1-8B70-080036B11A03} 10'    => 'VideoCompression',
     759    '{64440492-4C8B-11D1-8B70-080036B11A03} 20'    => 'Directors',
     760    '{64440491-4C8B-11D1-8B70-080036B11A03} 8'     => 'DataRate',
     761    '{64440491-4C8B-11D1-8B70-080036B11A03} 4'     => 'FrameHeight',
     762    '{64440491-4C8B-11D1-8B70-080036B11A03} 6'     => 'FrameRate',
     763    '{64440491-4C8B-11D1-8B70-080036B11A03} 3'     => 'FrameWidth',
     764    '{64440491-4C8B-11D1-8B70-080036B11A03} 43'    => 'TotalBitrate',
     765);
     766
     767#------------------------------------------------------------------------------
     768# Extract information from Xtra MP4 atom
     769# Inputs: 0) ExifTool object ref, 1) dirInfo ref, 2) tag table ref
     770# Returns: 1 on success
     771# Reference: http://code.google.com/p/mp4v2/ [since removed from trunk]
     772sub ProcessXtra($$$)
     773{
     774    my ($et, $dirInfo, $tagTablePtr) = @_;
     775    my $dataPt = $$dirInfo{DataPt};
     776    my $dataPos = $$dirInfo{Base} || 0;
     777    my $dataLen = $$dirInfo{DataLen};
     778    my $pos = 0;
     779    $et->VerboseDir('Xtra', 0, $dataLen);
     780    for (;;) {
     781        last if $pos + 4 > $dataLen;
     782        my $size = Get32u($dataPt, $pos); # (includes $size word)
     783        last if $size < 8 or $pos + $size > $dataLen;
     784        my $tagLen = Get32u($dataPt, $pos + 4);
     785        last if $tagLen + 18 > $size;
     786        my $tag = substr($$dataPt, $pos + 8, $tagLen);
     787        # (version flags according to the reference, but looks more like a count - PH)
     788        my $count = Get32u($dataPt, $pos + $tagLen + 8);
     789        my ($i, $valPos, $valLen, $valType, $val, $format, @vals);
     790        # point to start of first value (after 4-byte length and 2-byte type)
     791        $valPos = $pos + $tagLen + 18;
     792        for ($i=0; ;) {
     793            # (stored value includes size of $valLen and $valType, so subtract 6)
     794            $valLen  = Get32u($dataPt, $valPos - 6) - 6;
     795            my $more = $pos + $size - $valPos - $valLen;
     796            last if $more < 0;
     797            $valType = Get16u($dataPt, $valPos - 2);
     798            $val = substr($$dataPt, $valPos, $valLen);
     799            # Note: all dumb Microsoft values are little-endian inside a big-endian-format file
     800            SetByteOrder('II');
     801            if ($valType == 8) {
     802                $format = 'Unicode';
     803                $val = $et->Decode($val, 'UCS2');
     804            } elsif ($valType == 19 and $valLen == 8) {
     805                $format = 'int64u';
     806                $val = Get64u(\$val, 0);
     807            } elsif ($valType == 21 and $valLen == 8) {
     808                $format = 'date';
     809                $val = Get64u(\$val, 0);
     810                # convert time from 100 ns intervals since Jan 1, 1601
     811                $val = $val * 1e-7 - 11644473600 if $val;
     812                # (the Nikon S100 uses UTC timezone, same as ASF - PH)
     813                $val = Image::ExifTool::ConvertUnixTime($val) . 'Z';
     814            } elsif ($valType == 72 and $valLen == 16) {
     815                $format = 'GUID';
     816                $val = uc unpack('H*',pack('NnnNN',unpack('VvvNN',$val)));
     817                $val =~ s/(.{8})(.{4})(.{4})(.{4})/$1-$2-$3-$4-/;
     818            } elsif ($valType == 65 && $valLen > 4) { #PH (empirical)
     819                $format = 'variant';
     820                require Image::ExifTool::FlashPix;
     821                my $vPos = $valPos; # (necessary because ReadFPXValue updates this)
     822                # read entry as a VT_VARIANT (use FlashPix module for this)
     823                $val = Image::ExifTool::FlashPix::ReadFPXValue($et, $dataPt, $vPos,
     824                       Image::ExifTool::FlashPix::VT_VARIANT(), $valPos+$valLen, 1);
     825            } else {
     826                $format = "Unknown($valType)";
     827            }
     828            SetByteOrder('MM'); # back to native QuickTime byte ordering
     829            last if ++$i >= $count or $more < 6;
     830            push @vals, $val;
     831            undef $val;
     832            $valPos += $valLen + 6; # step to next value
     833        }
     834        if (@vals) {
     835            push @vals, $val if defined $val;
     836            $val = \@vals;
     837            $valPos = $pos + $tagLen + 18;
     838            $valLen = $size - 18 - $tagLen;
     839        }
     840        if ($tagLen > 0 and $valLen > 0) {
     841            my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
     842            unless ($tagInfo) {
     843                # generate tag information for unrecognized tags
     844                my $name = $tag;
     845                $name =~ s{^WM/}{};
     846              # $name =~ tr/-_A-Za-z0-9//dc;
     847                if ($name =~ /^[-\w]+$/) {
     848                    $tagInfo = { Name => ucfirst($name) };
     849                    AddTagToTable($tagTablePtr, $tag, $tagInfo);
     850                    $et->VPrint(0, $$et{INDENT}, "[adding Microsoft:$tag]\n");
     851                }
     852            }
     853            $et->HandleTag($tagTablePtr, $tag, $val,
     854                TagInfo => $tagInfo,
     855                DataPt  => $dataPt,
     856                DataPos => $dataPos,
     857                Start   => $valPos,
     858                Size    => $valLen,
     859                Format  => $format,
     860                Extra   => " count=$count type=$valType",
     861            );
     862        }
     863        $pos += $size;  # step to next entry
     864    }
     865    return 1;
     866}
    160867
    1618681;  # end
     
    178885=head1 AUTHOR
    179886
    180 Copyright 2003-2011, Phil Harvey (phil at owl.phy.queensu.ca)
     887Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
    181888
    182889This library is free software; you can redistribute it and/or modify it
Note: See TracChangeset for help on using the changeset viewer.