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