/stuff/2011/youtube.cgi
#!/usr/bin/env python
# coding=utf-8
import sys
print "Content-Type: text/plain"
print
print "Sorry, this service has been removed"
sys.exit()
import cgitb
cgitb.enable()
import sys, os, re, urllib
# sys.setdefaultencoding('utf-8')
class Grab(urllib.URLopener):
def __init__(self, *args):
self.version = 'Mozilla/5.0 (YouTube Info Script)'
urllib.URLopener.__init__(self, *args)
def http_error_default(self, url, fp, errcode, errmsg, headers):
return urllib.addinfourl(fp, [headers, errcode], "http:" + url)
urllib._urlopener = Grab()
gdata = 'http://gdata.youtube.com/feeds/api/videos/'
r_title = re.compile(r"<title type='text'>(.*?)</title>")
r_viewCount = re.compile(r"viewCount='(\d+)'")
r_numRaters = re.compile(r"numRaters='(\d+)'")
r_average = re.compile(r"average='([0-9.]+)'")
r_duration = re.compile(r"duration='(\d+)'")
def format(duration):
if duration < 60: return str(duration) + 's'
return str(duration / 60) + ':' + ('%02i' % (duration % 60))
def formatnumber(n):
parts = list(str(n))
for i in range((len(parts) - 3), 0, -3):
parts.insert(i, ',')
return ''.join(parts)
def data(vid):
u = urllib.urlopen(gdata + vid)
bytes = u.read()
u.close()
title = r_title.search(bytes).group(1)
views = int(r_viewCount.search(bytes).group(1))
views = formatnumber(views)
try: raters = int(r_numRaters.search(bytes).group(1))
except AttributeError: raters = 0
raters = formatnumber(raters)
try: average = r_average.search(bytes).group(1)
except AttributeError: average = 0
duration = format(int(r_duration.search(bytes).group(1)))
return title, views, average, raters, duration
def text(vid):
print 'Content-Type: text/plain; charset=utf-8'
print
title, views, average, raters, duration = data(vid)
print title[:250],
print '(%s)' % duration,
print '%s views,' % views,
av = int(float(average))
print ('★' * av) + ('☆' * (5 - av)),
print 'by %s raters' % raters
p = os.environ.get('PATH_INFO', '/')
p += os.environ.get('QUERY_STRING', '')
p = urllib.unquote(p)
if 'v%3D' in p:
p = p.rsplit('v%3D', 1).pop()
if '%3D' in p: p.split('%3D', 1)[0]
if 'v=' in p:
p = p.rsplit('v=', 1).pop()
if '=' in p: p.split('=', 1)[0]
if p.startswith('/'):
p = p[1:]
if '=' in p:
text(p.rsplit('=').pop())
else: text(p)
# EOF