Recuperando libertad y diversión con Raspberry Pi (II)

Pues seguimos cacharreando con el pequeño -pero matón- Pi. Las grabaciones DVBT ya van viento en popa a toda vela, después de haber superado no pocas dificultades y haber aprendido mucho por el camino. ¿No era ese el objetivo de RPi? Pues al menos en lo que a mi respecta lo ha conseguido.

Enlace a la primera parte: Recuperando libertad y diversión con Raspberry Pi

Quizá lo que viene a continuación debería haberlo escrito en la primera entrada pero de todas formas ahí va. Cuando haces uso del cable HDMI el sonido que se produce en el Pi va directamente por ahí en lugar de por la salida jack. Si para vosotros esa opción está bien no hay nada que tocar, pero para forzar que el sonido vaya por el jack:

sudo amixer cset numid=1

Montando el almacenamiento

Volviendo al tema, lo primero que quería conseguir era que se montara automáticamente y en un punto de montaje fijo un pendrive de 16Gb que tengo, que es donde quiero almacenar las grabaciones. Es relativamente fácil hacerlo con un pendrive formateado FAT32 pero yo quería hacerlo con formato ext4 para superar la limitación de los 4Gb de tamaño máximo de archivo.

Cuando los dispositivos de almacenamiento en Unix/Linux no se conectaban en caliente como pasa con los USB las cosas eran más sencillas. Cuando los pendrives y discos externos se empezaron a generalizar creo que los desarrolladores del núcleo no lo pasaron demasiado bien y el resultado es un poco confuso. Hoy en día enchufas un pendrive y -asumiendo que estás trabajando con escritorio gráfico- siempre se monta y funciona bien. Pero para tener más control sobre el proceso y sobre todo si no estás en un entorno gráfico, la cosa se pone un poco “tricky” como dicen los angloparlantes.

Para que el núcleo linux monte un pendrive en el que el usuario pueda escribir, el usuario en cuestión deber ser propietario tanto del dispositivo (/dev/sd*) como del punto de montaje. Para que ésto quede perfecto habría que asegurarse de que el pendrive siempre se monta con el mismo nombre de dispositivo bajo /dev pero por ahora asumiré que linux lo detecta y le asigna /dev/sda1. Sabiendo eso vamos y hacemos:

sudo chown pi:pi -Rf /dev/sda1

Ahora hay que averiguar el UUID del dispositivo para poder configurar correctamente el archivo /etc/fstab. Haremos lo siguiente:

ls -al /dev/disk/by-uuid

En este directorio hay enlaces simbólicos hacia los dispositivos reales, organizados por UUID. Tenemos que encontrar el que apunte a nuestro dispositivo. El truco está en saber que tu pendrive ha sido montado en /dev/sda1. Para ello ayuda no tener ningún otro conectado. Entonces como resultado del último comando deberíamos ver:


[…] 72d5a2de-ae0a-485b-8383-cfb128703a1e -> ../../sda1

Esa ristra larga que empiezar por 7 es el UUID. La ventaja es que siempre es el mismo y no se repite en el mismo sistema. Linux podrá montar el pendrive en sda1, sdb1, sdc1, etc -donde pueda en cada momento- pero sabemos seguro que siempre habrá un enlace simbólico en el directorio /dev/disk/by-uuid con el mismo UUID apuntando hacia el dispositivo real donde haya sido “enganchado” el pendrive. Nos quedamos con el número y editamos el archivo que controla los sistemas de ficheros:

sudo joe /etc/fstab

El editor joe es mi favorito pero aquí podeis escribir: pico, nano, vi o lo que quiera que useis. La línea que hay que añadir es la siguiente:

UUID=72d5a2de-ae0a-485b-8383-cfb128703a1e /home/pi/pendrive ext4 defaults,noatime,user 0 0

