// Image Meta // (c) 2020 Steve Banham scriptName = "Image Meta"; scriptVersion = "1.2"; scriptDate = "14/5/2020"; scriptCopyright = "(c) 2020 Steve Banham"; scriptMinVersion = "12.20"; scriptDesc = "Modify/Edit Image metadata."; function OnInit(initData) { initData.name = scriptName; initData.version = scriptVersion; initData.copyright = scriptCopyright; initData.desc = scriptDesc; initData.default_enable = true; initData.min_version = scriptMinVersion; initData.url = "https://resource.dopus.com/t/image-meta"; initData.config_desc = DOpus.Create.Map(); var configName = ""; configName = "remember_position"; initData.Config[configName] = true; initData.config_desc(configName) = "The dialog remembers it's last size and position."; var vecMeta = DOpus.NewVector(); vecMeta.push_back(0); vecMeta.push_back("Author"); vecMeta.push_back("Copyright"); vecMeta.push_back("Description"); vecMeta.push_back("Instructions"); vecMeta.push_back("Subject"); vecMeta.push_back("Title"); configName = "default_metadata"; initData.config[configName] = vecMeta; initData.config_desc(configName) = "The default metadata used when the dialog opens."; var vecMode = DOpus.NewVector(); vecMode.push_back(0); vecMode.push_back("Clear"); vecMode.push_back("Replace"); vecMode.push_back("Find & Replace"); vecMode.push_back("Append"); vecMode.push_back("Prefix"); vecMode.push_back("File Name"); vecMode.push_back("Parent Name"); configName = "default_mode"; initData.config[configName] = vecMode; initData.config_desc(configName) = "The default mode used when the dialog opens."; var cmd = initData.AddCommand(); cmd.name = "ImageMeta"; cmd.method = "onImageMeta"; cmd.desc = scriptDesc; cmd.label = "ImageMeta"; cmd.template = "CLEAR/S,REPLACE/S,FINDREPLACE/S,APPEND/S,PREFIX/S,FILENAME/S,PARENTNAME/S,METADATA/K[Authors,Copyright,Description,Instructions,Subject,Title]"; } function onImageMeta(scriptCmdData) { var srcTab = scriptCmdData.func.sourcetab; if (srcTab.stats.selfiles == 0) { DOpus.Output("No files selected."); return; } var dlg = DOpus.Dlg; dlg.title = scriptName + " " + scriptVersion+ " - Directory Opus"; dlg.template = "dlgImageMeta"; dlg.want_resize = true; if (Script.Config["remember_position"] == true) { dlg.LoadPosition("Steve_ImageMeta"); } dlg.detach = true; dlg.Create(); dlg.Control("comboMode").value = 0; dlg.Control("comboMeta").value = 0; dlg.Control("listResults").columns.AddColumn("Filename"); dlg.Control("listResults").columns.AddColumn("Current Metadata"); dlg.Control("listResults").columns.AddColumn("New Metadata"); dlg.Control("comboMode").value = Script.Config["default_mode"]; if (scriptCmdData.func.args.got_arg.clear) { dlg.Control("comboMode").value = 0; } if (scriptCmdData.func.args.got_arg.replace) { dlg.Control("comboMode").value = 1; } if (scriptCmdData.func.args.got_arg.findreplace) { dlg.Control("comboMode").value = 2; } if (scriptCmdData.func.args.got_arg.append) { dlg.Control("comboMode").value = 3; } if (scriptCmdData.func.args.got_arg.prefix) { dlg.Control("comboMode").value = 4; } if (scriptCmdData.func.args.got_arg.filename) { dlg.Control("comboMode").value = 5; } if (scriptCmdData.func.args.got_arg.parentname) { dlg.Control("comboMode").value = 6; } dlg.Control("comboMeta").value = Script.Config["default_metadata"]; switch(scriptCmdData.func.args.metadata) { case "Authors": dlg.Control("comboMeta").value = 0; break; case "Copyright": dlg.Control("comboMeta").value = 1; break; case "Description": dlg.Control("comboMeta").value = 2; break; case "Instructions": dlg.Control("comboMeta").value = 3; break; case "Subject": dlg.Control("comboMeta").value = 4; break; case "Title": dlg.Control("comboMeta").value = 5; } updateCols(dlg); updateMode(dlg); updateList(dlg, srcTab, scriptCmdData); updateMetadata(dlg, srcTab); dlg.Show(); while (true) { var msg = dlg.GetMsg(); if (!msg.result) break; if (msg.event == "selchange" && dlg.Control("comboMode").focus == true) { updateMode(dlg); updateList(dlg, srcTab, scriptCmdData); updateMetadata(dlg, srcTab); } if (msg.event == "selchange" && dlg.Control("comboMeta").focus == true) { updateCols(dlg); updateList(dlg, srcTab, scriptCmdData); updateMetadata(dlg, srcTab); } if (msg.event == "editchange" && dlg.Control("editOne").focus == true || dlg.Control("editTwo").focus == true) { updateResults(dlg, srcTab); } if (msg.event == "click" && dlg.Control("btnOk").focus == true) { commitChanges(scriptCmdData, dlg, srcTab); } if (msg.event == "resize") { updateMode(dlg); } } if (Script.Config["remember_position"] == true) { dlg.SavePosition("Steve_ImageMeta"); } } function updateCols(dlg) { switch (Number(dlg.Control("comboMeta").value)) { case 0: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Authors"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Authors"; break; case 1: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Copyright"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Copyright"; break; case 2: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Description"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Description"; break; case 3: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Instructions"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Instructions"; break; case 4: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Subject"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Subject"; break; case 5: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Title"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Title"; } } function updateList(dlg, srcTab, scriptCmdData) { dlg.Control("listResults").RemoveItem(-1); for (var enumFiles = new Enumerator(srcTab.selected); !enumFiles.atEnd(); enumFiles.moveNext()) { enumFiles.item().Update(); if (enumFiles.item().metadata == "image" && enumFiles.item().ext != ".HEIC") { dlg.Control("listResults").AddItem(enumFiles.item().name); } } if (dlg.Control("listResults").count == 0) { DOpus.Output("No image files selected."); dlg.EndDlg(); var cmd = scriptCmdData.func.command; cmd.RunCommand('Set LISTERSIZE=Set UTILITY=OtherLog'); return; } dlg.Control("listResults").columns.AutoSize(); } function updateMetadata(dlg, srcTab) { for (var enumMeta = new Enumerator(srcTab.selected); !enumMeta.atEnd(); enumMeta.moveNext()) { if (enumMeta.item().metadata == "image" && enumMeta.item().ext != ".HEIC") { switch (Number(dlg.Control("comboMeta").value)) { case 0: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.image.mp3artist; break; case 1: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.image.copyright; break; case 2: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.image.imagedesc; break; case 3: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.image.instructions; break; case 4: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.image.subject; break; case 5: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.image.title; } } } updateResults(dlg, srcTab); dlg.Control("listResults").columns.AutoSize(); } function updateResults(dlg, srcTab) { for (i=0; i < dlg.Control("listResults").count; i ++) { switch (Number(dlg.Control("comboMode").value)) { case 0: dlg.Control("listResults").GetItemAt(i).subitems(1) = ""; break; case 1: dlg.Control("listResults").GetItemAt(i).subitems(1) = dlg.Control("editOne").value; break; case 2: var strCurrent = dlg.Control("listResults").GetItemAt(i).subitems(0); var strFind = dlg.Control("editOne").value; var strReplace = dlg.Control("editTwo").value; strCurrent = strCurrent.split(strFind).join(strReplace); dlg.Control("listResults").GetItemAt(i).subitems(1) = strCurrent; break; case 3: dlg.Control("listResults").GetItemAt(i).subitems(1) = dlg.Control("listResults").GetItemAt(i).subitems(0) + dlg.Control("editOne").value; break; case 4: dlg.Control("listResults").GetItemAt(i).subitems(1) = dlg.Control("editOne").value + dlg.Control("listResults").GetItemAt(i).subitems(0); break; case 5: var strFilename = dlg.Control("listResults").GetItemAt(i).name; var intFilenameLength = strFilename.length - 4; strFilename = strFilename.substring(0, intFilenameLength); dlg.Control("listResults").GetItemAt(i).subitems(1) = strFilename; break; case 6: dlg.Control("listResults").GetItemAt(i).subitems(1) = srcTab.path.filepart; } } strCurrent = ""; strFind = ""; strReplace = ""; dlg.Control("listResults").columns.AutoSize(); } function commitChanges(scriptCmdData, dlg, srcTab) { var cmd = scriptCmdData.func.command; for (i=0; i < dlg.Control("listResults").count; i ++) { switch (Number(dlg.Control("comboMeta").value)) { case 0: var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "author:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); break; case 1: var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "copyright:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); break; case 2: var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "imagedesc:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); break; case 3: var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "instructions:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); break; case 4: var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "subject:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); break; case 5: var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "title:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); } } dlg.EndDlg(); return; } function updateMode(dlg) { switch (Number(dlg.Control("comboMode").value)) { case 0: dlg.Control("staticOne").visible = false; dlg.Control("editOne").visible = false; dlg.Control("staticTwo").visible = false; dlg.Control("editTwo").visible = false; dlg.Control("listResults").y = 43; dlg.Control("listResults").cy = dlg.cy - 134; dlg.Control("editOne").cx = dlg.cx - 113; dlg.Control("editTwo").cx = dlg.cx - 113; dlg.Control("listResults").cx = dlg.cx - 36; break; case 1: dlg.Control("staticOne").label = "New:"; dlg.Control("staticOne").visible = true; dlg.Control("editOne").visible = true; dlg.Control("staticTwo").visible = false; dlg.Control("editTwo").visible = false; dlg.Control("listResults").y = 76; dlg.Control("listResults").cy = dlg.cy - 167; dlg.Control("editOne").cx = dlg.cx - 113; dlg.Control("editTwo").cx = dlg.cx - 113; dlg.Control("listResults").cx = dlg.cx - 36; break; case 2: dlg.Control("staticOne").label = "Find:"; dlg.Control("staticOne").visible = true; dlg.Control("editOne").visible = true; dlg.Control("staticTwo").label = "Replace:"; dlg.Control("staticTwo").visible = true; dlg.Control("editTwo").visible = true; dlg.Control("listResults").y = 104; dlg.Control("listResults").cy = dlg.cy - 195; dlg.Control("editOne").cx = dlg.cx - 113; dlg.Control("editTwo").cx = dlg.cx - 113; dlg.Control("listResults").cx = dlg.cx - 36; break; case 3: dlg.Control("staticOne").label = "Append:"; dlg.Control("staticOne").visible = true; dlg.Control("editOne").visible = true; dlg.Control("staticTwo").visible = false; dlg.Control("editTwo").visible = false; dlg.Control("listResults").y = 76; dlg.Control("listResults").cy = dlg.cy - 167; dlg.Control("editOne").cx = dlg.cx - 113; dlg.Control("editTwo").cx = dlg.cx - 113; dlg.Control("listResults").cx = dlg.cx - 36; break; case 4: dlg.Control("staticOne").label = "Prefix:"; dlg.Control("staticOne").visible = true; dlg.Control("editOne").visible = true; dlg.Control("staticTwo").visible = false; dlg.Control("editTwo").visible = false; dlg.Control("listResults").y = 76; dlg.Control("listResults").cy = dlg.cy - 167; dlg.Control("editOne").cx = dlg.cx - 113; dlg.Control("editTwo").cx = dlg.cx - 113; dlg.Control("listResults").cx = dlg.cx - 36; break; case 5: dlg.Control("staticOne").visible = false; dlg.Control("editOne").visible = false; dlg.Control("staticTwo").visible = false; dlg.Control("editTwo").visible = false; dlg.Control("listResults").y = 43; dlg.Control("listResults").cy = dlg.cy - 134; dlg.Control("editOne").cx = dlg.cx - 113; dlg.Control("editTwo").cx = dlg.cx - 113; dlg.Control("listResults").cx = dlg.cx - 36; break; case 6: dlg.Control("staticOne").visible = false; dlg.Control("editOne").visible = false; dlg.Control("staticTwo").visible = false; dlg.Control("editTwo").visible = false; dlg.Control("listResults").y = 43; dlg.Control("listResults").cy = dlg.cy - 134; dlg.Control("editOne").cx = dlg.cx - 113; dlg.Control("editTwo").cx = dlg.cx - 113; dlg.Control("listResults").cx = dlg.cx - 36; } dlg.Control("listResults").columns.AutoSize(); } function OnAboutScript(aboutData){ dlg = DOpus.Dlg; dlg.window = aboutData.window; dlg.title = scriptName + scriptVersion + " - Directory Opus"; dlg.message = scriptName + " v" + scriptVersion + "\t\t\t\t" + scriptDate + "\n\n" + scriptDesc + "\n\n" + scriptCopyright; dlg.buttons = "Close"; dlg.icon = "info"; dlg.show; } ==SCRIPT RESOURCES