Browsing in Linux

Porque todo el mundo cree que tienes sus datos seguros… hasta que los pierde. Y yo los he perdido. 1TB ¬¬

Lo irónico, es que yo SÍ era consciente de la situación, y estaba a punto de configurar el sistema para dejar un disco duro de 500gb como almacén para los backups… Además, ya había recibido varias alarmas (en el pasado) de que podía perder fácilmente muchos datos, y entre exámenes y falta de tiempo he ido diciendo… “ya lo configuraré cuando terminé los exámenes” y cosas por el estilo.

Bien. Pues si se tienen datos que se consideren importantes (porque las series, pelis, música, siempre se pueden bajar de nuevo, pero cosas propias… no), sería cuestión de valorar si necesitamos copias de seguridad o no.

Lo más fácil es ir guardando cada X tiempo cosas en un DvD, pero si lo queremos organizar un poco mejor… podemos utilizar rsync, un comando estándar en unix que sirve perfectamente para esto.

Solución rápida:

rsync -au --delete /directorio/de/origen /directorio/de/destino/

Con esto conseguimos hacer una copia de seguridad incremental del directorio de origen al de destino. Podemos ejecutarlo las veces que queramos, que solo se copiarán los archivos nuevos, borrando del directorio de destino los que se hayan borrado del origen siempre que no sean más nuevos.

Mete eso en un crontab para que se ejecute todas las noches, y listo.

Solución detallada:

Con el parámetro -a, es como si pusiésemos -rlptgoD. Una manera rápida de decir que se aplique recursión en directorios y que se preserve prácticamente todo (permisos, fecha de modificación, grupo, propietario, etc).

Con --delete estamos diciendo que también se sincronicen los archivos borrados. Es decir, si borramos un archivo en el directorio de origen, también se borrará en el de destino si existía de un backup anterior. Es muy útil porque lo que hacemos es crear una copia exacta, sin dejar archivos residuales.

Con el parámetro -u indicamos que no queremos borrar los ficheros del directorio de destino que sean más nuevos que los del de origen que hayan sido borrados. Por si trabajamos sobre el directorio de destino (sobre el backup) y luego borramos ese fichero en el de origen.

Con esto tenemos ya un comando bastante decente, que podemos hacer que cron lo ejecute, por ejemplo, cada día a las 5 de la mañana (para que nos pille durmiendo y no moleste), simplemente añadiendo la siguiente linea en el crontab (ejecutando crontab -e editamos el fichero de crontab):

0 5 * * * rsync -au --delete /directorio/de/origen /directorio/de/destino/

Por supuesto, intentad tener el directorio de destino en otro lugar distinto al de origen, como por ejemplo un disco duro que solo uséis para hacer backups y nada más (vamos, que no se menee mucho y se pueda romper fácilmente).

Luego también tenemos muchas opciones más, como por ejempo, que los ficheros que se borren con el --delete no se borren de verdad en la copia de seguridad, sino que sean movidos a otro directorio de backup. Esto lo conseguimos añadiendo -b y --backup-dir=$PWD/backup_$(date +%y%m%d)

Así especificamos que el directorio de backup sea un directorio dentro de cada directorio con el prefijo backup_ y la fecha. Por ejemplo backup_091003.

Con esto conseguiríamos tener todas las versiones de cada fichero antes de ser borrado, y que se puedan consultar. Ocuparía más espacio, pero también podemos recuperar archivos de otros días si nos arrepentimos de haberlos borrado :)

Aquí vemos un ejemplo de todo lo explicado:

Tenemos un directorio (llamado original) del que queremos hacer la copia de seguridad:

$ ll original/
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 15:32 f1
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 01:42 f2

Así que la hacemos:

$ rsync -avb --delete --backup-dir=$PWD/backup_$(date +%y%m%d) original/ backup
sending incremental file list
./
f1
f2
 
sent 154 bytes  received 53 bytes  414.00 bytes/sec
total size is 0  speedup is 0.00
$ ll backup/
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 15:32 f1
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 01:42 f2

Ahora, borramos el fichero f1 del directorio original… y volvemos a hacer una copia de seguridad.

