Here's some code to submit track information to Last.FM (''scrobble''). To use it, first you need to do the `handshake`, then you get token which you can use to send the "now playing" track (`np`) or "just played" one (`scrobble`). ====== set lastfmtoken [lastfm::handshake $s] # while the track is playing you should periodically run np: lastfm::np token $lastfmtoken artist $artist track $track # to scrobble the track (see details on when to do this on last.fm site) lastfm::scrobble token $lastfmtoken artist $artist track $track source personal ====== This code supports both short (as per protocol) and long human-readable `source`s. ====== #!/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=&v=&u=&t=&a= 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 } } ======