#!/bin/bash # # amaroK's plugin to fetch lyrics from www.letras.mus.br, a # amazing website with a really big lyrics database. # # Copyright Caio Begotti 2006 # Licensed under GPL2 on Sat, 27 May 2006 23:19:25 -0300 # # current TODO list: # - handle suggestions lang=en_US cache=${HOME}/lyrics template=/tmp/amarok.tpl config="-cfg=$(dirname $0)/lynx.cfg" dcop=$(which dcop) alert="${dcop} amarok playlist popupMessage" display="${dcop} amarok contextbrowser showLyrics" # lyrics script weren't supported until 1.4.0 $(which amarok) --version | grep 1.4. || ${alert} "This script requires amaroK 1.4 or later!" get="$(which lynx)" || ${alert} "The 'lynx' package is required to fetch lyrics!" gui="$(which kdialog)" || ${alert} "The 'kdialog' binary is required to configure me!" command=$1 # notification variable SaveCache() { varArtista="$(echo ${1} | iconv -f "UTF-8" -t "ISO-8859-1" | sed 's/\ /_/g')" varMusica="$( echo ${2} | iconv -f "UTF-8" -t "ISO-8859-1" | sed 's/\ /_/g')" cachedFile=${cache}/${varArtista}-${varMusica}.txt test -d ${cache} || mkdir -p ${cache} cp -f ${template} ${cachedFile} } FetchContent() { # can we call it template? cat << EOF > ${template} LYRICS_GOES_HERE EOF varArtista="$(echo ${1} | iconv -f "UTF-8" -t "ISO-8859-1" | sed 's/_/+/g')" varMusica="$( echo ${2} | iconv -f "UTF-8" -t "ISO-8859-1" | sed 's/_/+/g')" # PID number allow multi-user data=$(mktemp /tmp/amarok.$$.XXXX) case ${lang} in pt_BR) # they provide nice URLs for parsing, yay! ${get} -source "http://letras.terra.com.br/winamp.php?musica=${varMusica}&artista=${varArtista}" > ${data} tradCode=$(sed -e '/tradu/!d' -e "s/^.*href='//" -e "s/'alt.*$//" ${data}) # almost there for the parser... [ ! -s "${tradCode}" ] && ${get} ${config} -dump "${tradCode}" > ${data}.iso ;; *) # that's the regular lyrics in english ${get} ${config} -dump "http://letras.terra.com.br/winamp.php?musica=${varMusica}&artista=${varArtista}" > ${data}.iso ;; esac # just to make sure... cat ${data}.iso | iconv -f "ISO-8859-1" -t "UTF-8" -o ${data} # formatting the whole thing to display in the context browser cat ${data} | sed '1,7d' | tac > ${data}.invert cat ${data}.invert | sed '1,14d;s/^\ \+//g' | tac > ${data} # if empty or not found, alert the user about it message="Lyrics not found... check your tags or send us this lyrics!" test -s ${data} || echo "${message}" > ${data} grep -i "nviando a letra" ${data} && echo "${message}" > ${data} grep -i "retirada do site" ${data} && echo "${message}" > ${data} grep -i "letra\.$" ${data} && echo "${message}" > ${data} grep -i "^1\." ${data} && echo "${message}" > ${data} # fucking amazing hack from m4n from #sed@irc.freenode.net to capitalize all line's first word # sed 's/^[a-z]/\u&/' could be used as well but it's not that portable, specially for freebsd sed -i 'h;s/.\(.*\)/\1/;x;s/\(.\).*/\1/;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/;G;s/\n//;' ${data} sed -i "/LYRICS_GOES_HERE/r ${data}" ${template} sed -i -e "s/ARTIST/${varArtista}/" \ -e "s/TITLE/${varMusica}/" \ -e "/LYRICS_GOES_HERE/d" \ -e "s/+/ /g" ${template} # show it in the big screen, save locally then flush ${display} "$(cat ${template})" SaveCache "${varArtista}" "${varMusica}" rm -rf ${data}* } CheckCached() { host letras.terra.com.br return=$? case ${return} in 0) FetchContent "${artistName}" "${songTitle}" ;; 69) varArtista="$(echo ${1} | iconv -f "UTF-8" -t "ISO-8859-1" | sed 's/\ \+/_/g')" varMusica="$( echo ${2} | iconv -f "UTF-8" -t "ISO-8859-1" | sed 's/\ \+/_/g')" cachedFile=${cache}/${varArtista}-${varMusica}.txt test -f "${cachedFile}" && ${display} "$(cat ${cachedFile})" ;; esac } CallFetcher() { artistName="$(${dcop} amarok player artist)" songTitle="$(${dcop} amarok player title)" CheckCached "${artistName}" "${songTitle}" } while read command do case ${command} in configure) option=$(${gui} --title Lyrics1982 --radiolist \ "Do you wanna fetch lyrics in which language?" \ en_US "English (default value, en_US)" on \ pt_BR "Portugues (brasileiro, pt_BR)" off) case ${option} in en_US) sed -i 's/^lang=.._../lang=en_US/' $0 export lang="en_US" ;; pt_BR) sed -i 's/^lang=.._../lang=pt_BR/' $0 export lang="pt_BR" ;; *) ;; esac ;; trackChange) CallFetcher ;; fetchLyrics*) CallFetcher ;; fetchLyricsByUrl) # expect a valid lyric URL ;; engineStateChange) # is it empty|idle|paused|playing? ;; customMenuClicked*) # submenu itemTitle paths ;; *) ;; esac done exit 0 # how in hell could i make this suggestions thing work? # null suggestions template that i dont know how to use yet