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}"

Reply via email to