download_bt1.py
来自「这是一个嵌入式linux系统下的命令工具包」· Python 代码 · 共 883 行 · 第 1/3 页
PY
883 行
except: pass try: try: response = bdecode(response) except: errorfunc("warning: bad data in responsefile") response = bdecode(response, sloppy=1) check_message(response) except ValueError, e: errorfunc("got bad file info - " + str(e)) return None return responseclass BT1Download: def __init__(self, statusfunc, finfunc, errorfunc, excfunc, doneflag, config, response, infohash, id, rawserver, port, appdataobj = None): self.statusfunc = statusfunc self.finfunc = finfunc self.errorfunc = errorfunc self.excfunc = excfunc self.doneflag = doneflag self.config = config self.response = response self.infohash = infohash self.myid = id self.rawserver = rawserver self.port = port self.info = self.response['info'] self.pieces = [self.info['pieces'][x:x+20] for x in xrange(0, len(self.info['pieces']), 20)] self.len_pieces = len(self.pieces) self.argslistheader = argslistheader self.unpauseflag = Event() self.unpauseflag.set() self.downloader = None self.storagewrapper = None self.fileselector = None self.super_seeding_active = False self.filedatflag = Event() self.spewflag = Event() self.superseedflag = Event() self.whenpaused = None self.finflag = Event() self.rerequest = None self.tcp_ack_fudge = config['tcp_ack_fudge'] self.selector_enabled = config['selector_enabled'] if appdataobj: self.appdataobj = appdataobj elif self.selector_enabled: self.appdataobj = ConfigDir() self.appdataobj.deleteOldCacheData( config['expire_cache_data'], [self.infohash] ) self.excflag = self.rawserver.get_exception_flag() self.failed = False self.checking = False self.started = False self.picker = PiecePicker(self.len_pieces, config['rarest_first_cutoff'], config['rarest_first_priority_cutoff']) self.choker = Choker(config, rawserver.add_task, self.picker, self.finflag.isSet) def checkSaveLocation(self, loc): if self.info.has_key('length'): return path.exists(loc) for x in self.info['files']: if path.exists(path.join(loc, x['path'][0])): return True return False def saveAs(self, filefunc, pathfunc = None): try: def make(f, forcedir = False): if not forcedir: f = path.split(f)[0] if f != '' and not path.exists(f): makedirs(f) if self.info.has_key('length'): file_length = self.info['length'] file = filefunc(self.info['name'], file_length, self.config['saveas'], False) if file is None: return None make(file) files = [(file, file_length)] else: file_length = 0L for x in self.info['files']: file_length += x['length'] file = filefunc(self.info['name'], file_length, self.config['saveas'], True) if file is None: return None # if this path exists, and no files from the info dict exist, we assume it's a new download and # the user wants to create a new directory with the default name existing = 0 if path.exists(file): if not path.isdir(file): self.errorfunc(file + 'is not a dir') return None if len(listdir(file)) > 0: # if it's not empty for x in self.info['files']: if path.exists(path.join(file, x['path'][0])): existing = 1 if not existing: file = path.join(file, self.info['name']) if path.exists(file) and not path.isdir(file): if file[-8:] == '.torrent': file = file[:-8] if path.exists(file) and not path.isdir(file): self.errorfunc("Can't create dir - " + self.info['name']) return None make(file, True) # alert the UI to any possible change in path if pathfunc != None: pathfunc(file) files = [] for x in self.info['files']: n = file for i in x['path']: n = path.join(n, i) files.append((n, x['length'])) make(n) except OSError, e: self.errorfunc("Couldn't allocate dir - " + str(e)) return None self.filename = file self.files = files self.datalength = file_length return file def getFilename(self): return self.filename def _finished(self): self.finflag.set() try: self.storage.set_readonly() except (IOError, OSError), e: self.errorfunc('trouble setting readonly at end - ' + str(e)) if self.superseedflag.isSet(): self._set_super_seed() self.choker.set_round_robin_period( max( self.config['round_robin_period'], self.config['round_robin_period'] * self.info['piece length'] / 200000 ) ) self.rerequest_complete() self.finfunc() def _data_flunked(self, amount, index): self.ratemeasure_datarejected(amount) if not self.doneflag.isSet(): self.errorfunc('piece %d failed hash check, re-downloading it' % index) def _failed(self, reason): self.failed = True self.doneflag.set() if reason is not None: self.errorfunc(reason) def initFiles(self, old_style = False, statusfunc = None): if self.doneflag.isSet(): return None if not statusfunc: statusfunc = self.statusfunc disabled_files = None if self.selector_enabled: self.priority = self.config['priority'] if self.priority: try: self.priority = self.priority.split(',') assert len(self.priority) == len(self.files) self.priority = [int(p) for p in self.priority] for p in self.priority: assert p >= -1 assert p <= 2 except: self.errorfunc('bad priority list given, ignored') self.priority = None data = self.appdataobj.getTorrentData(self.infohash) try: d = data['resume data']['priority'] assert len(d) == len(self.files) disabled_files = [x == -1 for x in d] except: try: disabled_files = [x == -1 for x in self.priority] except: pass try: try: self.storage = Storage(self.files, self.info['piece length'], self.doneflag, self.config, disabled_files) except IOError, e: self.errorfunc('trouble accessing files - ' + str(e)) return None if self.doneflag.isSet(): return None self.storagewrapper = StorageWrapper(self.storage, self.config['download_slice_size'], self.pieces, self.info['piece length'], self._finished, self._failed, statusfunc, self.doneflag, self.config['check_hashes'], self._data_flunked, self.rawserver.add_task, self.config, self.unpauseflag) except ValueError, e: self._failed('bad data - ' + str(e)) except IOError, e: self._failed('IOError - ' + str(e)) if self.doneflag.isSet(): return None if self.selector_enabled: self.fileselector = FileSelector(self.files, self.info['piece length'], self.appdataobj.getPieceDir(self.infohash), self.storage, self.storagewrapper, self.rawserver.add_task, self._failed) if data: data = data.get('resume data') if data: self.fileselector.unpickle(data) self.checking = True if old_style: return self.storagewrapper.old_style_init() return self.storagewrapper.initialize def getCachedTorrentData(self): return self.appdataobj.getTorrentData(self.infohash) def _make_upload(self, connection, ratelimiter, totalup): return Upload(connection, ratelimiter, totalup, self.choker, self.storagewrapper, self.picker, self.config) def _kick_peer(self, connection): def k(connection = connection): connection.close() self.rawserver.add_task(k,0) def _ban_peer(self, ip): self.encoder_ban(ip) def _received_raw_data(self, x): if self.tcp_ack_fudge: x = int(x*self.tcp_ack_fudge) self.ratelimiter.adjust_sent(x)# self.upmeasure.update_rate(x) def _received_data(self, x): self.downmeasure.update_rate(x) self.ratemeasure.data_came_in(x) def _received_http_data(self, x): self.downmeasure.update_rate(x) self.ratemeasure.data_came_in(x) self.downloader.external_data_received(x) def _cancelfunc(self, pieces): self.downloader.cancel_piece_download(pieces) self.httpdownloader.cancel_piece_download(pieces) 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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?