function OnInit(initData) {
initData.name = 'ExifTool';
initData.desc = 'Provide columns for metadata read via ExifTool';
initData.version = '2024-01-23';
initData.url = 'https://resource.dopus.com/t/exiftool-custom-columns/38975';
initData.default_enable = true;
initData.min_version = '13.0';
initData.config_desc = DOpus.Create().Map();
initData.config_desc('logLevel') = 'Set level of logging';
initData.config.logLevel = DOpus.Create.Vector(1,
'none',
'standard',
'max');
initData.config_desc('exeExifTool') = 'Enter full path to exiftool.exe';
initData.config.exeExifTool = '/programfiles\\exiftool\\exiftool.exe';
initData.config_desc('cacheFolder') = 'Enter full path to cache folder';
initData.config.cacheFolder = '/profile\\ExifToolCache';
initData.config_desc('patternCheckMode') = 'Set which files to process';
initData.config.patternCheckMode = DOpus.Create.Vector(0,
'all',
'matching',
'non-matching');
initData.config_desc('wildPattern') = 'Set wildcard pattern to match against the filename';
initData.config.wildPattern = '*.*';
initData.config_desc('wildFlags') = 'Set pattern matching mode';
initData.config.wildFlags = DOpus.Create.Vector(0,
'standard pattern matching',
'regular expression',
'filename mode',
'case-sensitive',
'DOS only');
initData.config_desc('printConversion') = 'Select human or machine readable format';
initData.config.printConversion = DOpus.Create.Vector(0,
'human',
'machine');
}
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';
}
var exeExifTool = fsu.Resolve(Script.config.exeExifTool);
var cacheFolder = fsu.Resolve(Script.config.cacheFolder);
var cmd = DOpus.Create().Command();
cmd.RunCommand('CreateFolder NAME="' + cacheFolder + '"');
if (fsu.Exists(exeExifTool)) {
Log(2, 'exeExifTool: ' + exeExifTool);
} else {
Log(1, 'exeExifTool: ' + exeExifTool);
Log(1, ' File not found!');
}
if (fsu.Exists(cacheFolder)) {
Log(2, 'cacheFolder: ' + cacheFolder);
} else {
Log(1, 'cacheFolder: ' + cacheFolder);
Log(1, ' Folder not found!');
}
Log(2, 'patternCheckMode: ' + Script.config.patternCheckMode);
Log(2, 'wildPattern: ' + Script.config.wildPattern);
Log(2, 'wildFlags: ' + Script.config.wildFlags);
Log(2, 'logLevel: ' + Script.config.logLevel);
Log(2, 'printConversion: ' + Script.config.printConversion);
Log(2, 'exifColumns.count: ' + exifColumns.count);
}
function OnAddCommands(addCmdData) {
var cmd = addCmdData.AddCommand();
cmd.name = 'ExifToolProbeFiles';
cmd.method = 'OnExifToolProbeFiles';
cmd.desc = 'Generate text files with ExifTool metadata for selected files';
cmd.label = 'Probe Files';
cmd.hide = false;
cmd.icon = 'script';
var cmd = addCmdData.AddCommand();
cmd.name = 'ExifToolOpenCacheInDual';
cmd.method = 'OnExifToolOpenCacheInDual';
cmd.desc = 'Open the ExifTool cache folder for the source in the destination';
cmd.label = 'Open Cache In Dual';
cmd.hide = false;
cmd.icon = 'script';
var cmd = addCmdData.AddCommand();
cmd.name = 'ExifToolColumnsToCommands';
cmd.method = 'OnExifToolColumnsToCommands';
cmd.desc = 'Edit clipboard content: Convert column definitions to button commands';
cmd.label = 'Columns To Commands';
cmd.hide = false;
cmd.icon = 'script';
var cmd = addCmdData.AddCommand();
cmd.name = 'ExifToolDeleteCache';
cmd.method = 'OnExifToolDeleteCache';
cmd.desc = 'Delete ExifTool cache for the source';
cmd.label = 'Delete Cache';
cmd.hide = false;
cmd.icon = 'script';
}
function OnColumn(scriptColData) {
var item = scriptColData.item;
var tab = scriptColData.tab;
if (item.is_dir) return;
var exeExifTool = fsu.Resolve(Script.config.exeExifTool);
var cacheFolder = fsu.Resolve(Script.config.cacheFolder);
if (!fsu.Exists(exeExifTool)) {
Log(1, 'skipped (exiftool.exe not found): ' + exeExifTool);
return;
}
if (!fsu.Exists(cacheFolder)) {
Log(1, 'skipped (cacheFolder not found): ' + cacheFolder);
return;
}
if (!CheckPattern(item.name)) {
Log(2, 'skipped (pattern mismatch): ' + item);
return;
}
if ((String(item).substring(1, 15)) == ':\\$RECYCLE.BIN') {
Log(2, 'skipped (inside recycle bin): ' + item);
return;
}
if ((String(item.path).indexOf(String(cacheFolder))) == 0) {
Log(2, 'skipped (inside cachefolder): ' + item);
return;
}
var itemPath = fsu.GetItem(item.path);
if (itemPath.InGroup('Archives')) {
Log(2, 'skipped (inside archive): ' + item);
return;
}
if (itemPath.fileattr != undefined) {
if (itemPath.fileattr.hidden) {
Log(2, 'skipped (hidden file/folder): ' + item);
return;
}
if (itemPath.fileattr.system) {
Log(2, 'skipped (system file/folder): ' + item);
return;
}
}
var cacheFile = fsu.GetItem(cacheFolder + '\\' + String(item.realpath).replace(':', '') + '.txt');
if (Script.config.logLevel) 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 {
srcToEnum = item.path;
var filesToEnum = fsu.ReadDir(item.path).Next(-1);
}
Log(1, '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('' +
(Script.config.printConversion ? '--printConv\n' : '') +
'-short\n' +
'-duplicates\n' +
'-unknown\n' +
'-groupNames\n' +
'-tab\n' +
'-charset\n' +
'FileName=UTF8\n' +
'-textOut!\n' +
cacheTabItem.path + '\\%F.txt\n' +
String(enumFile.realpath).replace(/\\$/, '') + '\n' +
'-execute\n');
Log(2, enumFile, startTime);
filesForExifTool++;
}
argFile.Close();
Log(1, '... done!', startTime);
if (filesForExifTool > 0) {
Log(1, 'Handing over ' + filesForExifTool + ' files to ExifTool...', startTime);
var cmdLine = '"' + exeExifTool + '" -@ "' + argFile + '"';
Log(2, cmdLine, startTime);
wsh.Run(cmdLine, 0, true);
Log(1, '... done!', startTime);
} else {
Log(2, '*** No files found - so nothing to do for ExifTool (Who called the script and why? Strange!) ***', startTime);
Log(2, 'srcToEnum: ' + srcToEnum);
Log(2, 'typeof srcToEnum: ' + typeof srcToEnum);
Log(2, 'filesToEnum: ' + filesToEnum);
Log(2, 'typeof filesToEnum: ' + typeof filesToEnum);
}
}
if (!fsu.Exists(cacheFile)) {
Log(2, '*** Error: cache file could not be created! ***');
Log(2, 'item: ' + item);
Log(2, 'cacheFile: ' + cacheFile);
Log(2, '');
Log(2, 'cmdLine:');
Log(2, cmdLine);
Log(2, '');
return;
}
exifTags.clear();
var exifCache = stt.Decode(cacheFile.Open().Read(), 'utf8').split('\r\n');
for (var i = 0; i < exifCache.length; i++) {
var line = exifCache[i].split('\t');
if (line.length != 3) continue;
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' || type == 'duration' || type == 'durationh') {
value = value.replace(/[^\d\.]/g, '');
}
// Add your custom modifications here...
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)', '');
// }
// }
// ... but not below this line!
scriptColData.columns(name).value = value;
}
}
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 CheckColumns() {
exifColumns.reverse();
for (var i = exifColumns.count - 1; i >= 0; i--) {
var columnItem = exifColumns(i);
if (ssi.insert(columnItem('name'))) continue;
Log(1, 'removed (dupe): ' + columnItem('name'));
exifColumns.erase(i);
}
exifColumns.reverse();
}
function CheckPattern(itemName) {
var pCM = Script.config.patternCheckMode;
if (pCM == 0) return true;
var wildPattern = Script.config.wildPattern
var wildFlags = ['', 'r', 'f', 'c', 'd'][Script.config.wildFlags];
wld.Parse(wildPattern, wildFlags);
if (pCM == 1 && wld.Match(itemName)) return true;
if (pCM == 2 && !wld.Match(itemName)) return true;
return false;
}
function padTime(milliseconds) {
var tmp = ('000000' + String(milliseconds)).slice(-6);
tmp = tmp.substring(0, 3) + ':' + tmp.substring(3, 6);
tmp = tmp.replace(/^00/, ' ');
tmp = tmp.replace(/^0/, ' ');
return tmp;
}
function Log(level, str, time) {
var logLevel = Script.config == null ? 2 : Script.config.logLevel;
if (!logLevel) return;
if (!level) return;
if (level > logLevel) return;
if (time) {
var currTime = DOpus.Create().Date();
str = padTime(currTime + currTime.ms - time - time.ms) + ' ' + str;
}
DOpus.Output(str);
}
function OnExifToolProbeFiles(scriptCmdData) {
var cmd = scriptCmdData.func.command;
var tab = scriptCmdData.func.sourcetab;
var wsh = new ActiveXObject('WScript.Shell');
cmd.deselect = false;
if (tab.selected_files.count == 0) return;
var exeExifTool = fsu.Resolve(Script.config.exeExifTool);
Log(2, 'Enumerating...');
Log(2, '');
cmd.ClearFiles();
for (var e = new Enumerator(tab.selected_files); !e.atEnd(); e.moveNext()) {
var item = e.item();
var exifColumnsPath = fsu.GetTempFilePath();
var cmdLine = '"' + exeExifTool + '"' +
' -short' +
' -duplicates' +
' -unknown' +
' -groupNames' +
' -tab' +
' -textOut! "%0f' + exifColumnsPath + '"' +
' "' + item + '"';
Log(2, cmdLine);
wsh.Run(cmdLine, 0, true);
var exifColumnsLines = stt.Decode(fsu.GetItem(exifColumnsPath).Open().Read(), 'utf8').split('\r\n');
var exifColumnsFile = fsu.GetItem(item + '-exifColumns.txt').Open('wa');
for (var i = 0; i < exifColumnsLines.length; i++) {
var line = exifColumnsLines[i].split('\t');
if (line.length != 3) continue;
var group = line[0];
var tag = line[1];
var value = line[2];
var str = 'exifColumns.push_back(GetColumnMap(\'' + group + '\', \'' + tag + '\', \'\', \'\', \'\', \'\', \'\', \'\'));';
while (str.length < 140) str += ' ';
str += '// ' + value + '\r\n';
exifColumnsFile.Write(str);
}
exifColumnsFile.Close();
cmd.AddFile(exifColumnsFile);
}
Log(2, '');
Log(2, '... done');
cmd.RunCommand('Select NONE');
cmd.RunCommand('Select FROMSCRIPT SETFOCUS');
cmd.RunCommand('Select SHOWFOCUS')
}
function OnExifToolOpenCacheInDual(scriptCmdData) {
var cmd = scriptCmdData.func.command;
var tab = scriptCmdData.func.sourcetab;
var lst = tab.lister;
cmd.deselect = false;
var cacheFolder = fsu.Resolve(Script.config.cacheFolder);
var srcPath = String(fsu.Resolve(tab.path));
Log(1, srcPath);
if (srcPath.substring(0, 2) == '::') return;
var destPath = cacheFolder + '\\' + srcPath.replace(':', '').replace(/\\$/, '');
Log(1, destPath);
cmd.RunCommand('CreateFolder NAME="' + destPath + '"');
cmd.RunCommand('GO' +
' PATH="' + destPath + '"' +
' NEWTAB=findexisting' +
' OPENINDUAL');
cmd.ClearFiles();
for (var e = new Enumerator(tab.selected_files); !e.atEnd(); e.moveNext()) {
var item = e.item();
cmd.AddFile(destPath + '\\' + item.name + '.txt');
}
lst.Update();
cmd.SetSourceTab(lst.desttab);
cmd.RunCommand('Set FORMAT=!default');
cmd.RunCommand('SELECT NONE');
cmd.RunCommand('SELECT FROMSCRIPT SETFOCUS');
cmd.RunCommand('SELECT SHOWFOCUS');
cmd.RunCommand('Set FOCUS=dest');
}
function OnExifToolColumnsToCommands(scriptCmdData) {
if (DOpus.GetClipFormat() != 'text') {
Log(1, 'No text in Clipboard!');
return;
}
var cmd = scriptCmdData.func.command;
cmd.deselect = false;
var clipLines = DOpus.GetClip().split('\r\n');
var tmp = '';
for (var i = 0; i < clipLines.length; i++) {
var line = clipLines[i].split('\'');
var group = line[1];
var tag = line[3];
var name = line[5];
if (name == '') name = group + '-' + tag;
if (typeof name == 'undefined') continue;
tmp += 'Set COLUMNSTOGGLE="scp:ExifTool/' + name + '(!,a,0)"\r\n';
}
if (tmp) {
Log(2, 'Clipboard converted to ' + tmp.split('\r\n').count + ' Set commands');
Log(2, '');
Log(2, 'New clipboard content:');
Log(2, tmp);
DOpus.SetClip(tmp);
} else {
Log(1, 'Nothing found. Clipboard unchanged.');
}
}
function OnExifToolDeleteCache(scriptCmdData) {
var cmd = scriptCmdData.func.command;
var tab = scriptCmdData.func.sourcetab;
cmd.deselect = false;
var cacheFolder = fsu.Resolve(Script.config.cacheFolder);
var srcPath = String(fsu.Resolve(tab.path));
if (fsu.GetType(srcPath) == 'invalid') return; // special nodes like 'This PC' and 'iCloud Photos'
cmd.ClearFiles();
Log(2, 'Looking for cache folders...');
Log(2, '');
if (srcPath.substring(0, 5) == 'coll:') {
var locations = DOpus.Create().StringSetI();
var folderEnum = fsu.ReadDir(srcPath);
while (!folderEnum.complete) {
var item = folderEnum.Next();
locations.insert(item.path);
}
folderEnum.Close();
for (var e = new Enumerator(locations); !e.atEnd(); e.moveNext()) {
var loc = e.item();
var destPath = cacheFolder + '\\' + loc.replace(':', '');
Log(2, destPath);
cmd.AddFile(destPath);
}
} else {
var destPath = cacheFolder + '\\' + srcPath.replace(':', '');
Log(2, destPath);
cmd.AddFile(destPath);
}
Log(2, '');
Log(2, '... done!');
cmd.RunCommand('Delete QUIET');
cmd.RunCommand('Go REFRESH');
}
var stt = DOpus.Create().StringTools();
var ssi = DOpus.Create().StringSetI();
var fsu = DOpus.FSUtil();
var wld = fsu.NewWild();
var wsh = new ActiveXObject('WScript.Shell');
var exifColumns = DOpus.Create().Vector();
var exifTags = DOpus.Create().Map();
// 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, duration, durationh. 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('ASF', 'AudioChannels', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'AudioCodecDescription', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'AudioCodecID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'AudioCodecName', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'AudioSampleRate', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'Author', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'Copyright', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'CreationDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('ASF', 'DataPackets', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'Duration', '', '', '', '', 'right', 'duration'));
exifColumns.push_back(GetColumnMap('ASF', 'ErrorCorrectionType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'FileID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'FileLength', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'Flags', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'ImageHeight', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'ImageWidth', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'MaxBitrate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'MaxPacketSize', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'MinPacketSize', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'Preroll', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'SendDuration', '', '', '', '', 'right', 'duration'));
exifColumns.push_back(GetColumnMap('ASF', 'StreamNumber', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('ASF', 'StreamType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'TimeOffset', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'Title', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'VideoCodecDescription', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ASF', 'VideoCodecName', '', '', '', '', '', ''));
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', 'ValidAFPoints', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('Composite', 'Aperture', '', '', '', '', 'right', 'double'));
exifColumns.push_back(GetColumnMap('Composite', 'AvgBitrate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'BlueBalance', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'CircleOfConfusion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'DOF', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'DriveMode', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'Duration', '', '', '', '', 'right', 'duration'));
exifColumns.push_back(GetColumnMap('Composite', 'FOV', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'FocalLength35efl', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'FocusDistance2', '', '', '', '', '', ''));
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', 'ISO', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'ImageSize', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'Lens', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'Lens35efl', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'LensID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'LightValue', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'Megapixels', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'RedBalance', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Composite', 'Rotation', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('Composite', 'ScaleFactor35efl', '', '', '', '', '', ''));
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('Composite', 'VolumeSize', '', '', '', '', '', ''));
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', 'Artist', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'BitsPerSample', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'BlackLevel', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'BrightnessValue', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'CFAPattern2', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'CFARepeatPatternDim', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ChromaticAberrationCorrection', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ColorSpace', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ComponentsConfiguration', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'CompressedBitsPerPixel', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Compression', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Contrast', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Copyright', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'CreateDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('EXIF', 'CustomRendered', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'DateTimeOriginal', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('EXIF', 'DefaultCropOrigin', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'DefaultCropSize', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'DigitalZoomRatio', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'DistortionCorrection', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ExifImageHeight', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ExifImageWidth', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ExifVersion', '', '', '', '', '', ''));
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', 'FileSource', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Flash', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'FlashpixVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'FocalLength', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'FocalLengthIn35mmFormat', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'FocalPlaneResolutionUnit', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'FocalPlaneXResolution', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'FocalPlaneYResolution', '', '', '', '', '', ''));
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', 'GPSDifferential', '', '', '', '', '', ''));
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', 'GPSMapDatum', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'GPSStatus', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'GPSTimeStamp', '', '', '', '', '', 'time'));
exifColumns.push_back(GetColumnMap('EXIF', 'GPSVersionID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ISO', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('EXIF', 'ImageDescription', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ImageHeight', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ImageWidth', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'InteropIndex', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'InteropVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'LensInfo', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'LensModel', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'LensSerialNumber', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'LightSource', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Make', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'MaxApertureValue', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'MeteringMode', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Model', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ModifyDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('EXIF', 'OffsetTime', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'OffsetTimeDigitized', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'OffsetTimeOriginal', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Orientation', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'OwnerName', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'PhotometricInterpretation', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'PlanarConfiguration', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'PreviewImageLength', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'PreviewImageStart', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'RecommendedExposureIndex', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ResolutionUnit', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Rotation', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'RowsPerStrip', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SamplesPerPixel', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Saturation', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SceneCaptureType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SceneType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SensitivityType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SerialNumber', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Sharpness', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ShutterSpeedValue', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'Software', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SonyCropSize', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SonyCropTopLeft', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SonyRawFileType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'StripByteCounts', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'StripOffsets', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SubSecTime', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'SubfileType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ThumbnailLength', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'ThumbnailOffset', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'UserComment', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'VignettingCorrection', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'WB_RGGBLevels', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'WhiteBalance', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'WhiteLevel', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'XPComment', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'XResolution', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('EXIF', 'YCbCrPositioning', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('EXIF', 'YResolution', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('ExifIFD', 'DateTimeOriginal', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('FLAC', 'BitsPerSample', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'BlockSizeMax', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'BlockSizeMin', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'Channels', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'FrameSizeMax', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'FrameSizeMin', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'MD5Signature', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'Padding', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'Picture', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureBitsPerPixel', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureDescription', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureHeight', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureIndexedColors', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureLength', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureMIMEType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'PictureWidth', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'SampleRate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'SeekTable', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('FLAC', 'TotalSamples', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'BitsPerSample', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'ColorComponents', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'Comment', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'Directory', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'EncodingProcess', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'ExifByteOrder', '', '', '', '', '', ''));
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', 'FileName', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'FilePermissions', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'FileSize', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('File', 'FileType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'FileTypeExtension', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'ImageHeight', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'ImageWidth', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'LineCount', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('File', 'MIMEEncoding', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'MIMEType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'Newlines', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'WordCount', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('File', 'YCbCrSubSampling', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('File', 'ZoneIdentifier', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Flash', 'AudioBitrate', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'AudioBitsPerSample', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'AudioChannels', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'AudioEncoding', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Flash', 'AudioSampleRate', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'ByteLength', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'CanSeekOnTime', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Flash', 'Duration', '', '', '', '', 'right', 'duration'));
exifColumns.push_back(GetColumnMap('Flash', 'FrameRate', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'ImageHeight', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'ImageWidth', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'SourceData', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Flash', 'StartTime', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('Flash', 'TotalDataRate', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'TotalDuration', '', '', '', '', 'right', 'duration'));
exifColumns.push_back(GetColumnMap('Flash', 'VideoBitrate', '', '', '', '', '', 'number'));
exifColumns.push_back(GetColumnMap('Flash', 'VideoEncoding', '', '', '', '', '', ''));
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('ICC_Profile', 'BlueMatrixColumn', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'BlueTRC', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'CMMFlags', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ChromaticAdaptation', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ColorSpaceData', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ConnectionSpaceIlluminant', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'DeviceAttributes', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'DeviceManufacturer', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'DeviceModel', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'GreenMatrixColumn', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'GreenTRC', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'MediaBlackPoint', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'MediaWhitePoint', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'PrimaryPlatform', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileCMMType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileClass', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileConnectionSpace', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileCopyright', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileCreator', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileDateTime', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileDescription', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileFileSignature', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'ProfileVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'RedMatrixColumn', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'RedTRC', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ICC_Profile', 'RenderingIntent', '', '', '', '', '', ''));
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('ISO', 'PathTableLocation', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'PathTableSize', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'RootDirectoryCreateDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('ISO', 'Software', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'System', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'VolumeBlockCount', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'VolumeBlockSize', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'VolumeCreateDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('ISO', 'VolumeModifyDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('ISO', 'VolumeName', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'VolumeSetDiskCount', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ISO', 'VolumeSetDiskNumber', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('JFIF', 'JFIFVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('JFIF', 'ResolutionUnit', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('JFIF', 'XResolution', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('JFIF', 'YResolution', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('M2TS', 'AudioBitrate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('M2TS', 'AudioChannels', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('M2TS', 'AudioSampleRate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('M2TS', 'Duration', '', '', '', '', '', 'duration'));
exifColumns.push_back(GetColumnMap('M2TS', 'SurroundMode', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('M2TS', 'VideoStreamType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'DependentImage1EntryNumber', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'DependentImage2EntryNumber', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'MPFVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'MPImageFlags', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'MPImageFormat', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'MPImageLength', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'MPImageStart', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'MPImageType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MPF', 'NumberOfImages', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MakerNotes', 'CameraOrientation', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MakerNotes', 'CanonExposureMode', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MakerNotes', 'CanonModelID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MakerNotes', 'CreativeStyle', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('MakerNotes', 'Shutter', '', '', '', '', '', ''));
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', 'duration'));
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('Matroska', 'VideoCodecID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Matroska', 'VideoFrameRate', '', '', '', '', 'right', 'double'));
exifColumns.push_back(GetColumnMap('PDF', 'Author', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'CreateDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('PDF', 'Creator', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'Encryption', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'HasXFA', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'Keywords', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'Linearized', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'ModifyDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('PDF', 'PDFVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'PageCount', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('PDF', 'Producer', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'Subject', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('PDF', 'Title', '', '', '', '', 'left', ''));
exifColumns.push_back(GetColumnMap('PDF', 'UserAccess', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'AV1ConfigurationVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'AudioAvgBitrate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'ChromaFormat', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'ChromaSamplePosition', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'CleanAperture', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'CompatibleBrands', '', '', '', '', '', ''));
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', 'duration'));
exifColumns.push_back(GetColumnMap('QuickTime', 'EncodingTime', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('QuickTime', 'GPSCoordinates', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'HandlerDescription', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'HandlerType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'HighBitDepth', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'ImagePixelDepth', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'ImageSpatialExtent', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'InitialDelaySamples', '', '', '', '', '', ''));
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', 'MediaData', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'MediaDataOffset', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'MediaDataSize', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'MediaDuration', '', '', '', '', 'right', 'duration'));
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', 'PixelAspectRatio', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'PrimaryItemReference', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'Rotation', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('QuickTime', 'SeqLevelIdx0', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'SeqProfile', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'SeqTier0', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'Subtitle', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'Title', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'TrackCreateDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('QuickTime', 'TrackDuration', '', '', '', '', 'right', 'duration'));
exifColumns.push_back(GetColumnMap('QuickTime', 'TrackModifyDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('QuickTime', 'TwelveBit', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'VideoAvgBitrate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'VideoAvgFrameRate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'VideoCodec', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('QuickTime', 'VideoFieldOrder', '', '', '', '', 'right', 'double'));
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', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('QuickTime', 'YResolution', '', '', '', '', 'right', 'number'));
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('Vorbis', 'Accurateripcount', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Accurateripcountalloffsets', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Accurateripcrc', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Accurateripdiscid', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Accurateripid', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Accurateriptotal', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Album', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'AlbumArtist', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Artist', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'AudioChannels', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('Vorbis', 'Comment', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Composer', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Date', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('Vorbis', 'Description', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Encoder', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Ensemble', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Genre', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Language', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Media', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'NominalBitrate', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('Vorbis', 'Organization', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Rating', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'ReleaseType', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'RetailDate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'RipDate', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'RippingTool', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'SampleRate', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('Vorbis', 'Title', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Totaltracks', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'TrackNumber', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Tracktotal', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'Vendor', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('Vorbis', 'VorbisVersion', '', '', '', '', 'right', 'number'));
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', 'CaptionWriter', '', '', '', '', '', ''));
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', 'DocumentID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'Format', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'HDRPMakerNote', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'HasExtendedXMP', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'Headline', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'InstanceID', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'Keywords', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'Marked', '', '', '', '', '', ''));
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', 'Rating', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'Rights', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'StartupProfile', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'Subject', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'Title', '', '', '', '', 'left', ''));
exifColumns.push_back(GetColumnMap('XMP', 'WebStatement', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('XMP', 'XMPToolkit', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'ArchivedFileName', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'CompressedSize', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('ZIP', 'ModifyDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('ZIP', 'OperatingSystem', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'PackingMethod', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'UncompressedSize', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipBitFlag', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipCRC', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipCompressedSize', '', '', '', '', 'right', 'number'));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipCompression', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipFileName', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipModifyDate', '', '', '', '', '', 'datetime'));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipRequiredVersion', '', '', '', '', '', ''));
exifColumns.push_back(GetColumnMap('ZIP', 'ZipUncompressedSize', '', '', '', '', 'right', 'number'));
// Add new column definitions here...
// ... but not below this line!
CheckColumns();