Microsoft.pm 43 KB

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