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 = """ + + ARTIST + TRACK + + + www.last.fm/music/Aretha+Franklin/_/Sisters+Are+Doing+It+For+Themselves + 9 Jun 2008, 17:16 + 1 + +""" + + # album, not nowplaying + data2 = """ + + ARTIST + TRACK + + ALBUM + www.last.fm/music/Aretha+Franklin/_/Sisters+Are+Doing+It+For+Themselves + 9 Jun 2008, 17:16 + 1 + +""" + + 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: