// Barra informativa // (c) 2025 DASOTA // Script para Directory Opus function OnInit(initData) { initData.name = "Barra informativa"; initData.version = "1.0"; initData.copyright = "(c) 2025 DASOTA"; initData.desc = "Informaciones relevantes sobre el elemento seleccionado"; initData.default_enable = true; initData.min_version = "13.0"; } function OnAddCommands(addCmdData) { var cmd = addCmdData.AddCommand(); cmd.name = "BarraInfo"; cmd.method = "OnBarraInfo"; cmd.desc = "Informaciones relevantes sobre el elemento seleccionado"; cmd.label = "Bara informativa"; cmd.template = "dialog1"; cmd.hide = false; cmd.icon = "script"; } function OnBarraInfo(scriptCmdData) { var tab = scriptCmdData.func.sourcetab; var selected = tab.selected; // Elementos seleccionados (archivos o carpetas) //var selected = tab.selected_files; // Archivos seleccionados (no carpetas) //var selected = tab.selected_dirs; // Carpetas seleccionadas (no archivos) if (!selected.count) { // Si no existe nada seleccionado... DOpus.Output("No existe ningún elemento seleccionado."); // Mostrar mensaje en consola return; // Interumpir el análisis del resto del código } var item = selected(0); // 1º elemento seleccionado (0= 1º, 1= 2º, ...) var meta = item.metadata; // Tipo de archivo (ej: image, audio, video, doc, exe) var dlg = scriptCmdData.func.Dlg(); dlg.title = "Informaciones de archivo - Directory Opus"; dlg.template = "dialog1"; dlg.detach = true; dlg.Create(); // ========================================================================================================================================= // CONTROLES GENERALES // ========================================================================================================================================= // NOMBRE dlg.Control("nombre").title = item.name_stem; // Nombre con extensión (item.name_stem = Nombre sin extensión) (item.ext = Extensión con punto) // EXTENSIÓN dlg.Control("extension").label = (item.ext || "").substr(1); // Extensión sin el punto. Insertar al final: .toUpperCase() para convertir en mayúsculas // TIPO DE ARCHIVO var tipo = item.is_dir ? "Carpeta" : // Si carpeta, mostrar 'Carpeta' item.metadata == "image" ? "Imagen" : // Si 'image', mostrar 'Imagen' item.metadata == "audio" ? "Audio" : item.metadata == "video" ? "Video" : item.metadata == "doc" ? "Documento" : item.metadata == "exe" ? "Ejecutable": "Otros"; // Si no, mostrar 'Otros' dlg.Control("tipo_archivo").title = tipo; // Tipo de archivo // TAMAÑO dlg.Control("tamano").title = item.size.fmt; // Tamaño en formato real // ATRIBUTOS var attr = item.attr; var attrStr = (attr & 1 ? "R, " : "") + // Read-only (solo lectura) (attr & 2 ? "H, " : "") + // Hidden (oculto) (attr & 4 ? "S, " : "") + // System (Sistema) (attr & 16 ? "D, " : "") + // Directory (carpeta) (attr & 32 ? "A, " : "") + // Archive (archivo) (attr & 1024 ? "I, " : "") + // Not indexed (no indixado) (attr & 2048 ? "C, " : "") + // Compressed (comprimido) (attr & 16384 ? "E, " : ""); // Encrypted (encriptado) attrStr = attrStr.replace(/, $/, ""); // Eliminar la última coma y espacio si existe dlg.Control("atributos").title = attrStr; // Atributos // FECHAS dlg.Control("fecha_creacion").title = item.create; // Fecha de creación dlg.Control("fecha_modificacion").title = item.modify; // Fecha de modificación dlg.Control("fecha_ultimo_acceso").title = item.access; // Fecha de último acceso // ========================================================================================================================================= // CONTROLES SEGÚN TIPO DE ARCHIVO SELECCIONADO // ========================================================================================================================================= // CONTROLES A MOSTRAR SEGÚN TIPO DE ARCHIVO SELECCIONADO (implementación, DEFINICIÓN) function mostrarSolo(dlg, prefijo) { var grupo = [ // Imágenes "ima_fecha_captura_t", "ima_fecha_captura", "ima_resolucion_t", "ima_resolucion", "ima_dimensiones_t", "ima_dimensiones", "ima_ppp_t", "ima_ppp", "ima_color_t", "ima_color", "ima_relacion_aspecto_t", "ima_relacion_aspecto", "ima_orientacion_t", "ima_orientacion", // Audio "aud_codec_audio_t", "aud_codec_audio", "aud_tasa_bits_t", "aud_tasa_bits", "aud_tasa_muestreo_t", "aud_tasa_muestreo", "aud_duracion_t", "aud_duracion", "aud_modo_t", "aud_modo", // Video "vid_codec_audio_t", "vid_codec_audio", "vid_codec_video_t", "vid_codec_video", "vid_dimensiones_t", "vid_dimensiones", "vid_fotogramas_t", "vid_fotogramas", "vid_relacion_t", "vid_relacion", "vid_modo_t", "vid_modo", "vid_duracion_t", "vid_duracion", "vid_tasa_bits_audio_t", "vid_tasa_bits_audio", "vid_tasa_bits_video_t", "vid_tasa_bits_video", "vid_tasa_muestreo_t", "vid_tasa_muestreo", // Documentos "doc_paginas_t", "doc_paginas", "doc_autor_t", "doc_autor", "doc_comentario_t", "doc_comentario", // Ejecutables "exe_producto_t", "exe_producto", "exe_version_t", "exe_version", "exe_empresa_t", "exe_empresa", "exe_copyright_t", "exe_copyright", "exe_firma_t", "exe_firma", "exe_descripcion_t", "exe_descripcion" ]; for (var i = 0; i < grupo.length; i++) { var ctrl = dlg.Control(grupo[i]); if (ctrl) { ctrl.visible = grupo[i].indexOf(prefijo) === 0; // grupo[i] = nombre de cada uno de los controles (ej: "ima_fecha_captura_t"), prefijo = prefijos (ej: ima_). Si el control contiene el prefijo ( === 0) la ecuacion se torna verdadera (true) y el contro lse etiqueta como visible } } } // CONTROLES A MOSTRAR SEGÚN TIPO DE ARCHIVO SELECCIONADO (decisión, EJECUCIÓN) item.metadata == "image" ? mostrarSolo(dlg, "ima_") : // Si 'image': Llamar a la función 'mostrarSolo' con el argumento "ima_" para mostrar solo controles que comienzan con "ima_" item.metadata == "audio" ? mostrarSolo(dlg, "aud_") : item.metadata == "video" ? mostrarSolo(dlg, "vid_") : item.metadata == "doc" ? mostrarSolo(dlg, "doc_") : item.metadata == "exe" ? mostrarSolo(dlg, "exe_") : mostrarSolo(dlg, "otro_"); // Si no, mostrar controles que comienzan con "otro_" // =========================================================== // IMÁGENES // =========================================================== // Comprobación inicial, si el archivo no cumple con las condiciones siguientes, el código de esta función // no se ejecuta para evitar posibles errores (por campos nulos, indefinidos, etc.) if ( item.metadata && item.metadata.image && item.metadata.image_text ) { // FECHA DE CAPTURA dlg.Control("ima_fecha_captura").label = item.metadata.image.datetaken || ""; // RESOLUCIÓN dlg.Control("ima_resolucion").label = item.metadata.image_text.picsize || ""; // Ancho x Alto x Profundidad // DIMENSIONES var dimensiones_cm = ""; if (item.metadata.image.picphysx && item.metadata.image.picphysy) { // Verificar si la imagen tiene dimensiones físicas (picphysx y picphysy). Si no las tienes, el código de este bucle no se ejecuta y se evita que se genere error var ancho_fisico_str = item.metadata.image.picphysx.split("\"")[0]; // Eliminarle las comillas a dimensiones (Ej: 14.8" > 14.8) var alto_fisico_str = item.metadata.image.picphysy.split("\"")[0]; var ancho_cm = (parseFloat(ancho_fisico_str) * 2.54).toFixed(2).replace('.', ','); // Convertir el texto "14.8" a número usando parseFloat(...), luego lo convierte a centímetros (* 2.54) y lo redondea a 2 cifras decimales ( .toFixed(2) ) y se reemplaza "." por "," (sistema latino) var alto_cm = (parseFloat(alto_fisico_str) * 2.54).toFixed(2).replace('.', ','); dimensiones_cm += ancho_cm + " x " + alto_cm + " cm"; } dlg.Control("ima_dimensiones").label = dimensiones_cm || ""; // Dimensiones en cm // PUNTOS POR PULGADA dlg.Control("ima_ppp").label = item.metadata.image.picresx || ""; // MODELO DE COLOR dlg.Control("ima_color").label = item.metadata.image.colorspace || ""; // RELACIÓN DE ASPECTO var relacion = item.metadata.image.aspectratio; dlg.Control("ima_relacion_aspecto").label = (relacion != null) ? parseFloat(relacion).toFixed(2).replace('.', ',') : ""; // ORIENTACIÓN dlg.Control("ima_orientacion").label = // Valor del campo 'orientacion'... (relacion < 1) ? "Vertical" : // Si 'relacion' < 1, entonces 'Vertical' (relacion > 1) ? "Horizontal" : // Si 'relacion' > 1, entonces 'Horizontal' "Neutra"; // Si no, 'Neutra' } else { dlg.Control("ima_relacion_aspecto").label = ""; dlg.Control("ima_orientacion").label = ""; } // =========================================================== // AUDIO // =========================================================== if (item.metadata && item.metadata.audio) { dlg.Control("aud_codec_audio").label = item.metadata.audio.audiocodec || ""; dlg.Control("aud_modo").label = item.metadata.audio.mp3mode || ""; // Modo de sonido: Ej: Estéreo dlg.Control("aud_tasa_bits").label = item.metadata.audio.mp3bitrate + " kbps" || ""; dlg.Control("aud_tasa_muestreo").label = item.metadata.audio.mp3samplerate || ""; dlg.Control("aud_tasa_muestreo").label = (item.metadata.audio.mp3samplerate / 1000).toFixed(1).replace('.', ',') + " kHz"; // La tasa se muestra en Hz, ej: 44100, convertirla en kHz hay que dividirla entre 1000, luego se redondea a 1 lugar decimal, se reemplaza "." por "," (sistema latino) y se le concatena "kHz" dlg.Control("aud_duracion").label = segundos_a_HMS(item.metadata.audio.duration) || ""; // Llamar a la función 'segundos_a_HMS' con el valor de 'item.metadata.audio.duration' (segundos) cargados para convertirlos en H:M:S } // =========================================================== // VIDEO // =========================================================== // Verificamos que haya metadatos if (item.metadata && item.metadata.video) { dlg.Control("vid_codec_audio").label = item.metadata.audio.audiocodec || ""; dlg.Control("vid_codec_video").label = item.metadata.video.videocodec || ""; dlg.Control("vid_dimensiones").label = item.metadata.video_text.picsize || ""; dlg.Control("vid_fotogramas").label = item.metadata.video.framerate || ""; var relacion = item.metadata.video.aspectratio; dlg.Control("vid_relacion").label = (relacion != null) ? parseFloat(relacion).toFixed(2).replace('.', ',') : ""; dlg.Control("vid_modo").label = item.metadata.audio.mp3mode || ""; dlg.Control("vid_tasa_muestreo").label = (item.metadata.audio.mp3samplerate || 0) > 0 ? (item.metadata.audio.mp3samplerate / 1000).toFixed(1).replace('.', ',') + " kHz" : ""; dlg.Control("vid_duracion").label = segundos_a_HMS(item.metadata.video.duration) || ""; dlg.Control("vid_tasa_bits_audio").label = item.metadata.audio.mp3bitrate + " kbps" || ""; dlg.Control("vid_tasa_bits_video").label = item.metadata.video.datarate + " kbps" || ""; } // =========================================================== // DOCUMENTOS // =========================================================== if (item.metadata && item.metadata.doc) { var doc = item.metadata.doc; dlg.Control("doc_paginas").label = item.metadata.doc.pages || ""; dlg.Control("doc_autor").label = item.metadata.doc.author || ""; dlg.Control("doc_comentario").label = item.metadata.doc.comments || ""; } // =========================================================== // EJECUTABLES // =========================================================== if (item.metadata && item.metadata.exe) { var exe = item.metadata.exe; dlg.Control("exe_producto").label = item.metadata.exe.prodname || ""; dlg.Control("exe_version").label = item.metadata.exe.modversion || ""; dlg.Control("exe_empresa").label = item.metadata.exe.companyname || ""; dlg.Control("exe_copyright").label = item.metadata.exe.copyright || ""; dlg.Control("exe_firma").label = item.metadata.exe.signer || ""; dlg.Control("exe_descripcion").label = item.metadata.exe.moddesc || ""; } // ============================================================================================================================================= dlg.Show(); // ============================================================================================================================================= while (true) { var msg = dlg.GetMsg(); if (!msg.result) break; if (msg.event == "click" && msg.control == "btn_aceptar") break; } // Fin de la función 'OnBarraInfo' } // ============================================================================================================================================= // Función auxiliar para convertir Segundos a Hora:Minutos:Segundos (utilizada en campos 'Duración') // ============================================================================================================================================= function segundos_a_HMS(segundos) { if (isNaN(segundos)) return ""; // Validación (si no existen segundos, interrumpir el código e informar: "") var hora = Math.floor(segundos / 3600); var min = Math.floor((segundos % 3600) / 60); var seg = Math.floor(segundos % 60); // Minutos y segundos con 2 dígitos (0 a la izquierda) var str_min = (min < 10 ? "0" : "") + min; var str_seg = (seg < 10 ? "0" : "") + seg; var tiempo; if (hora > 0) { tiempo = hora + ":" + str_min + ":" + str_seg; } else { tiempo = str_min + ":" + str_seg; } return "" + tiempo; } ==SCRIPT RESOURCES