📄 download_bt1.py
字号:
def _reqmorefunc(self, pieces):
self.downloader.requeue_piece_download(pieces)
def startEngine(self, ratelimiter = None, statusfunc = None):
if self.doneflag.isSet():
return False
if not statusfunc:
statusfunc = self.statusfunc
self.checking = False
for i in xrange(self.len_pieces):
if self.storagewrapper.do_I_have(i):
self.picker.complete(i)
self.upmeasure = Measure(self.config['max_rate_period'],
self.config['upload_rate_fudge'])
self.downmeasure = Measure(self.config['max_rate_period'])
if ratelimiter:
self.ratelimiter = ratelimiter
else:
self.ratelimiter = RateLimiter(self.rawserver.add_task,
self.config['upload_unit_size'],
self.setConns)
self.ratelimiter.set_upload_rate(self.config['max_upload_rate'])
self.ratemeasure = RateMeasure()
self.ratemeasure_datarejected = self.ratemeasure.data_rejected
self.downloader = Downloader(self.storagewrapper, self.picker,
self.config['request_backlog'], self.config['max_rate_period'],
self.len_pieces, self.config['download_slice_size'],
self._received_data, self.config['snub_time'], self.config['auto_kick'],
self._kick_peer, self._ban_peer)
self.downloader.set_download_rate(self.config['max_download_rate'])
self.connecter = Connecter(self._make_upload, self.downloader, self.choker,
self.len_pieces, self.upmeasure, self.config,
self.ratelimiter, self.rawserver.add_task)
self.encoder = Encoder(self.connecter, self.rawserver,
self.myid, self.config['max_message_length'], self.rawserver.add_task,
self.config['keepalive_interval'], self.infohash,
self._received_raw_data, self.config)
self.encoder_ban = self.encoder.ban
self.httpdownloader = HTTPDownloader(self.storagewrapper, self.picker,
self.rawserver, self.finflag, self.errorfunc, self.downloader,
self.config['max_rate_period'], self.infohash, self._received_http_data,
self.connecter.got_piece)
if self.response.has_key('httpseeds') and not self.finflag.isSet():
for u in self.response['httpseeds']:
self.httpdownloader.make_download(u)
if self.selector_enabled:
self.fileselector.tie_in(self.picker, self._cancelfunc, self._reqmorefunc)
if self.priority:
self.fileselector.set_priorities_now(self.priority)
self.appdataobj.deleteTorrentData(self.infohash)
# erase old data once you've started modifying it
self.started = True
return True
def rerequest_complete(self):
if self.rerequest:
self.rerequest.announce(1)
def rerequest_stopped(self):
if self.rerequest:
self.rerequest.announce(2)
def rerequest_lastfailed(self):
if self.rerequest:
return self.rerequest.last_failed
return False
def startRerequester(self):
if self.response.has_key('announce-list'):
trackerlist = self.response['announce-list']
else:
trackerlist = [[self.response['announce']]]
self.rerequest = Rerequester(trackerlist, self.config['rerequest_interval'],
self.rawserver.add_task, self.connecter.how_many_connections,
self.config['min_peers'], self.encoder.start_connections,
self.rawserver.add_task, self.storagewrapper.get_amount_left,
self.upmeasure.get_total, self.downmeasure.get_total, self.port, self.config['ip'],
self.myid, self.infohash, self.config['http_timeout'],
self.errorfunc, self.excfunc, self.config['max_initiate'],
self.doneflag, self.upmeasure.get_rate, self.downmeasure.get_rate,
self.unpauseflag)
self.rerequest.start()
def _init_stats(self):
self.statistics = Statistics(self.upmeasure, self.downmeasure,
self.connecter, self.httpdownloader, self.ratelimiter,
self.rerequest_lastfailed, self.filedatflag)
if self.info.has_key('files'):
self.statistics.set_dirstats(self.files, self.info['piece length'])
if self.config['spew']:
self.spewflag.set()
def autoStats(self, displayfunc = None):
if not displayfunc:
displayfunc = self.statusfunc
self._init_stats()
DownloaderFeedback(self.choker, self.httpdownloader, self.rawserver.add_task,
self.upmeasure.get_rate, self.downmeasure.get_rate,
self.ratemeasure, self.storagewrapper.get_stats,
self.datalength, self.finflag, self.spewflag, self.statistics,
displayfunc, self.config['display_interval'])
def startStats(self):
self._init_stats()
d = DownloaderFeedback(self.choker, self.httpdownloader, self.rawserver.add_task,
self.upmeasure.get_rate, self.downmeasure.get_rate,
self.ratemeasure, self.storagewrapper.get_stats,
self.datalength, self.finflag, self.spewflag, self.statistics)
return d.gather
def getPortHandler(self):
return self.encoder
def shutdown(self, torrentdata = {}):
if self.checking or self.started:
self.storagewrapper.sync()
self.storage.close()
self.rerequest_stopped()
if self.fileselector and self.started:
if not self.failed:
self.fileselector.finish()
torrentdata['resume data'] = self.fileselector.pickle()
try:
self.appdataobj.writeTorrentData(self.infohash, torrentdata)
except:
self.appdataobj.deleteTorrentData(self.infohash) # clear it
return not self.failed and not self.excflag.isSet()
# if returns false, you may wish to auto-restart the torrent
def setUploadRate(self, rate):
try:
def s(self = self, rate = rate):
self.config['max_upload_rate'] = rate
self.ratelimiter.set_upload_rate(rate)
self.rawserver.add_task(s)
except AttributeError:
pass
def setConns(self, conns, conns2 = None):
if not conns2:
conns2 = conns
try:
def s(self = self, conns = conns, conns2 = conns2):
self.config['min_uploads'] = conns
self.config['max_uploads'] = conns2
if (conns > 30):
self.config['max_initiate'] = conns + 10
self.rawserver.add_task(s)
except AttributeError:
pass
def setDownloadRate(self, rate):
try:
def s(self = self, rate = rate):
self.config['max_download_rate'] = rate
self.downloader.set_download_rate(rate)
self.rawserver.add_task(s)
except AttributeError:
pass
def startConnection(self, ip, port, id):
self.encoder._start_connection((ip, port), id)
def _startConnection(self, ipandport, id):
self.encoder._start_connection(ipandport, id)
def setInitiate(self, initiate):
try:
def s(self = self, initiate = initiate):
self.config['max_initiate'] = initiate
self.rawserver.add_task(s)
except AttributeError:
pass
def getConfig(self):
return self.config
def getDefaults(self):
return defaultargs(defaults)
def getUsageText(self):
return self.argslistheader
def reannounce(self, special = None):
try:
def r(self = self, special = special):
if special is None:
self.rerequest.announce()
else:
self.rerequest.announce(specialurl = special)
self.rawserver.add_task(r)
except AttributeError:
pass
def getResponse(self):
try:
return self.response
except:
return None
# def Pause(self):
# try:
# if self.storagewrapper:
# self.rawserver.add_task(self._pausemaker, 0)
# except:
# return False
# self.unpauseflag.clear()
# return True
#
# def _pausemaker(self):
# self.whenpaused = clock()
# self.unpauseflag.wait() # sticks a monkey wrench in the main thread
#
# def Unpause(self):
# self.unpauseflag.set()
# if self.whenpaused and clock()-self.whenpaused > 60:
# def r(self = self):
# self.rerequest.announce(3) # rerequest automatically if paused for >60 seconds
# self.rawserver.add_task(r)
def Pause(self):
if not self.storagewrapper:
return False
self.unpauseflag.clear()
self.rawserver.add_task(self.onPause)
return True
def onPause(self):
self.whenpaused = clock()
if not self.downloader:
return
self.downloader.pause(True)
self.encoder.pause(True)
self.choker.pause(True)
def Unpause(self):
self.unpauseflag.set()
self.rawserver.add_task(self.onUnpause)
def onUnpause(self):
if not self.downloader:
return
self.downloader.pause(False)
self.encoder.pause(False)
self.choker.pause(False)
if self.rerequest and self.whenpaused and clock()-self.whenpaused > 60:
self.rerequest.announce(3) # rerequest automatically if paused for >60 seconds
def set_super_seed(self):
self.superseedflag.set()
self.rawserver.add_task(self._set_super_seed)
def _set_super_seed(self):
if not self.super_seeding_active and self.finflag.isSet():
self.super_seeding_active = True
self.errorfunc(' ** SUPER-SEED OPERATION ACTIVE **\n' +
' please set Max uploads so each peer gets 6-8 kB/s')
def s(self = self):
self.downloader.set_super_seed()
self.choker.set_super_seed()
self.rawserver.add_task(s)
if self.finflag.isSet(): # mode started when already finished
def r(self = self):
self.rerequest.announce(3) # so after kicking everyone off, reannounce
self.rawserver.add_task(r)
def am_I_finished(self):
return self.finflag.isSet()
def get_transfer_stats(self):
return self.upmeasure.get_total(), self.downmeasure.get_total()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -