#------------------------------------------------------------------------------ # File: XMP2.pm # # Description: Additional XMP schema definitions # # Revisions: 10/12/2008 - P. Harvey Created # # References: 1) PLUS - http://ns.useplus.org/ # 2) PRISM - http://www.prismstandard.org/ #------------------------------------------------------------------------------ package Image::ExifTool::XMP; use Image::ExifTool qw(:Utils); use Image::ExifTool::XMP; #------------------------------------------------------------------------------ # PLUS vocabulary conversions my %plusVocab = ( ValueConv => '$val =~ s{http://ns.useplus.org/ldf/vocab/}{}; $val', ValueConvInv => '"http://ns.useplus.org/ldf/vocab/$val"', ); # PLUS License Data Format 1.2.0 (plus) (ref 1) %Image::ExifTool::XMP::plus = ( %xmpTableDefaults, GROUPS => { 0 => 'XMP', 1 => 'XMP-plus', 2 => 'Author' }, NAMESPACE => 'plus', NOTES => q{ PLUS License Data Format 1.2.0 schema tags. Note that all controlled-vocabulary tags in this table (ie. tags with a fixed set of values) have raw values which begin with "http://ns.useplus.org/ldf/vocab/", but to reduce clutter this prefix has been removed from the values shown below. }, Version => { Name => 'PLUSVersion' }, Licensee => { SubDirectory => { }, Struct => 'Licensee', List => 'Seq', }, LicenseeLicenseeID => { List => 1, Name => 'LicenseeID' }, LicenseeLicenseeName => { List => 1, Name => 'LicenseeName' }, EndUser => { SubDirectory => { }, Struct => 'EndUser', List => 'Seq', }, EndUserEndUserID => { List => 1, Name => 'EndUserID' }, EndUserEndUserName => { List => 1, Name => 'EndUserName' }, Licensor => { SubDirectory => { }, Struct => 'Licensor', List => 'Seq', }, LicensorLicensorID => { List => 1, Name => 'LicensorID' }, LicensorLicensorName => { List => 1, Name => 'LicensorName' }, LicensorLicensorStreetAddress => { List => 1, Name => 'LicensorStreetAddress' }, LicensorLicensorExtendedAddress => { List => 1, Name => 'LicensorExtendedAddress' }, LicensorLicensorCity => { List => 1, Name => 'LicensorCity' }, LicensorLicensorRegion => { List => 1, Name => 'LicensorRegion' }, LicensorLicensorPostalCode => { List => 1, Name => 'LicensorPostalCode' }, LicensorLicensorCountry => { List => 1, Name => 'LicensorCountry' }, LicensorLicensorTelephoneType1 => { Name => 'LicensorTelephoneType1', List => 1, %plusVocab, PrintConv => { 'work' => 'Work', 'cell' => 'Cell', 'fax' => 'FAX', 'home' => 'Home', 'pager' => 'Pager', }, }, LicensorLicensorTelephone1 => { List => 1, Name => 'LicensorTelephone1' }, LicensorLicensorTelephoneType2 => { Name => 'LicensorTelephoneType2', List => 1, %plusVocab, PrintConv => { 'work' => 'Work', 'cell' => 'Cell', 'fax' => 'FAX', 'home' => 'Home', 'pager' => 'Pager', }, }, LicensorLicensorTelephone2 => { List => 1, Name => 'LicensorTelephone2' }, LicensorLicensorEmail => { List => 1, Name => 'LicensorEmail' }, LicensorLicensorURL => { List => 1, Name => 'LicensorURL' }, LicensorNotes => { Writable => 'lang-alt' }, MediaSummaryCode => { }, LicenseStartDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, LicenseEndDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, MediaConstraints => { Writable => 'lang-alt' }, RegionConstraints => { Writable => 'lang-alt' }, ProductOrServiceConstraints => { Writable => 'lang-alt' }, ImageFileConstraints => { List => 'Bag', %plusVocab, PrintConv => { 'IF-MFN' => 'Maintain File Name', 'IF-MID' => 'Maintain ID in File Name', 'IF-MMD' => 'Maintain Metadata', 'IF-MFT' => 'Maintain File Type', }, }, ImageAlterationConstraints => { List => 'Bag', %plusVocab, PrintConv => { 'AL-CRP' => 'No Cropping', 'AL-FLP' => 'No Flipping', 'AL-RET' => 'No Retouching', 'AL-CLR' => 'No Colorization', 'AL-DCL' => 'No De-Colorization', 'AL-MRG' => 'No Merging', }, }, ImageDuplicationConstraints => { %plusVocab, PrintConv => { 'DP-NDC' => 'No Duplication Constraints', 'DP-LIC' => 'Duplication Only as Necessary Under License', 'DP-NOD' => 'No Duplication', }, }, ModelReleaseStatus => { %plusVocab, PrintConv => { 'MR-NON' => 'None', 'MR-NAP' => 'Not Applicable', 'MR-UMR' => 'Unlimited Model Releases', 'MR-LMR' => 'Limited or Incomplete Model Releases', }, }, ModelReleaseID => { List => 'Bag' }, MinorModelAgeDisclosure => { %plusVocab, PrintConv => { 'AG-UNK' => 'Age Unknown', 'AG-A25' => 'Age 25 or Over', 'AG-A24' => 'Age 24', 'AG-A23' => 'Age 23', 'AG-A22' => 'Age 22', 'AG-A21' => 'Age 21', 'AG-A20' => 'Age 20', 'AG-A19' => 'Age 19', 'AG-A18' => 'Age 18', 'AG-A17' => 'Age 17', 'AG-A16' => 'Age 16', 'AG-A15' => 'Age 15', 'AG-U14' => 'Age 14 or Under', }, }, PropertyReleaseStatus => { %plusVocab, PrintConv => { 'PR-NON' => 'None', 'PR-NAP' => 'Not Applicable', 'PR-UPR' => 'Unlimited Property Releases', 'PR-LPR' => 'Limited or Incomplete Property Releases', }, }, PropertyReleaseID => { List => 'Bag' }, OtherConstraints => { Writable => 'lang-alt' }, CreditLineRequired => { %plusVocab, PrintConv => { 'CR-NRQ' => 'Not Required', 'CR-COI' => 'Credit on Image', 'CR-CAI' => 'Credit Adjacent To Image', 'CR-CCA' => 'Credit in Credits Area', }, }, AdultContentWarning => { %plusVocab, PrintConv => { 'CW-NRQ' => 'Not Required', 'CW-AWR' => 'Adult Content Warning Required', 'CW-UNK' => 'Unknown', }, }, OtherLicenseRequirements => { Writable => 'lang-alt' }, TermsAndConditionsText => { Writable => 'lang-alt' }, TermsAndConditionsURL => { }, OtherConditions => { Writable => 'lang-alt' }, ImageType => { %plusVocab, PrintConv => { 'TY-PHO' => 'Photographic Image', 'TY-ILL' => 'Illustrated Image', 'TY-MCI' => 'Multimedia or Composited Image', 'TY-VID' => 'Video', 'TY-OTR' => 'Other', }, }, LicensorImageID => { }, FileNameAsDelivered => { }, ImageFileFormatAsDelivered => { %plusVocab, PrintConv => { 'FF-JPG' => 'JPEG Interchange Formats (JPG, JIF, JFIF)', 'FF-TIF' => 'Tagged Image File Format (TIFF)', 'FF-GIF' => 'Graphics Interchange Format (GIF)', 'FF-RAW' => 'Proprietary RAW Image Format', 'FF-DNG' => 'Digital Negative (DNG)', 'FF-EPS' => 'Encapsulated PostScript (EPS)', 'FF-BMP' => 'Windows Bitmap (BMP)', 'FF-PSD' => 'Photoshop Document (PSD)', 'FF-PIC' => 'Macintosh Picture (PICT)', 'FF-PNG' => 'Portable Network Graphics (PNG)', 'FF-WMP' => 'Windows Media Photo (HD Photo)', 'FF-OTR' => 'Other', }, }, ImageFileSizeAsDelivered => { %plusVocab, PrintConv => { 'SZ-U01' => 'Up to 1 MB', 'SZ-U10' => 'Up to 10 MB', 'SZ-U30' => 'Up to 30 MB', 'SZ-U50' => 'Up to 50 MB', 'SZ-G50' => 'Greater than 50 MB', }, }, CopyrightStatus => { %plusVocab, PrintConv => { 'CS-PRO' => 'Protected', 'CS-PUB' => 'Public Domain', 'CS-UNK' => 'Unknown', }, }, CopyrightRegistrationNumber => { }, FirstPublicationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, CopyrightOwner => { SubDirectory => { }, Struct => 'CopyrightOwner', List => 'Seq', }, CopyrightOwnerCopyrightOwnerID => { List => 1, Name => 'CopyrightOwnerID' }, CopyrightOwnerCopyrightOwnerName => { List => 1, Name => 'CopyrightOwnerName' }, CopyrightOwnerImageID => { }, ImageCreator => { SubDirectory => { }, Struct => 'ImageCreator', List => 'Seq', }, ImageCreatorImageCreatorID => { List => 1, Name => 'ImageCreatorID' }, ImageCreatorImageCreatorName => { List => 1, Name => 'ImageCreatorName' }, ImageCreatorImageID => { }, ImageSupplier => { SubDirectory => { }, Struct => 'ImageSupplier', List => 'Seq', }, ImageSupplierImageSupplierID => { List => 1, Name => 'ImageSupplierID' }, ImageSupplierImageSupplierName => { List => 1, Name => 'ImageSupplierName' }, ImageSupplierImageID => { }, LicenseeImageID => { }, LicenseeImageNotes => { Writable => 'lang-alt' }, OtherImageInfo => { Writable => 'lang-alt' }, LicenseID => { }, LicensorTransactionID => { List => 'Bag' }, LicenseeTransactionID => { List => 'Bag' }, LicenseeProjectReference=> { List => 'Bag' }, LicenseTransactionDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, Reuse => { %plusVocab, PrintConv => { 'RE-REU' => 'Repeat Use', 'RE-NAP' => 'Not Applicable', }, }, OtherLicenseDocuments => { List => 'Bag' }, OtherLicenseInfo => { Writable => 'lang-alt' }, # Note: these are Bag's of lang-alt lists -- a nested list tag! Custom1 => { List => 'Bag', Writable => 'lang-alt' }, Custom2 => { List => 'Bag', Writable => 'lang-alt' }, Custom3 => { List => 'Bag', Writable => 'lang-alt' }, Custom4 => { List => 'Bag', Writable => 'lang-alt' }, Custom5 => { List => 'Bag', Writable => 'lang-alt' }, Custom6 => { List => 'Bag', Writable => 'lang-alt' }, Custom7 => { List => 'Bag', Writable => 'lang-alt' }, Custom8 => { List => 'Bag', Writable => 'lang-alt' }, Custom9 => { List => 'Bag', Writable => 'lang-alt' }, Custom10 => { List => 'Bag', Writable => 'lang-alt' }, ); #------------------------------------------------------------------------------ # PRISM # # NOTE: The "Avoid" flag is set for all PRISM tags # my %obsolete = ( # Notes => 'obsolete in 2.0', # ValueConvInv => sub { # my ($val, $self) = @_; # unless ($self->Options('IgnoreMinorErrors')) { # warn "Warning: [minor] Attempt to write obsolete tag\n"; # return undef; # } # return $val; # } # ); # Publishing Requirements for Industry Standard Metadata 2.1 (prism) (ref 2) %Image::ExifTool::XMP::prism = ( %xmpTableDefaults, GROUPS => { 0 => 'XMP', 1 => 'XMP-prism', 2 => 'Document' }, NAMESPACE => 'prism', NOTES => 'Publishing Requirements for Industry Standard Metadata 2.1 schema tags.', aggregationType => { List => 'Bag' }, alternateTitle => { List => 'Bag' }, byteCount => { Writable => 'integer' }, channel => { List => 'Bag' }, complianceProfile=>{ PrintConv => { three => 'Three' } }, copyright => { Groups => { 2 => 'Author' } }, corporateEntity => { List => 'Bag' }, coverDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, coverDisplayDate=> { }, creationDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, dateRecieved => { %dateTimeInfo, Groups => { 2 => 'Time'} }, distributor => { }, doi => { Name => 'DOI', Description => 'Digital Object Identifier' }, edition => { }, eIssn => { }, embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, endingPage => { }, event => { List => 'Bag' }, expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, genre => { List => 'Bag' }, hasAlternative => { List => 'Bag' }, hasCorrection => { }, hasPreviousVersion => { }, hasTranslation => { List => 'Bag' }, industry => { List => 'Bag' }, isCorrectionOf => { List => 'Bag' }, issn => { Name => 'ISSN' }, issueIdentifier => { }, issueName => { }, isTranslationOf => { }, keyword => { List => 'Bag' }, killDate => { %dateTimeInfo, Groups => { 2 => 'Time'} }, location => { List => 'Bag' }, # metadataContainer => { }, modificationDate=> { %dateTimeInfo, Groups => { 2 => 'Time'} }, number => { }, object => { List => 'Bag' }, organization => { List => 'Bag' }, originPlatform => { List => 'Bag', PrintConv => { email => 'E-Mail', mobile => 'Mobile', broadcast => 'Broadcast', web => 'Web', 'print' => 'Print', recordableMedia => 'Recordable Media', other => 'Other', }, }, pageRange => { List => 'Bag' }, person => { }, publicationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, publicationName => { }, rightsAgent => { }, section => { }, startingPage => { }, subsection1 => { }, subsection2 => { }, subsection3 => { }, subsection4 => { }, teaser => { List => 'Bag' }, ticker => { List => 'Bag' }, timePeriod => { }, url => { Name => 'URL', List => 'Bag' }, versionIdentifier => { }, volume => { }, wordCount => { Writable => 'integer' }, # new in PRISM 2.1 isbn => { Name => 'ISBN' }, # tags that existed in version 1.3 # category => { %obsolete, List => 'Bag' }, # hasFormat => { %obsolete, List => 'Bag' }, # hasPart => { %obsolete, List => 'Bag' }, # isFormatOf => { %obsolete, List => 'Bag' }, # isPartOf => { %obsolete }, # isReferencedBy => { %obsolete, List => 'Bag' }, # isRequiredBy => { %obsolete, List => 'Bag' }, # isVersionOf => { %obsolete }, # objectTitle => { %obsolete, List => 'Bag' }, # receptionDate => { %obsolete }, # references => { %obsolete, List => 'Bag' }, # requires => { %obsolete, List => 'Bag' }, # tags in older versions # page # contentLength # creationTime # expirationTime # hasVersion # isAlternativeFor # isBasedOn # isBasisFor # modificationTime # publicationTime # receptionTime # releaseTime ); # PRISM Rights Language 2.1 schema (prl) (ref 2) %Image::ExifTool::XMP::prl = ( %xmpTableDefaults, GROUPS => { 0 => 'XMP', 1 => 'XMP-prl', 2 => 'Document' }, NAMESPACE => 'prl', NOTES => 'PRISM Rights Language 2.1 schema tags.', geography => { List => 'Bag' }, industry => { List => 'Bag' }, usage => { List => 'Bag' }, ); # PRISM Usage Rights 2.1 schema (prismusagerights) (ref 2) %Image::ExifTool::XMP::pur = ( %xmpTableDefaults, GROUPS => { 0 => 'XMP', 1 => 'XMP-pur', 2 => 'Document' }, NAMESPACE => 'prismusagerights', NOTES => 'PRISM Rights Language 2.1 schema tags.', NOTES => q{ Prism Usage Rights 2.1 schema tags. The actual namespace prefix is "prismusagerights", but ExifTool shortens this for the "XMP-pur" family 1 group name. }, adultContentWarning => { List => 'Bag' }, agreement => { List => 'Bag' }, copyright => { Writable => 'lang-alt', Groups => { 2 => 'Author' } }, creditLine => { List => 'Bag' }, embargoDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, exclusivityEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, expirationDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, imageSizeRestriction=> { }, optionEndDate => { List => 'Bag', %dateTimeInfo, Groups => { 2 => 'Time'} }, permissions => { List => 'Bag' }, restrictions => { List => 'Bag' }, reuseProhibited => { Writable => 'boolean' }, rightsAgent => { }, rightsOwner => { }, usageFee => { List => 'Bag' }, ); # set "Avoid" flag for all PRISM tags my ($table, $key); foreach $table (\%prism, \%prl, \%pur) { foreach $key (TagTableKeys($table)) { $table->{$key}->{Avoid} = 1; } } 1; #end __END__ =head1 NAME Image::ExifTool::XMP - Additional XMP schema definitions =head1 SYNOPSIS This module is loaded automatically by Image::ExifTool when required. =head1 DESCRIPTION This file contains definitions for the following XMP schemas: 1) PLUS License Data Format 1.2.0 2) Publishing Requirements for Industry Standard Metadata (PRISM) 2.1 =head1 AUTHOR Copyright 2003-2008, Phil Harvey (phil at owl.phy.queensu.ca) This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 REFERENCES =over 4 =item L =item L =back =head1 SEE ALSO L, L =cut