// Music Tags // (c) 2020 Steve Banham scriptName = "Music Tags"; scriptVersion = "1.0"; scriptDate = "25/5/2020"; scriptCopyright = "(c) 2020 Steve Banham"; scriptMinVersion = "12.20.4"; scriptDesc = "Music tag editor."; var vecColumns = DOpus.NewVector(); var oldSelection, newSelection; var TRACK = 0; var TITLE = 1; var ARTIST = 2; var ALBUM = 3; var ALBUMARTIST = 4; var COMPOSER = 5; var DISC = 6; var YEAR = 7; var GENRE = 8; var COMMENT = 9; function OnInit(initData) { initData.name = scriptName; initData.version = scriptVersion; initData.copyright = scriptCopyright; initData.desc = scriptDesc; initData.default_enable = true; initData.min_version = scriptMinVersion; initData.config_desc = DOpus.Create.Map(); var configName = ""; configName = "show_cover_art"; initData.Config[configName] = true; initData.config_desc(configName) = "Show cover art for the selected files."; configName = "confirm_save"; initData.Config[configName] = true; initData.config_desc(configName) = "Show a confirmation dialog before saving changes."; configName = "log_folder"; initData.Config[configName] = "/desktop"; initData.config_desc(configName) = "Destination folder for the log file."; configName = "log_changes"; initData.Config[configName] = true; initData.config_desc(configName) = "Write a log file detailing all metadata changes made."; vecColumns.push_back = "Track"; vecColumns.push_back = "Title"; vecColumns.push_back = "Artist"; vecColumns.push_back = "Album"; vecColumns.push_back = "Album Artist"; vecColumns.push_back = "Composer"; vecColumns.push_back = "Disc"; vecColumns.push_back = "Year"; vecColumns.push_back = "Genre"; vecColumns.push_back = "Comment"; configName = "columns_order"; initData.config[configName] = vecColumns; initData.config_desc(configName) = "Display order for the tag columns."; 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"); configName = "dblclk_action"; initData.config[configName] = vecDblClk; initData.config_desc(configName) = "Choose the default double click action."; var cmd = initData.AddCommand(); cmd.name = "MusicTags"; cmd.method = "onMusicTags"; cmd.desc = scriptDesc; cmd.label = "MusicTags"; cmd.template = "LOGREADER/S"; } function onMusicTags(scriptCmdData) { var srcTab = scriptCmdData.func.sourcetab; 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); var fso = new ActiveXObject("Scripting.FilesystemObject"); tmpFolder = fso.GetSpecialFolder(2); if (scriptCmdData.func.args.got_arg.logreader) { logReader(null, logPath); return; } if (srcTab.stats.selfiles == 0) { DOpus.ClearOutput(); DOpus.Output("No files selected."); return; } var dlg = DOpus.Dlg; dlg.title = scriptName + " " + scriptVersion + " - Directory Opus"; dlg.template = "dlgMusic"; dlg.LoadPosition("Steve_MusicTag"); dlg.detach = true; dlg.Create(); dlg.AddHotkey("ALL", "ctrl+a"); dlg.AddHotKey("NONE", "ctrl+n"); dlg.SetTimer(100, "timer"); dlg.Control("staticNotify").label = "Ready."; dlg.Control("listFiles").focus = true; dlg.Control("btnSave").enabled = false; if (Script.Config["show_cover_art"] == false) { dlg.Control("grpCover").visible = false; dlg.Control("staticCover").visible = false; dlg.Control("staticCoverText").visible = false; } var fileList = dlg.Control("listFiles"); for (var eCols = new Enumerator(Script.Config["columns_order"]); !eCols.atEnd(); eCols.moveNext()) { var colIndex = fileList.columns.AddColumn(eCols.item()); var colName = fileList.columns(colIndex).name; colIndex = colIndex - 1; switch (colName) { case "Track": TRACK = colIndex; break; case "Title": TITLE = colIndex; break; case "Artist": ARTIST = colIndex; break; case "Album": ALBUM = colIndex; break; case "Album Artist": ALBUMARTIST = colIndex; break; case "Composer": COMPOSER = colIndex; break; case "Disc": DISC = colIndex; break; case "Year": YEAR = colIndex; break; case "Genre": GENRE = colIndex; break; case "Comment": COMMENT = colIndex; } } populateList(fileList, srcTab, dlg); dlg.Show(); while (true) { var msg = dlg.GetMsg(); if (!msg.result) break; if (msg.event == "selchange") { newSelection = fileList.value.count; switch (msg.control) { case "listFiles": if (fileList.value.count === 1) { selectionChangedSingle(fileList, dlg, srcTab, tmpFolder); if (Script.Config["show_cover_art"] == true) { updateCover(fileList, srcTab, dlg, tmpFolder, null); } } if (fileList.value.count === 0) { selectionChangedNone(fileList, dlg, srcTab, tmpFolder); } } } if (msg.event == "timer") { if (oldSelection != newSelection) { if (fileList.value.count > 1) { selectionChangedMulti(fileList, dlg, srcTab, tmpFolder); if (Script.Config["show_cover_art"] == true) { updateCover(fileList, srcTab, dlg, tmpFolder, null); } } } } if (msg.event == "click") { switch (msg.control) { case "btnAll": fileList.focus = true; oldSelection = fileList.value.count; fileList.SelectItem(-1); newSelection = fileList.value.count; break; case "btnNone": fileList.focus = true; oldSelection = fileList.value.count; fileList.DeselectItem(-1); newSelection = fileList.value.count; break; case "btnReload": fileList.focus = true; fileList.DeselectItem(-1); populateList(fileList, srcTab, dlg); break; case "btnSave": saveChanges(srcTab, dlg, fileList, logPath); break; case "btnLog": logReader(dlg, logPath); } } if (msg.event == "rclick") { switch (msg.control) { case "listFiles": popupMenu(dlg, srcTab, scriptCmdData, fileList); } } if (msg.event == "hotkey") { switch (msg.control) { case "ALL": fileList.focus = true; oldSelection = fileList.value.count; fileList.SelectItem(-1); newSelection = fileList.value.count; break; case "NONE": fileList.focus = true; oldSelection = fileList.value.count; fileList.DeselectItem(-1); newSelection = fileList.value.count; } } if (msg.event == "dblclk" && msg.control == "listFiles") { if (Script.Config["dblclk_action"] == 0) { for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { scriptCmdData.func.command.RunCommand("Show \"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\""); } } } if (Script.Config["dblclk_action"] == 1) { for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { scriptCmdData.func.command.RunCommand("FileType ACTION=dblclk FILE \"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\""); } } } if (Script.Config["dblclk_action"] == 2) { for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { scriptCmdData.func.command.RunCommand("Properties FILE \"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\""); } } } } } var factory = DOpus.Create(); factory.command.RunCommand("Delete NORECYCLE QUIET ALL FORCE FILE=\"" + tmpFolder + "\\*.mt_tmp\""); dlg.SavePosition("Steve_MusicTag"); } function popupMenu(dlg, srcTab, scriptCmdData, fileList) { var dlgMenu = DOpus.Dlg; dlgMenu.choices = DOpus.Create.Vector("Open...", "Show", "Properties"); dlgMenu.menu = DOpus.Create.Vector(1, 0, 0); var menuReturn = dlgMenu.Show; switch (menuReturn) { case 1: for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { scriptCmdData.func.command.RunCommand("FileType ACTION=dblclk FILE \"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\""); } } break; case 2: for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { scriptCmdData.func.command.RunCommand("Show \"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\""); } } break; case 3: for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { scriptCmdData.func.command.RunCommand("Properties FILE \"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\""); } } } } function logReader(dlg, logPath) { var arrLines = []; var dlgLog = DOpus.Dlg; dlgLog.title = "Log Reader - Music Tags"; dlgLog.template = "dlgLog"; dlgLog.window = dlg; dlgLog.disable_window = dlg; dlgLog.LoadPosition("Steve_LogReader"); dlgLog.detach = true; dlgLog.Create(); dlgLog.Control("staticLogFile").label = logPath + "\\MusicTags.log"; var fso = new ActiveXObject("Scripting.FileSystemObject"); var logFile = fso.OpenTextFile(logPath + "\\MusicTags.log", 1, true); if (fso.FileExists(logPath + "\\MusicTags.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; } } } } function saveChanges(srcTab, dlg, fileList, logPath) { if (Script.Config["confirm_save"] == true) { var dlgConfirm = DOpus.Dlg; dlgConfirm.window = dlg; dlgConfirm.message = "Are you sure you want to save your changes to " + fileList.value.count + " file/s?"; dlgConfirm.title = "Save Confirmation"; dlgConfirm.buttons = "Ok|Cancel"; var dlgResult = dlgConfirm.Show(); } else { var dlgResult = 1; } if (dlgResult == 1) { dlg.Control("staticNotify").label = "Writing metadata..."; var factory = DOpus.Create(); var dopDate = factory.Date(); var cmd = factory.command; cmd.SetModifier("sync"); if (Script.Config["log_changes"]) { var fso = new ActiveXObject("Scripting.FileSystemObject"); var logFile = fso.OpenTextFile(logPath + "\\MusicTags.log", 8, true); logFile.WriteLine("--------------------"); logFile.WriteLine(dopDate.Format("D#dd-MMM-yyyy T#HH:mm:ss")); logFile.WriteLine("--------------------"); } for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { if (fileList.GetItemAt(eItems.item()).subitems(TRACK) != dlg.Control("cmbTrack").label && dlg.Control("cmbTrack").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "track:" + dlg.Control("cmbTrack").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Track] From=\"" + fileList.GetItemAt(eItems.item()).subitems(TRACK) + "\" To=\"" + dlg.Control("cmbTrack").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(TITLE) != dlg.Control("cmbTitle").label && dlg.Control("cmbTitle").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "title:" + dlg.Control("cmbTitle").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Title] From=\"" + fileList.GetItemAt(eItems.item()).subitems(TITLE) + "\" To=\"" + dlg.Control("cmbTitle").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(ARTIST) != dlg.Control("cmbArtist").label && dlg.Control("cmbArtist").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "artist:" + dlg.Control("cmbArtist").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Artist] From=\"" + fileList.GetItemAt(eItems.item()).subitems(ARTIST) + "\" To=\"" + dlg.Control("cmbArtist").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(ALBUM) != dlg.Control("cmbAlbum").label && dlg.Control("cmbAlbum").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "album:" + dlg.Control("cmbAlbum").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Album] From=\"" + fileList.GetItemAt(eItems.item()).subitems(ALBUM) + "\" To=\"" + dlg.Control("cmbAlbum").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST) != dlg.Control("cmbAlbumArtist").label && dlg.Control("cmbAlbumArtist").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "albumartist:" + dlg.Control("cmbAlbumArtist").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Album Artist] From=\"" + fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST) + "\" To=\"" + dlg.Control("cmbAlbumArtist").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(COMPOSER) != dlg.Control("cmbComposer").label && dlg.Control("cmbComposer").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "composers:" + dlg.Control("cmbComposer").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Composer] From=\"" + fileList.GetItemAt(eItems.item()).subitems(COMPOSER) + "\" To=\"" + dlg.Control("cmbComposer").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(DISC) != dlg.Control("cmbDisc").label && dlg.Control("cmbDisc").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "discnumber:" + dlg.Control("cmbDisc").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Disc] From=\"" + fileList.GetItemAt(eItems.item()).subitems(DISC) + "\" To=\"" + dlg.Control("cmbDisc").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(YEAR) != dlg.Control("cmbYear").label && dlg.Control("cmbYear").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "year:" + dlg.Control("cmbYear").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Year] From=\"" + fileList.GetItemAt(eItems.item()).subitems(YEAR) + "\" To=\"" + dlg.Control("cmbYear").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(GENRE) != dlg.Control("cmbGenre").label && dlg.Control("cmbGenre").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "genre:" + dlg.Control("cmbGenre").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Genre] From=\"" + fileList.GetItemAt(eItems.item()).subitems(GENRE) + "\" To=\"" + dlg.Control("cmbGenre").label + "\""); } } if (fileList.GetItemAt(eItems.item()).subitems(COMMENT) != dlg.Control("cmbComment").label && dlg.Control("cmbComment").label != "") { cmd.AddLine("SetAttr FILE=\"" + srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name + "\" META \"" + "comment:" + dlg.Control("cmbComment").label + "\""); if (Script.Config["log_changes"]) { logFile.WriteLine("\"" + fileList.GetItemAt(eItems.item()).name + "\" [Comment] From=\"" + fileList.GetItemAt(eItems.item()).subitems(COMMENT) + "\" To=\"" + dlg.Control("cmbComment").label + "\""); } } } } if (cmd.linecount > 0) { cmd.Run() if (cmd.result === 0) { dlg.Control("staticNotify").label = "Metadata write failed."; DOpus.Delay(2000); } else { dlg.Control("staticNotify").label = "Metadata successfully written."; DOpus.Delay(2000); } } else { dlg.Control("staticNotify").label = "No metadata to write." DOpus.Delay(2000); } fileList.focus = true; fileList.DeselectItem(-1); populateList(fileList, srcTab, dlg); } if (Script.Config["log_changes"]) { logFile.Close(); } } function updateCover(fileList, srcTab, dlg, tmpFolder, eItems) { var arrCover = []; var flgCoverArtSame = false; for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { var filePath = DOpus.FSUtil.NewPath(srcTab.path + "\\" + fileList.GetItemAt(eItems.item()).name); var file = DOpus.FSUtil.GetItem(filePath); if (file.metadata == "audio" && file.metadata.audio.coverart) { if (file.metadata == "audio" && file.metadata.audio.coverart > 0 ) { var art = file.metadata.audio.coverart(0); arrCover.push(DOpus.FSUtil.Hash(file.metadata.audio.coverart(0).data)); } else { var art = null; arrCover.push(null); } } if (checkArray(arrCover)) { var tmpFile = DOpus.FSUtil.OpenFile(tmpFolder + "\\" + file.name_stem + ".mt_tmp", "w"); if (art != null) { if (typeof(art.data) != null) { tmpFile.Write(art.data); tmpFile.Close(); flgCoverArtSame = true; } } else { dlg.Control("staticCover").bg = ""; dlg.Control("staticCoverText").bg = ""; dlg.Control("staticCoverText").fg = ""; dlg.Control("staticCover").label = ""; dlg.Control("staticCoverText").label = "No cover art"; flgCoverArtSame = false; } } else { dlg.Control("staticCover").bg = ""; dlg.Control("staticCoverText").bg = ""; dlg.Control("staticCoverText").fg = ""; dlg.Control("staticCover").label = ""; dlg.Control("staticCoverText").label = "Cover art varies"; flgCoverArtSame = false; } } } if (flgCoverArtSame == true) { dlg.Control("staticCover").bg = "#000000"; dlg.Control("staticCoverText").bg = "#000000"; dlg.Control("staticCoverText").fg = "#FFFFFF"; dlg.Control("staticCover").label = tmpFolder + "\\" + file.name_stem + ".mt_tmp"; dlg.Control("staticCoverText").label = art.height + " x " + art.width + " x " + art.depth + " (" + art.size.fmt + ")"; } } function checkArray(arrTag) { var boolReturn = true; for(x = 0; x < arrTag.length - 1; x++){ if (arrTag[x] != arrTag[x + 1]) { boolReturn = false; } } return boolReturn; } function clearFields(dlg) { dlg.Control("cmbTrack").RemoveItem(-1); dlg.Control("cmbTitle").RemoveItem(-1); dlg.Control("cmbArtist").RemoveItem(-1); dlg.Control("cmbAlbum").RemoveItem(-1); dlg.Control("cmbAlbumArtist").RemoveItem(-1); dlg.Control("cmbComposer").RemoveItem(-1); dlg.Control("cmbDisc").RemoveItem(-1); dlg.Control("cmbYear").RemoveItem(-1); dlg.Control("cmbComment").RemoveItem(-1); dlg.Control("cmbTrack").label = ""; dlg.Control("cmbTrack").AddItem(""); dlg.Control("cmbTitle").label = ""; dlg.Control("cmbTitle").AddItem(""); dlg.Control("cmbArtist").label = ""; dlg.Control("cmbArtist").AddItem(""); dlg.Control("cmbAlbum").label = ""; dlg.Control("cmbAlbum").AddItem(""); dlg.Control("cmbAlbumArtist").label = ""; dlg.Control("cmbAlbumArtist").AddItem(""); dlg.Control("cmbComposer").label = ""; dlg.Control("cmbComposer").AddItem(""); dlg.Control("cmbDisc").label = ""; dlg.Control("cmbDisc").AddItem(""); dlg.Control("cmbYear").label = ""; dlg.Control("cmbYear").AddItem(""); dlg.Control("cmbGenre").label = ""; dlg.Control("cmbComment").label = ""; dlg.Control("cmbComment").AddItem(""); } function selectionChangedNone(fileList, dlg, srcTab, tmpFolder) { dlg.Control("staticStats").label = fileList.value.count + "/" + fileList.count + " Selected"; clearFields(dlg); dlg.Control("staticCover").label = ""; dlg.Control("staticCover").bg = ""; dlg.Control("staticCoverText").bg = ""; dlg.Control("staticCoverText").fg = ""; dlg.Control("staticCoverText").label = ""; dlg.Control("btnSave").enabled = false; return; } function selectionChangedSingle(fileList, dlg, srcTab, tmpFolder) { dlg.Control("staticStats").label = fileList.value.count + "/" + fileList.count + " Selected"; clearFields(dlg); for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { dlg.Control("cmbTrack").label = fileList.GetItemAt(eItems.item()).subitems(TRACK); dlg.Control("cmbTrack").AddItem(fileList.GetItemAt(eItems.item()).subitems(TRACK)); dlg.Control("cmbTitle").label = fileList.GetItemAt(eItems.item()).subitems(TITLE); dlg.Control("cmbTitle").AddItem(fileList.GetItemAt(eItems.item()).subitems(TITLE)); dlg.Control("cmbArtist").label = fileList.GetItemAt(eItems.item()).subitems(ARTIST); dlg.Control("cmbArtist").AddItem(fileList.GetItemAt(eItems.item()).subitems(ARTIST)); dlg.Control("cmbAlbum").label = fileList.GetItemAt(eItems.item()).subitems(ALBUM); dlg.Control("cmbAlbum").AddItem(fileList.GetItemAt(eItems.item()).subitems(ALBUM)); dlg.Control("cmbAlbumArtist").label = fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST); dlg.Control("cmbAlbumArtist").AddItem(fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST)); dlg.Control("cmbComposer").label = fileList.GetItemAt(eItems.item()).subitems(COMPOSER); dlg.Control("cmbComposer").AddItem(fileList.GetItemAt(eItems.item()).subitems(COMPOSER)); dlg.Control("cmbDisc").label = fileList.GetItemAt(eItems.item()).subitems(DISC); dlg.Control("cmbDisc").AddItem(fileList.GetItemAt(eItems.item()).subitems(DISC)); dlg.Control("cmbYear").label = fileList.GetItemAt(eItems.item()).subitems(YEAR); dlg.Control("cmbYear").AddItem(fileList.GetItemAt(eItems.item()).subitems(YEAR)); dlg.Control("cmbGenre").label = fileList.GetItemAt(eItems.item()).subitems(GENRE); dlg.Control("cmbComment").label = fileList.GetItemAt(eItems.item()).subitems(COMMENT); dlg.Control("cmbComment").AddItem(fileList.GetItemAt(eItems.item()).subitems(COMMENT)); } } dlg.Control("btnSave").enabled = true; dlg.Control("staticNotify").label = "Ready."; return; } function selectionChangedMulti(fileList, dlg, srcTab, tmpFolder) { oldSelection = fileList.value.count; dlg.Control("staticStats").label = fileList.value.count + "/" + fileList.count + " Selected"; clearFields(dlg); dlg.Control("staticNotify").label = "Comparing metadata..."; var arrTrack = [], arrTitle = [], arrArtist = [], arrAlbum = [], arrAlbumArtist = [], arrComposer = []; var arrDisc = [], arrYear = [], arrGenre = [], arrComment = []; for (var eItems = new Enumerator(fileList.value); !eItems.atEnd(); eItems.moveNext()) { if (eItems.item().selected == true) { if (typeof(fileList.GetItemAt(eItems.item()).subitems(TRACK)) !== undefined) { arrTrack.push(fileList.GetItemAt(eItems.item()).subitems(TRACK)); } if (fileList.GetItemAt(eItems.item()).subitems(TRACK) != "" && !dlg.Control("cmbTrack").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(TRACK))) { dlg.Control("cmbTrack").AddItem(fileList.GetItemAt(eItems.item()).subitems(TRACK)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(TITLE)) !== undefined) { arrTitle.push(fileList.GetItemAt(eItems.item()).subitems(TITLE)); } if (fileList.GetItemAt(eItems.item()).subitems(TITLE) != "" && !dlg.Control("cmbTitle").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(TITLE))) { dlg.Control("cmbTitle").AddItem(fileList.GetItemAt(eItems.item()).subitems(TITLE)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(ARTIST)) !== undefined) { arrArtist.push(fileList.GetItemAt(eItems.item()).subitems(ARTIST)); } if (fileList.GetItemAt(eItems.item()).subitems(ARTIST) != "" && !dlg.Control("cmbArtist").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(ARTIST))) { dlg.Control("cmbArtist").AddItem(fileList.GetItemAt(eItems.item()).subitems(ARTIST)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(ALBUM)) !== undefined) { arrAlbum.push(fileList.GetItemAt(eItems.item()).subitems(ALBUM)); } if (fileList.GetItemAt(eItems.item()).subitems(ALBUM) != "" && !dlg.Control("cmbAlbum").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(ALBUM))) { dlg.Control("cmbAlbum").AddItem(fileList.GetItemAt(eItems.item()).subitems(ALBUM)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST)) !== undefined) { arrAlbumArtist.push(fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST)); } if (fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST) != "" && !dlg.Control("cmbAlbumArtist").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST))) { dlg.Control("cmbAlbumArtist").AddItem(fileList.GetItemAt(eItems.item()).subitems(ALBUMARTIST)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(COMPOSER)) !== undefined) { arrComposer.push(fileList.GetItemAt(eItems.item()).subitems(COMPOSER)); } if (fileList.GetItemAt(eItems.item()).subitems(COMPOSER) != "" && !dlg.Control("cmbComposer").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(COMPOSER))) { dlg.Control("cmbComposer").AddItem(fileList.GetItemAt(eItems.item()).subitems(COMPOSER)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(DISC)) !== undefined) { arrDisc.push(fileList.GetItemAt(eItems.item()).subitems(DISC)); } if (fileList.GetItemAt(eItems.item()).subitems(DISC) != "" && !dlg.Control("cmbDisc").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(DISC))) { dlg.Control("cmbDisc").AddItem(fileList.GetItemAt(eItems.item()).subitems(DISC)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(YEAR)) !== undefined) { arrYear.push(fileList.GetItemAt(eItems.item()).subitems(YEAR)); } if (fileList.GetItemAt(eItems.item()).subitems(YEAR) != "" && !dlg.Control("cmbYear").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(YEAR))) { dlg.Control("cmbYear").AddItem(fileList.GetItemAt(eItems.item()).subitems(YEAR)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(GENRE)) !== undefined) { arrGenre.push(fileList.GetItemAt(eItems.item()).subitems(GENRE)); } if (typeof(fileList.GetItemAt(eItems.item()).subitems(COMMENT)) !== undefined) { arrComment.push(fileList.GetItemAt(eItems.item()).subitems(COMMENT)); } if (fileList.GetItemAt(eItems.item()).subitems(COMMENT) != "" && !dlg.Control("cmbComment").GetItemByName(fileList.GetItemAt(eItems.item()).subitems(COMMENT))) { dlg.Control("cmbComment").AddItem(fileList.GetItemAt(eItems.item()).subitems(COMMENT)); } } } if (checkArray(arrTrack)) { dlg.Control("cmbTrack").label = arrTrack[0]; } else dlg.Control("cmbTrack").label = ""; if (checkArray(arrTitle)) { dlg.Control("cmbTitle").label = arrTitle[0]; } else dlg.Control("cmbTitle").label = ""; if (checkArray(arrArtist)) { dlg.Control("cmbArtist").label = arrArtist[0]; } else dlg.Control("cmbArtist").label = ""; if (checkArray(arrAlbum)) { dlg.Control("cmbAlbum").label = arrAlbum[0]; } else dlg.Control("cmbAlbum").label = ""; if (checkArray(arrAlbumArtist)) { dlg.Control("cmbAlbumArtist").label = arrAlbumArtist[0]; } else dlg.Control("cmbAlbumArtist").label = ""; if (checkArray(arrComposer)) { dlg.Control("cmbComposer").label = arrComposer[0]; } else dlg.Control("cmbComposer").label = ""; if (checkArray(arrDisc)) { dlg.Control("cmbDisc").label = arrDisc[0]; } else dlg.Control("cmbDisc").label = ""; if (checkArray(arrYear)) { dlg.Control("cmbYear").label = arrYear[0]; } else dlg.Control("cmbYear").label = ""; if (checkArray(arrGenre)) { dlg.Control("cmbGenre").label = arrGenre[0]; } else dlg.Control("cmbGenre").label = ""; if (checkArray(arrComment)) { dlg.Control("cmbComment").label = arrComment[0]; } else dlg.Control("cmbComment").label = ""; dlg.Control("staticNotify").label = "Ready."; dlg.Control("btnSave").enabled = true; } function populateList(fileList, srcTab, dlg) { fileList.RemoveItem(-1); for (var enumFiles = new Enumerator(srcTab.selected); !enumFiles.atEnd(); enumFiles.moveNext()) { if (enumFiles.item().metadata == "audio" ) { //&& enumFiles.item().ext == ".mp3" fileList.AddItem(enumFiles.item().name); fileList.GetItemByName(enumFiles.item().name).subitems(TRACK) = enumFiles.item().metadata.audio.mp3track; fileList.GetItemByName(enumFiles.item().name).subitems(TITLE) = enumFiles.item().metadata.audio.mp3title; dlg.Control("cmbTitle").AddItem(fileList.GetItemByName(enumFiles.item().name).subitems(TITLE)); fileList.GetItemByName(enumFiles.item().name).subitems(ARTIST) = enumFiles.item().metadata.audio.mp3artist; fileList.GetItemByName(enumFiles.item().name).subitems(ALBUM) = enumFiles.item().metadata.audio.mp3album; fileList.GetItemByName(enumFiles.item().name).subitems(ALBUMARTIST) = enumFiles.item().metadata.audio.mp3albumartist; fileList.GetItemByName(enumFiles.item().name).subitems(COMPOSER) = enumFiles.item().metadata.audio.composers; fileList.GetItemByName(enumFiles.item().name).subitems(DISC) = enumFiles.item().metadata.audio.mp3disc; fileList.GetItemByName(enumFiles.item().name).subitems(YEAR) = enumFiles.item().metadata.audio.mp3year; fileList.GetItemByName(enumFiles.item().name).subitems(GENRE) = enumFiles.item().metadata.audio.mp3genre; fileList.GetItemByName(enumFiles.item().name).subitems(COMMENT) = enumFiles.item().metadata.audio.mp3comment; } } if (fileList.count == 0) { dlg.Control("staticNotify").label = "No mp3 files selected."; } else { dlg.Control("staticStats").label = fileList.value.count + "/" + fileList.count + " Selected"; } fileList.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