$ rm original/f1
$ rsync -avb --delete --backup-dir=$PWD/backup_$(date +%y%m%d) original/ backup
sending incremental file list
./
deleting f1
 
sent 65 bytes  received 15 bytes  160.00 bytes/sec
total size is 0  speedup is 0.00

Y podemos comprobar, que también se ha borrado de backup, pero se ha creado un directorio llamado backup_091003 donde se ha guardado este fichero borrado:

$ ll backup
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 01:42 f2
 
$ ll backup_091003/
total 0
-rw-r--r-- 1 danikaze danikaze 0 2009-10-03 15:32 f1

Modificando el funcionamiento por defecto de rsync:

Por defecto, rsync considera nuevo los ficheros para ser copiados comparando la fecha y el tamaño, aunque podemos modificar este comportamiendo, haciendo que haga un checksum con la opción -c

A la hora de copiar un archivo, aunque el cambio sea muy pequeño (p.e. un archivo contenía “12345678″ y le añadimos un 9 para que valga “123456789″), rsync lo copia entero (en este caso 9 bytes) ya que funciona por defecto con la opcíon -W (–copy-whole-file). Podemos hacer que copie la parte diferente solamente (1 byte) con la opción –no-whole-file (que no copie el fichero entero vaya xD). Aunque generalmente el cálculo de la diferencia supone una carga mayor que la copia del archivo completo :P

También podemos hacer que se compriman los ficheros antes de copiarlos con la opción -z, lo que conlleva en un mayor uso de CPU aunque se tarde menos la copia. Puede ser útil a la hora de pasar archivos entre máquinas remotas.

Copiando archivos entre máquinas remotas:

¿Y si queremos mandar o traernos las copias de seguridad desde otro ordenador, o algún servidor que tengamos por ahí?

Pues exáctamente igual, solo que la ruta la especificamos de la siguiente manera:

usuario@host:/ruta/del/directorio

Como por defecto se usa ssh (ergo scp), conviene tener configurado ssh de manera que podamos hacer login de forma transparente. Esto es, dejando configurado los archivos ~/.ssh/config y las claves públicas y privadas para que no tengamos que escribir la contraseña.

Esto último no tengo ganas de explicarlo, que no tiene que ver con rsync, pero podéis consultar esos dos links del párrafo anterior, que viene todo muy clarito :)

Yo no soy muy navideño, aunque me guste el ambiente, pero es que últimamente, hasta el VLC se pone navideño ;)
vlc

Por cierto, que yo soy más de MPlayer, pero para ver DvDs si que uso el VLC (Sin City en este caso ^_^)

A más de un@ conozco que antes de subir las imágenes, le gusta poner un texto con su nick, o un borde a la imagen, para dejarla bonita.

Eso no lo veo tan necesario, pero cuando subo imágenes a flickr por ejemplo, si que noto que tarda mucho, cuando cada imagen pesa entre 2 y 4 MB (y más ahora con mi nueva Canon 450D ^^)

El problema es, que al redimensionar, editar y procesar las imágenes, muchas veces se hace de tal manera que se pierde la información EXIF de la propia foto (la que indica los datos de la fotografía, modelo de cámara, velocidad del obturador, etc.)

Para ello anoche hice un pequeño script en bash, que usa los paquetes Imagemagick para hacer las transformaciones y zenity para mostrar una interfaz agradable al usuario ^^

Bola!

El script lo puedes descargar desde aquí, y lo debes guardar en algún lugar que este en tu path de ejecución (p.e. en ~/bin) y asignarles permisos de ejecución!
Como podeis ver, he llamado al script (al comando) fotoflickr porque lo hice pensado para subir mis fotos a flickr (que por cierto, uso postr para ello ^^)

