Automatizando tareas repetitivas con la ayuda de bash

Como el título indica, vamos a ver como automatizar una tarea repetitiva, en este caso, la creación de unos ficheros matroska (mkv) con la ayuda de bash (y también de vim).

Supongamos que tenemos unos cuantos videos (en formato avi), que tienen video y 2 pistas de audio (castellano e inglés), cuyos nombres son 101.avi, 102.avi, …, 125.avi.
También tenemos unos subtítulos, tanto en castellano (101s.srt, …, 125s.srt) como en inglés (101e.srt, …, 125e.srt). Aquí una muestra de los ficheros:

Podemos coger tal cual todos los ficheros y grabarlos en un DVD, pero en nuestro caso lo que queremos es crear un mkv por cada capítulo que tenga video, las dos pistas de audio y los dos subtítulos.


Para ello usaremos mkvtoolnix, un software que nos permite crear y modificar archivos mkv, que además es multiplataforma. La primera opción que tenemos es usar mmg, una aplicación gráfica con la que añadiríamos los 3 ficheros de cada capítulo, pondríamos que idioma tiene cada audio y cada subtítulo, le diríamos donde guardar el resultado y le daríamos a “Start”. Hacer esto con 1 fichero es pasable, pero hacerlo con una serie de 4 temporadas con 25 capítulos por temporada es una matada. Por este motivo, con la ayuda de vim y de bash podremos hacerlo con 2 comandos que ahora explicaré.

Lo primero, es que por propia experiencia, si los subtítulos no están en UTF8, suelen dar problemas con algún que otro reproductor. Para pasarlos a UTF8, vamos a usar vim:

for i in *.srt
do vim -c ":set fileencoding=utf8" -c ":set fileformat=unix" -c ":wqa" ${i}
done

Lo que hacemos es: “para todos los ficheros acabados en .srt en el directorio actual, ejecutamos vim con esos parametros”. El parametro -c de vim ejecuta un comando de vim. “:set fileencoding=utf8″ convierte el texto a utf8, “:set fileformat=unix” convierte los saltos de linea al formato UNIX, y “:wqa” guarda y cierra el fichero.
Por lo tanto, después de haber ejecutado eso ya tenemos todos los subtítulos en UTF8 y con saltos de linea UNIX.

Ahora veamos como vamos a crear los mkv. Lo que yo he hecho ha sido con mmg abrir los 3 ficheros de un capitulo, poner todas las opciones a gusto (pistas por defecto, idiomas, etc…) y copiar la linea de comandos que genera el programa (en la parte inferior de la captura):

Como el nombre de los ficheros sigue un patrón, es muy sencillo de automatizar la ejecución de los 25 comandos (donde en la captura pone 101, ponemos ${i}):
for i in 1{0{1..9},{10..25}}
do "mkvmerge" -o "/Volumes/Maxtor/Series/Lost/${i}.mkv" --language 1:spa --language 2:eng --default-track 2 -a 1,2 -d 0 -S "/Volumes/Maxtor/Euskal/Completo/Series/Lost/Temporada 1/${i}.avi" --sub-charset 0:UTF8 --language 0:spa -s 0 -D -A "/Volumes/Maxtor/Euskal/Completo/Series/Lost/Temporada 1/${i}s.srt" --sub-charset 0:UTF8 --language 0:eng -s 0 -D -A "/Volumes/Maxtor/Euskal/Completo/Series/Lost/Temporada 1/${i}e.srt" --track-order 0:0,0:1,0:2,1:0,2:0
done

Como antes, es un for de bash. En cada iteración, la variable i va a coger los valores que genera 1{0{1..9},{10..25}}, que son 101, 102, 103, …, 125. Pese a parecer algo ilegible, su funcionamiento es sencillo (y muy práctico):

  • {1..9} genera: 1 2 3 4 5 6 7 8 9
  • 0{1..9} le añade un 0 a lo que genera {1..9}: 01 02 03 … 09
  • {10..25} hace lo mismo que {1..9}: 10 11 12 … 25
  • {0{1..9},{10..25}} junta los valores de 0{1..9} y {10,25}: 01 02 03 … 10 11 12 … 25
  • 1{0{1..9},{10..25}} añade un 1 a lo que genera {0{1..9},{10..25}}: 101 102 103 … 110 111 112 … 125

Ejecutamos dicho comando, y después de un rato, tendremos en el directorio objetivo 25 ficheros mkv con las 2 pistas y de audio y los 2 subtítulos como podemos ver en esta imagen ;)

Espero que le sea útil a alguien :P

Agur!

Un Comentario to “Automatizando tareas repetitivas con la ayuda de bash”

  1. Ivan dice:

    Grande. Muy grande. Gran idea lo de copiar la salida de un programa con interfaz para hacer tus scripts. La mayoría de las veces es pesadísimo saber como meter cada opción en un programa de shell.

    Un saludo

Vuelve a la Portada

Deja tu comentario