Tag Archives: set music statis in bitlbee

Music Status for BitlBee

Advertisements

For nearly every instant messenger in Linux there is a plugin or the ability to set your status to the currently playing song. I was surprised to find that nothing like this was available for Irssi and BitlBee though. So, I decided to see if I could do anything about it. It turned out to be a lot harder than I thought it would be to get this working, but finally after a lot of tinkering and help from the #irssi channel on irc.freenode.net as well as the Irssi info email list, it’s alive!
First, let’s get everything set up. You will need the cron script for Irssi. Save the script to your ~/.irssi/scripts directory. You may need to create the scripts directory. Then create a simlink to cron.pl from the ~/.irssi/scripts/autorun/ directory. the autorun directory may also need to be created. to make the simlink:
ln -s ~/.irssi/scripts/cron.pl ~/.irssi/scripts/autorun/cron.pl
This causes the cron.pl script to start with Irssi. For this example I decided to use Pianobar, console based Pandora player. You can use a script file called eventcmd.sh located in ~/.config/pianobar/ to make Pianobar do some pretty nifty things. Part of what mine does is set status for Pidgin instant messenger and also write a file in /tmp/irssistatus that contains a small script to set by bitlbee status to the currently playing song. Here is my file which is based off the example file included with Pianobar:
#!/bin/bash
# create variables
while read L; do
k="`echo "$L" | cut -d '=' -f 1`"
v="`echo "$L" | cut -d '=' -f 2`"
export "$k=$v"
done < <(grep -e '^\(title\|artist\|album\|stationName\|pRet\|pRetStr\|wRet\|wRetStr\|songDuration\|songPlayed\|rating\|coverArt\|stationCount\|station[0-9]*\)=' /dev/stdin) # don’t overwrite $1…
album=$(echo "$album" | sed 's/ (Explicit)//g')
case "$1" in
"songstart")
/usr/bin/purple-remote "setstatus?status=available&message=Listening to $title by $artist from $album" &> /dev/null
irssiStatus="#!/bin/bash
echo \"set status 'Listening to $title by $artist from $album'\"
exit 0"
irssiStatus=$(echo "$irssiStatus" | sed 's/\&/and/g')
irssiStatus=$(echo "$irssiStatus" | sed "s/'/\\'/g")
echo "$irssiStatus" > /tmp/irssistatus
chmod 700 /tmp/irssistatus
;;

"songfinish")
if [ -n "$songDuration" ] && [ $(echo "scale=4; ($songPlayed/$songDuration*100)>50" | bc) -eq 1 ] && [ "$rating" -ne 2 ]; then
/usr/lib/lastfmsubmitd/lastfmsubmit --artist "$artist" --title "$title" --album "$album" --length "$((songDuration/1000))"
fi
;;
"songlove")
statusText="#nowplaying \"$title\" by \"$artist\" from \"$album\""
ttytter -readline=0 -silent -status="$statusText"
;;
*)
if [ "$pRet" -ne 1 ]; then
echo "naughty.notify({title = \"pianobar\", text = \"$1 failed: $pRetStr\"})" | awesome-client -
elif [ "$wRet" -ne 1 ]; then
echo "naughty.notify({title = \"pianobar\", text = \"$1 failed: Network error: $wRetStr\"})" | awesome-client -
fi
;;
esac
exit 0
#end eventcmd.sh
If you have createdd the file to ~/.config/pianobar/eventcmd.sh, set it to executable, and it doesn’t seem to work, edit the file ~/.config/pianobar/config and add the line:
event_command = /home/USER/.config/pianobar/eventcmd.sh
You can add your Pandora user name and password if you want:
user = Your Email Address
password = YourPassWord
This will allow you to automatically login without being prompted for your information each time.
The above script will also post the songs you love by pressing the + key to Twitter using TTYtter. It scrobbles to Last.fm using lastfmsubmitd:
sudo apt-get install lastfmsubmitd
Then edit the file:
/etc/lastfmsubmitd.conf
and add the following three lines:
[account]
password = yourLast.fmPassword
user = Last.fmUserName
Your user name is your account user name not your email address.
If you get permission denied errors for /var/spool/lastfmsubmit… files, the following code may correct the problem:
for i in /var/log /var/run /var/spool; do sudo chown lastfm:lastfm $i/lastfm; sudo chmod 775 $i/lastfm;done
And now, back to the original idea for this article. You have your shiny new eventcmd.sh file in place, you have your cron.pl script in the ~/.irssi/scripts directory and have it set to start when Irssi does. So, now, start irssi and type the following line:
/jobadd -server localhost * * * * * /exec -msg &bitlbee /tmp/irssistatus
To save it for future use type:
/jobssave
Then, the next time you start Irssi and login to BitlBee type:
/jobsload
to get it up and running again. And there you have it, your very own musical status for BitlBee. If you don’t have BitlBee installed but use a public installation, you will need to change the -server bit in the /jobadd line to your public server. There is one small problem though. In your &bitlbee control channel you will keep getting your message to set the status and then the root confirming it has been set. I have managed to get rid of the confirmation message but the actual set status from your nick will still show up. To block out the confirmation:
/ignore -regexp -pattern “(set status|status =)” *
There is probably a better way but regexps are not my strong point, so suggestions are welcome.
If you aren’t listening to anything and the /tmp/irssistatus file doesn’t exist you will get an error. the easiest way to correct this is to write the /tmp/irssi file by hand with your chosen status:
#!/bin/bash
echo 'set status "GREEN! like a booger!"'
exit 0
That one will definitely get you some ims Usually consisting of things like "What the hell!?". If you would like a bit more of a random status you can use this instead:
#!/bin/bash
status=$(fortune -s | sed "s/'/\\'/g")
status=$(echo "$status" | tr "[:space:]" " ")
if [ $(echo "$status" | wc -l) -eq "1" ] ; then
echo "set status '$status'"
fi
exit 0
The above script will give an error if the fortune is not in English. In the music script, some songs with odd things in their names may cause errors. this is rare as far as I can tell. I think I have fixed most if not all of them.