Hoy Fer nos cuenta cómo grabar programas de radio en mp3 con linux, una genial idea para grabar esos programas que no siempre podemos escuchar en directo (concretamente Arus en la 100 que empieza a las 6:00 de la mañana).

Hablando con fer hemos comentado la posibilidad de mejorar ligeramente el script, un pequeño problema que tiene es que hay que grabar primero el asf, luego convertir a wav (que ocupa horrores!!!!) y finalmente convertirlo a mp3. Otro pequeño inconveniente es que realmente si el mplayer es capaz de reproducir el stream de audio, ¿No podría bastar para hacerlo todo?. Finalmente la respuesta es casi-sí, con el MPlayer y Lame (que suele ser una dependencia de mencoder) podemos:

¡¡¡ Grabar en MP3 al vuelo directamente del MPlayer !!!

después de darle unas cuantas vueltas el script resultante queda así.
update: el script lo puedes bajar de aquí

#!/bin/bash
# Script para la grabacion de un programa de radio por internet.
# Idea original de fer (www.tabernadelturco.com)
#
# Pplux (www.pplux.com)
#emisora
emisora=mms://live.c100.edgestreams.net/reflector:34743
#numero de minutos
minutos=1
#Nombre del programa
programa=arus
#Directorio donde grabarlo ('.' = actual)
dir=.
# Nombre del fichero
nombre=${dir}/${programa}_`date +%y_%m_%d`.mp3
#------------------------------------------------#
#Creamos un pipe
[ -e /tmp/radio_pipe ] && rm /tmp/radio_pipe
mkfifo /tmp/radio_pipe
#Lame
lame /tmp/radio_pipe $nombre 2>/dev/null 1>/dev/null &
#mplayer
mplayer $emisora -cache 32 -ao pcm:file=/tmp/radio_pipe 2>/dev/null </dev/null &
#Esperamos el tiempo marcado
sleep $(($minutos * 60))
#acabamos con el mplayer
    kill %2
#borramos el pipe
    rm /tmp/radio_pipe

Cosas raras del script para los más avispados:

  • Como MPlayer no puede sacar el audio por la salida estándar (lo que nos permitiría usar Lame directamente con un pipe entre comandos) utilizamos mkfifo para crear un pipe con nombre. La función es la misma que el pipe entre comandos, solo que con un fichero intermedio
  • Para que MPlayer pueda funcionar en background hay que usar el <dev/null para que no de problemas.
  • Primero lanzamos Lame y luego MPlayer, ¿No debería ser al revés? Lame es capaz de quedarse esperando a recibir sonido por el fichero o por la entrada estandar, y además es más rápido que el MPlayer produciendo sonido(si no, no se podría hacer al vuelo). MPlayer podría dar problemas si se lanza primero a escribir sobre un pipe del que no está esperando leer nadie.
  • kill %2 ¿Qué es eso? , Tiene que ver con la gestión de tareas(jobs) del BASH (mirar man bash, para más info). Cuando lanzamos tareas en background con el bash ocurre esto:
    pplux$ commando &
    [1] 14592
    

    El [1] es el número de tarea, y el 14592 el PID (identificador de proceso) del commando lanzado en background. Una de las muchas opciones de control de tareas que podemos realizar es precisamente la de mandar señales a las tareas, eso se realiza con kill y para mandar una señal a una tarea (sin necesidad de conocer su PID) podemos usar %n donde n es el nuestro número de la tarea. En este caso como hemos lanzado el MPlayer en segundo lugar en background con %2 le mandamos a él la señal.

  • ¿Y hace falta lanzar el MPlayer en background realmente? Jejeje, pues no lo se, pero no he encontrado la forma de decirle al MPlayer que lea del stream de audio durante x minutos y luego pare, así que la opción es lanzarlo en backround, hacer un sleep del tiempo necesario y luego pararlo mandándole una señal (que por defecto kill manda la señal de parar ordenadamente)
  • $((5+5)) esta sintáxis de doble paréntesis permite realizar operaciones matemáticas en el BASH, muy útil para multiplicar el número de minutos $minutos por 60 segundos para pasárselo al sleep (que solo entiende de segundos)

Todo lo demás, de cómo usar el cron se puede leer en el blog de fer… Para otro post queda ese aspecto interesante del cron que es poder programar tareas a nivel de usuario y no como root siempre.