Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: betitogc2 en 30 Marzo 2015, 22:09 pm



Título: Obtener y ordenar texto CMD y MediaInfo Cli
Publicado por: betitogc2 en 30 Marzo 2015, 22:09 pm
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ódigo:
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

Código:
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.


Título: Re: Obtener y ordenar texto CMD y MediaInfo Cli
Publicado por: explorer en 31 Marzo 2015, 00:03 am
Se puede realizar en una sola línea:
Código
  1. 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
  1. #!/usr/bin/perl
  2.  
  3. $DEL = qr/\s*:\s*/; # definimos un delimitador que se repite varias veces
  4.  
  5. foreach $mxf (<*.mxf>) { # para todos los archivos .mxf del dir. actual
  6.  
  7. # llamamos a MediaInfo
  8.    my $resultado = qx(c:/mediainfo/MediaInfo.exe $mxf);
  9.  
  10. # extraemos lo que queremos desde el $resultado
  11.    ($name,$duration,$encoded) =
  12.        $resultado =~ /Complete name$DEL(.*?)\n.+?Duration$DEL(.*?)\n.+?Encoded date$DEL(\d{4}-\d{2}-\d{2}).+?\n/ms;
  13.  
  14. # formateamos los valores y los sacamos
  15.    say join ' | ', $name, $duration, $encoded;
  16. }
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


Título: Re: Obtener y ordenar texto CMD y MediaInfo Cli
Publicado por: Eleкtro en 31 Marzo 2015, 09:19 am
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:

Código:
@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:
Código:
MediaInfo.exe --help

Saludos


Título: Re: Obtener y ordenar texto CMD y MediaInfo Cli
Publicado por: betitogc2 en 31 Marzo 2015, 19:36 pm
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.