// Bulk Meta // (c) 2020 Steve Banham scriptName = "Bulk Meta"; scriptVersion = "1.2"; scriptDate = "19/5/2020"; scriptCopyright = "(c) 2020 Steve Banham"; scriptMinVersion = "12.20"; scriptDesc = "Bulk modify/edit 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/bulk-meta"; initData.config_desc = DOpus.Create.Map(); initData.config_groups = 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."; initData.config_groups(configName) = "Window"; configName = "confirm_write"; initData.Config[configName] = true; initData.config_desc(configName) = "Ask for confirmation before any metadata is changed."; initData.config_groups(configName) = "Options"; configName = "backup_files"; initData.Config[configName] = true; initData.config_desc(configName) = "Backup the files before writing any metadata."; initData.config_groups(configName) = "Options"; configName = "copy_folder"; initData.Config[configName] = "/desktop"; initData.config_desc(configName) = "Destination folder for the copy function."; initData.config_groups(configName) = "Options"; configName = "log_folder"; initData.Config[configName] = "/desktop"; initData.config_desc(configName) = "Destination folder for the log file."; initData.config_groups(configName) = "Log File"; configName = "log_changes"; initData.Config[configName] = true; initData.config_desc(configName) = "Write a log file detailing all metadata changes made."; initData.config_groups(configName) = "Log File"; var vecDblClk = DOpus.NewVector(); vecDblClk.push_back(0); vecDblClk.push_back("Show with DOpus viewer"); vecDblClk.push_back("Default Open action"); vecDblClk.push_back("View Properties"); vecDblClk.push_back("Insert File Name"); configName = "dblclk_action"; initData.config[configName] = vecDblClk; initData.config_desc(configName) = "Choose the default double click action."; initData.config_groups(configName) = "Options"; var cmd = initData.AddCommand(); cmd.name = "BulkMeta"; cmd.method = "onBulkMeta"; cmd.desc = scriptDesc; cmd.label = "BulkMeta"; cmd.template = "IMAGE/S,AUDIO/S,PDF/S,LOGREADER/S,MODE/K[Clear,Replace,FindReplace,Append,Prefix,Filename,Parent]"; } function onBulkMeta(scriptCmdData) { var srcTab = scriptCmdData.func.sourcetab; var copyPath = Script.Config["copy_folder"]; if (copyPath.substr(-1) == "\\") { copyPath = copyPath.substr(0, copyPath.length - 1); } var copyPath = DOpus.FSUtil.NewPath(copyPath); var logPath = Script.Config["log_folder"]; if (logPath.substr(-1) == "\\") { logPath = logPath.substr(0, logPath.length - 1); } logPath = DOpus.FSUtil.Resolve(logPath); logPath = DOpus.FSUtil.NewPath(logPath); if (scriptCmdData.func.args.got_arg.logreader) { logReader(null, logPath); return; } 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_BulkMeta"); } dlg.detach = true; dlg.Create(); dlg.Control("staticNotify").style = "b"; dlg.Control("comboCat").value = 0; 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"); updateMode(dlg); if (scriptCmdData.func.args.got_arg.audio) { dlg.Control("comboCat").value = 1; updateList(dlg, srcTab, scriptCmdData); updateMetaAudio(dlg); updateColsAudio(dlg); updateMetadataAudio(dlg, srcTab); } else if (scriptCmdData.func.args.got_arg.pdf) { dlg.Control("comboCat").value = 2; updateList(dlg, srcTab, scriptCmdData); updateMetaPdf(dlg); updateColsPdf(dlg); updateMetadataPdf(dlg, srcTab); } else { dlg.Control("comboCat").value = 0; updateList(dlg, srcTab, scriptCmdData); updateMetaImage(dlg); updateColsImage(dlg); updateMetadataImage(dlg, srcTab); } switch(scriptCmdData.func.args.mode) { case "Clear": dlg.Control("comboMode").value = 0; break; case "Replace": dlg.Control("comboMode").value = 1; break; case "FindReplace": dlg.Control("comboMode").value = 2; break; case "Append": dlg.Control("comboMode").value = 3; break; case "Prefix": dlg.Control("comboMode").value = 4; break; case "Filename": dlg.Control("comboMode").value = 5; break; case "Parent": dlg.Control("comboMode").value = 6; } updateMode(dlg); dlg.Control("listResults").columns.AutoSize(); 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); switch (Number(dlg.Control("comboCat").value)) { case 0: updateMetadataImage(dlg, srcTab); break; case 1: updateMetadataAudio(dlg, srcTab); break; case 2: updateMetadataPdf(dlg, srcTab); } } if (msg.event == "selchange" && dlg.Control("comboCat").focus == true) { updateList(dlg, srcTab, scriptCmdData); if (Number(dlg.Control("comboCat").value) == 0) { updateMetaImage(dlg); updateColsImage(dlg); updateMetadataImage(dlg, srcTab); } if (Number(dlg.Control("comboCat").value) == 1) { updateMetaAudio(dlg); updateColsAudio(dlg); updateMetadataAudio(dlg, srcTab); } if (Number(dlg.Control("comboCat").value) == 2) { updateMetaPdf(dlg); updateColsPdf(dlg); updateMetadataPdf(dlg, srcTab); } } if (msg.event == "selchange" && dlg.Control("comboMeta").focus == true) { updateList(dlg, srcTab, scriptCmdData); switch (Number(dlg.Control("comboCat").value)) { case 0: updateColsImage(dlg); updateMetadataImage(dlg, srcTab); break; case 1: updateColsAudio(dlg); updateMetadataAudio(dlg, srcTab); break; case 2: updateColsPdf(dlg); updateMetadataPdf(dlg, srcTab); } } if (msg.event == "dblclk" && dlg.Control("listResults").focus == true) { if (Script.Config["dblclk_action"] == 0) { scriptCmdData.func.command.RunCommand("Show \"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value).name); } if (Script.Config["dblclk_action"] == 1) { scriptCmdData.func.command.RunCommand("FileType ACTION=dblclk FILE \"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value).name); } if (Script.Config["dblclk_action"] == 2) { scriptCmdData.func.command.RunCommand("Properties FILE \"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value).name); } if (Script.Config["dblclk_action"] == 3) { if (dlg.Control("comboMode").value == 1 || dlg.Control("comboMode").value == 2 || dlg.Control("comboMode").value == 3 || dlg.Control("comboMode").value == 4) { if (dlg.Control("listResults").value.index > -1) { dlg.Control("editOne").value = dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value.index).name; updateResults(dlg, srcTab); } } } } if (msg.event == "rclick" && dlg.Control("listResults").focus == true) { if (dlg.Control("listResults").value.index > -1) { popupMenu(dlg, srcTab, scriptCmdData, copyPath); updateResults(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, logPath); } if (msg.event == "resize") { updateMode(dlg); } if (msg.event == "click" && dlg.Control("btnLog").focus == true) { logReader(dlg, logPath); } } if (Script.Config["remember_position"] == true) { dlg.SavePosition("Steve_BulkMeta"); } } function logReader(dlg, logPath) { var arrLines = []; var dlgLog = DOpus.Dlg; dlgLog.title = "Log Reader - Bulk Meta"; dlgLog.template = "dlgLog"; dlgLog.window = dlg; dlgLog.disable_window = dlg; dlgLog.LoadPosition("Steve_LogReader"); dlgLog.detach = true; dlgLog.Create(); dlgLog.Control("staticLogFile").label = logPath + "\\BulkMeta.log"; var fso = new ActiveXObject("Scripting.FileSystemObject"); var logFile = fso.OpenTextFile(logPath + "\\BulkMeta.log", 1, true); if (fso.FileExists(logPath + "\\BulkMeta.log")) { if (!logFile.AtEndOfStream) { var logContents = logFile.ReadAll(); arrLines = logContents.split(/\r\n|\n/); } } logFile.Close(); updateLog(dlg, dlgLog, arrLines); dlgLog.Control("listLog").columns.AutoSize(); dlgLog.Show(); while (true) { var msg = dlgLog.GetMsg(); if (!msg.result) break; if (msg.event == "editchange" && dlgLog.Control("editFilter").focus == true) { updateLog(dlg, dlgLog, arrLines); } if (msg.event == "click" && dlgLog.Control("btnReset").focus == true) { dlgLog.Control("editFilter").value = ""; updateLog(dlg, dlgLog, arrLines); } if (msg.event == "dblclk" && dlgLog.Control("listLog").focus == true) { dlgLog.Control("editFilter").value = dlgLog.Control("listLog").GetItemAt(dlgLog.Control("listLog").value).subitems(0); updateLog(dlg, dlgLog, arrLines); } } dlgLog.SavePosition("Steve_LogReader"); } function updateLog(dlg, dlgLog, arrLines) { var intItem = 1; var strFilter = dlgLog.Control("editFilter").value; dlgLog.Control("listLog").RemoveItem(-1); for (i=0; i < arrLines.length; i ++) { var strFile, strMeta, strFrom, strTo = ""; var intTmp, intTmp2; if (arrLines[i].slice(0,1) == "\"") { intTmp = arrLines[i].search(/\[/); strFile = arrLines[i].substring(1,intTmp-2); var tmpstrFile = strFile; tmpstrFile = tmpstrFile.toLowerCase(); strFilter = strFilter.toLowerCase(); var intFilter = tmpstrFile.search(strFilter); if (intFilter > -1) { intTmp = intTmp + 1; intTmp2 = arrLines[i].search(/\]/); strMeta = arrLines[i].substring(intTmp, intTmp2); intTmp = arrLines[i].search("From="); intTmp2 = arrLines[i].search("To="); strFrom = arrLines[i].substring(intTmp + 6, intTmp2 - 2); strTo = arrLines[i].substring(intTmp2 + 4); strTo = strTo.replace(/\"/, ""); dlgLog.Control("listLog").AddItem(intItem); dlgLog.Control("listLog").GetItemByName(intItem).subitems(0) = strFile; dlgLog.Control("listLog").GetItemByName(intItem).subitems(1) = strMeta; dlgLog.Control("listLog").GetItemByName(intItem).subitems(2) = strFrom; dlgLog.Control("listLog").GetItemByName(intItem).subitems(3) = strTo; intItem = intItem + 1; } } } dlgLog.Control("listLog").columns.AutoSize(); } function popupMenu(dlg, srcTab, scriptCmdData, copyPath) { var dlgMenu = DOpus.Dlg; dlgMenu.choices = DOpus.Create.Vector("Open...", "Copy to " + copyPath.filepart, "-", "Insert File Name", "Insert Parent Name", "-", "Insert Current " + dlg.Control("comboMeta").GetItemAt(dlg.Control("comboMeta").value).name, "Insert New " + dlg.Control("comboMeta").GetItemAt(dlg.Control("comboMeta").value).name, "-", "Copy Current " + dlg.Control("comboMeta").GetItemAt(dlg.Control("comboMeta").value).name + " to Clipboard", "Copy New " + dlg.Control("comboMeta").GetItemAt(dlg.Control("comboMeta").value).name + " to Clipboard", "-", "Show", "Properties"); if (dlg.Control("comboMode").value == 0) { dlgMenu.menu = DOpus.Create.Vector(1, 0, 8, 8, 8, 8, 8, 8, 0, 0, 8, 0, 0, 0); } if (dlg.Control("comboMode").value == 5 || dlg.Control("comboMode").value == 6) { dlgMenu.menu = DOpus.Create.Vector(1, 0, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0); } if (dlg.Control("comboMode").value == 1 || dlg.Control("comboMode").value == 2 || dlg.Control("comboMode").value == 3 || dlg.Control("comboMode").value == 4) { dlgMenu.menu = DOpus.Create.Vector(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); } var menuReturn = dlgMenu.Show; switch (menuReturn) { case 1: scriptCmdData.func.command.RunCommand("FileType ACTION=dblclk FILE \"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value).name); break; case 2: if (DOpus.FSUtil.Exists(copyPath)) { scriptCmdData.func.command.RunCommand("Copy \"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value).name + "\" TO=\"" + copyPath + "\""); } else { dlg.Control("staticNotify").label = "Folder does not exist"; } break; case 4: dlg.Control("editOne").value = dlg.Control("editOne").value + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value.index).name; break; case 5: dlg.Control("editOne").value = dlg.Control("editOne").value + srcTab.path.filepart; break; case 7: dlg.Control("editOne").value = dlg.Control("editOne").value + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value.index).subitems(0); break; case 8: dlg.Control("editOne").value = dlg.Control("editOne").value + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value.index).subitems(1); break; case 10: DOpus.SetClip(dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value.index).subitems(0)); break; case 11: DOpus.SetClip(dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value.index).subitems(1)); break; case 13: scriptCmdData.func.command.RunCommand("Show \"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value).name); break; case 14: scriptCmdData.func.command.RunCommand("Properties FILE \"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(dlg.Control("listResults").value).name); } } function updateMetaImage(dlg) { dlg.Control("comboMeta").RemoveItem(-1); dlg.Control("comboMeta").AddItem("Authors"); dlg.Control("comboMeta").AddItem("Copyright"); dlg.Control("comboMeta").AddItem("Description"); dlg.Control("comboMeta").AddItem("Instructions"); dlg.Control("comboMeta").AddItem("Subject"); dlg.Control("comboMeta").AddItem("Title"); dlg.Control("comboMeta").AddItem("Tags"); dlg.Control("comboMeta").value = 0; } function updateMetaAudio(dlg) { dlg.Control("comboMeta").RemoveItem(-1); dlg.Control("comboMeta").AddItem("Artist"); dlg.Control("comboMeta").AddItem("Title"); dlg.Control("comboMeta").AddItem("Album"); dlg.Control("comboMeta").AddItem("Album Artist"); dlg.Control("comboMeta").AddItem("Tags"); dlg.Control("comboMeta").value = 0; } function updateMetaPdf(dlg) { dlg.Control("comboMeta").RemoveItem(-1); dlg.Control("comboMeta").AddItem("Authors"); dlg.Control("comboMeta").AddItem("Creator"); dlg.Control("comboMeta").AddItem("Producer"); dlg.Control("comboMeta").AddItem("Subject"); dlg.Control("comboMeta").AddItem("Title"); dlg.Control("comboMeta").AddItem("Tags"); dlg.Control("comboMeta").value = 0; } function updateColsImage(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"; break; case 6: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Tags"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Tags"; } dlg.Control("listResults").columns.AutoSize(); } function updateColsAudio(dlg) { switch (Number(dlg.Control("comboMeta").value)) { case 0: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Artist"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Artist"; break; case 1: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Title"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Title"; break; case 2: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Album"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Album"; break; case 3: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Album Artist"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Album Artist"; break; case 4: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Tags"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Tags"; } dlg.Control("listResults").columns.AutoSize(); } function updateColsPdf(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 Creator"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Creator"; break; case 2: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Producer"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Producer"; break; case 3: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Subject"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Subject"; break; case 4: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Title"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Title"; break; case 5: dlg.Control("listResults").columns.GetColumnAt(1).name = "Current Tags"; dlg.Control("listResults").columns.GetColumnAt(2).name = "New Tags"; } dlg.Control("listResults").columns.AutoSize(); } 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 (Number(dlg.Control("comboCat").value) == 0) { if (enumFiles.item().metadata == "image" && enumFiles.item().ext != ".HEIC") { dlg.Control("listResults").AddItem(enumFiles.item().name); } } if (Number(dlg.Control("comboCat").value) == 1) { if (enumFiles.item().metadata == "audio") { dlg.Control("listResults").AddItem(enumFiles.item().name); } } if (Number(dlg.Control("comboCat").value) == 2) { if (enumFiles.item().ext == ".pdf") { dlg.Control("listResults").AddItem(enumFiles.item().name); } } } if (dlg.Control("listResults").count == 0) { dlg.Control("staticNotify").label = "No " + dlg.Control("comboCat").GetItemAt(dlg.Control("comboCat").value).name + " selected."; dlg.Control("listResults").enabled = false; dlg.Control("btnOk").enabled = false; } if (dlg.Control("listResults").count > 0) { dlg.Control("staticNotify").label = ""; dlg.Control("listResults").enabled = true; dlg.Control("btnOk").enabled = true; } dlg.Control("listResults").columns.AutoSize(); dlg.Control("editOne").focus = true; } function updateMetadataImage(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; break; case 6: var strTags = ""; for (var enumTags = new Enumerator(enumMeta.item().metadata.tags); !enumTags.atEnd(); enumTags.moveNext()) { strTags = strTags + enumTags.item() + "\;"; } strTags = strTags.substring(0, strTags.length - 1); dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = strTags; } } } updateResults(dlg, srcTab); dlg.Control("listResults").columns.AutoSize(); } function updateMetadataAudio(dlg, srcTab) { for (var enumMeta = new Enumerator(srcTab.selected); !enumMeta.atEnd(); enumMeta.moveNext()) { if (enumMeta.item().metadata == "audio") { switch (Number(dlg.Control("comboMeta").value)) { case 0: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.audio.mp3artist; break; case 1: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.audio.mp3title; break; case 2: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.audio.mp3album; break; case 3: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.audio.mp3albumartist; break; case 4: var strTags = ""; for (var enumTags = new Enumerator(enumMeta.item().metadata.tags); !enumTags.atEnd(); enumTags.moveNext()) { strTags = strTags + enumTags.item() + "\;"; } strTags = strTags.substring(0, strTags.length - 1); dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = strTags; } } } updateResults(dlg, srcTab); dlg.Control("listResults").columns.AutoSize(); } function updateMetadataPdf(dlg, srcTab) { for (var enumMeta = new Enumerator(srcTab.selected); !enumMeta.atEnd(); enumMeta.moveNext()) { if (enumMeta.item().metadata == "doc" && enumMeta.item().ext == ".pdf") { switch (Number(dlg.Control("comboMeta").value)) { case 0: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.doc.author; break; case 1: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.doc.creator; break; case 2: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.doc.producer; break; case 3: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.doc.subject; break; case 4: dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = enumMeta.item().metadata.doc.title; break; case 5: var strTags = ""; for (var enumTags = new Enumerator(enumMeta.item().metadata.tags); !enumTags.atEnd(); enumTags.moveNext()) { strTags = strTags + enumTags.item() + "\;"; } strTags = strTags.substring(0, strTags.length - 1); dlg.Control("listResults").GetItemByName(enumMeta.item().name).subitems(0) = strTags; } } } 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, logPath) { var cmd = scriptCmdData.func.command; if (Script.Config["confirm_write"] == true) { var dlgConfirm = DOpus.Dlg; dlgConfirm.window = dlg; dlgConfirm.message = "Are you sure you want to write metadata to " + dlg.Control("listResults").count + " file/s?"; dlgConfirm.title = "Confirm metadata changes"; dlgConfirm.buttons = "Ok|Cancel"; var dlgResult = dlgConfirm.Show(); } else { var dlgResult = 1; } if (dlgResult == 1) { if (Script.Config["backup_files"] == true) { var dopFac = DOpus.Create(); var dopDate = dopFac.Date(); var tmpName, tmpFolder, logFile; dlg.Control("staticNotify").label = "Creating backup..."; var fso = new ActiveXObject("Scripting.FilesystemObject"); tmpFolder = fso.GetSpecialFolder(2); tmpName = ".bulkmeta_" + dopDate.Format("D#yyyy-MM-dd_T#HH-mm-ss"); var cmd = scriptCmdData.func.command; cmd.RunCommand("CreateFolder \"" + tmpFolder + "\\" + tmpName + "\""); for (i=0; i < dlg.Control("listResults").count; i ++) { cmd.RunCommand("Copy \"" + dlg.Control("listResults").GetItemAt(i).name + "\" TO=\"" + tmpFolder + "\\" + tmpName + "\""); } } if (Script.Config["log_changes"]) { var fso = new ActiveXObject("Scripting.FileSystemObject"); var logFile = fso.OpenTextFile(logPath + "\\BulkMeta.log", 8, true); logFile.WriteLine("--------------------"); logFile.WriteLine(dopDate.Format("D#dd-MMM-yyyy T#HH:mm:ss")); logFile.WriteLine("--------------------"); } if (Number(dlg.Control("comboCat").value) == 0) { dlg.Control("staticNotify").label = "Writing metadata..."; applyChangesImage(scriptCmdData, dlg, srcTab, logFile); } if (Number(dlg.Control("comboCat").value) == 1) { dlg.Control("staticNotify").label = "Writing metadata..."; applyChangesAudio(scriptCmdData, dlg, srcTab, logFile); } if (Number(dlg.Control("comboCat").value) == 2) { dlg.Control("staticNotify").label = "Writing metadata..."; applyChangesPdf(scriptCmdData, dlg, srcTab, logFile); } cmd.RunCommand("Delete " + "\"" + tmpFolder + "\\" + tmpName + "\" RECYCLE"); if (Script.Config["log_changes"]) { logFile.Close(); } dlg.EndDlg(); return; } } function applyChangesImage(scriptCmdData, dlg, srcTab, logFile) { var cmd = scriptCmdData.func.command; for (i=0; i < dlg.Control("listResults").count; i ++) { if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + dlg.Control("listResults").GetItemAt(i).name + "\" [" + dlg.Control("comboMeta").GetItemAt(dlg.Control("comboMeta").value).name + "] From=\"" + dlg.Control("listResults").GetItemAt(i).subitems(0) + "\" To=\"" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""); } 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); break; case 6: var strTags = dlg.Control("listResults").GetItemAt(i).subitems(1); var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "tags:" + strTags + "\""; cmd.RunCommand(strCommand); } } } function applyChangesAudio(scriptCmdData, dlg, srcTab, logFile) { var cmd = scriptCmdData.func.command; for (i=0; i < dlg.Control("listResults").count; i ++) { if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + dlg.Control("listResults").GetItemAt(i).name + "\" [" + dlg.Control("comboMeta").GetItemAt(dlg.Control("comboMeta").value).name + "] From=\"" + dlg.Control("listResults").GetItemAt(i).subitems(0) + "\" To=\"" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""); } switch (Number(dlg.Control("comboMeta").value)) { case 0: var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "artist:" + 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 \"" + "title:" + 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 \"" + "album:" + 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 \"" + "albumartist:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); break; case 4: var strTags = dlg.Control("listResults").GetItemAt(i).subitems(1); var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "tags:" + strTags + "\""; cmd.RunCommand(strCommand); } } } function applyChangesPdf(scriptCmdData, dlg, srcTab, logFile) { var cmd = scriptCmdData.func.command; for (i=0; i < dlg.Control("listResults").count; i ++) { if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + dlg.Control("listResults").GetItemAt(i).name + "\" [" + dlg.Control("comboMeta").GetItemAt(dlg.Control("comboMeta").value).name + "] From=\"" + dlg.Control("listResults").GetItemAt(i).subitems(0) + "\" To=\"" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""); } 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 \"" + "creator:" + 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 \"" + "producer:" + 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 \"" + "subject:" + 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 \"" + "title:" + dlg.Control("listResults").GetItemAt(i).subitems(1) + "\""; cmd.RunCommand(strCommand); break; case 5: var strTags = dlg.Control("listResults").GetItemAt(i).subitems(1); var strCommand = "SetAttr FILE=\"" + srcTab.path + "\\" + dlg.Control("listResults").GetItemAt(i).name + "\" META \"" + "tags:" + strTags + "\""; cmd.RunCommand(strCommand); } } } 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 = 88; dlg.Control("listResults").cy = dlg.cy - 179; 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 = 120; dlg.Control("listResults").cy = dlg.cy - 211; 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 = 148; dlg.Control("listResults").cy = dlg.cy - 239; 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 = 120; dlg.Control("listResults").cy = dlg.cy - 211; 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 = 120; dlg.Control("listResults").cy = dlg.cy - 211; 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 = 88; dlg.Control("listResults").cy = dlg.cy - 179; 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 = 88; dlg.Control("listResults").cy = dlg.cy - 179; 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