1 theshadow 1.1 #!/usr/bin/env python
2
3 # Written by Bram Cohen
4 # see LICENSE.txt for license information
5
6 from BitTorrent.download import download
7 from threading import Event
8 from os.path import abspath
9 from sys import argv, version, stdout
10 assert version >= '2', "Install Python 2.0 or greater"
11 true = 1
12 false = 0
13
14 def hours(n):
15 if n == -1:
16 return '<unknown>'
17 if n == 0:
18 return 'complete!'
19 n = int(n)
20 h, r = divmod(n, 60 * 60)
21 m, sec = divmod(r, 60)
22 theshadow 1.1 if h > 1000000:
23 return '<unknown>'
24 if h > 0:
25 return '%d hour %02d min %02d sec' % (h, m, sec)
26 else:
27 return '%d min %02d sec' % (m, sec)
28
29 class HeadlessDisplayer:
30 def __init__(self):
31 self.done = false
32 self.file = ''
33 self.percentDone = ''
34 self.timeEst = ''
35 self.downloadTo = ''
36 self.downRate = ''
37 self.upRate = ''
38 self.errors = []
39
40 def finished(self):
41 self.done = true
42 self.percentDone = '100'
43 theshadow 1.1 self.timeEst = 'Download Succeeded!'
44 self.downRate = ''
45 self.display()
46
47 def failed(self):
48 self.done = true
49 self.percentDone = '0'
50 self.timeEst = 'Download Failed!'
51 self.downRate = ''
52 self.display()
53
54 def error(self, errormsg):
55 self.errors.append(errormsg)
56 self.display()
57
58 def display(self, fractionDone = None, timeEst = None,
59 downRate = None, upRate = None, activity = None):
60 if fractionDone is not None:
61 self.percentDone = str(float(int(fractionDone * 1000)) / 10)
62 if timeEst is not None:
63 self.timeEst = hours(timeEst)
64 theshadow 1.1 if activity is not None and not self.done:
65 self.timeEst = activity
66 if downRate is not None:
67 self.downRate = '%.0f kB/s' % (float(downRate) / (1 << 10))
68 if upRate is not None:
69 self.upRate = '%.0f kB/s' % (float(upRate) / (1 << 10))
70 print '\n\n\n\n'
71 for err in self.errors:
72 print 'ERROR:\n' + err + '\n'
73 print 'saving: ', self.file
74 print 'percent done: ', self.percentDone
75 print 'time left: ', self.timeEst
76 print 'download to: ', self.downloadTo
77 print 'download rate: ', self.downRate
78 print 'upload rate: ', self.upRate
79 stdout.flush()
80
81 def chooseFile(self, default, size, saveas, dir):
82 self.file = '%s (%.1f MB)' % (default, float(size) / (1 << 20))
83 if saveas != '':
84 default = saveas
85 theshadow 1.1 self.downloadTo = abspath(default)
86 return default
87
88 def newpath(self, path):
89 self.downloadTo = path
90
91 def run(params):
92 try:
93 import curses
94 curses.initscr()
95 cols = curses.COLS
96 curses.endwin()
97 except:
98 cols = 80
99
100 h = HeadlessDisplayer()
101 download(params, h.chooseFile, h.display, h.finished, h.error, Event(), cols, h.newpath)
102 if not h.done:
103 h.failed()
104
105 if __name__ == '__main__':
106 theshadow 1.1 run(argv[1:])
|