Toma de fotos – timelapse automática y copia en Google Drive (desde PC)

Pretendo que se tomen fotos automáticamente mediante la webcam, de manera programada, y se guarden tanto en el ordenador como en una cuenta de Google Drive.

1. Instalar Grive (cliente de Google Drive)

Google no proporciona un cliente para Linux que sincronice carpetas del ordenador con las carpetas alojadas en Google Drive. Grive es un programa que se ejecuta desde la consola y que permite realizar esta tarea. En el caso de necesitar interface y otras opciones, también se puede instalar posteriormente Grive Tools: no es necesario en esta ocasión.

Desde la consola, instalamos previamente varios paquetes:

sudo apt-get install git cmake build-essential libgcrypt11-dev libjson0-dev libcurl4-openssl-dev libexpat1-dev libboost-filesystem-dev libboost-program-options-dev binutils-dev libboost-test-dev libqt4-dev libyajl-dev

Después descargamos el programa Grive:

git clone git://github.com/Grive/grive.git

Ahora accedemos a la carpeta descargada y compilamos:

cd ./grive

cmake .

make

El siguiente paso es crear en nuestra carpeta de usuario una nueva carpeta, que será la que se sincronice con Google Drive. En el caso aquí expuesto esta carpeta se llama “googledrive”.

Ahora pegaremos el archivo que ejecuta Grive en esta nueva carpeta creada. El archivo se llama “grive”, y se encuentra en la carpeta “grive” (la que hemos descargado), y en una subcarpeta también llamada “grive”.

Nos situamos desde la consola en la carpeta que sincronizamos con Google Drive en la que acabamos de pegar el archivo, y lo ejecutamos de la siguiente manera:

grive -a

El parámetro “-a” sólo es necesario incluirlo en la primera ejecución, pues nos va a enlazar el programa con nuestra cuenta de Google. De este modo, al ejecutar el comando se nos muestra un enlace a seguir desde el que autorizaremos a Grive para usar nuestra cuenta. Para ello, desde el enlace se nos proporciona un código que debemos escribir en la consola. (Puede que no permita hacer copiar/pegar, pero si consultáis el código fuente de la página también aparecerá incluido y sí podréis copiarlo desde ahí).

Si todo funciona correctamente empezará a sincronizar la cuenta de Google Drive con nuestra carpeta. Para el uso que aquí se le va a dar, se ha creado una cuenta ad hoc evitando descargar al equipo archivos alojados en mi cuenta personal.

2. Instalar xawtv (para tomar fotos desde la consola)

Este paquete lo encontraremos en los repositorios:

sudo apt-get install xawtv

Una vez instalado, podremos ejecutar v4lctl, programa que toma las fotos. Previamente tenemos que conocer la ruta hacia nuestra webcam. Para ello tenemos diferentes opciones, siendo una posibilidad introducir en la consola:

ls /dev/video*

En mi caso la consola me devuelve la ruta /dev/video2 (al reiniciar más adelante pasó a la ruta /dev/video0, más lógica, lo que me obligó a modificar esta indicación). Conociendo este dato hacemos una primera prueba de v4lctl:

v4lctl -c /dev/video2 snap jpeg 640×400 ~/googledrive/cam/image.jpg

En esta sintaxis utilizada vemos como indicamos la resolución deseada (640×400), la carpeta en la que guardar la foto (~/googledrive/cam/image.jpg) y el nombre del archivo (image.jpg). Pero de esta manera, cada vez que se tomase una foto, el archivo image.jpg se modificaría por la última foto tomada. Quiero que se genere un archivo diferente por cada foto tomada, sin que se sobrescriban. Por ello voy a indicar en el nombre de archivo que incluya fecha, hora y minuto en que se toma la imagen:

v4lctl -c /dev/video2 snap jpeg 640×400 ~/googledrive/cam/cam1_$(date +%d.%m.%y. – %H:%M).jpg

Si repetimos este comando varias veces, deberían acumularse las diferentes fotografías tomadas en la carpeta que hemos creado.

3. Crear script para subir a Google Drive cada foto realizada.

En este paso creamos un script muy simple, en el que primero indicamos a v4lctl que debe tomar una foto para después ejecutar Grive, subiéndola este último a Google Drive.

Con este fin, dentro de la carpeta que sincronizamos y que en este ejemplo se ha llamado “googledrive”, creamos un archivo de texto. En este caso el archivo se llama “camdrive” y tiene el siguiente contenido:

#! /bin/bash

v4lctl -c /dev/video2 snap jpeg 640×400 ~/googledrive/cam/cam1_$(date +%d.%m.%y. – %H:%M).jpg

./grive

Si contamos con más de una webcam, podemos repetir el comando v4lctl modificando la ruta hacia cada una de las cámaras disponibles (/dev/video0, /dev/video1…).

El script necesita permisos de ejecución. Para ello abrimos una consola en la carpeta en la que se encuentra ubicado y escribimos:

sudo chmod +x camdrive

Para comprobar si funciona, simplemente lo ejecutamos:

./camdrive

A partir de este momento podemos comprobar en nuestro Google Drive como se van subiendo las fotografías. Además, la página de Google Drive se actualiza automáticamente cada vez que se incluye algún archivo nuevo. Se recomienda la visualización de miniaturas.

4. Programar la ejecución del script.

Para ello utilizamos cron y crontab. Cron se ejecuta por defecto, en segundo plano, cada vez que iniciamos el sistema. Podemos modificar el crontab para introducir tareas que queremos se realicen. Para ello, desde la consola ejecutamos:

crontab -e

El mismo archivo incluye al inicio una explicación de su uso, mostrando que se puede indicar la ejecución de una tarea en fecha o fechas concretas, y también en las franjas de tiempo que queramos. Incluso permite ejecutar una tarea cada vez que se inicia el sistema.

En esta ocasión, voy a indicar a crontab que ejecute el script que hemos creado cada 10 minutos. Incluyo la línea:

*/10 * * * * /home/pi/googledrive/camdrive

En esta sintaxis indicamos con números los minutos, horas, día del mes, mes y día de la semana. Por ello sólo indico los minutos (cada 10 minutos), y dejo con asterisco el resto de indicaciones. Delante del número indico con una barra (/) para que no se interprete que es en el minuto 10, sino cada 10 minutos. Otra manera de indicarlo podría ser @daily (para cada día), @hourly (para cada hora…), @reboot (al iniciar el sistema)… En todo caso, puede ser necesario no indicar la extensión (.sh) detrás del nombre del script para que funcione correctamente.

Muy posiblemente este archivo que modificamos se haya abierto con el editor Nano. Para guardar los cambios realizados presionamos Ctrl+O, y Enter para sobrescribir. Con Ctrl+X salimos de Nano.

Reiniciamos cron:

sudo service cron restart

Alternativas

Teniendo en cuenta que el script propuesto es muy sencillo, y tan sólo recoge un par de comandos, también podemos obviar la creación del script e incluir directamente la ejecución de estas tareas en el crontab. La primera de ellas podría programarse cada X minutos, y la segunda con un tiempo de X+1. Por algún motivo que no identifico, esta opción no me funciona.

He tenido también algún problema para ejecutar Grive desde el crontab, solucionado al incluir el comando de la siguiente manera: cd /home/pi/googledrive/cam && grive (en vez de indicar juntos la ruta y el comando).

Fuentes: Raspberry Web ServerTips de Linux.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s