Este archivo está formado por registros (líneas) con campos separados por espacios o tabuladores. El primero indica cual es el sistema de ficheros y en este caso lo identificamos mediante el UUID que obtuvimos anteriormente. Después le asignamos un punto de montaje, así cada vez que lo montemos sabemos que estará ahí. En este caso /home/pi/pendrive (lo creamos luego). Después viene el tipo de sistema de ficheros (ext4). Luego hay un campo formado por opciones separadas por comas. La más importante de ahí es user que permite al usuario montar el sistema de archivos. Para saber más: man fstab.

Ahora creamos el punto de montaje y cambiamos el propietario y el grupo:

cd ~
mkdir pendrive
mount pendrive
sudo chown pi:pi -Rf pendrive

Ahora que lo hemos montado y hemos cambiado los permisos del punto de montaje (de forma recursiva) cada vez que se desmonte y se vuelva a montar ya siempre tendrá los permisos bien asignados y el usuario tendrá permisos totales dentro del dispositivo de almacenamiento. Además se montará automáticamente cada vez que se inicie el RasPi y el pendrive esté conectado.

¡Grabando!

Como decía en la primera entrada los programas GNUtv [1] y cat (o dd) son suficientes para registrar una emisión de DVB-T. El programa gnutv necesitará un archivo válido de canales para poder sintonizar. Luego habrá que crear un proceso sintonizando el canal y otro proceso pasando lo que está generando gnutv a un archivo en disco. Me fascina la facilidad con la que trata linux el tema de grabar. He tenido larga experiencia grabando la TDT, incluido con equipos Windows. Normalmente el programa que te venía con cualquier sintonizadora USB para windows siempre hacía algo sobre el stream que viene de tu antena, con los siguientes problemas:

  • Requiere una máquina más potente -sobre todo con más RAM- para grabar.
  • El resultado es de peor calidad. La calidad con que emite un buen canal de DVB-T es similar a DVD y eso se pierde.
  • Se pierden los subtítulos y la pista de audio original.

Para un fan total de la pista de audio original y de los subtítulos como yo, el tercer punto era esencial e innegociable. Los programas que el fabricante de cada tarjeta mete en el paquete de venta siempre hacían algo raro. Se contentaban con guardar una versión muy comprimida y amputada. Y yo pensaba ¡si hoy tenemos almacenamiento barato! ¿qué importa que una películao ocupa 5Gb? Y así terminé pasando al gran programa Me-TV y posteriormente a grabar con el pequeño Pi mediante scripts.

Volviendo al tema, lo primero que tenemos que hacer es tener una sintonizadora USB sencilla. Todo el proceso de hacerla funcionar y escanear la lista de canales lo describí en Grabar TDT (DVB) con subtítulos para sordos. Y todas las averiguaciones para grabar con el Pi están en el primer artículo de la serie [1] así que no lo repetiré aquí.

Todo lo que he ido aprendiendo sobre grabación lo he ido plasmando en un proyecto [2] basado en un script Ruby que acepta varios parámetros y se encarga él solito de hacer la grabación. Un ejemplo para grabar La 1 durante 1 hora y 20 minutos empezando dentro de 5 minutos sería:

./recordtv.rb -c “La 1” -d 1h20m -s 05m

Ejecutando recordtv.rb sin parámetros podeis obtener ayuda sobre los parámetros y cuales son opcionales y cuales obligatorios. Realmente los únicos obligatorios son el canal y la duración de la grabación. Si no se indica retraso hasta el inicio, empezará la grabación de inmediato. Además, se generará un log de la grabación en el mismo directorio.

El hecho de que haya un solo script tiene la ventaja de que podemos ponerlo en el cron. Así podemos grabar el programa que nos interese. Una de mis viejas aspiraciones con el HTPC de salón era poder tener la oportunidad de hacer grabaciones desatendidas y periódicas (por ejemplo grabar todos los jueves a las 22.30 tal serie). Pero lo que no quería era dejar un ordenador “normal” siempre encencido solo para esperar a hacer esa grabación. Y ahora sí que puedo, porque el “ridículo” consumo del RPi hace que puede tenerlo siempre encendido y disponible. Y como siempre la línea de comandos y GNU nos trae todo lo que necesitamos.

