]> code.delx.au - youtube-cgi/blobdiff - youtube.cgi
better command line downloader
[youtube-cgi] / youtube.cgi
index 17fcf1697b517ec053abb2ff98a6dfd74202ea93..283e69233b5efc4860482bdaa9f39a4720a6fed4 100755 (executable)
@@ -1,5 +1,7 @@
 #!/usr/bin/env python
 
+from __future__ import division
+
 import cookielib
 import cgi
 import itertools
@@ -27,6 +29,8 @@ MIMETYPES = {
 }
 
 QUALITIES = {
+       "hd1080": 5,
+       "hd720": 4,
        "large": 3,
        "medium": 2,
        "small": 1,
@@ -218,7 +222,16 @@ def copy_with_progress(total_size, infile, outfile):
                        if size < 1024:
                                break
                        size /= 1024
-               return "%d %s" % (size, suffix)
+               return "%.2f %s" % (size, suffix)
+
+       def print_status():
+               sys.stdout.write("\33[2K\r")
+               sys.stdout.write("%s / %s (%s/sec)" % (
+                       pp_size(bytes_read),
+                       pp_size(total_size),
+                       pp_size(bytes_read / (now - start_ts)),
+               ))
+               sys.stdout.flush()
 
        start_ts = time.time()
        last_ts = 0
@@ -227,13 +240,7 @@ def copy_with_progress(total_size, infile, outfile):
                now = time.time()
                if now - last_ts > 0.5:
                        last_ts = now
-                       sys.stdout.write("\33[2K\r")
-                       sys.stdout.write("%s / %s (%s/sec)" % (
-                               pp_size(bytes_read),
-                               pp_size(total_size),
-                               pp_size(bytes_read / (now - start_ts)),
-                       ))
-                       sys.stdout.flush()
+                       print_status()
 
                buf = infile.read(32768)
                if not buf:
@@ -241,6 +248,10 @@ def copy_with_progress(total_size, infile, outfile):
                outfile.write(buf)
                bytes_read += len(buf)
 
+       # Newline at the end
+       print_status()
+       print
+
 def main():
        try:
                url = sys.argv[1]
@@ -250,6 +261,9 @@ def main():
        doc = parse_url(url)
        video_url, filename = get_video_url(doc)
        video_data = urlopen(video_url)
+       if os.path.isfile(filename):
+               print >>sys.stderr, "Error! File exists:", filename
+               sys.exit(1)
        outfile = open(filename, "w")
        total_size = int(video_data.info().getheader("Content-Length"))
        print "Downloading", filename.encode("utf-8")