diff --git a/plugin.py b/plugin.py
index d3b143b..76f8b7f 100644
--- a/plugin.py
+++ b/plugin.py
@@ -44,6 +44,32 @@ from time import time
from LastFMDB import *
+class LastFMParser:
+
+ def parseRecentTracks(self, stream):
+ """
+ @return Tuple with track information of last track
+ """
+
+ xml = minidom.parse(stream).getElementsByTagName("recenttracks")[0]
+ user = xml.getAttribute("user")
+
+ t = xml.getElementsByTagName("track")[0] # most recent track
+ isNowPlaying = (t.getAttribute("nowplaying") == "true")
+ if not isNowPlaying:
+ time = int(t.getElementsByTagName("date")[0].getAttribute("uts"))
+ else:
+ time = None
+
+ artist = t.getElementsByTagName("artist")[0].firstChild.data
+ track = t.getElementsByTagName("name")[0].firstChild.data
+ try:
+ albumNode = t.getElementsByTagName("album")[0].firstChild
+ album = albumNode.data
+ except (IndexError, AttributeError):
+ album = None
+ return (user, isNowPlaying, artist, track, album, time)
+
class LastFM(callbacks.Plugin):
# 1.0 API (deprecated)
APIURL_1_0 = "http://ws.audioscrobbler.com/1.0/user"
@@ -115,22 +141,13 @@ class LastFM(callbacks.Plugin):
irc.error("Unknown ID (%s)" % id)
return
- xml = minidom.parse(f).getElementsByTagName("recenttracks")[0]
- user = xml.getAttribute("user")
- t = xml.getElementsByTagName("track")[0] # most recent track
- isNowplaying = (t.getAttribute("nowplaying") == "true")
- artist = t.getElementsByTagName("artist")[0].firstChild.data
- track = t.getElementsByTagName("name")[0].firstChild.data
- try:
- album = "["+t.getElementsByTagName("album")[0].firstChild.data+"]"
- except IndexError:
- album = ""
-
- if isNowplaying:
+ parser = LastFMParser()
+ (user, isNowPlaying, artist, track, album, time) = parser.parseRecentTracks(f)
+ if isNowPlaying:
+ albumStr = "[" + album + "]" if album else ""
irc.reply(('%s is listening to "%s" by %s %s'
- % (user, track, artist, album)).encode("utf8"))
+ % (user, track, artist, )).encode("utf8"))
else:
- time = int(t.getElementsByTagName("date")[0].getAttribute("uts"))
irc.reply(('%s listened to "%s" by %s %s more than %s'
% (user, track, artist, album,
self._formatTimeago(time))).encode("utf-8"))
diff --git a/test.py b/test.py
index 7db7999..eeaf64d 100644
--- a/test.py
+++ b/test.py
@@ -31,6 +31,9 @@
#from __future__ import print_function
from supybot.test import *
+from plugin import LastFMParser
+
+from StringIO import StringIO
class LastFMTestCase(PluginTestCase):
plugins = ('LastFM',)
@@ -53,5 +56,49 @@ class LastFMTestCase(PluginTestCase):
print self.assertNotError("lastfm compare krf czshadow")
print self.assertNotError("lastfm compare krf")
+ def testLastFMParseRecentTracks(self):
+ """Parser tests"""
+
+ # noalbum, nowplaying
+ data1 = """
+
+"""
+
+ # album, not nowplaying
+ data2 = """
+
+"""
+
+ parser = LastFMParser()
+ (user, isNowPlaying, artist, track, album, time) = \
+ parser.parseRecentTracks(StringIO(data1))
+ self.assertEqual(user, "USER")
+ self.assertEqual(isNowPlaying, True)
+ self.assertEqual(artist, "ARTIST")
+ self.assertEqual(track, "TRACK")
+ self.assertEqual(album, None)
+ self.assertEqual(time, None)
+
+ (user, isNowPlaying, artist, track, album, time) = \
+ parser.parseRecentTracks(StringIO(data2))
+ self.assertEqual(album, "ALBUM")
+ self.assertEqual(time, 1213031819)
+
# vim:set shiftwidth=4 tabstop=4 expandtab textwidth=79: