Obtener y ordenar texto CMD y MediaInfo Cli

Iniciado por betitogc2, 30 Marzo 2015, 22:09 PM

0 Miembros y 1 Visitante están viendo este tema.

betitogc2

Hola a todos.

Me gustaría ver si pueden ayudarme. Les cuento rapidamente el asunto:

1.- Escenario: Tengo un carpeta con 400 archivos de video con extensíon mxf.
2.- Problema: Necesito saber la duración y fecha de creación de los archivos.
3.- Posible solución: Con MediaInfo CLI, puedo extraer la información del video, pero solo necesito lo antes mencionado.

Con el siguiente comando extraigo la información del video, esto lo hago en Windows a través del CMD

c:\mediainfo\MediaInfo.exe d:\archivo.mxf

General
Complete name                            : d:\archivo.mxf
Format                                   : MXF
Format profile                           : OP-1a
Format settings                          : Open / Incomplete
File size                                : 10.9 GiB
Duration                                 : 34mn 21s
Overall bit rate                         : 45.5 Mbps
Encoded date                             : 2014-12-04 15:11:55.212
Writing application                      : J2K MXF Wrapper Based on MXFLib 1.0.1(13)-Beta
Writing library                          : J2K MXF Wrapper Based on MXFLib 1.0.1(13)-Beta


Y demás información acerca del archivo de video, (es bastante)  :-\

Lo que yo necesito es solamente extraer 3 datos y mandarlos a un txt que quede así:
Complete name | Duration | Encoded Date, (solo la fecha YYYY-MM-DD) Y eso meterlo en un FOR para que me de la información de los 400 archivos.  ;-)

Ejemplo de la salida

d:\archivo.mxf | 32mn 21s | 2014-12-04
d:\archivo2.mxf | 31mn 32s | 2014-11-05
d:\archivo3.mxf | 35mn 56s | 2014-19-09


¿Podrían ayudarme a estructurarlo?  :-(

Saludos.

explorer

#1
Se puede realizar en una sola línea:
Código (bash) [Seleccionar]
perl -E '$del = qr/\s*:\s*/; foreach (<*.mxf>) { ($name,$duration,$encoded) = qx(c:/mediainfo/MediaInfo.exe $_) =~ /Complete name$del(.*?)\n.+?Duration$del(.*?)\n.+?Encoded date$del(\d{4}-\d{2}-\d{2}).+?\n/ms; say join " | ", $name, $duration, $encoded; }'
Este código lee los nombres de todos los archivos *.mxf del directorio actual.
Por cada uno de ellos (foreach), llamamos a MediaInfo.
De todo lo que devuelve, nos quedamos con lo que queremos.
Y finalmente, lo formateamos y sacamos a pantalla.
Para guardarlo a un archivo, vale con agregar '> resumen.txt' al final.

En forma de programa:
Código (perl) [Seleccionar]
#!/usr/bin/perl

$DEL = qr/\s*:\s*/; # definimos un delimitador que se repite varias veces

foreach $mxf (<*.mxf>) { # para todos los archivos .mxf del dir. actual

# llamamos a MediaInfo
   my $resultado = qx(c:/mediainfo/MediaInfo.exe $mxf);

# extraemos lo que queremos desde el $resultado
   ($name,$duration,$encoded) =
       $resultado =~ /Complete name$DEL(.*?)\n.+?Duration$DEL(.*?)\n.+?Encoded date$DEL(\d{4}-\d{2}-\d{2}).+?\n/ms;

# formateamos los valores y los sacamos
   say join ' | ', $name, $duration, $encoded;
}

Ejemplo de salida:
d:\archivo1.mxf | 34mn 21s | 2014-12-04
d:\archivo2.mxf | 3mn 21s | 2014-12-04
d:\archivo3.mxf | 4mn 21s | 2014-12-04
d:\archivo4.mxf | 5mn 21s | 2014-12-04

Eleкtro

#2
La solución del compañero @Explorer es funcional y útil,
pero, en lo que se refiere a rendimiento, solicitar el informe completo y despues parsearlo/partirlo/unirlo resulta inneceasario por un motivo muy importante que razonablemente quien no esté familiarizado con MediaInfo puede desconocerlo:

· La aplicación MediaInfo permite obtener datos específicos en lugar de obtener el informe completo.

Por ende, al solicitarle a MediaInfo menos información del archivo solicitando los campos específicos para esta tarea se aumenta el rendimiento, y al mismo tiempo se puede construir el formato deseado del string al pasarle los argumentos al MediaInfo, el mismo formato será devuelto por la salida de la aplicación.

Un ejemplo, en Batch:

@Echo OFF

(For %%# In ("*.mxf") DO (
     MediaInfo.exe "%%~f#" "--Inform=General;%%CompleteName%% | %%Duration/String3%% | %%Encoded_Date%%"
))> ".\MediaInfo.txt"

Pause&Exit /B 0


Lee la ayuda de la aplicación para conocer el resto de parámetros:
MediaInfo.exe --help

Saludos








betitogc2

Muchisimas gracias  ;-)

Ambas respuestas me funcionaron perfecto.

Como bien dice Elektro, la respuesta de Explorer es buena, de hecho ya lo estaba haciendo así, pero es un poco más rápido utilizando el batch que extrae solamente la infiormación necesaria del MediaInfo.

Muchisímas gracias a los dos.  ::)

Estoy en deuda.

Saludos.