Add exiftool as a component tool for workhorse

This commit is contained in:
DJ Mountney 2023-04-07 01:02:09 +00:00 committed by Stan Hu
parent 4c57027790
commit e48a60a78d
9 changed files with 762 additions and 2 deletions

View file

@ -28,6 +28,7 @@ stages:
- gitlab
- gitlab-assets
- gitlab-review-app
- workhorse
- gitaly
- automation

View file

@ -58,3 +58,25 @@ gitlab-review-app:
GCLOUD: '383'
KUBECTL: '1.23'
HELM: '3.5'
# Used by GitLab's workhorse tests
gitlab-workhorse:
needs: []
extends:
- .gitlab
stage: workhorse
variables:
EXIFTOOL: '12.60'
RUBYGEMS: '3.4'
parallel:
matrix:
- OS: ['debian:bullseye']
RUBY: ['2.7', '3.0', '3.1', '3.2']
GOLANG: ['1.18', '1.19']
RUST: ['1.65']
GIT: ['2.36']
- OS: ['ubi:8.6']
RUBY: ['2.7', '3.0', '3.1', '3.2']
GOLANG: ['1.18', '1.19']
RUST: ['1.65']
GIT: ['2.36']

View file

@ -76,6 +76,13 @@ ARG GRAPHISMAGICK_DOWNLOAD_SHA256
RUN if [ -n "$GRAPHISMAGICK_VERSION" ]; then /scripts/install-graphicsmagick && gm version; fi
# Exiftool
ARG EXIFTOOL_VERSION
ARG EXIFTOOL_DOWNLOAD_URL=https://gitlab.com/gitlab-org/build/omnibus-mirror/exiftool/-/archive/${EXIFTOOL_VERSION}/exiftool-${EXIFTOOL_VERSION}.tar.gz
ARG EXIFTOOL_DOWNLOAD_SHA256
RUN if [ -n "$EXIFTOOL_VERSION" ]; then /scripts/install-exiftool && exiftool -ver; fi
# Docker
ARG DOCKER_VERSION

View file

