import cgi
from lxml.html import document_fromstring
+import os
import re
+import shutil
import subprocess
import sys
import urllib
+urllib.URLopener.version = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
+
fmt_quality = [
(38, ".mp4"), # 4096x3072
(37, ".mp4"), # 1920x1080
(17, ".3gp"), # 176x144
]
+
def print_form(url="", msg=""):
print "Content-Type: application/xhtml+xml\r\n\r\n"
print """
for fmt, extension in fmt_quality:
try:
video_url = fmt_url_map[fmt]
- return video_url, extension
break
except KeyError:
continue
- return None, None
+ else:
+ return None, None, None
-def print_filename_header(doc, extension):
title = doc.xpath("/html/head/title/text()")[0]
title = re.sub("\s+", " ", title.strip())
- valid_chars = frozenset("\\/-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
+ valid_chars = frozenset("-_.() abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
filename = "".join(c for c in title.encode("ascii", "ignore") if c in valid_chars)
filename += extension
- sys.stdout.write("Content-Disposition: attachment; filename=\"%s\"\r\n" % filename)
-
-def print_stream_file(video_url, silent=True):
- cmd = [
- "curl",
- "--user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
- "--include",
- video_url,
- ]
- if silent:
- cmd.insert(1, "--silent")
- p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
- block = 32768
- data = p.stdout.read(block)
- data = data[data.find("\n")+1:]
- sys.stdout.write(data)
- while len(data) > 0:
- data = p.stdout.read(block)
- sys.stdout.write(data)
- p.wait()
+ return video_url, filename
-def main():
+def cgimain():
args = cgi.parse()
try:
url = args["url"][0]
try:
doc = parse_url(url)
- video_url, extension = get_video_url(doc)
- print_filename_header(doc, extension)
- print_stream_file(video_url, silent=True)
+ video_url, filename = get_video_url(doc)
+ data = urllib.urlopen(video_url)
+ httpinfo = data.info()
+ sys.stdout.write("Content-Disposition: attachment; filename=\"%s\"\r\n" % filename)
+ sys.stdout.write("Content-Length: %s\r\n" % httpinfo.getheader("Content-Length"))
+ sys.stdout.write("\r\n")
+ shutil.copyfileobj(data, sys.stdout)
+ data.close()
except Exception, e:
print_form(
url=url,
)
return
+def main():
+ try:
+ url = sys.argv[1]
+ except:
+ print >>sys.stderr, "Usage: %s http://youtube.com/watch?v=FOOBAR" % sys.argv[0]
+ sys.exit(1)
+ doc = parse_url(url)
+ video_url, filename = get_video_url(doc)
+ data = urllib.urlopen(video_url)
+ outfile = open(filename, "w")
+ shutil.copyfileobj(data, outfile)
+ data.close()
+ outfile.close()
+
+
if __name__ == "__main__":
- main()
+ if os.environ.has_key("SCRIPT_NAME"):
+ cgimain()
+ else:
+ main()