Version 0 of Last.FM

Updated 2011-01-20 15:03:36 by andrewshadoura

#!/usr/bin/env tclsh

package provide LastFM 0.1

package require http package require md5

namespace eval lastfm {

    # http://post.audioscrobbler.com/?hs=true&p=1.2.1&c=<client-id>&v=<client-ver>&u=<user>&t=<timestamp>&a=<auth>
    proc handshake {args} {
        set user {}
        set password {}
        if {[llength $args] == 1} {
            lassign $args args
        }
        foreach {k v} $args {
            set $k $v
        }
        set timestamp [clock seconds]
        set authtoken [string tolower [::md5::md5 -hex [string tolower [::md5::md5 -hex $password]]$timestamp]]
        set query [::http::formatQuery hs true p 1.2.1 c tst v 1.0 u $user t $timestamp a $authtoken]
        set r [::http::geturl http://post.audioscrobbler.com/ -query $query]
        set data [::http::data $r]
        ::http::cleanup $r
        return $data
    }

    proc np {args} {
        set sessid {}
        set artist {}
        set track {}
        set album {}
        set length {}
        set trackno {}
        set musicbrainz {}
        if {[llength $args] == 1} {
            lassign $args args
        }
        foreach {k v} $args {
            set $k $v
        }
        lassign $token code sessid npurl
        set query [::http::formatQuery s $sessid a $artist t $track b $album l $length n $trackno m $musicbrainz]
        set r [::http::geturl $npurl -query $query]
        set data [::http::data $r]
        ::http::cleanup $r
        return $data
    }

    proc scrobble {args} {
        set sessid {}
        set artist {}
        set track {}
        set album {}
        set length {}
        set trackno {}
        set musicbrainz {}
        set source personal
        set time [clock seconds]
        if {[llength $args] == 1} {
            lassign $args args
        }
        foreach {k v} $args {
            set $k $v
        }
        set source [string map {personal P radio R recommendation E last.fm L} [string tolower $source]]
        if {$source eq ""} {
            set source P
        }
        lassign $token code sessid -> submissionurl
        set query [::http::formatQuery s $sessid {a[0]} $artist {t[0]} $track {b[0]} $album {l[0]} $length {n[0]} $trackno {m[0]} $musicbrainz {i[0]} $time {o[0]} $source {r[0]} {}]
        set r [::http::geturl $submissionurl -query $query]
        set data [::http::data $r]
        ::http::cleanup $r
        return $data
    }

}