Radio
Acá encuentras detalles sobre nuestra radio, Radio Costa.
Indice:
- Historia
- Configuración
- Acceso
- Metadata
- Editaje
- Cacharreo
Historia
Nuestra radio inicialamente estuvo alojada en una Raspberry Pi llamada Pira. Tenía acceso a internet pero no se podía acceder a ella desde afuera. No teníamos acceso al router para abrir los puertos.
Para poder transmitir hicimos un "ssh reverse tunneling" con caracolito. De esa forma pudimos hacerla funcionar.
Más adelante nos ofrecieron espacio en un servidor amigo, lugar en donde actualmente se encuentra funcionando.
La radio incialmente estuvo usando Ices2. Con los nuevos recursos hemos podido instalar y usar Liquidsoap.
Configuración
La radio usa Icecast2 con Liquidsoap para servir y reproducir el audio.
Ambos programas son relativamente livianos y simples. Manejamos todo por la línea de comando.
Originalmente Ices2 utilizaba una lista en texto plano para leer las canciones que queremos que reproduzca. En ese archivo escribíamos los caminos ("paths") de las canciones. Por ejemplo:
~/musicaradio/LasLetras/Tanama.ogg
Un detalle para quienes quieran usar Ices2: solo reproduce archivos ".ogg".
Actualmente, con Liquidsoap, utilizamos las listas de reproducción que le indicamos (e.g. lista.m3u). Este programa se maneja con un script, y utiliza su propio lenguaje. El programa lee un archivo con extensión ".liq". Este es el contenido de nuestro archivo ".liq":
#!/usr/bin/liquidsoap # Direccion del log set("log.file.path","/tmp/log/basic-radio.log") def predicate.activates(~init=false, p) last = ref(not init) fun () -> begin cur = p() ans = (not !last) and cur last := cur ans end end # Musica dia = playlist("/~/jabonliquido/dia.m3u") tarde = playlist("/~/jabonliquido/tarde.m3u") noche = playlist("/~/jabonliquido/noche.m3u") madrugada = playlist("/~/jabonliquido/madrugada.m3u") # Separadores separadores = playlist("/~/jabonliquido/separadores.m3u") # Seguridad seguridad = single("/~/musicaradio/Separadores/separadorRCdiez.ogg") # Radio radio = switch([ (predicate.activates({ 0m-7m }), separadores), ({ 4h-10h }, madrugada), ({ 10h-16h }, dia), ({ 16h-22h }, tarde), ({ 22h-4h }, noche) ]) # Si algo sale mal esto se reproducira radio = fallback(track_sensitive = false, [radio, seguridad]) # La salida del stream output.icecast(%mp3(bitrate=128), host = "localhost", port = 8000, icy_metadata = "true", password = "password", mount = "radiocosta", description="La radio oficial de Archipielago I.", radio) output.icecast(%mp3.abr(bitrate=64,max_bitrate=128,id3v2=true), host = "localhost", port = 8000, icy_metadata = "true", description="(Menor calidad) La radio oficial de Archipielago I.", password = "password", mount = "mradiocosta", radio)
De manera simple este script indica:
- Guarda el log en esta dirección.
- Define lo que es la función "predicate.activates" (para que prediga cuando tiene que reproducir el separador, y cuantas veces).
- Estos son los caminos a las listas y sus respectivas referencias. (Lo que esta bajo # Music)
- Este es el camino para nuestra "seguridad", lo que va a reproducir si algo sale mal.
- Esta es la definición de la radio: Reproduce un separador dentro de los primeros 7 minutos de cada hora, de acuerdo a los parametros de "predicate.activates". Reproduce la lista de madrugada de 4h-10h, la de día de 10h-16h, la de tarde de 16h-22h y la de noche de 22h-4h.
- Esta es la definición por si algo sale mal.
- Esto son los streams que queremos que salgan: El primero, en .mp3, con 128 de bitrate, por el puerto 8000, en el punto de montaje "radiocosta", con tal contraseña (definida desde Icecast), con esta descripción. El segundo con los mismos detalles excepto con 64 de bitrate (menor calidad).
Acceso
Este segmento es solo para las islas. Es posible accesar a la radio para añadir música y editar sus listas.
Primero debemos hacer un par de llaves ssh y luego pasarle la pública a diez para que te otorgue acceso.
Cómo crear llaves ssh
Estando en la terminal, en el home (~) de tu computadora:
- Moverte a la carpeta `.ssh` . Si no tienes esa carpeta, entonces hacerla con el comando `mkdir .ssh`. Luego moverte a la carpeta ( `cd .ssh` ).
- Hacer/ejecutar `ssh-keygen`.
- Lo primero que te pregunta es el nombre que le quieres poner al archivo. Yo diría de llamarle `archi1` pero puede ser lo que quieras. Luego te pregunta si quieres ponerle una frase de seguridad. En este caso no le vamos a poner, así que solo presionaría Enter las dos veces.
- Eso te crea dos archivos: la llave privada (que nunca se comparte) y la llave pública (que termina en .pub). Terminas entonces con `archi1` y `archi1.pub` en la carpeta `.ssh`.
- Para accesar se necesitara el contenido de la llave pública. Puedes compartir esa info de dos formas. *1.* Compartiendo una copia del archivo `archi1.pub` o *2.* copiando y pegando el contenido que tiene (haciendo `cat archi1.pub` o abriéndolo con un editor de texto como `nano`).
- Si tienes problemas accesando, intenta especificando la llave que quieres que se use: `ssh -i ~/.ssh/archi1.pub usuarie@servidor`
Metadata
Muchas veces nos encontramos con que la radio no tiene la metadata incluída en sus canciones. Para añadir la información correspondiente usamos `id3v2` para varios formatos (mp3, m4a, wav, ...) y `vorbiscomment` para ".ogg".
Con `id3v2` podemos hacer varias cosas.
Si quieres ver la metada de todos los archivos ".mp3" en una carpeta puedes hacer:
id3v2 -l *.mp3
Para añadir el nombre de artista a todos los archivos ".mp3" puedes hacer:
id3v2 -a "Nombre de Artista" *.mp3
Para añadir el título de una canción puedes hacer:
id3v2 -t "Nombre de la canción" cancion.mp3
Con que la canción tenga nombre de artista y título nos es suficiente.
Para `vorbiscomment` puedes usar estos dos comandos.
Para añadir nombre de artista puedes hacer:
vorbiscomment -a -t "ARTIST=Nombre de artista" Nombredelarchivo.ogg
Para añadir el título de una cancióin puedes hacer:
vorbiscomment -a -t "TITLE=Titulo de la canción" Nombredelarchivo.ogg
Lamentablemente `vorbiscomment` no permite usar el asterisco (*) para añadir a todos los ".ogg", por lo que hay ir uno por uno.
Editaje
Editar el nombre de los archivos
Cuando copiamos o bajamos canciones a la radio es común encontrar que los nombres de los archivos tienen espacios o palabras que no queremos.
Como por ejemplo:
Hector Coco Barez - Lo que te vuelve loco.mp3
En este caso nos interesa quitar el nombre de artista y todos los espacios en blanco. Vayamos por paso.
Para remover lo que se quiera del título de los archivos usamos `rename`. Supongamos que todos los ".mp3" en nuestra carpeta tienen lo mismo. Usaríamos el siguiente comando para borrarlo:
rename ’s/Hector Coco Barez - //‘ *.mp3
El archivo se renombra como "Lo que te vuelve loco.mp3". En el resto de los ".mp3" también se elimina.
Ahora queremos quitar los espacios en blanco para que Liquidsoap los pueda leer sin problema. Usamos el siguiente comando que aplica a todos los archivos ".mp3" de la carpeta:
rename 's/ //g' *.mp3
De esta forma el archivo queda "Loquetevuelveloco.mp3", justo como lo necesitamos.
A veces el archivo tiene números luego de un guión, como por ejemplo "Hector Coco Barez - Lo que te vuelve loco-415633156.mp3". En este caso, luego de hacer los pasos anteriores, hacemos este último para elminarlos:
rename 's/\-\d+\.mp3$/\.mp3/' *.mp3
Este comando le dice que elimine todo lo que esta entre el guión ("-") y el ".mp3". El "*.mp3" establece que haga lo mismo para todos los archivos que terminen en ".mp3".
Añadiendo canciones a la lista de bloque
Para que Liquidsoap reproduzca las canciones es necesario añadir su dirección ("path") a nuestra lista de bloque (.m3u). Siguiendo con el ejemplo, supongamos que ésta y las demás canciones en esta carpeta las queremos añadir a la tarde.
Primero debemos conocer su dirección completa. Estas canciones estan en una carpeta de álbum (ElLaberintodelCoco), dentro de la carpeta de artista (CocoBarez), dentro de la carpeta de la música de la radio (musicaradio). Si nos movemos a la carpeta donde están todas las canciones podemos hacer esto:
find $(pwd) -iname "*.mp3"
Esto "imprime" la dirección completa de todos los archivos con la extensión ".mp3".
Suponiendo que nuestra musica esta en el "home" (~) en una carpeta llamada "musicaradio", el resultado con la canción de ejemplo sería el siguiente:
/home/usuarie/musicaradio/CocoBarez/ElLaberintodelCoco/Loquetevuelveloco.mp3
Esa dirección (y la de las demás canciones) la añadimos al archivo "tarde.m3u". Para poder distinguir entre artistas es posible comentar en el archivo con "#":
# Coco Barez /home/usuarie/musicaradio/CocoBarez/ElLaberintodelCoco/Loquetevuelveloco.mp3 # Viento de Agua /home/usuarie/musicaradio/VientodeAgua/DePuertoRicoAlMundo/FiestadePlena.mp3
Y listo, así la canción se añade a la lista de la tarde.
Cacharreo
Añadir "últimas canciones" en la web
Si bien Icecast2 no recomienda editar sus ".xsl", nosotres nos aventuramos. :)
Para poder mostrar las últimas canciones que han sonado en la radio incrustramos un ".txt" que las muestra.
Hicimos un script (.sh) que extrae la últimas canciones que han sonado del log de liquidsoap. Luego elimina parte de la dirección (path) de las carpetas. Eso lo convierte en un ".txt" y ese archivo lo incrustramos en la página de icecast.
El script (.sh) contiene lo siguiente:
#!/bin/bash tail -n 20 /liquidsoap/log/radio.log | grep RID | cut -d '"' -f 2 > /usr/share/icecast2/web/ultimas.txt sed -i 's/\/home//' /usr/share/icecast2/web/ultimas.txt sed -i 's/.mp3//' /usr/share/icecast2/web/ultimas.txt echo Listo
Vamos por paso.
tail -n 20 /liquidsoap/log/radio.log | grep RID | cut -d '"' -f 2 > /usr/share/icecast2/web/ultimas.txt`
Este comando es una composición de varios. El primer comando es `tail`, que muestra las últimas líneas del archivo que le indicas. En este caso le estamos diciendo que nos muestre las últimas 20 líneas (`-n 20`) del log de liquidsoap.
Luego lo pareamos con que solo muestre las líneas que tienen "RID", con `grep RID`.
A la vez le decimos que solo muestre lo que esta entre comillas, que en este caso es la dirección (path) de la canción. Eso lo logramos con `cut -d '"' -f 2`.
Luego le decimos que el resultado de esos comandos lo convierta en un archivo llamado "ultimas.txt" y que lo coloque en /usr/share/icecast2/web/ (donde estan los archivos de la página web).
Una línea dentro del archivo ".txt" se ve de la siguiente forma:
/home/musicaradio/CERO39/MontateenelViaje/Corozo.mp3
sed -i 's/\/home//' /usr/share/icecast2/web/ultimas.txt
Este comando con "sed" elimina la parte de la dirección que dice "/home/", en las líneas del ".txt". Esto lo hacemos por motivos de seguridad.
El resultado es:
/musicaradio/CERO39/MontateenelViaje/Corozo.mp3
sed -i 's/.mp3//' /usr/share/icecast2/web/ultimas.txt
Por último, este comando "sed" elimina los ".mp3" al final de cada línea. Esto lo hacemos más por motivos estéticos.
Al final del script escribimos "echo Listo" para saber que el script se ejecutó exitosamente.
Con este script guardado (guardado como "ultimas.sh", por ejemplo) podemos hacer que se ejecute cada cierta cantidad de tiempo. Eso lo logramos con un "cronjob".
$ crontab -e
Dentro de ese archivo, al final, escribimos la siguiente línea. Este ejemplo esta hecho para correr el script cada minuto:
* * * * * cd /home/ && sh ultimas.sh
Con este script automatizamos las últimas canciones que están sonando en la radio.
Ahora necesitamos "incrustrar" ese ".txt" en nuestra página.
En el archivo "status.xsl" de la carpeta de icecast (/usr/share/icecast2/web/status.xsl) incluímos lo siguiente:
<object data="ultimas.txt" type="text/plain" width="500" style="height: 250px"></object>
El grosor y la altura la determinas a gusto.
El resultado final debe mostrar algo parecido a:
/musicaradio/CERO39/MontateenelViaje/Corozo /musicaradio/Pachyman/InDub/Uptown /musicaradio/YesserTejeda/Kijombo/SwingRipiaoftElProdigio /musicaradio/Separadores/separadorazul /musicaradio/AustinTV/LaUltimaNochedelMundo/Rucci