@ -61,6 +61,7 @@ Minor components define tag name. [Supported minor](https://gitlab.com/gitlab-or
1. `CHROME`
1. `YARN`
1. `GRAPHICSMAGICK`
1. `EXIFTOOL`
1. `BAZELISK`
1. `DOCKER`
1. `BUILDX`

View file

@ -0,0 +1,686 @@
diff --git a/lib/Image/ExifTool.pm b/lib/Image/ExifTool.pm
index 57dbf679..077ed1b2 100644
--- a/lib/Image/ExifTool.pm
+++ b/lib/Image/ExifTool.pm
@@ -189,18 +189,10 @@ $defaultLang = 'en'; # default language
# 2) Put types with weak file signatures at end of list to avoid false matches
# 3) PLIST must be in this list for the binary PLIST format, although it may
# cause a file to be checked twice for XML
-@fileTypes = qw(JPEG EXV CRW DR4 TIFF GIF MRW RAF X3F JP2 PNG MIE MIFF PS PDF
- PSD XMP BMP BPG PPM RIFF AIFF ASF MOV MPEG Real SWF PSP FLV OGG
- FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF LFP
- HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2
- CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS
- MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA PDB
- PFM2 MRC LIF JXL MOI ISO ALIAS JSON MP3 DICOM PCD ICO TXT);
+@fileTypes = qw(JPEG TIFF);
# file types that we can write (edit)
-my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
- X3F PS PDF ICC VRD DR4 JP2 JXL EXIF AI AIT IND MOV EXV FLIF
- RIFF);
+my @writeTypes = qw(JPEG TIFF);
my %writeTypes; # lookup for writable file types (hash filled if required)
# file extensions that we can't write for various base types
@@ -221,341 +213,9 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
# (if extension may be more than one type, the type is a list where
# the writable type should come first if it exists)
%fileTypeLookup = (
- '360' => ['MOV', 'GoPro 360 video'],
- '3FR' => ['TIFF', 'Hasselblad RAW format'],
- '3G2' => ['MOV', '3rd Gen. Partnership Project 2 audio/video'],
- '3GP' => ['MOV', '3rd Gen. Partnership Project audio/video'],
- '3GP2'=> '3G2',
- '3GPP'=> '3GP',
- A => ['EXE', 'Static library'],
- AA => ['AA', 'Audible Audiobook'],
- AAE => ['PLIST','Apple edit information'],
- AAX => ['MOV', 'Audible Enhanced Audiobook'],
- ACR => ['DICOM','American College of Radiology ACR-NEMA'],
- ACFM => ['Font', 'Adobe Composite Font Metrics'],
- AFM => ['Font', 'Adobe Font Metrics'],
- AMFM => ['Font', 'Adobe Multiple Master Font Metrics'],
- AI => [['PDF','PS'], 'Adobe Illustrator'],
- AIF => 'AIFF',
- AIFC => ['AIFF', 'Audio Interchange File Format Compressed'],
- AIFF => ['AIFF', 'Audio Interchange File Format'],
- AIT => 'AI',
- ALIAS=> ['ALIAS','MacOS file alias'],
- APE => ['APE', "Monkey's Audio format"],
- APNG => ['PNG', 'Animated Portable Network Graphics'],
- ARW => ['TIFF', 'Sony Alpha RAW format'],
- ARQ => ['TIFF', 'Sony Alpha Pixel-Shift RAW format'],
- ASF => ['ASF', 'Microsoft Advanced Systems Format'],
- AVC => ['AVC', 'Advanced Video Connection'], # (extensions are actually _AU,_AD,_IM,_ID)
- AVI => ['RIFF', 'Audio Video Interleaved'],
- AVIF => ['MOV', 'AV1 Image File Format'],
- AZW => 'MOBI', # (see http://wiki.mobileread.com/wiki/AZW)
- AZW3 => 'MOBI',
- BMP => ['BMP', 'Windows Bitmap'],
- BPG => ['BPG', 'Better Portable Graphics'],
- BTF => ['BTF', 'Big Tagged Image File Format'], #(unofficial)
- BZ2 => ['BZ2', 'BZIP2 archive'],
- CHM => ['CHM', 'Microsoft Compiled HTML format'],
- CIFF => ['CRW', 'Camera Image File Format'],
- COS => ['COS', 'Capture One Settings'],
- CR2 => ['TIFF', 'Canon RAW 2 format'],
- CR3 => ['MOV', 'Canon RAW 3 format'],
- CRM => ['MOV', 'Canon RAW Movie'],
- CRW => ['CRW', 'Canon RAW format'],
- CS1 => ['PSD', 'Sinar CaptureShop 1-Shot RAW'],
- CSV => ['TXT', 'Comma-Separated Values'],
- CUR => ['ICO', 'Windows Cursor'],
- CZI => ['CZI', 'Zeiss Integrated Software RAW'],
- DC3 => 'DICM',
- DCM => 'DICM',
- DCP => ['TIFF', 'DNG Camera Profile'],
- DCR => ['TIFF', 'Kodak Digital Camera RAW'],
- DCX => ['DCX', 'Multi-page PC Paintbrush'],
- DEX => ['DEX', 'Dalvik Executable format'],
- DFONT=> ['Font', 'Macintosh Data fork Font'],
- DIB => ['BMP', 'Device Independent Bitmap'],
- DIC => 'DICM',
- DICM => ['DICOM','Digital Imaging and Communications in Medicine'],
- DIR => ['DIR', 'Directory'],
- DIVX => ['ASF', 'DivX media format'],
- DJV => 'DJVU',
- DJVU => ['AIFF', 'DjVu image'],
- DLL => ['EXE', 'Windows Dynamic Link Library'],
- DNG => ['TIFF', 'Digital Negative'],
- DOC => ['FPX', 'Microsoft Word Document'],
- DOCM => [['ZIP','FPX'], 'Office Open XML Document Macro-enabled'],
- # Note: I have seen a password-protected DOCX file which was FPX-like, so I assume
- # that any other MS Office file could be like this too. The only difference is
- # that the ZIP and FPX formats are checked first, so if this is wrong, no biggie.
- DOCX => [['ZIP','FPX'], 'Office Open XML Document'],
- DOT => ['FPX', 'Microsoft Word Template'],
- DOTM => [['ZIP','FPX'], 'Office Open XML Document Template Macro-enabled'],
- DOTX => [['ZIP','FPX'], 'Office Open XML Document Template'],
- DPX => ['DPX', 'Digital Picture Exchange' ],
- DR4 => ['DR4', 'Canon VRD version 4 Recipe'],
- DS2 => ['DSS', 'Digital Speech Standard 2'],
- DSS => ['DSS', 'Digital Speech Standard'],
- DV => ['DV', 'Digital Video'],
- DVB => ['MOV', 'Digital Video Broadcasting'],
- 'DVR-MS'=>['ASF', 'Microsoft Digital Video recording'],
- DWF => ['DWF', 'Autodesk drawing (Design Web Format)'],
- DWG => ['DWG', 'AutoCAD Drawing'],
- DYLIB=> ['EXE', 'Mach-O Dynamic Link Library'],
- DXF => ['DXF', 'AutoCAD Drawing Exchange Format'],
- EIP => ['ZIP', 'Capture One Enhanced Image Package'],
- EPS => ['EPS', 'Encapsulated PostScript Format'],
- EPS2 => 'EPS',
- EPS3 => 'EPS',
- EPSF => 'EPS',
- EPUB => ['ZIP', 'Electronic Publication'],
- ERF => ['TIFF', 'Epson Raw Format'],
- EXE => ['EXE', 'Windows executable file'],
- EXR => ['EXR', 'Open EXR'],
- EXIF => ['EXIF', 'Exchangable Image File Metadata'],
- EXV => ['EXV', 'Exiv2 metadata'],
- F4A => ['MOV', 'Adobe Flash Player 9+ Audio'],
- F4B => ['MOV', 'Adobe Flash Player 9+ audio Book'],
- F4P => ['MOV', 'Adobe Flash Player 9+ Protected'],
- F4V => ['MOV', 'Adobe Flash Player 9+ Video'],
- FFF => [['TIFF','FLIR'], 'Hasselblad Flexible File Format'],
- FIT => 'FITS',
- FITS => ['FITS', 'Flexible Image Transport System'],
- FLAC => ['FLAC', 'Free Lossless Audio Codec'],
- FLA => ['FPX', 'Macromedia/Adobe Flash project'],
- FLIF => ['FLIF', 'Free Lossless Image Format'],
- FLIR => ['FLIR', 'FLIR File Format'], # (not an actual extension)
- FLV => ['FLV', 'Flash Video'],
- FPF => ['FPF', 'FLIR Public image Format'],
- FPX => ['FPX', 'FlashPix'],
- GIF => ['GIF', 'Compuserve Graphics Interchange Format'],
- GPR => ['TIFF', 'General Purpose RAW'], # https://gopro.github.io/gpr/
- GZ => 'GZIP',
- GZIP => ['GZIP', 'GNU ZIP compressed archive'],
- HDP => ['TIFF', 'Windows HD Photo'],
- HDR => ['HDR', 'Radiance RGBE High Dynamic Range'],
- HEIC => ['MOV', 'High Efficiency Image Format still image'],
- HEIF => ['MOV', 'High Efficiency Image Format'],
- HIF => 'HEIF',
- HTM => 'HTML',
- HTML => ['HTML', 'HyperText Markup Language'],
- ICAL => 'ICS',
- ICC => ['ICC', 'International Color Consortium'],
- ICM => 'ICC',
- ICO => ['ICO', 'Windows Icon'],
- ICS => ['VCard','iCalendar Schedule'],
- IDML => ['ZIP', 'Adobe InDesign Markup Language'],
- IIQ => ['TIFF', 'Phase One Intelligent Image Quality RAW'],
- IND => ['IND', 'Adobe InDesign'],
- INDD => ['IND', 'Adobe InDesign Document'],
- INDT => ['IND', 'Adobe InDesign Template'],
- INSV => ['MOV', 'Insta360 Video'],
- INSP => ['JPEG', 'Insta360 Picture'],
- INX => ['XMP', 'Adobe InDesign Interchange'],
- ISO => ['ISO', 'ISO 9660 disk image'],
- ITC => ['ITC', 'iTunes Cover Flow'],
- J2C => ['JP2', 'JPEG 2000 codestream'],
- J2K => 'J2C',
- JNG => ['PNG', 'JPG Network Graphics'],
- JP2 => ['JP2', 'JPEG 2000 file'],
- # JP4? - looks like a JPEG but the image data is different
- JPC => 'J2C',
- JPE => 'JPEG',
JPEG => ['JPEG', 'Joint Photographic Experts Group'],
- JPF => 'JP2',
JPG => 'JPEG',
- JPM => ['JP2', 'JPEG 2000 compound image'],
- JPS => ['JPEG', 'JPEG Stereo image'],
- JPX => ['JP2', 'JPEG 2000 with extensions'],
- JSON => ['JSON', 'JavaScript Object Notation'],
- JXL => ['JXL', 'JPEG XL'],
- JXR => ['TIFF', 'JPEG XR'],
- K25 => ['TIFF', 'Kodak DC25 RAW'],
- KDC => ['TIFF', 'Kodak Digital Camera RAW'],
- KEY => ['ZIP', 'Apple Keynote presentation'],
- KTH => ['ZIP', 'Apple Keynote Theme'],
- LA => ['RIFF', 'Lossless Audio'],
- LFP => ['LFP', 'Lytro Light Field Picture'],
- LFR => 'LFP', # (Light Field RAW)
- LIF => ['LIF', 'Leica Image File'],
- LNK => ['LNK', 'Windows shortcut'],
- LRI => ['LRI', 'Light RAW'],
- LRV => ['MOV', 'Low-Resolution Video'],
- M2T => 'M2TS',
- M2TS => ['M2TS', 'MPEG-2 Transport Stream'],
- M2V => ['MPEG', 'MPEG-2 Video'],
- M4A => ['MOV', 'MPEG-4 Audio'],
- M4B => ['MOV', 'MPEG-4 audio Book'],
- M4P => ['MOV', 'MPEG-4 Protected'],
- M4V => ['MOV', 'MPEG-4 Video'],
- MACOS=> ['MacOS','MacOS ._ sidecar file'],
- MAX => ['FPX', '3D Studio MAX'],
- MEF => ['TIFF', 'Mamiya (RAW) Electronic Format'],
- MIE => ['MIE', 'Meta Information Encapsulation format'],
- MIF => 'MIFF',
- MIFF => ['MIFF', 'Magick Image File Format'],
- MKA => ['MKV', 'Matroska Audio'],
- MKS => ['MKV', 'Matroska Subtitle'],
- MKV => ['MKV', 'Matroska Video'],
- MNG => ['PNG', 'Multiple-image Network Graphics'],
- MOBI => ['PDB', 'Mobipocket electronic book'],
- MODD => ['PLIST','Sony Picture Motion metadata'],
- MOI => ['MOI', 'MOD Information file'],
- MOS => ['TIFF', 'Creo Leaf Mosaic'],
- MOV => ['MOV', 'Apple QuickTime movie'],
- MP3 => ['MP3', 'MPEG-1 Layer 3 audio'],
- MP4 => ['MOV', 'MPEG-4 video'],
- MPC => ['MPC', 'Musepack Audio'],
- MPEG => ['MPEG', 'MPEG-1 or MPEG-2 audio/video'],
- MPG => 'MPEG',
- MPO => ['JPEG', 'Extended Multi-Picture format'],
- MQV => ['MOV', 'Sony Mobile Quicktime Video'],
- MRC => ['MRC', 'Medical Research Council image'],
- MRW => ['MRW', 'Minolta RAW format'],
- MTS => 'M2TS',
- MXF => ['MXF', 'Material Exchange Format'],
- # NDPI => ['TIFF', 'Hamamatsu NanoZoomer Digital Pathology Image'],
- NEF => ['TIFF', 'Nikon (RAW) Electronic Format'],
- NEWER => 'COS',
- NKSC => ['XMP', 'Nikon Sidecar'],
- NMBTEMPLATE => ['ZIP','Apple Numbers Template'],
- NRW => ['TIFF', 'Nikon RAW (2)'],
- NUMBERS => ['ZIP','Apple Numbers spreadsheet'],
- O => ['EXE', 'Relocatable Object'],
- ODB => ['ZIP', 'Open Document Database'],
- ODC => ['ZIP', 'Open Document Chart'],
- ODF => ['ZIP', 'Open Document Formula'],
- ODG => ['ZIP', 'Open Document Graphics'],
- ODI => ['ZIP', 'Open Document Image'],
- ODP => ['ZIP', 'Open Document Presentation'],
- ODS => ['ZIP', 'Open Document Spreadsheet'],
- ODT => ['ZIP', 'Open Document Text file'],
- OFR => ['RIFF', 'OptimFROG audio'],
- OGG => ['OGG', 'Ogg Vorbis audio file'],
- OGV => ['OGG', 'Ogg Video file'],
- ONP => ['JSON', 'ON1 Presets'],
- OPUS => ['OGG', 'Ogg Opus audio file'],
- ORF => ['ORF', 'Olympus RAW format'],
- ORI => 'ORF',
- OTF => ['Font', 'Open Type Font'],
- PAC => ['RIFF', 'Lossless Predictive Audio Compression'],
- PAGES => ['ZIP', 'Apple Pages document'],
- PBM => ['PPM', 'Portable BitMap'],
- PCD => ['PCD', 'Kodak Photo CD Image Pac'],
- PCT => 'PICT',
- PCX => ['PCX', 'PC Paintbrush'],
- PDB => ['PDB', 'Palm Database'],
- PDF => ['PDF', 'Adobe Portable Document Format'],
- PEF => ['TIFF', 'Pentax (RAW) Electronic Format'],
- PFA => ['Font', 'PostScript Font ASCII'],
- PFB => ['Font', 'PostScript Font Binary'],
- PFM => [['Font','PFM2'], 'Printer Font Metrics'], # (description is overridden for Portable FloatMap images)
- PGF => ['PGF', 'Progressive Graphics File'],
- PGM => ['PPM', 'Portable Gray Map'],
- PHP => ['PHP', 'PHP Hypertext Preprocessor'],
- PHP3 => 'PHP',
- PHP4 => 'PHP',
- PHP5 => 'PHP',
- PHPS => 'PHP',
- PHTML=> 'PHP',
- PICT => ['PICT', 'Apple PICTure'],
- PLIST=> ['PLIST','Apple Property List'],
- PMP => ['PMP', 'Sony DSC-F1 Cyber-Shot PMP'], # should stand for Proprietery Metadata Package ;)
- PNG => ['PNG', 'Portable Network Graphics'],
- POT => ['FPX', 'Microsoft PowerPoint Template'],
- POTM => [['ZIP','FPX'], 'Office Open XML Presentation Template Macro-enabled'],
- POTX => [['ZIP','FPX'], 'Office Open XML Presentation Template'],
- PPAM => [['ZIP','FPX'], 'Office Open XML Presentation Addin Macro-enabled'],
- PPAX => [['ZIP','FPX'], 'Office Open XML Presentation Addin'],
- PPM => ['PPM', 'Portable Pixel Map'],
- PPS => ['FPX', 'Microsoft PowerPoint Slideshow'],
- PPSM => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow Macro-enabled'],
- PPSX => [['ZIP','FPX'], 'Office Open XML Presentation Slideshow'],
- PPT => ['FPX', 'Microsoft PowerPoint Presentation'],
- PPTM => [['ZIP','FPX'], 'Office Open XML Presentation Macro-enabled'],
- PPTX => [['ZIP','FPX'], 'Office Open XML Presentation'],
- PRC => ['PDB', 'Palm Database'],
- PS => ['PS', 'PostScript'],
- PS2 => 'PS',
- PS3 => 'PS',
- PSB => ['PSD', 'Photoshop Large Document'],
- PSD => ['PSD', 'Photoshop Document'],
- PSDT => ['PSD', 'Photoshop Document Template'],
- PSP => ['PSP', 'Paint Shop Pro'],
- PSPFRAME => 'PSP',
- PSPIMAGE => 'PSP',
- PSPSHAPE => 'PSP',
- PSPTUBE => 'PSP',
- QIF => 'QTIF',
- QT => 'MOV',
- QTI => 'QTIF',
- QTIF => ['QTIF', 'QuickTime Image File'],
- R3D => ['R3D', 'Redcode RAW Video'],
- RA => ['Real', 'Real Audio'],
- RAF => ['RAF', 'FujiFilm RAW Format'],
- RAM => ['Real', 'Real Audio Metafile'],
- RAR => ['RAR', 'RAR Archive'],
- RAW => [['RAW','TIFF'], 'Kyocera Contax N Digital RAW or Panasonic RAW'],
- RIF => 'RIFF',
- RIFF => ['RIFF', 'Resource Interchange File Format'],
- RM => ['Real', 'Real Media'],
- RMVB => ['Real', 'Real Media Variable Bitrate'],
- RPM => ['Real', 'Real Media Plug-in Metafile'],
- RSRC => ['RSRC', 'Mac OS Resource'],
- RTF => ['RTF', 'Rich Text Format'],
- RV => ['Real', 'Real Video'],
- RW2 => ['TIFF', 'Panasonic RAW 2'],
- RWL => ['TIFF', 'Leica RAW'],
- RWZ => ['RWZ', 'Rawzor compressed image'],
- SEQ => ['FLIR', 'FLIR image Sequence'],
- SKETCH => ['ZIP', 'Sketch design file'],
- SO => ['EXE', 'Shared Object file'],
- SR2 => ['TIFF', 'Sony RAW Format 2'],
- SRF => ['TIFF', 'Sony RAW Format'],
- SRW => ['TIFF', 'Samsung RAW format'],
- SVG => ['XMP', 'Scalable Vector Graphics'],
- SWF => ['SWF', 'Shockwave Flash'],
- TAR => ['TAR', 'TAR archive'],
- THM => ['JPEG', 'Thumbnail'],
- THMX => [['ZIP','FPX'], 'Office Open XML Theme'],
- TIF => 'TIFF',
TIFF => ['TIFF', 'Tagged Image File Format'],
- TORRENT => ['Torrent', 'BitTorrent description file'],
- TS => 'M2TS',
- TTC => ['Font', 'True Type Font Collection'],
- TTF => ['Font', 'True Type Font'],
- TUB => 'PSP',
- TXT => ['TXT', 'Text file'],
- VCARD=> ['VCard','Virtual Card'],
- VCF => 'VCARD',
- VOB => ['MPEG', 'Video Object'],
- VNT => [['FPX','VCard'], 'Scene7 Vignette or V-Note text file'],
- VRD => ['VRD', 'Canon VRD Recipe Data'],
- VSD => ['FPX', 'Microsoft Visio Drawing'],
- WAV => ['RIFF', 'WAVeform (Windows digital audio)'],
- WDP => ['TIFF', 'Windows Media Photo'],
- WEBM => ['MKV', 'Google Web Movie'],
- WEBP => ['RIFF', 'Google Web Picture'],
- WMA => ['ASF', 'Windows Media Audio'],
- WMF => ['WMF', 'Windows Metafile Format'],
- WMV => ['ASF', 'Windows Media Video'],
- WV => ['RIFF', 'WavePack lossless audio'],
- X3F => ['X3F', 'Sigma RAW format'],
- XCF => ['XCF', 'GIMP native image format'],
- XHTML=> ['HTML', 'Extensible HyperText Markup Language'],
- XLA => ['FPX', 'Microsoft Excel Add-in'],
- XLAM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Add-in Macro-enabled'],
- XLS => ['FPX', 'Microsoft Excel Spreadsheet'],
- XLSB => [['ZIP','FPX'], 'Office Open XML Spreadsheet Binary'],
- XLSM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Macro-enabled'],
- XLSX => [['ZIP','FPX'], 'Office Open XML Spreadsheet'],
- XLT => ['FPX', 'Microsoft Excel Template'],
- XLTM => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template Macro-enabled'],
- XLTX => [['ZIP','FPX'], 'Office Open XML Spreadsheet Template'],
- XMP => ['XMP', 'Extensible Metadata Platform'],
- WOFF => ['Font', 'Web Open Font Format'],
- WOFF2=> ['Font', 'Web Open Font Format2'],
- WTV => ['WTV', 'Windows recorded TV show'],
- ZIP => ['ZIP', 'ZIP archive'],
);
# typical extension for each file type (if different than FileType)
diff --git a/lib/Image/ExifTool/AIFF.pm b/lib/Image/ExifTool/AIFF.pm
deleted file mode 100644
index a862a0de..00000000
--- a/lib/Image/ExifTool/AIFF.pm
+++ /dev/null
@@ -1,312 +0,0 @@
-#------------------------------------------------------------------------------
-# File: AIFF.pm
-#
-# Description: Read AIFF meta information
-#
-# Revisions: 01/06/2006 - P. Harvey Created
-# 09/22/2008 - PH Added DjVu support
-#
-# References: 1) http://developer.apple.com/documentation/QuickTime/INMAC/SOUND/imsoundmgr.30.htm#pgfId=3190
-# 2) http://astronomy.swin.edu.au/~pbourke/dataformats/aiff/
-# 3) http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/
-#------------------------------------------------------------------------------
-
-package Image::ExifTool::AIFF;
-
-use strict;
-use vars qw($VERSION);
-use Image::ExifTool qw(:DataAccess :Utils);
-use Image::ExifTool::ID3;
-
-$VERSION = '1.12';
-
-# information for time/date-based tags (time zero is Jan 1, 1904)
-my %timeInfo = (
- Groups => { 2 => 'Time' },
- ValueConv => 'ConvertUnixTime($val - ((66 * 365 + 17) * 24 * 3600))',
- PrintConv => '$self->ConvertDateTime($val)',
-);
-
-# AIFF info
-%Image::ExifTool::AIFF::Main = (
- GROUPS => { 2 => 'Audio' },
- NOTES => q{
- Tags extracted from Audio Interchange File Format (AIFF) files. See
- L<http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html> for
- the AIFF specification.
- },
-# FORM => 'Format',
- FVER => {
- Name => 'FormatVersion',
- SubDirectory => { TagTable => 'Image::ExifTool::AIFF::FormatVers' },
- },
- COMM => {
- Name => 'Common',
- SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Common' },
- },
- COMT => {
- Name => 'Comment',
- SubDirectory => { TagTable => 'Image::ExifTool::AIFF::Comment' },
- },
- NAME => {
- Name => 'Name',
- ValueConv => '$self->Decode($val, "MacRoman")',
- },
- AUTH => {
- Name => 'Author',
- Groups => { 2 => 'Author' },
- ValueConv => '$self->Decode($val, "MacRoman")',
- },
- '(c) ' => {
- Name => 'Copyright',
- Groups => { 2 => 'Author' },
- ValueConv => '$self->Decode($val, "MacRoman")',
- },
- ANNO => {
- Name => 'Annotation',
- ValueConv => '$self->Decode($val, "MacRoman")',
- },
- 'ID3 ' => {
- Name => 'ID3',
- SubDirectory => {
- TagTable => 'Image::ExifTool::ID3::Main',
- ProcessProc => \&Image::ExifTool::ID3::ProcessID3,
- },
- },
- APPL => 'ApplicationData', # (first 4 bytes are the application signature)
-# SSND => 'SoundData',
-# MARK => 'Marker',
-# INST => 'Instrument',
-# MIDI => 'MidiData',
-# AESD => 'AudioRecording',
-);
-
-%Image::ExifTool::AIFF::Common = (
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
- GROUPS => { 2 => 'Audio' },
- FORMAT => 'int16u',
- 0 => 'NumChannels',
- 1 => { Name => 'NumSampleFrames', Format => 'int32u' },
- 3 => 'SampleSize',
- 4 => { Name => 'SampleRate', Format => 'extended' }, #3
- 9 => {
- Name => 'CompressionType',
- Format => 'string[4]',
- PrintConv => {
- NONE => 'None',
- ACE2 => 'ACE 2-to-1',
- ACE8 => 'ACE 8-to-3',
- MAC3 => 'MAC 3-to-1',
- MAC6 => 'MAC 6-to-1',
- sowt => 'Little-endian, no compression',
- alaw => 'a-law',
- ALAW => 'A-law',
- ulaw => 'mu-law',
- ULAW => 'Mu-law',
- 'GSM '=> 'GSM',
- G722 => 'G722',
- G726 => 'G726',
- G728 => 'G728',
- },
- },
- 11 => { #PH
- Name => 'CompressorName',
- Format => 'pstring',
- ValueConv => '$self->Decode($val, "MacRoman")',
- },
-);
-
-%Image::ExifTool::AIFF::FormatVers = (
- PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
- FORMAT => 'int32u',
- 0 => { Name => 'FormatVersionTime', %timeInfo },
-);
-
-%Image::ExifTool::AIFF::Comment = (
- PROCESS_PROC => \&Image::ExifTool::AIFF::ProcessComment,
- GROUPS => { 2 => 'Audio' },
- 0 => { Name => 'CommentTime', %timeInfo },
- 1 => 'MarkerID',
- 2 => {
- Name => 'Comment',
- ValueConv => '$self->Decode($val, "MacRoman")',
- },
-);
-
-%Image::ExifTool::AIFF::Composite = (
- Duration => {
- Require => {
- 0 => 'AIFF:SampleRate',
- 1 => 'AIFF:NumSampleFrames',
- },
- RawConv => '($val[0] and $val[1]) ? $val[1] / $val[0] : undef',
- PrintConv => 'ConvertDuration($val)',
- },
-);
-
-# add our composite tags
-Image::ExifTool::AddCompositeTags('Image::ExifTool::AIFF');
-
-
-#------------------------------------------------------------------------------
-# Process AIFF Comment chunk
-# Inputs: 0) ExifTool object reference, 1) DirInfo reference, 2) tag table ref
-# Returns: 1 on success
-sub ProcessComment($$$)
-{
- my ($et, $dirInfo, $tagTablePtr) = @_;
- my $dataPt = $$dirInfo{DataPt};
- my $dirLen = $$dirInfo{DirLen};
- my $verbose = $et->Options('Verbose');
- return 0 unless $dirLen > 2;
- my $numComments = unpack('n',$$dataPt);
- my $pos = 2;
- my $i;
- $verbose and $et->VerboseDir('Comment', $numComments);
- for ($i=0; $i<$numComments; ++$i) {
- last if $pos + 8 > $dirLen;
- my ($time, $markerID, $size) = unpack("x${pos}Nnn", $$dataPt);
- $et->HandleTag($tagTablePtr, 0, $time);
- $et->HandleTag($tagTablePtr, 1, $markerID) if $markerID;
- $pos += 8;
- last if $pos + $size > $dirLen;
- my $val = substr($$dataPt, $pos, $size);
- $et->HandleTag($tagTablePtr, 2, $val);
- ++$size if $size & 0x01; # account for padding byte if necessary
- $pos += $size;
- }
-}
-
-#------------------------------------------------------------------------------
-# Extract information from a AIFF file
-# Inputs: 0) ExifTool object reference, 1) DirInfo reference
-# Returns: 1 on success, 0 if this wasn't a valid AIFF file
-sub ProcessAIFF($$)
-{
- my ($et, $dirInfo) = @_;
- my $raf = $$dirInfo{RAF};
- my ($buff, $err, $tagTablePtr, $page, $type, $n);
-
- # verify this is a valid AIFF file
- return 0 unless $raf->Read($buff, 12) == 12;
- my $fast3 = $$et{OPTIONS}{FastScan} && $$et{OPTIONS}{FastScan} == 3;
- my $pos = 12;
- # check for DjVu image
- if ($buff =~ /^AT&TFORM/) {
- # http://www.djvu.org/
- # http://djvu.sourceforge.net/specs/djvu3changes.txt
- my $buf2;
- return 0 unless $raf->Read($buf2, 4) == 4 and $buf2 =~ /^(DJVU|DJVM)/;
- $pos += 4;
- $buff = substr($buff, 4) . $buf2;
- $et->SetFileType('DJVU');
- return 1 if $fast3;
- $tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main');
- # modify FileType to indicate a multi-page document
- $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM' and $$et{VALUE}{FileType};
- $type = 'DjVu';
- } else {
- return 0 unless $buff =~ /^FORM....(AIF(F|C))/s;
- $et->SetFileType($1);
- return 1 if $fast3;
- $tagTablePtr = GetTagTable('Image::ExifTool::AIFF::Main');
- $type = 'AIFF';
- }
- SetByteOrder('MM');
- my $verbose = $et->Options('Verbose');
-#
-# Read through the IFF chunks
-#
- for ($n=0;;++$n) {
- $raf->Read($buff, 8) == 8 or last;
- $pos += 8;
- my ($tag, $len) = unpack('a4N', $buff);
- my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
- $et->VPrint(0, "AIFF '${tag}' chunk ($len bytes of data): ", $raf->Tell(),"\n");
- # AIFF chunks are padded to an even number of bytes
- my $len2 = $len + ($len & 0x01);
- if ($len2 > 100000000) {
- if ($len2 >= 0x80000000 and not $et->Options('LargeFileSupport')) {
- $et->Warn('End of processing at large chunk (LargeFileSupport not enabled)');
- last;
- }
- if ($tagInfo) {
- $et->Warn("Skipping large $$tagInfo{Name} chunk (> 100 MB)");
- undef $tagInfo;
- }
- }
- if ($tagInfo) {
- if ($$tagInfo{TypeOnly}) {
- $len = $len2 = 4;
- $page = ($page || 0) + 1;
- $et->VPrint(0, $$et{INDENT} . "Page $page:\n");
- }
- $raf->Read($buff, $len2) >= $len or $err=1, last;
- unless ($$tagInfo{SubDirectory} or $$tagInfo{Binary}) {
- $buff =~ s/\0+$//; # remove trailing nulls
- }
- $et->HandleTag($tagTablePtr, $tag, $buff,
- DataPt => \$buff,
- DataPos => $pos,
- Start => 0,
- Size => $len,
- );
- } elsif (not $len) {
- next if ++$n < 100;
- $et->Warn('Aborting scan. Too many empty chunks');
- last;
- } elsif ($verbose > 2 and $len2 < 1024000) {
- $raf->Read($buff, $len2) == $len2 or $err = 1, last;
- $et->VerboseDump(\$buff);
- } else {
- $raf->Seek($len2, 1) or $err=1, last;
- }
- $pos += $len2;
- $n = 0;
- }
- $err and $et->Warn("Error reading $type file (corrupted?)");
- return 1;
-}
-
-1; # end
-
-__END__
-
-=head1 NAME
-
-Image::ExifTool::AIFF - Read AIFF meta information
-
-=head1 SYNOPSIS
-
-This module is used by Image::ExifTool
-
-=head1 DESCRIPTION
-
-This module contains routines required by Image::ExifTool to extract
-information from AIFF (Audio Interchange File Format) audio files.
-
-=head1 AUTHOR
-
-Copyright 2003-2023, Phil Harvey (philharvey66 at gmail.com)
-
-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<http://developer.apple.com/documentation/QuickTime/INMAC/SOUND/imsoundmgr.30.htm#pgfId=3190>
-
-=item L<http://astronomy.swin.edu.au/~pbourke/dataformats/aiff/>
-
-=item L<http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/>
-
-=back
-
-=head1 SEE ALSO
-
-L<Image::ExifTool::TagNames/AIFF Tags>,
-L<Image::ExifTool(3pm)|Image::ExifTool>
-
-=cut

