I've been playing around with retrieving my recently listened to tracks from last.fm so that I can use it on my portfolio. Last.fm provides an XML file of recently listened to tracks, so I wrote a php function to retrieve them. Below is the script, it's just basic HTML at the moment so that it can be properly stylised. I've commented all the code so you can see how it works.
//enter your last.fm username
$username = 'spahndirge';
//in seconds, how long to wait until your recently listened tracks are checked for new entries
$time = 300;
//this is the URL of the last.fm xml file of your profile
$lastfmFile = "http://ws.audioscrobbler.com/1.0/user/$username/recenttracks.xml";
//the number of tracks you want to display, this can't be above 9
$numOfTracks = 5;
function getTracks($username, $time, $lastfmFile, $numOfTracks) {
//this will be the local xml file written to your server
$myLocalFile = $username.'.xml';
//if the local xml file doesn't exist or if local xml file is older than the time set
if ((!file_exists($myLocalFile)) || (time()-filemtime($myLocalFile)>$time)) {
//get the last.fm xml file and place it into the contents variable as a string
$contents = @file_get_contents($lastfmFile);
//open the local file or create it if it doesn't exist
$temp = fopen($myLocalFile, "w");
//write the contents of the lastfmFile to the local file
fwrite($temp, $contents);
//close the file
fclose($temp);
}
//grab the local xml file and place it into the xml variable
$xml = @simplexml_load_file($myLocalFile);
//create an unordered list of the track name and artist from the local XML file
print "
<ul>";
for ($t = 0; $t <= $numOfTracks; $t++) {
print "\n
<li><a href=\"".$xml->track[$t]->url."\" target=\"_blank\">".$xml->track[$t]->name." - ".$xml->track[$t]->artist."</a></li>
";
}
print "</ul>
";
}
getTracks($username, $time, $lastfmFile, $numOfTracks);
It isn't the most efficient code, but it works!
I set the time to 300 seconds (5 minutes), it's around the average time it takes to listen to a song. This is to reduce server load and loading times; there's no point in checking for a new song every minute or two.
If you have any improvements on the script, let me know.