Una vez guardado, tienes varias variables configurables para editar la ejecución del script:

  • ARCHIVOS=’.*jpg’
    Indica el tipo archivos a procesar (expresion regular no case-sensitive entre comillas simples)
  • ANCHO=1024
    ALTO=1024
    Es el tamaño máximo permitido para las imágenes (conserva las proporciones)
  • DESTINO=”/home/danikaze/Desktop/procesado2″
    Es la carpeta donde guardar los resultados
    Si es una ruta relativa (no empieza por /), la carpeta de DESTINO se creara dentro de donde esté cada imagen (p.e. si la imagen esta en /ruta/a/la/imagen.jpg el resultado estara en /ruta/a/la/DESTINO/imagen.jpg)
    Si es una ruta absoluta (empieza por /), todas las imagenes se guardaran en DESTINO independientemente de su origen (con lo que pueden sobreescribirse imágenes si tienen los mismos nombres)
  • BLEND=”50″
    Nivel de transparencia de la imagen de watermark
  • WM=”/home/danikaze/bin/danikaze.png”
    Ruta a la imagen de watermark
  • CALIDAD=95
    Calidad de compresion JPG
  • LIMITE=500
    Mostrará una ventana que te avisa si el número de imágenes es superior al LIMITE (por si hemos cogido una carpeta incorrecta o con subcarpetas)
  • AUTOCERRAR=0
    cierra la ventana de progreso al finalizar automaticamente

Para usar el script solo hacen falta esos paquetes, y nautilus-actions está recomendado (si estás en un sistema debian, con apt-get):

sudo apt-get install zenity imagemagick libimage-exiftool-perl nautilus-actions

Nautilus-actions, lo que hace es añadir una nueva acción al menú contextual del navegador de archivos (Nautilus), para que se muestre una opción al pulsar el click derecho sobre una imagen o carpeta.

Para ello, simplemente nos vamos a (en Ubuntu) Sistema > Preferencias > Configuración de acciones de Nautilus y nos saldrá una ventanita donde seleccionaremos Añadir.

Los parámetros los configuraremos como en los pantallazos de a continuación, y listo para usar :)

Seguro que la mayoría de la gente usa el bittorrent, y muchos el Azureus, el que creo que es el cliente de bittorrent más famoso que existe. Es muy bonito, tiene muchas opciones, y funciona en muchos sistemas. ¿Desventajas? Está programado en Java y eso es sinónimo de usar muchos recursos.

Por eso yo llevo bastante tiempo usando el cliente rtorrent, un cliente que funciona por linea de comandos (ncurses) y que unido a la aplicación screen, da mucho juego :)

Su principal ventaja respecto al rendimiento es que está escrito en C++ y que usa directamente la pila de red. En conexiones de alta velocidad es capaz de dar una velocidad el triple que otros clientes de bittorrent habituales ^_^

Ante todo, para instalar el rtorrent, en un sistema debian: sudo apt-get install rtorrent y listo. Si no, pues a descargar desde aquí.

Si uno se molesta un momento en configurarlo como es debido (sólo lleva unos minutos, al igual que cualquier programa ^^), pues se obtienen muy buenos resultados y prácticamente sin afectar al rendimiento del sistema. Y para simplificar, os diré todos los pasos necesarios para dejarlo listo:

Una vez instalado, lo primero que tenemos que hacer es tener una carpetita dedicada al bittorrent. En mi caso es /media/Almacen/Bittorrent, y dentro de ella tengo dos carpetas más, torrents e incompletos. En la carpeta principal tendré los archivos descargados, en la carpeta torrents, los archivos .torrent, y en incompletos, los archivos temporales mientras se descarguen. Esto es muy útil ya que podemos saber cuando se terminan de bajar los archivos o no :)

Si ya tenemos preparada la estructura en nuestro disco duro para empezar a bajar, nos vamos a crear un archivo de configuración, llamado ~/.rtorrent.rc

Así que para ello usa tu editor de textos habitual, nano, vi, emacs, kedit, gedit… y ábrelo:

$ gedit ~/.rtorrent.rc &

Yo he añadido las siguientes lineas de configuración:

Para guardar mis archivos que se están bajando en la carpeta especificada:
directory = /media/Almacen/Bittorrent/incompletos

El rango de puertos que usará el torrent. Asegurarse de abrirlos en el router/firewall
port_range = 8000-8010