View file

@ -52,7 +52,7 @@ function prepare_ubi_environment() {
yum install -by --nodocs \
autoconf clang-devel cmake gcc gcc-c++ make patch perl bzip2 \
libedit ncurses uuid libarchive curl-devel \
libicu-devel libffi-devel libuuid-devel openssl-devel \
libicu-devel libyaml-devel libedit-devel libffi-devel libuuid-devel openssl-devel \
ncurses-devel pcre2-devel zlib-devel libstdc++-static \
libevent-devel redhat-lsb-core procps-ng

29
scripts/install-exiftool Executable file
View file

@ -0,0 +1,29 @@
#!/bin/bash
set -xeuo pipefail
mkdir build \
&& curl -fsSL "$EXIFTOOL_DOWNLOAD_URL" -o exiftool.tar.gz \
&& echo "$EXIFTOOL_DOWNLOAD_SHA256 exiftool.tar.gz" | sha256sum -c - \
&& tar -C build -xzf exiftool.tar.gz
cd build/exiftool-$EXIFTOOL_VERSION
# Apply patches
patchdir="/patches/exiftool/${EXIFTOOL_VERSION}"
if [[ -d "${patchdir}" ]]; then
for i in "${patchdir}"/*.patch; do
echo "$i..."
patch -p1 -i "$i"
done
else
echo "!! Missing exiftools patch"
echo "!! Make sure the patch exists for exiftool version ${EXIFTOOL_VERSION} before proceeding."
exit 1
fi
perl Makefile.PL \
&& make install \
&& cd ../.. \
&& rm -rf build \
&& rm exiftool.tar.gz

View file

@ -189,6 +189,19 @@ function print_graphicsmagick_args() {
printf -- "--build-arg GRAPHISMAGICK_DOWNLOAD_SHA256=%s " "$GRAPHISMAGICK_DOWNLOAD_SHA256"
}
function print_exiftool_args() {
case "$1" in
12.60)
EXIFTOOL_VERSION=12.60
EXIFTOOL_DOWNLOAD_SHA256=30f22c28905c7aae46986c41cf1f3635781b336c8183b62348198734ffd33366
;;
*) fail "Unknown exiftool version $1" ;;
esac
printf -- "--build-arg EXIFTOOL_VERSION=%s " "$EXIFTOOL_VERSION"
printf -- "--build-arg EXIFTOOL_DOWNLOAD_SHA256=%s " "$EXIFTOOL_DOWNLOAD_SHA256"
}
function print_bazelisk_args() {
case "$1" in
1.9.0)
@ -358,6 +371,7 @@ function parse_arguments() {
YARN) print_yarn_args $version ;;
POSTGRESQL) print_postgres_args $version ;;
GRAPHICSMAGICK) print_graphicsmagick_args $version ;;
EXIFTOOL) print_exiftool_args $version ;;
BAZELISK) print_bazelisk_args $version ;;
GCLOUD) print_gcloud_args $version ;;
KUBECTL) print_kubectl_args $version ;;

View file

@ -2,7 +2,7 @@
# various variable operations used in this script.
PATH_TOOLS=(DEBIAN OS UBI RUBY GOLANG RUST NODE POSTGRESQL)
TAG_TOOLS=(BUNDLER RUBYGEMS GIT LFS CHROME YARN GRAPHICSMAGICK BAZELISK DOCKER GCLOUD KUBECTL HELM)
TAG_TOOLS=(BUNDLER RUBYGEMS GIT LFS CHROME YARN GRAPHICSMAGICK EXIFTOOL BAZELISK DOCKER GCLOUD KUBECTL HELM)
# Generate the docker image path using the components that were specified via
# variables.