/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