var cmd = DOpus.Create().Command(); var stt = DOpus.Create().StringTools(); var fsu = DOpus.FSUtil(); var wld = fsu.NewWild(); var fso = new ActiveXObject('Scripting.FileSystemObject'); var wsh = new ActiveXObject('WScript.Shell'); var exifColumns = DOpus.Create().Vector(); var exifCache = DOpus.Create().Vector(); var exifTags = DOpus.Create().Map(); // -- Adjust to your system. Copy the path to exiftool.exe with 'Edit - Copy Other - Copy Full Pathnames (Double Backslashes)' var exeExifTool = fsu.Resolve('C:\\Program Files\\exiftool\\exiftool.exe'); // -- Adjust to your preferences. Use double backslashes. var cacheFolder = fsu.Resolve('/profile\\ExifToolCache'); // Add wildcard pattern against which the script should match the filename // https://www.gpsoft.com.au/help/opus12/index.html#!Documents/Scripting/Wild.htm // wld.Parse('grp:Images', 'f'); // wld.Parse('*.(iso|mkv|xml|gpx)'); // wld.Parse('*.(pdf|epub|txt|doc)'); // Pick one of the three options (by out-commenting the other two) to decide which files the script should process // var patternCheckMode = 1; // process only files that *match* the pattern var patternCheckMode = 0; // process all files // var patternCheckMode = -1; // process only files that *do not match* the pattern // Set to false if you don't want any logging var log = true; // Column definitions go here. // group, tag: reference for ExifTool (mandatory) // name, label, header: adjust to your preferences (optional) // justify: like Opus standard for columns (optional) // type: datetime, date, time, double, number. String, if left empty (optional) // defaultValue: value, if no tag is found via ExifTool (optional) // group, tag, name, label, header, defaultValue, justify, type exifColumns.push_back(GetColumnMap('Canon', 'CanonExposureMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Canon', 'FocusMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Canon', 'MeteringMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Canon', 'NumAFPoints', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('Canon', 'OneShotAFRelease', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Canon', 'ValidAFPoints', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'Aperture', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('Composite', 'AvgBitrate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'CircleOfConfusion', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'Duration', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'FOV', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'FocalLength35efl', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'GPSAltitude', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('Composite', 'GPSDateTime', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('Composite', 'GPSLatitude', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('Composite', 'GPSLongitude', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('Composite', 'GPSPosition', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'HyperfocalDistance', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'ImageSize', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'LensID', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'LightValue', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'Megapixels', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'Rotation', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('Composite', 'ShootingMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'ShutterSpeed', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Composite', 'SubSecCreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('Composite', 'SubSecDateTimeOriginal', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('Composite', 'SubSecModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('EXE', 'CompanyName', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXE', 'MachineType', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXE', 'SubsystemVersion', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXE', 'TimeStamp', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('EXIF', 'ApertureValue', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'CreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('EXIF', 'DateTimeOriginal', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('EXIF', 'ExposureCompensation', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'ExposureMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'ExposureProgram', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'ExposureTime', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'FNumber', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('EXIF', 'Flash', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'FocalLength', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSAltitude', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSAltitudeRef', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSDateStamp', '', '', '', '', '', 'date')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSLatitude', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSLatitudeRef', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSLongitude', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSLongitudeRef', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'GPSTimeStamp', '', '', '', '', '', 'time')); exifColumns.push_back(GetColumnMap('EXIF', 'ISO', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('EXIF', 'LensInfo', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'LensModel', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'LensSerialNumber', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'Make', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'Model', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'ModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('EXIF', 'Orientation', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'UserComment', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'XPComment', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('EXIF', 'XResolution', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('EXIF', 'YResolution', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('ExifIFD', 'DateTimeOriginal', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('File', 'Comment', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('File', 'EncodingProcess', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('File', 'FileAccessDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('File', 'FileCreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('File', 'FileModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('File', 'FileTypeExtension', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'ApertureSetting', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'DateTimeOriginal', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('H264', 'ExposureProgram', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'ExposureTime', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'FNumber', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('H264', 'Focus', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'Gain', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'ImageHeight', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('H264', 'ImageStabilization', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'ImageWidth', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('H264', 'Make', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'Model', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'TimeCode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('H264', 'WhiteBalance', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('ID3', 'Genre', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('ID3', 'ReleaseTime', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('ID3', 'Subtitle', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('ID3', 'Year', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('M2TS', 'AudioBitrate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('M2TS', 'AudioChannels', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('M2TS', 'AudioSampleRate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('M2TS', 'Duration', '', '', '', '', '', 'time')); exifColumns.push_back(GetColumnMap('M2TS', 'SurroundMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('M2TS', 'VideoStreamType', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('MakerNotes', 'CameraOrientation', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('MakerNotes', 'CanonExposureMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('MakerNotes', 'CanonFirmwareVersion', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('MakerNotes', 'CanonModelID', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('MakerNotes', 'CreativeStyle', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('MakerNotes', 'ShutterCount', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('MakerNotes', 'WhiteBalance', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Matroska', 'DateTimeOriginal', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('Matroska', 'DisplayHeight', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('Matroska', 'DisplayWidth', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('Matroska', 'Duration', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('Matroska', 'ImageHeight', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('Matroska', 'ImageWidth', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('Matroska', 'TrackNumber', '', '', '', 'right', 'number', '')); exifColumns.push_back(GetColumnMap('PDF', 'CreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('PDF', 'Creator', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('PDF', 'ModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('PDF', 'PageCount', '', '', '', '', 'right', 'number')); exifColumns.push_back(GetColumnMap('PDF', 'Producer', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('PDF', 'Title', '', '', '', '', 'left', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'AudioAvgBitrate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'CompressorID', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'ContentCreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'CreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'CreationDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'DateAcquired', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'DateTimeOriginal', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'Duration', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('QuickTime', 'EncodingTime', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'LocationDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'MajorBrand', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'Make', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'MediaCreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'MediaDuration', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('QuickTime', 'MediaModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'MinorVersion', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'Model', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'ModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'Title', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'TrackCreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'TrackDuration', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('QuickTime', 'TrackModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('QuickTime', 'VideoAvgBitrate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'VideoAvgFrameRate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'VideoCodec', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'VideoFrameRate', '', '', '', '', 'right', 'double')); exifColumns.push_back(GetColumnMap('QuickTime', 'VideoMaxBitrate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'VideoMaxFrameRate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'VideoSize', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'XResolution', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('QuickTime', 'YResolution', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('RIFF', 'AvgBytesPerSec', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('RIFF', 'BitsPerSample', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('RIFF', 'Encoding', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('RIFF', 'NumChannels', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('RIFF', 'SampleRate', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('Sony', 'FocusMode', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'CreationDateValue', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('XML', 'DeviceManufacturer', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'DeviceModelName', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'DeviceSerialNo', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'VideoFormatVideoFrameCaptureFps', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'VideoFormatVideoFrameFormatFps', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'VideoFormatVideoFrameVideoCodec', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'VideoFormatVideoLayoutNumOfVerticalLine', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XML', 'VideoFormatVideoLayoutPixel', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'Contributor', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'CreateDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('XMP', 'Creator', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'CreatorTool', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'Date', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('XMP', 'DateCreated', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('XMP', 'Description', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'Format', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'Headline', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'MetadataDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('XMP', 'ModifyDate', '', '', '', '', '', 'datetime')); exifColumns.push_back(GetColumnMap('XMP', 'Producer', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'Subject', '', '', '', '', '', '')); exifColumns.push_back(GetColumnMap('XMP', 'Title', '', '', '', '', 'left', '')); exifColumns.push_back(GetColumnMap('XMP', 'XMPToolkit', '', '', '', '', '', '')); function GetColumnMap(group, tag, name, label, header, defaultValue, justify, type) { var map = DOpus.Create().Map(); var tmp = (group + '-' + tag); map('group') = group; map('tag') = tag; map('name') = name == '' ? tmp : stt.Decode(name, 'utf8'); map('label') = label == '' ? tmp : stt.Decode(label, 'utf8'); map('header') = header == '' ? tmp : stt.Decode(header, 'utf8'); map('defaultValue') = defaultValue == '' ? '' : stt.Decode(defaultValue, 'utf8'); map('justify') = justify; map('type') = type; return map; } function OnInit(initData) { initData.name = 'ExifTool'; initData.desc = 'Provide columns for tags read via exiftool.exe'; initData.version = '2023-02-28'; initData.url = 'https://resource.dopus.com/t/exiftool-custom-columns/38975'; initData.default_enable = true; cmd.RunCommand('CreateFolder NAME="' + cacheFolder + '"'); Log('exeExifTool: ' + exeExifTool + (fsu.Exists(exeExifTool) ? ' - OK. File exists' : ' - Error. File not found!')); Log('cacheFolder: ' + cacheFolder + (fsu.Exists(cacheFolder) ? ' - OK. Folder exists' : ' - Error. Folder not found!')); } function OnAddColumns(AddColData) { for (var e = new Enumerator(exifColumns); !e.atEnd(); e.moveNext()) { var columnItem = e.item(); var col = AddColData.AddColumn(); col.multicol = true; col.label = columnItem('label'); col.header = columnItem('header'); col.justify = columnItem('justify'); col.name = columnItem('name'); col.type = columnItem('type'); col.method = 'OnColumn'; } } function OnColumn(scriptColData) { var item = scriptColData.item; var tab = scriptColData.tab; if (item.is_dir) return; if (!CheckPattern(item.name)) { Log('skipped (pattern mismatch): ' + item); return; } if ((String(item).substring(1, 15)) == ':\\$RECYCLE.BIN') { Log('skipped (inside recycle bin): ' + item); return; } var itemPath = fsu.GetItem(item.path); if (itemPath.InGroup('Archives')) { Log('skipped (inside archive): ' + item); return; } if (itemPath.fileattr.hidden) { Log('skipped (hidden file/folder): ' + item); return; } if (itemPath.fileattr.system) { Log('skipped (system file/folder): ' + item); return; } var cacheFile = fsu.GetItem(cacheFolder + '\\' + String(item.realpath).replace(':', '') + '.txt'); if (log) var startTime = DOpus.Create().Date(); if (!fsu.Exists(cacheFile) || cacheFile.modify.Compare(item.modify) < 0) { var srcToEnum = tab.path; if (typeof srcToEnum == 'object') { var filesToEnum = tab.files; } else { // Script gets called for some renaming action. No tab, so we enumerate the item's parent folder instead. srcToEnum = item.path; var filesToEnum = fsu.ReadDir(item.path).Next(-1); } Log('Enumerating ' + filesToEnum.count + ' items in "' + srcToEnum + '"...', startTime); var argFile = fsu.GetTempFile(); var filesForExifTool = 0; for (var e = new Enumerator(filesToEnum); !e.atEnd(); e.moveNext()) { var enumFile = e.item(); if (enumFile.is_dir) continue; if (!CheckPattern(enumFile.name)) continue; var cacheTabItem = fsu.GetItem(cacheFolder + '\\' + String(enumFile.realpath).replace(':', '') + '.txt'); if (fsu.Exists(cacheTabItem) && cacheTabItem.modify.Compare(enumFile.modify) > 0) continue; argFile.Write('--printConv\n-short\n-duplicates\n-unknown\n-groupNames\n-tab\n-charset\nFileName=UTF8\n-textOut!\n' + cacheTabItem.path + '\\%F.txt\n' + String(enumFile.realpath).replace(/\\$/, '') + '\n-execute\n'); Log(enumFile, startTime); ++filesForExifTool; } argFile.Close(); Log('... Handing over ' + filesForExifTool + ' files to ExifTool...', startTime); if (filesForExifTool > 0) { var cmdLine = '"' + exeExifTool + '" -@ "' + argFile + '"'; Log(cmdLine, startTime); wsh.Run(cmdLine, 0, true); } else { Log('*** No files found - so nothing to do for ExifTool (strange!) ***', startTime); } Log('... done!', startTime); } if (!fsu.Exists(cacheFile)) { Log('*** Error: cache file could not be created! ***'); Log('item: ' + item); Log('cacheFile: ' + cacheFile); Log(''); Log('cmdLine:'); Log(cmdLine); Log(''); return; } exifCache.assign(stt.Decode(cacheFile.Open().Read(), 'utf8').split('\r\n')); exifTags.clear(); for (var e = new Enumerator(exifCache); !e.atEnd(); e.moveNext()) { var line = e.item().split('\t'); var group = line[0]; var tag = line[1]; var value = line[2]; var key = group + '-' + tag; exifTags(key) = value; } for (var e = new Enumerator(exifColumns); !e.atEnd(); e.moveNext()) { var column = e.item(); var name = column('name'); var type = column('type'); group = column('group'); tag = column('tag'); key = group + '-' + tag; value = exifTags.exists(key) ? exifTags(key) : column('defaultValue'); if (type == 'datetime' || type == 'date' || type == 'time') { value = value.replace(/^(\d\d\d\d):(\d\d):(\d\d)/, '$1-$2-$3'); if (value != '') value = DOpus.Create().Date(value); } else if (type == 'number' || type == 'double') { value = Number(value.replace(/s/g, '')); } // Here we add some post-processing to the column values // Fully optional - modify as needed. if (key == 'QuickTime-Duration') { value = Math.round(value * 10) / 10; } if (key == 'QuickTime-VideoFrameRate') { value = Math.round(value * 10) / 10; } if (key.indexOf('QuickTime') == 0 && key.indexOf('Duration') > 0) { value = Math.round(value * 10) / 10; } if (group == 'QuickTime') { if (tag.indexOf('Duration') >= 0) { value = Math.round(value * 10) / 10; } else if (tag == 'Model') { value = value.replace(' (1st generation)', ''); value = value.replace(' (2nd generation)', ''); value = value.replace(' (3rd generation)', ''); value = value.replace(' (12.9-inch)', ''); } } // End of post-processing scriptColData.columns(name).value = value; } } function CheckPattern(itemName) { if (patternCheckMode > 0 && wld.Match(itemName)) return true; if (patternCheckMode == 0) return true; if (patternCheckMode < 0 && !wld.Match(itemName)) return true; return false; } function Log(str, time) { if (!log) return; if (time) { var currTime = DOpus.Create().Date(); str = padTime(currTime + currTime.ms - time - time.ms) + ' ' + str; } DOpus.Output(str); } function padTime(milliseconds) { var str = ('000000' + String(milliseconds)).slice(-6); var tmp = str.substring(0, 3) + ':' + str.substring(3, 6); tmp = tmp.replace(/^00/, ' '); tmp = tmp.replace(/^0/, ' '); return tmp; }