]> code.delx.au - monosys/blobdiff - scripts/youtube.cgi
Added SBS downloader
[monosys] / scripts / youtube.cgi
index de74b4782831bcc9daa1f7a8fbfc1c414b61c6fc..a5d63d294947157498e24bf1a6ce78f985472d98 100755 (executable)
@@ -2,12 +2,16 @@
 
 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
@@ -21,6 +25,7 @@ fmt_quality = [
        (17, ".3gp"),  # 176x144
 ]
 
+
 def print_form(url="", msg=""):
        print "Content-Type: application/xhtml+xml\r\n\r\n"
        print """
@@ -73,41 +78,21 @@ def get_video_url(doc):
        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]
@@ -117,9 +102,14 @@ def main():
 
        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,
@@ -127,6 +117,24 @@ def main():
                )
                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()