#!/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 }
}