viernes, 9 de enero de 2009

Scrobbling a lastfm con mocp

Soy un fanatico de WindowMaker y con ello, de las interfaces ligeras en Gnu/Linux.

Por lo que cualquier programa si es en consola mejor y ya se lleva una interfaz ncurses,chapó entonces.

Uso dos ciente-servidores para escuchar mi musica,moc y mpd. Con mocp y gmpc respectivamente, el motivo es que mocp lo uso cuando pongo algo rapido para salir del paso o simplemente no me apetece arrancar el gmpc, el gmpc sobretodo lo uso en el curro.

Pues bien, soy usuario desde hace años de lastfm y me interesa la idea de poder hacer scrobling de mis temas a mi perfil de este.



Resulta que en moc, actualmente no existe esa posibilidad y se esta incorporando una nueva feature la cual deje ejecutar un comando al cambiar una cancion(OnSongChange) con el fin de al realizar el cambio de tema se ejecute un comando por ejemplo que envie la informacion ID3 a lastfm.

Para mpd si existe este demonio que se llama mpdscribble pero para moc no.
Pero lo que si existe en debian etch actualmente es un demonio y un cliente de este llamados lastfmsubmitd/lastfmsubmit que hacen de interfaz para poder enviar la info a lastfm.


Pues bien basandome en esto he realizado un script que es un demonio que hace scrobbling a lastfm en moc. ;D




#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/
FICH=/tmp/moc_info


# Si ya esta corriendo nuestro demonio terminamos
[ "$$" != "`pgrep -fo $0`" ] && exit 0

# Esperamos un tiempo por si es la primera vez que espere a que se haya terminado de ejecutar el alias
sleep 10s


while true
do
# Sino esta corriendo el demonio moc terminamos nuestro demonio
[ "$(pidof mocp)" ] || break

# Si existe el fichero entonces recogemos el mp3 antiguo
if [ -f $FICH ]; then
ARTIST_OLD=$(grep ^Artist: $FICH | cut -c 9-)
ALBUM_OLD=$(grep ^Album: $FICH | cut -c 8-)
TITLE_OLD=$(grep ^SongTitle: $FICH | cut -c 12-)
LENGTH_OLD=$(grep ^TotalTime: $FICH | cut -c 12-)
fi;
mocp -i > $FICH
# Parseamos el fichero
ARTIST=$(grep ^Artist: $FICH | cut -c 9-)
ALBUM=$(grep ^Album: $FICH | cut -c 8-)
TITLE=$(grep ^SongTitle: $FICH | cut -c 12-)
LENGTH=$(grep ^TotalTime: $FICH | cut -c 12-)
if [ -n "$ARTIST" -a -n "$ALBUM" -a -n "$TITLE" -a -n "$LENGTH" ] && \
( [ ! -f $FICH ] || [ "$ARTIST_OLD" != "$ARTIST" -o "$ALBUM_OLD" != "$ALBUM" -o "$TITLE_OLD" != "$TITLE" -o "$LENGTH_OLD" != "$LENGTH" ] );
then
/usr/lib/lastfmsubmitd/lastfmsubmit --artist "$ARTIST" --title "$TITLE" --length "$LENGTH" --album "$ALBUM"
fi;
# Dormimos 1 minuto
sleep 1m
done



Basicamente es un demonio que:

1- Mientras este corriendo el demonio moc se reproduce, con el fin de no gastar cpu tontamente.
2- Únicamente puede estar corriendo uno cada vez, con el fin de que no haya varios corriendo haciendo lo mismo e enviando los temas repetidos.
3- No envia el mismo tema varias veces seguidas, es decir comprueba antes de enviarlo que sea distinto al anterior.
4- Que no hace scrobbling sino tiene todas las etiquetas puestas, no tiene mucho sentido enviar un tema sin artista por ejemplo...
5- Que comprueba cada minuto si se esta reproducciendo algo nuevo, considero que es un intervalo de tiempo prudente.
6- Esta echo en bash, off course. ;)
7- Requiere de los paquetes mocp y lastfmsubmitd, por si no ha quedado claro.


Pues bien una vez creado nuestro demonio, falta saber cuando lanzarlo.
Nos interesa que:
1- Únicamente corra cuando este corriendo moc
2- Que cuando termine el nuestro tambien termine

Por lo tanto podriamos aprovechar por ejemplo los alias de bash para lanzar nuestro demonio cada vez que ejecutemos mocp y asi nos asegurariamos que cada vez que vayamos a escuchar musica se active el scrobbling de esta.

Vamos a utilizar:
1- nohup con el fin de que corra libre "como el viento".
2- lo vamos a lanzar en segundo plano con el fin de poder seguir interactuando con el terminal una vez lanzado.
3- Vamos a utilizar el agrupamiento de ordenes para poder poner en background el demonio y no lanzar nuestro cliente de moc.
4- Vamos a enviar el archivo nohup.out generado obligatoriamente al abujero negro (dev/null) con el fin de no tener nohup.outs por todas partes.


Pues aqui lo tienen señores, ¡this is linux!
Se añade esto al .bashrc de tu HOME y a correr millas. ;)

alias mocp='(nohup $HOME/Scripts/lastfm-moc.sh &>/dev/null &); mocp'



Seguidamente el:
$source .bashrc de rigor y listo. :)


Bravo!! :D

2 comentarios: