Skip to content

Instantly share code, notes, and snippets.

@dopuskh3
Created April 30, 2010 16:29
Show Gist options
  • Save dopuskh3/385439 to your computer and use it in GitHub Desktop.
Save dopuskh3/385439 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
import sys
import urllib2
import datetime
import time
import socket
import logging
from threading import Thread
socket.setdefaulttimeout(10000)
class WatcherThread(Thread):
def __init__(self, size):
Thread.__init__(self)
self.size = size
self.fetched = 1
self.bstop = False
self.start_time = time.time()
def run(self):
while not self.bstop:
progress_bar = "=" * int(((float(self.fetched) / float(self.size)) * 60))
spaces = " "* (60 - len(progress_bar))
percent = float(self.fetched) / float(self.size) * 100.0
elapsed = time.time() - self.start_time
v = float(self.fetched / elapsed)
t = (self.size - self.fetched) / v
eta = str(datetime.timedelta(seconds = t))
print "\r["+progress_bar+">"+spaces+"] %8sk/%8sk %f%% ETA %s "%(str(self.fetched/1024), str(self.size/1024), percent, eta),
time.sleep(1)
sys.stdout.flush()
def stop(self):
self.bstop = True
class BigFileDownloader(object):
def __init__(self, url, file):
self.packet_size = 128
self.urlopener = urllib2.build_opener()
self.url = url
self.file = file
def download(self):
try:
request = urllib2.Request(self.url)
fout = open(self.file, "wb")
datafd = self.urlopener.open(request)
totalsize = int(datafd.headers.get("content-length"))*8
wt = WatcherThread(totalsize)
wt.start()
while True:
data = datafd.read(self.packet_size)
if not data:
break
fout.write(data)
wt.fetched += self.packet_size*8
wt.stop()
wt.join()
fout.close()
except (KeyboardInterrupt, SystemExit):
wt.stop()
wt.join()
except Exception, e:
logging.critical("Cannot download %s"%str(e))
wt.stop()
wt.join()
if __name__ == "__main__":
bd = BigFileDownloader('http://debian.mirror.inra.fr/debian-cd/5.0.3/ia64/iso-cd/debian-503-ia64-netinst.iso', 'out.iso')
bd.download()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment