by Bart Schaefer
#!/bin/zsh
zmodload -i zsh/net/tcp || exit 245
zmodload -i zsh/zselect || exit 246
zmodload -i zsh/datetime || exit 247
setopt extendedglob
autoload -U tcp_open
TCP_SILENT=yes
TCP_PROMPT=
audioscrobbler_handshake() {
local username="$1"
tcp_open post.audioscrobbler.com 80 scrobbler
tcp_send -s scrobbler -- "GET /?hs=true&p=1.1&c=tst&v=1.0&u=${username}
HTTP/1.1"
tcp_send -s scrobbler -- "Host: post.audioscrobbler.com"
tcp_send -s scrobbler -- ""
sleep 1
tcp_read -d -s scrobbler
tcp_close -s scrobbler
if [[ $tcp_lines[1] != "HTTP/1.1 200 OK
" ]];
then
return 1
fi
response=(${tcp_lines[(r)
,-1]})
local rstatus=${response[2]}
case "$rstatus" in
(UPTODATE|UPDATE *)
challenge="${response[3]/
(#e)/}"
submiturl="$response[4]"
interval="$response[5]"
;;
(FAILED *|BADUSER)
interval="$response[3]"
print $rstatus
return 1
;;
(*)
print $rstatus what the fuck
print -l ${response}
return 1
;;
esac
}
audioscrobbler_urlencode() {
setopt localoptions extendedglob
input=( ${(s::)1} )
print ${(j::)input/(#b)([^A-Za-z0-9_.!~*\'\(\)-])/%$(([##16]#match))}
}
audioscrobbler_submit() {
local username=$(audioscrobbler_urlencode "$1")
local password=$(audioscrobbler_urlencode "$2")
local artist=$(audioscrobbler_urlencode "$3")
local track=$(audioscrobbler_urlencode "$4")
local album=$(audioscrobbler_urlencode "$5")
local mbid="$6" length="$7" ttime="$8"
local cr="$(print -n "${password}" | md5sum | awk '{print $1}')${challenge}"
local challengeresponse="$(print -n "${cr}" | md5sum | awk '{print $1}')"
tcp_open post.audioscrobbler.com 80 scrobbler
print "GET
/protocol_1.1?u=${username}&s=${challengeresponse}&a[0]=${artist}&t[0]=${track}&b[0]=${album}&m[0]=${mbid}&l[0]=${length}&i[0]=${ttime}"
tcp_send -s scrobbler -- "GET
/protocol_1.1?u=${username}&s=${challengeresponse}&a[0]=${artist}&t[0]=${track}&b[0]=${album}&m[0]=${mbid}&l[0]=${length}&i[0]=${ttime}"
sleep 1
tcp_read -d -s scrobbler
tcp_close -s scrobbler
print -l ${tcp_lines}
}
audioscrobbler_handshake TestUser || exit 1
#tstamp=$(TZ=UTC strftime "%Y-%m-%d %H:%M:%S" ${EPOCHSECONDS})
tstamp=$(date -u +"%Y-%m-%d %H:%M:%S")
audioscrobbler_submit TestUser secretpassword "Caetano Veloso" "Cucurrucucu
Paloma" "Divina Estampa" "" "230" "${tstamp// /%20}"