Benutzer-Werkzeuge

Webseiten-Werkzeuge


en:scytheman:zeugs:scripte:mp3blstr2dscrbblr.sh

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
en:scytheman:zeugs:scripte:mp3blstr2dscrbblr.sh [2011/09/10 12:52]
127.0.0.1 Externe Bearbeitung
en:scytheman:zeugs:scripte:mp3blstr2dscrbblr.sh [2014/03/01 17:13] (aktuell)
Zeile 1: Zeile 1:
 +[[en:​scytheman|↑ up]]
  
 +===== mp3blstr2dscrbblr.sh =====
 +
 +**Note: mp3blstr2dscrbblr is now hosted on [[https://​github.com/​scaidermern/​mp3blstr2dscrbblr|GitHub]]**.
 +
 +==== Description ====
 +
 +This is a song submission script for [[http://​www.last.fm|last.fm]]/​[[http://​www.audioscrobbler.net|audioscrobbler]]. The script {{:​scytheman:​zeugs:​mp3blstr2dscrbblr.sh}} (**mp3bl**a**st**e**r** **to** au**d**io**scr**o**bbl**e**r**) analyses the status file of [[http://​mp3blaster.sourceforge.net/​|mp3blaster]] and delivers the gattered information to a perl script.
 +
 +mp3blaster doesn'​t have a native plugin interface. Thus we need to retrieve the needed data through a config file (//​mp3blaster -f <​file>//​). Then, [[wp>​cron]] calls this script every 30 seconds. The script checks if the song plays at least 30 seconds (giving the listener enough time to skip it) and at most 59 seconds (preventing multiple submissions). This check can be disabled by calling the script with the parameter %%--%%force.
 +
 +==== Requires ====
 +
 +  * perl script: debian package [[http://​packages.debian.org/​testing/​perl/​libaudio-scrobbler-perl|libaudio-scrobbler-perl]] or script [[http://​search.cpan.org/​~roam/​Audio-Scrobbler-0.01/​lib/​Audio/​Scrobbler.pm|Audio::​Scrobbler]]
 +  * audio player [[http://​mp3blaster.sourceforge.net/​|mp3blaster]]
 +  * date, stat
 +  * cron (for periodic script calls)
 +
 +==== Code ====
 +
 +<code bash>
 +#!/bin/bash
 +#
 +# mp3blstr2dscrbblr.sh:​ last.fm/​audioscrobbler song submission script for mp3blaster
 +#
 +# Copyright (C) 2006-2007,​2012 Alexander Heinlein <​alexander.heinlein@web.de>​
 +#
 +# version: 0.4
 +#
 +
 +# mp3blaster status file (mp3blaster -f <​file>​)
 +MP3_STAT="/​tmp/​mp3blaster"​
 +# perl audioscrobbler plugin directory
 +# (http://​search.cpan.org/​~roam/​Audio-Scrobbler-0.01/​lib/​Audio/​Scrobbler.pm)
 +#​DIR="/​home/​scytheman/​Audio-Scrobbler-0.01/​lib"​
 +# plugin binary/​script
 +#​BIN="​../​bin/​scrobbler-helper"​
 +BIN="​scrobbler-helper"​
 +
 +# maximum retries if first submission failed
 +MAX_RETRIES=15
 +# seconds to wait before second submission
 +# this value increases during further retries
 +WAIT=10
 +
 +# check for existing status file
 +if ! test -e $MP3_STAT
 +then
 + echo "​$MP3_STAT doesn'​t exist, make sure mp3blaster is running with '-f $MP3_STAT'"​
 + exit
 +fi
 +
 +# check for scrobbler binary
 +if ! which $BIN >/​dev/​null
 +then
 + echo "$BIN doesn'​t exist, make sure libaudio-scrobbler-perl is installed"​
 + exit
 +fi
 +
 +# first, check if the time of last modification is greather than 30s and less than 60s
 +# because this script will be executed every 30s, so we don't submit the same song twice
 +# and make sure we don't submit skipped tracks (user has 30s to skip the track)
 +
 +# we calculate the difference between last modification time (-> stat) and current time
 +# (-> date), both are seconds since 1970-01-01 00:00:00 UTC
 +
 +# seconds since last modification
 +SSLM=$(echo "​$(date "​+%s"​) - $(stat -c "​%Y"​ $MP3_STAT)"​ | bc)
 +if [ "​$SSLM"​ -lt 30 ] || [ "​$SSLM"​ -ge 60 ]
 +then
 + echo "last modification time <30 or >​=60"​
 +
 + # user may skip this test by passing '​--force'​ to script
 + if [ "​$1"​ = "​--force"​ ]
 + then
 + echo "​ignoring."​
 + else
 + echo "​specify '​--force'​ to submit anyway"​
 + exit
 + fi
 +fi
 +
 +# check if song is playing otherwise there is the risc of submitting a song twice
 +# because every time a song is paused, mp3blaster updates it's status file, thus
 +# changing also time of last modification
 +if ! grep -q "​^status playing"​ $MP3_STAT
 +then
 + echo "no song playing"​
 + exit
 +fi
 +
 +# we need 2 + 7 arguments:
 +#  -P <​client>​ -V <​clientversion>​
 +#  title, artist, album, year, comment, genre, length
 +# note: - comment will be left empty
 +#       - genre will be specified globally
 +
 +# unfortunately mp3blaster isn't recognized as client >:(
 +CLIENT="​mpd"​
 +CLIVER="​0.11"​
 +
 +# mp3blaster doesn'​t list the genre in the status file
 +GENRE="​rock"​
 +
 +# now get all information from mp3blaster
 +title=$(grep "​^title " $MP3_STAT | cut -d ' ' -f2-)
 +artist=$(grep "​^artist " $MP3_STAT | cut -d ' ' -f2-)
 +album=$(grep "​^album " $MP3_STAT | cut -d ' ' -f2-)
 +year=$(grep "^year " $MP3_STAT | cut -d ' ' -f2-)
 +length=$(grep "​^length " $MP3_STAT | cut -d ' ' -f2-)
 +
 +# check if we have artist and title
 +# else print error message to stderr
 +if [ "​$title"​ = ""​ ] || [ "​$artist"​ = ""​ ]
 +then
 + echo "​error:​ $(grep "^path " $MP3_STAT | cut -d ' ' -f2-) has no/invalid ID tag" 1>&2
 + exit
 +fi
 +
 +# and finally execute plugin
 +if [ -n "​$DIR"​ ]; then cd "​$DIR";​ fi
 +
 +# creating function and variable for multiple use
 +SUBMIT="​$BIN -P $CLIENT -V $CLIVER \"​$title\"​ \"​$artist\"​ \"​$album\"​ \"​$year\"​ \"​\"​ \"​$GENRE\"​ \"​$length\""​
 +submit()
 +{
 +    "​$BIN"​ -P "​$CLIENT"​ -V "​$CLIVER"​ "​$title"​ "​$artist"​ "​$album"​ "​$year"​ ""​ "​$GENRE"​ "​$length"​ >/​dev/​null
 +}
 +
 +echo
 +echo "​executing $SUBMIT"​
 +echo
 +submit
 +
 +retval="​$?"​
 +# known return values:
 +#   22 bad hostname
 +#  104 Connection reset by peer
 +#  110 connection timeout
 +#  111 Connection refused (fuck you)
 +#  114 couldn'​t complete handshake
 +#  115 connection timeout
 +#  255 couldn'​t complete handshake
 +#  500 read timeout / EOF
 +
 +# last submission failed, resubmit
 +if [ "​$retval"​ ==  "​22"​ ] || [ "​$retval"​ == "​104"​ ] || [ "​$retval"​ == "​110"​ ] || [ "​$retval"​ == "​111"​ ] \
 +|| [ "​$retval"​ == "​114"​ ] || [ "​$retval"​ == "​115"​ ] || [ "​$retval"​ == "​255"​ ] || [ "​$retval"​ == "​500"​ ]
 +then
 +    for ((i = 1; i <= MAX_RETRIES;​ i++))
 +    do
 +        echo "​waiting for $WAIT seconds..."​
 +        sleep $WAIT
 +        echo "retry #$i: executing $SUBMIT"​
 +        submit
 +
 +        if [ "​$?"​ == "​0"​ ]
 +        then
 +            exit 0
 +        fi
 +
 +        # doubling next wait, server may be down for any length of time
 +        let "WAIT = $WAIT * 2"
 +    done
 +    echo "​couldn'​t submit song after $MAX_RETRIES retries: $?" 1>&2
 +elif [ "​$retval"​ != "​0"​ ]
 +then
 +    echo "​return value: $retval"​ 1>&2
 +fi
 +</​code>​
 +
 +=== Needed Adjustments ===
 +
 +  * change variable //MP3// if path to status file differs
 +  * set //DIR// and change //BIN// if you want to use the script from the website instead of a distribution'​s package
 +  * change //GENRE// if you listen to another music style
 +  * create ~/​.scrobbler-helper.conf
 +
 +<​file>​
 +# ~/​.scrobbler_helper.conf example file
 +# see `man scrobbler-helper'​ for detailed
 +# information
 +[global]
 +username=last.fm-user
 +password=password
 +# Optional (the default is UTF-8)
 +default_encoding=iso885915
 +# Optional (the default is "​no"​)
 +fix_track_name=yes
 +</​file>​
 +
 +==== Usage ====
 +
 +For periodic calls of this script through cron you need to set up a cron job (see ''​man 5 crontab''​). Run as user ''​crontab -e''​ and add the following lines:
 +
 +<​file>​
 +# m h dom mon dow command
 +# cron runs only every minute, thus we need sleep here
 +*    *  *  *  *   nice -19 ~/​scripts/​mp3blstr2dscrbblr.sh > /dev/null & sleep 30s && nice -19 ~/​scripts/​mp3blstr2dscrbblr.sh > /dev/null
 +#
 +</​file>​
 +
 +or
 +
 +<​file>​
 +# m h dom mon dow command
 +# cron runs only every minute, thus we need sleep here
 +*    *  *  *  *                nice -19 ~/​scripts/​mp3blstr2dscrbblr.sh > /dev/null
 +*    *  *  *  *   sleep 30s && nice -19 ~/​scripts/​mp3blstr2dscrbblr.sh > /dev/null
 +#
 +</​file>​
 +
 +==== License ====
 +
 +This script is licensed under the GPL 3.0.
 +
 +http://​www.gnu.org/​licenses/​gpl-3.0.html
 +
 +==== Changelog ====
 +
 +2012-05-10 0.4
 +  * minor tweaks for GitHub release
 +
 +2007-09-25 0.3
 +  * retry specified number of times if submission fails
 +
 +2006-11-06 0.2
 +  * support for debian package libaudio-scrobbler-perl
 +
 +2006-06-16 0.1
 +  * initial release
en/scytheman/zeugs/scripte/mp3blstr2dscrbblr.sh.txt · Zuletzt geändert: 2014/03/01 17:13 (Externe Bearbeitung)