Cuando se completen los archivos, moverlos a la carpeta principal:
on_finished = move_complete,"execute=mv,-u,$d.get_base_path=,/media/Almacen/Bittorrent/ ;d.set_directory=/media/Almacen/Bittorrent/"

Limito la bajada desde las 10 de la mañana hasta la 1 de la noche a 30kb/s, pero le quito los límites por la noche:
schedule = throttle_1,01:00:00,24:00:00,download_rate=0
schedule = throttle_2,10:00:00,24:00:00,download_rate=30

Comprueba el directorio por nuevos archivos .torrent, reinicia los nuevos torrents copiados y para aquellos que hayan sido borrados:
schedule = watch_directory,10,10,load_start=~/media/Almacen/Bittorrent/torrents/*.torrent
schedule = tied_directory,10,10,start_tied=
schedule = untied_directory,10,10,close_untied=

Cuando haya menos de 100Mb de disco duro, para de descargar archivos
schedule = low_diskspace,5,60,close_low_diskspace=100M

Por cierto, teneis un archivo de configuración de ejemplo en /usr/share/doc/rtorrent/examples/rtorrent.rc con lo que podeis abrirlo, toquetearlo a vuestro gusto, y luego guardarlo en ~/.rtorrent.rc para que se cargue por defecto.

Además, el rtorrent ya acepta almacenamiento en sistema de ficheros NTFS (lo que hizo que un tiempo usase el Azureus… – ya no mas!)

Cambiando de tema, una pregunta que muchos se harán es… “Como el rtorrent es una aplicación de consola, ¿necesito tener una consola abierta y dedicada al rtorrent?” — No! Con screen, es posible dejar cualquier aplicación de consola en segundo plano ;)

Arrancar rtorrent:
$ screen rtorrent

Dentro del rtorrent, para dejarlo en segundo plano:
[Control + A] [Control + D]

Para retomar el rtorrent, desde una consola:
$ screen -r

De todas maneras, hay más detalles en las páginas de manual de screen ;)

nautilus-gnomeHoy al intentar descargar una película me he dado cuenta de que me estaba quedando sin espacio en mi partición /home, pero me parecía extraño ya que yo nunca la uso para guardar nada que ocupe espacio.

Use el Analizador del uso de disco (el comando baobab, que me parece simplemente genial y terriblemente útil), y vi que tenia 2 gb usados por el directorio ~/.thumbnails

El directorio ~/.thumbnails lo gestiona el navegador de archivos nautilus para guardar las previsualizaciones de las imágenes de nuestro disco duro… y por lo visto yo tengo muchas imágenes (y las he usado mucho estos días ya que he estado subiendo muchas fotos a flickr y por tanto se han generado literalmente miles de archivos nuevos).

Para limpiar un poco el espacio, he eliminado las thumbnails de aquellos archivos que no se hayan accedido durante los últimos 7 días, simplemente ejecutando el siguiente comando:

find ~/.thumbnails -type f -atime +7 -exec rm {} \;

Quizás una buena idea sería meter este comando en el crontab para que se ejecute una vez por semana a una hora que no se use el ordenador por ejemplo ;)

ScummVMSi alguna vez os han entrado sentimientos nostálgicos y ganas de volver a jugar a las aventuras gráficas de la época dorada de los videojuegos, y en especial a las de LucasArts desarrolladas con el sistema SCUMM (Script Creation Utility for Maniac Mansion), podemos hacerlo con la máquina virtual de SCUMM,un emulador libre programado para ejecutar los juegos creados con este sistema.

Nos la podemos descargar desde su página de descargas eligiendo la plataforma que tengamos (funciona para Windows, Linux, Mac, PSP, Nintendo DS, iPhone, GP32, Symbian, Palm…) o bien, si estamos en un Linux con apt, escribiendo:
sudo apt-get install scummvm

Luego simplemente tenemos que conseguir los archivos de los juegos y cargarlos en el scummvm, para echarlos a andar.

En la imagen tengo corriendo el maravilloso Indiana Jones y las llaves de Atlantis, que en su momento compré original y me terminé varias veces (incluyendo los 3 caminos posibles a seguir en la historia).

¿Cómo ejecutar los juegos?

RTFM! (Read The Fucking Manual!)

Bueno, de todas maneras os incluyo unas pequeñas notas como ayuda rápida ^_^

Existe un fichero llamado ~/.scummvm donde tienes la configuración en este formato:


[scummvm]
music_volume=192
midi_gain=100
speech_volume=192
browser_lastpath=/media/Almacen/scumm/monkey2/
aspect_ratio=false
music_driver=auto
lastselectedgame=atlantis
native_mt32=false
subtitles=true
fullscreen=false
sfx_volume=192
talkspeed=60
speech_mute=false
enable_gs=false
multi_midi=false
versioninfo=0.9.1
savepath=/home/danikaze/.scummvm

[atlantis]
description=Indiana Jones and the Fate of Atlantis
path=/media/Almacen/scumm/Indiana Jones and the fate of atlantis/
platform=linux
gameid=atlantis
language=es

donde cada linea es bastante fácil de comprender, y además todo esto se puede editar graficamente desde la GUI de la máquina virtual.

Otras cosas interesantes que incluye ScummVM y que no he visto en la GUI es el parámetro -g al ejecutarlo en linea de comandos, que permite seleccionar filtros para la salida de video, como por ejemplo interpolación para eliminar los píxeles marcados.

Ejemplo de la pantalla inicial del Indy4 sin antialias con escalado a doble tamaño, escalado a doble tamaño con 2xsai, y con escalado a doble tamaño con 2xsupersai (click para agrandar):

Indiana Jones and the Fate of Atlantis @ scummvm, pantallazo-indiana-jones-and-the-fate-of-atlantis-2xsai.png, pantallazo-indiana-jones-and-the-fate-of-atlantis-super2xsai.png

Como podéis ver, esto mejora un poco la imagen, aunque yo soy bastante retro y me encanta el pixel art, así que prefiero dejarlo a 2x sin filtro ninguno :)

Desde siempre me ha gustado muchísimo el estilo de dibujo pixel art, del que seguramente hablaré más adelante más veces ^_^. Ayer comencé a hacer un personajillo, y para enseñarlo, pues se me ocurrió hacerle una pequeña animación de un simple parpadeo.

Para hacer la animación pensé en el formato GIF, que se puede crear con el GIMP fácilmente, aunque para los no iniciados puede ser difícil de encontrar cómo hacerlo.

Paso 1: Creando los fotogramas

Lo primero de todo es hacer los dibujos que se usarán en los frames de la animación. Aquí vemos los míos

GIF-capa1 GIF-capa2

Paso 2: Optimizando la imagen

Una vez tenemos todas las capas, hacemos que el GIMP nos optimice la imagen, en cuestión de tamaño y demás, con lo siguiente:

Filtro -> Animación -> Optimizar (para GIF)

Esto nos crea un nuevo documento, habiendo recortado lo necesario de cada capa, para que ocupe lo mínimo, y además las pone en modo composición (esto es, que por ejemplo, en esos fotogramas solo varían los ojos, pues el 1er fotograma está tal cual, pero el 2º solo tiene los ojos, y lo demás es transparente, y a la hora de redibujar, en vez de dibujar todo el frame, se dibuja sólo lo necesario ^_^)

Además, hace una indexación de colores con los mínimos necesarios.

Paso 3: Definiendo la duración de cada fotograma

GIF-capasSi nos fijamos, el documento creado por el paso 2, ha modificado los nombres de las capas, añadiendo (100ms) a las capas y (composed) a algunas. Esto es porque el GIMP pone por defecto una duración de 1/10 de segundo para cada frame, y el composed es para lo que hemos explicado en el paso 2.

Pues, aunque pueda parecer un parche cutre ( xD ), la duración de cada fotograma, se pone en el nombre de la capa con ese formato. Yo en este ejemplo le he puesto 2 segundos a la de los ojos abiertos, y 100 ms para los ojos cerrados, de manera que mi bicho parpadeará cada 2 segundos, durante 100 ms.

Paso 4: Guardando la imagen

Ya solo nos queda darle a Archivo -> Guardar como… y escribir el nombre del archivo con extensión .gif

Cuando nos pregunte como debe manejar las capas, marcamos Guardar como animación, de manera que cada capa sea un frame.

Paso 5: Disfrutando del resultado ^_^

Ya podemos ver el resultado:

Animación GIF creada con el GIMP

Se me ha antojado así por las buenas, volver a jugar al maravilloso Metal Slug mientras sale o no para la Nintendo DS…

gngeo logo

Así que manos a la obra…

Empezamos bajando el emulador gngeo de aquí. Lo descomprimimos e instalamos:

./configure
make
sudo make install

Ya lo tenemos instalado y podemos ejecutar las roms con el comando gngeo nombre_rom. Pero también podemos instalar una interfaz gráfica.Lo mismo, bajamos desde aquí, y la descomprimimos.

XgnGeo

Esta vez, ejecutamos un script de python, que nos lo configurará todo solito ^_^:
sudo python setup.py install

Ya tenemos la interfaz instalada, pero tenemos que configurar donde están las BIOS y el archivo de drivers. Simplemente bájalos de emulatronia y arrancad el xgngeo, donde os saldrá una ventana en la que podeis introducir el directorio donde teneis las BIOS y las Roms.

[Descargar BIOS] [Descargar archivo de drivers]

Configuración del xgngeo

A jugar!

Bueno, el otro día comenté sobre como separar archivos .vob (de formato DvD) en capítulos sueltos para editar los videos más comodamente.

La verdad es que me sirvió bastante bien para editar con el Pinnacle 9. ¿Qué es lo que pasó? Que el Pinnacle Studio 9 fallaba más que una escopeta de caña, ya que se colgaba cada dos por tres haciéndome repetir trabajo. Además, una vez conseguí terminar el video, no me dejaba exportarlo a avi, mpg o mp4 ya que petaba en el proceso.

Ojo, no digo que el Pinnacle Studio 9 sea una mierda, ya que la interfaz es super sencilla y cómoda, y además, después de parchearlo a la versión 9.3.4 funcionaba sin problema ninguno. Pero por todos es conocido que el Premiere es más potente que el Studio, y quiero probarlo.

Total, que después de que me “prestasen” el Adobe Premiere CS3 y lo echase a andar, me topé con el primer problema (problema que por cierto también me encontré en el Pinnacle Studio 10, y que debería de ver si esta solución para el Premiere sirve también para este otro programa).

El problema es que, al importar los archivos .mpg que creé de la manera que describí en el otro post, tenía archivos .mpg sin sonido, y claro, como que no tiene gracia…

El problema estaba en la importación del formato de archivo, ya que el Adobe Premiere funciona bien y por otro lado, el video se veía y se escuchaba en el mplayer. ¿Cómo solucionarlo? Pues exportándolo de otra manera distinta. Es fácil, la verdad, simplemente hay que indicarle al mencoder, que al exportar el capítulo, el audio lo pase por libavcodec y codifique en mp2. Es decir, que lo que vimos el otro día quedaría así:

mencoder dvd:// -dvd-device <carpeta_donde_tengas_el_DvD> -of mpeg -oac lavc -ovc copy -lavcopts acodec=mp2 -o <archivo_de_salida.mpg> -chapter inicio-fin

Y ya está. Es un post un poco corto, así que podemos expandirlo con otro tema que me preocupaba un poco la verdad…

Teniendo en cuenta que tengo unos 27 ó 28 días grabados de video, que cada día hay entre 1 y 4 discos, y que cada disco tiene entre 15 y 40 capítulos (la cámara crea un capítulo cada vez que se pulsa el botón record – útil la verdad xD), pues puede haber miles de capítulos, por lo que habrá que escribir ese comando unos cuantos cientos de veces y estar pendiente del ordenador de una manera innecesaria.

Así que me dije… ¿por qué no hacer un script en bash para que lo haga solito casi todo?

Manos a la obra: Hagamos un script que tome tres argumentos: la carpeta origen, la carpeta destino y el número del capítulo por el que vamos. Así por ejemplo llamaríamos al siguiente script:

carpeta_donde_se_guarda/separar_capitulos 2006-08-10/1 2006-08-10 1

Esto cogería el DvD de la carpeta ruta_origen/2006-08-10/1 ruta_destino/2006-08-10 y guardaría los capítulos de ese DvD numerados a partir del archivo 1.mpg

Empecemos con el código:

La primera línea debería de ser algo tal que así, para que sepa con que interpretar el script:
#!/bin/bash

Comprobamos que se hayan introducido tres parámetros (destino, origen, offset):
if [ $# -ne 3 ]; then
echo "Uso: $0 carpeta_origen carpeta_destino archivo.mpg"
echo "Ej: $0 2006-08-10/4 2006-08-10 69"
exit 1
fi

Cogemos el número de capítulos que tiene ese DvD (para despues hacer un bucle). Queda un poco guarrillo porque se ve algo de la salida del mplayer, pero como es un script que solo voy a usar para esto, es simplemente para ahorrarme comandos, y funciona :)

Para ello llamamos al mplayer, diciéndole que ejecute el capítulo 1000 del DvD que especificamos. Esto dará un error porque el DvD no tiene capítulo 1000, pero entre su salida, nos dará también el número de capítulos que tiene en total ese DvD. Esa salida la cogeremos y nos quedaremos (con grep) solo con la linea en la que aparece la palabra “chapters”, y de esa linea, con la tercera palabra (con cut), que es el número que nos interesa:

NCHAP=`mplayer dvd:// -dvd-device <carpeta_origen>/"$1" -chapter 100-100 | grep chapters | cut -d" " -f3`

Para coger la salida del comando anterior, recordad que a NCHAP se le asigna la salida de la ejecución del comando que está entre las comillas simples antiguas (en un teclado español, la que está en la tecla del [ o del ^, a la derecha de la P).

Para terminar, una vez tenemos el número de capítulos que hay, los vamos procesando uno a uno, copiando su video y pasando su audio a mp2:

Asignamos dos variables, el capítulo de entrada, que empezará por el primer capítulo del DvD, y el capítulo de salida, que empezará por el offset que hemos especificado en el tercer parámetro al llamar a nuestro script:

CAP_IN=1
CAP_OUT=$3

Para cada capítulo del DvD, vemos si existe. Si existe nos lo saltamos para no sobreescribir el archivo de salida. Además, lo notificamos para luego ver que era lo que había...

while (($CAP_IN <= $NCHAP)); do
if [ -e "<carpeta_destino>/$2/$CAP_OUT.mpg" ]; then
echo $CAP_OUT existe! saltandoselo…

Si no existía, lo procesamos, indicando que es lo que estamos haciendo:

else
echo "<carpeta_origen>/$1[$CAP_IN] => <carpeta_destino>/$2/$CAP_OUT.mpg"
`mencoder -msglevel all=-1 dvd:// -of mpeg -oac lavc -ovc copy -lavcopts acodec=mp2 -dvd-device <carpeta_origen>/"$1" -o <carpeta_destino>/"$2"/"$CAP_OUT".mpg -chapter "$CAP_IN"-"$CAP_IN"`
fi

Y aumentamos las variables del bucle, para no liarla ^^'

((CAP_IN++))
((CAP_OUT++))
done

Y con esto acaba nuestro script. Si queremos luego podemos hacer que si no existe /$2 se cree automaticamente, o cualquier otra cosilla que veais, pero bueno, a mi esto me quita todo el trabajo gordo, por lo que estoy satisfecho con el script ^_^

Además, si no queremos estar escribiendo la ruta completa del script cada vez, podemos hacer lo siguiente:

crear una carpeta ~/bin donde guardaremos nuestros scripts:
mkdir ~/bin

añadir esa carpeta al path, modificando el archivo ~/.bash_rc, añadiendo la siguiente linea:
PATH=export $PATH:~/bin

Así por ejemplo para procesar un día con cuatro DvDs, solo habría que escribir 4 comandos:

separar_capitulos 2006-08-10/1 2006-08-10 1
separar_capitulos 2006-08-10/2 2006-08-10 21
separar_capitulos 2006-08-10/3 2006-08-10 38
separar_capitulos 2006-08-10/4 2006-08-10 61

Con esos cuatro comandos suponemos que el primer DvD tenía 20 capítulos (archivos 1.mpg - 20.mpg), el 2º Dvd generaría los capítulos del 21 al 37, el 3º del 38 al 60, y el 4º del 61 en adelante... y nos hemos ahorrado unos 80 comandos aproximadamente :) (y el tiempo que hay que estar pendiente para ir poniéndolos uno detrás de otro claro está).

Todo esto se podía haber hecho en Windows también, ya que tiene su propio lenguaje de shell script (distinto), pero me parecía bastante más interesante hacerlo en Linux, ya que en Windows poca gente usa la consola, y aprender a hacerlo en Linux es mucho más pedagógico :P (además de que es el sistema operativo que normalmente uso).

Ahora ya bien, depende de lo que se necesite, pues se puede usar el Studio de Pinnacle o el Premiere de Adobe, pero tendremos nuestro DvD separado por capítulos en archivos mpeg para una edición cómoda y que sirvan para ambos programas ^_^

Para variar estos días, sigo con insomnio… así que voy a aprovechar para poner un post. Realmente iba a postear unas fotillos sobre Málaga, pero como no las tengo aquí, pues aprovecho y pongo otra cosa que hice esta tarde.

Resulta que gracias a una reciente compra de un disco duro nuevo de 400 GB me decidí a volcar todos los videos que grabé de mi pasado viaje a Japón, en formato DvD (así los grababa la cámara de video que llevaba) al disco duro, para su posterior edición (si es que tengo tiempo claro xD).

Pues da la casualidad de que el Pinnacle Studio 9 no lee archivos .vob del formato DvD. ¿Cómo solucionarlo? Pues sabiendo que el formato DvD realmente es mpeg, bastaría con renombrar el .vob a .mpg ¿no? En parte sí, pero el Studio 9 sigue sin leer bien el archivo de video, ya que sólo ve el primer capítulo del archivo (cada archivo es de 1 GB de tamaño, y cada vez que comienzas a grabar se crea un capítulo nuevo). Es decir, que no me sirve.

¿Soluciones? Varias. Después de probar de todas las maneras posibles el que cargase el .vob y darme por vencido, probé el Virtual Dub Mod (el Mod carga mpeg2) y transformarlo a .avi. Esto funcionaba bien, solo que no es capaz de decodificar el audio del Dvd ¬¬u… así que tampoco me servía bien.

Al final, la mejor solución es la más conocida ^_^. Usar el mágico programa y más famoso reproductor de videos de linux: el mplayer y su compañero mencoder. Digamos que tenemos los archivos con su jerarquía DvD (esto es, su carpeta TS_VIDEO y tal…) en una carpeta de nuestro disco duro (que fue como yo me fui copiando los DvDs a medida que grababa en Japón), y queremos extraer todos los capítulos en archivos sueltos para su edición. Pues fácil, basta con usar el siguiente comando:

mencoder -dvd-device <carpeta_donde_tenemos_volcado_el_dvd> dvd:// -of mpeg -oac mp3lame -ovc copy -o <archivo_de_salida> -chapter <inicio>-<fin>

Así, si queremos extraer solo un capítulo por archivo, el parametro <inicio> y <fin> para la opcion -chapter debe ser el mismo. P.e: -chapter 1-1 para el primer capítulo.

De esta manera tenemos listos todos nuestros capitulitos en archivos pequeñitos y manejables para su posterior edición cual Spielberg casero en el Studio 9 (lease el programa que más te guste, ya que puedes sacarlos en el formato que otro programa necesite, en mi caso mpg).

Realmente no soy un gran entendido sobre edición de video (es más, es la primera edición así que voy a hacer, sin contar compresiones y demás… xD)

Y otra cosa a tener en cuenta es que, aunque haya metido este post dentro de la sección Linux, por ser un truquito del mplayer, realmente todo esto lo hice desde Windows, donde también está el mplayer, y es donde lo voy a usar, ya que ahí es donde tengo instalado el Pinnacle ^^’.