Aquí dejo unos ejemplo que están en mi cron y unas cuantas características especiales que necesita. Lo que tenemos que hacer es escribir:

crontab -e

Y entraremos en modo de edición del cron para nuestro usuario. Si es la primera vez que lo hacemos nos pedirá qué editor queremos usar. En mi caso uso joe pero nano es igualmente fácil de usar. Así que antes de empezar a editar el cron recomiendo que nos familiaricemos con las peculiaridades de algún editor en línea de comandos: joe, vim, nano, pico, etc. Sabiendo esto, este es el aspecto de mi cron:

PATH=/home/pi/workspace/dvbpi:/usr/bin:/bin

30 22 28 3 * recordtv.rb -o “bala_oscuridad” -c “nova” -d 2h30m

#Mundo Hacker todos los jueves
20 00 * * 5 recordtv.rb -o “mundo_hacker” -c “discoverymax” -d 1h20m

La primera línea (PATH…) establece unas rutas por defecto para que se consigan encontrar los comandos necesarios como gnutv.

La segunda línea hacía una grabación a las 22:30 (el primer campo son los minutos, el segundo la hora) de la película “Una bala en la oscuridad” en el canal Nova el 28 del 3, con una duración de dos horas y media.

La tercera es una grabación periódica. Graba todos los días 5 de la semana (viernes) a las 00:20 el programa “Mundo Hacker” en DiscoveryMax, con una duración de 1 hora y 20 minutos. Como veis, la principal diferencia entre la primera y la segunda grabación es que en la segunda no está establecida la fecha del mes, así que cada quinto día de la semana grabará. En la primera está especificado el 28 del 3 (marzo) y como cron no admite años, se supone que todos los 28 de marzo de aquí hasta el fin de los tiempos se grabará según esa línea. Para más información sobre este fichero:

man 5 crontab

¡A ver si vais a querer que os lo cuente todo! 😉

Por último, los pasos para que os podais descargar el script de ruby para grabar:

sudo apt-get install git
git clone https://github.com/ddianes/dvbpi.git

Se creará un directorio dvbpi con el código. Evidentemente hay cosas que modificar. Dentro de etc hay un fichero con un par de líneas de configuración. La primera corresponde al directorio por defecto donde irán las grabaciones. Debería haber puesto más líneas útiles en este fichero pero todavía no he tenido tiempo. Otro aspecto a tener en cuenta es que posiblemente no os sirva el fichero de canales, porque depende de cada provincia. Así que hay que proporcionarle uno nuevo, pero que se llame igual. Otra cosa que hice es que cambié los nombres de todos los canales (primer campo de cada línea del fichero) quitando mayúsculas, espacios y todo lo que no fueran letras o números. Así es más fácil de usar desde cron.

¡Compartiendo!

Una vez que empiezas a grabar contenido o a bajarte cosas con un gestor de descargas torrent, se plantea el problema de compartirlas por la red o tener que desconectar el almacenamiento del RasPi para conectarlo en otro ordenador. La segunda opción siempre es posible pero hay que acordarse de conectarse por ssh, desmontarlo y extraerlo con seguridad. Se convierte en un proceso engorroso. Para la primera opción lo que se nos viene a la cabeza es Samba. Eso está bien si quieres simplemente copiarte los ficheros a otro ordenador. Hice pruebas abriendo el arhivo compartido en Samba directamente con el VLC y no dieron buen resultado.

Hay una opción mucho más interesante. Se puede hacer disponible el contenido mediante un servidor DLNA/UPNP. Este protocolo hace que el cliente (un PC, un dispositivo Android, una SmartTV, …) autodescubra los servidores en la red local y se puede acceder al contenido y reproducirse sin sobresaltos.

Pero eso amigos, junto con la instalación y configuración de un cliente torrent, quedará para la siguiente entrada de la serie de cacharreo con el RPi.

Referencias:

  1. Recuperando libertad y diversión con Raspberry Pi
  2. Proyecto dvbpi en github

Responder

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *