From 1000f6ede3f5faabfd3f252bfb3c273b2ccd947c Mon Sep 17 00:00:00 2001 From: Ryan Hitchman Date: Mon, 16 Mar 2009 18:55:54 -0600 Subject: [PATCH] youtube.py and xml.etree.ElementTree -> lxml.etree --- plugins/twitter.py | 6 +++--- plugins/weather.py | 4 ++-- plugins/youtube.py | 52 +++++++++++++++++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/plugins/twitter.py b/plugins/twitter.py index 4a511bf..1ed1435 100644 --- a/plugins/twitter.py +++ b/plugins/twitter.py @@ -4,19 +4,19 @@ retrieves most recent tweets """ import urllib -from xml.etree import ElementTree +from lxml import etree import hook @hook.command def twitter(bot, input): - '''.twitter - gets most recent tweet from ''' + ".twitter - gets most recent tweet from " if not input.inp.strip(): return twitter.__doc__ url = "http://twitter.com/statuses/user_timeline/%s.xml?count=1" \ % urllib.quote(input.inp) - tweet = ElementTree.parse(urllib.urlopen(url)) + tweet = etree.parse(url) if tweet.find('error') is not None: return "can't find that username" diff --git a/plugins/weather.py b/plugins/weather.py index 18e99d4..b19d786 100755 --- a/plugins/weather.py +++ b/plugins/weather.py @@ -2,7 +2,7 @@ "weather, thanks to google" import urllib -from xml.etree import ElementTree +from lxml import etree import hook @@ -15,7 +15,7 @@ def weather(bot, input): data = urllib.urlencode({'weather':input.inp.encode('utf-8')}) url = 'http://www.google.com/ig/api?' + data - w = ElementTree.parse(urllib.urlopen(url)).find('weather') + w = etree.parse(url).find('weather') if w.find('problem_cause') is not None: return "Couldn't fetch weather data for '%s', try using a zip or " \ diff --git a/plugins/youtube.py b/plugins/youtube.py index cb1bb23..32fafab 100644 --- a/plugins/youtube.py +++ b/plugins/youtube.py @@ -1,17 +1,45 @@ -import urllib -from xml.etree import ElementTree +import re +from lxml import etree +import locale + +import hook + +locale.setlocale(locale.LC_ALL, "") def ytdata(id): - url = 'http://gdata.youtube.com/feeds/api/videos/' + idt - print url - data = urllib.urlopen(url).read() - if len(data) < 50: # it's some error message; ignore - print data - return - global x - def - x = ElementTree.XML(data) + url = 'http://gdata.youtube.com/feeds/api/videos/' + id + x = etree.parse(url) + # I can't figure out how to deal with schemas/namespaces properly :( + yt = '{http://gdata.youtube.com/schemas/2007}' + media = '{http://search.yahoo.com/mrss/}' + + rating = x.find('{http://schemas.google.com/g/2005}rating') + data = dict(rating.items()) + data['title'] = x.find('{http://www.w3.org/2005/Atom}title').text + data['views'] = locale.format('%d', int(x.find(yt + 'statistics').get( + 'viewCount')), 1) + length = int(x.find(media + 'group/' + yt + 'duration').get('seconds')) + data['length'] = '' + if length / 3600: # > 1 hour + data['length'] += str(length/3600) + 'h ' + if length / 60: # > 1 minute + data['length'] += str(length/60 % 60) + 'm ' + data['length'] += "%ds" % (length % 60) + + return data + +youtube_re = re.compile(r'.*youtube.*v=([-_a-z0-9]+)', flags=re.IGNORECASE) + +@hook.command(hook=r'(.*)', prefix=False) +def youtube(inp): + m = youtube_re.match(inp) + if m: + data = ytdata(m.group(1)) + return '\x02%(title)s\x02 - rated \x02%(average)s/%(max)s\x02 ' \ + '(%(numRaters)s) - views \x02%(views)s\x02 - length \x02' \ + '%(length)s\x02' % data if __name__ == '__main__': - ytdata('the0KZLEacs') + print ytdata('the0KZLEacs') + print ytdata('Ct8nZ6eTTiY')