亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? torrentqueue.py

?? BT的原代碼
?? PY
?? 第 1 頁 / 共 2 頁
字號:
            if t.finishtime > mintime:                if t.uptotal < t.downtotal * minratio:                    continue            self.change_torrent_state(infohash, RUNNING, KNOWN)            break        if self.running_torrents and self.last_save_time < now - 300:            self._dump_state()    def _check_queue(self):        if self.starting_torrent is not None or self.config['pause']:            return        for infohash in self.running_torrents:            if self.torrents[infohash].state == RUN_QUEUED:                self.starting_torrent = infohash                t = self.torrents[infohash]                t.state = RUNNING                t.finishtime = None                t.dl = self.multitorrent.start_torrent(t.metainfo, self.config,                                                       self, t.dlpath)                return        if not self.queue or len(self.running_torrents) >= \               self.config['def_running_torrents']:            return        infohash = self.queue.pop(0)        self.starting_torrent = infohash        t = self.torrents[infohash]        assert t.state == QUEUED        t.state = RUNNING        t.finishtime = None        self.running_torrents.append(infohash)        t.dl = self.multitorrent.start_torrent(t.metainfo, self.config, self,                                               t.dlpath)        self._send_state(infohash)    def _send_state(self, infohash):        t = self.torrents[infohash]        state = t.state        if state == RUN_QUEUED:            state = RUNNING        pos = None        if state in (KNOWN, RUNNING, QUEUED):            l = self._get_list(state)            if l[-1] != infohash:                pos = l.index(infohash)        self.run_ui_task(self.ui.torrent_state_changed, infohash, state,                        t.completion, t.uptotal_old, t.downtotal_old, pos)    def _stop_running(self, infohash):        t = self.torrents[infohash]        if t.state == RUN_QUEUED:            self.running_torrents.remove(infohash)            t.state = KNOWN            return True        assert t.state == RUNNING        t.dl.shutdown()        if infohash == self.starting_torrent:            self.starting_torrent = None        try:            self.running_torrents.remove(infohash)        except ValueError:            self.other_torrents.remove(infohash)            return False        else:            t.state = KNOWN            totals = t.dl.get_total_transfer()            t.uptotal_old += totals[0]            t.uptotal = t.uptotal_old            t.downtotal_old += totals[1]            t.downtotal = t.downtotal_old            t.dl = None            t.completion = self.multitorrent.get_completion(self.config,                                               t.metainfo, t.dlpath)            return True    def external_command(self, action, data):        if action == 'start_torrent':            self.start_new_torrent(data)        elif action == 'show_error':            self.global_error(ERROR, data)        elif action == 'no-op':            pass    def remove_torrent(self, infohash):        if infohash not in self.torrents:            return        state = self.torrents[infohash].state        if state == QUEUED:            self.queue.remove(infohash)        elif state in (RUNNING, RUN_QUEUED):            self._stop_running(infohash)            self._check_queue()        else:            self.other_torrents.remove(infohash)        self.run_ui_task(self.ui.removed_torrent, infohash)        del self.torrents[infohash]        filename = os.path.join(self.config['data_dir'], 'metainfo',                                infohash.encode('hex'))        try:            os.remove(filename)        except Exception, e:            self.global_error(WARNING, 'Could not delete cached metainfo file:'                              + str(e))        self._dump_state()    def set_save_location(self, infohash, dlpath):        torrent = self.torrents.get(infohash)        if torrent is None or torrent.state == RUNNING:            return        torrent.dlpath = dlpath        torrent.completion = self.multitorrent.get_completion(self.config,                                                   torrent.metainfo, dlpath)        if torrent.state == ASKING_LOCATION:            torrent.state = KNOWN            self.change_torrent_state(infohash, KNOWN, QUEUED)        else:            self._send_state(infohash)            self._dump_state()    def start_new_torrent(self, data):        t = TorrentInfo()        try:            t.metainfo = ConvertedMetainfo(bdecode(data))        except Exception, e:            self.global_error(ERROR, "This is not a valid torrent file. (%s)"                              % str(e))            return        infohash = t.metainfo.infohash        if infohash in self.torrents:            self.error(t.metainfo, ERROR, "A torrent with the same contents "                       "(infohash) is already open. Cannot start another.")            return        path = os.path.join(self.config['data_dir'], 'metainfo',                            infohash.encode('hex'))        try:            f = file(path, 'wb')            f.write(data)            f.close()        except Exception, e:            try:                f.close()            except:                pass            self.global_error(ERROR, 'Could not write file '+path+' ('+str(e)+                              '), torrent will not be restarted correctly on '                              'client restart')        self.torrents[infohash] = t        t.state = ASKING_LOCATION        self.other_torrents.append(infohash)        self._dump_state()        self.run_ui_task(self.ui.new_displayed_torrent, infohash,                         t.metainfo, None, ASKING_LOCATION)        def show_error(level, text):            self.run_ui_task(self.ui.error, infohash, level, text)        t.metainfo.show_encoding_errors(show_error)    def set_config(self, option, value):        if option not in self.config:            return        oldvalue = self.config[option]        self.config[option] = value        if option == 'pause':            if value and not oldvalue:                self.set_zero_running_torrents()            elif not value and oldvalue:                self._check_queue()        else:            self.multitorrent.set_option(option, value)            for infohash in list(self.running_torrents):                torrent = self.torrents[infohash]                if torrent.state == RUNNING:                    torrent.dl.set_option(option, value)                    if option in ('forwarded_port', 'maxport'):                        torrent.dl.change_port()        self._dump_config()    def request_status(self, infohash, want_spew, want_fileinfo):        torrent = self.torrents.get(infohash)        if torrent is None or torrent.state != RUNNING:            return        status = torrent.dl.get_status(want_spew, want_fileinfo)        if torrent.finishtime is not None:            now = bttime()            uptotal = status['upTotal'] + torrent.uptotal_old            downtotal = status['downTotal'] + torrent.downtotal_old            ulspeed = status['upRate2']            if self.queue:                ratio = self.config['next_torrent_ratio'] / 100            else:                ratio = self.config['last_torrent_ratio'] / 100            if ratio <= 0 or ulspeed <= 0:                rem = 1e99            else:                rem = (downtotal * ratio - uptotal) / ulspeed            if self.queue:                rem = min(rem, torrent.finishtime +                          self.config['next_torrent_time'] * 60 - now)            rem = max(rem, torrent.finishtime + 120 - now)            if rem <= 0:                rem = 1            if rem == 1e99:                rem = None            status['timeEst'] = rem        self.run_ui_task(self.ui.update_status, infohash, status)    def _get_list(self, state):        if state == KNOWN:            return self.other_torrents        elif state == QUEUED:            return self.queue        elif state in (RUNNING, RUN_QUEUED):            return self.running_torrents        assert False    def change_torrent_state(self, infohash, oldstate, newstate=None,                     pred=None, succ=None, replaced=None, force_running=False):        self._check_version()        t = self.torrents.get(infohash)        if t is None or (t.state != oldstate and not (t.state == RUN_QUEUED and                                                      oldstate == RUNNING)):            return        if newstate is None:            newstate = oldstate        assert oldstate in (KNOWN, QUEUED, RUNNING)        assert newstate in (KNOWN, QUEUED, RUNNING)        pos = None        if oldstate != RUNNING and newstate == RUNNING and replaced is None:            if len(self.running_torrents) >= (force_running and self.config[               'max_running_torrents'] or self.config['def_running_torrents']):                if force_running:                    self.global_error(ERROR,                                      "Can't run more than %d torrents "\                                      "simultaneously. For more info see the"\                                      " FAQ at %s."%                                      (self.config['max_running_torrents'],                                       FAQ_URL))                newstate = QUEUED                pos = 0        l = self._get_list(newstate)        if newstate == oldstate:            origpos = l.index(infohash)            del l[origpos]            if pos is None:                pos = decode_position(l, pred, succ, -1)            if pos == -1 or l == origpos:                l.insert(origpos, infohash)                return            l.insert(pos, infohash)            self._dump_state()            self.run_ui_task(self.ui.reorder_torrent, infohash, pos)            return        if pos is None:            pos = decode_position(l, pred, succ)        if newstate == RUNNING:            newstate = RUN_QUEUED            if replaced and len(self.running_torrents) >= \               self.config['def_running_torrents']:                t2 = self.torrents.get(replaced)                if t2 is None or t2.state not in (RUNNING, RUN_QUEUED):                    return                if self.running_torrents.index(replaced) < pos:                    pos -= 1                if self._stop_running(replaced):                    t2.state = QUEUED                    self.queue.insert(0, replaced)                    self._send_state(replaced)                else:                    self.other_torrents.append(replaced)        if oldstate == RUNNING:            if newstate == QUEUED and len(self.running_torrents) <= \                   self.config['def_running_torrents'] and pos == 0:                return            if not self._stop_running(infohash):                if newstate == KNOWN:                    self.other_torrents.insert(pos, infohash)                    self.run_ui_task(self.ui.reorder_torrent, infohash, pos)                else:                    self.other_torrents.append(infohash)                return        else:            self._get_list(oldstate).remove(infohash)        t.state = newstate        l.insert(pos, infohash)        self._check_queue()  # sends state if it starts the torrent from queue        if t.state != RUNNING or newstate == RUN_QUEUED:            self._send_state(infohash)        self._dump_state()    def set_zero_running_torrents(self):        newrun = []        for infohash in list(self.running_torrents):            t = self.torrents[infohash]            if self._stop_running(infohash):                newrun.append(infohash)                t.state = RUN_QUEUED            else:                self.other_torrents.append(infohash)        self.running_torrents = newrun    def check_completion(self, infohash, filelist=False):        t = self.torrents.get(infohash)        if t is None:            return        r = self.multitorrent.get_completion(self.config, t.metainfo,                                             t.dlpath, filelist)        if r is None or not filelist:            self.run_ui_task(self.ui.update_completion, infohash, r)        else:            self.run_ui_task(self.ui.update_completion, infohash, *r)    def global_error(self, level, text):        self.run_ui_task(self.ui.global_error, level, text)    # callbacks from torrent instances    def failed(self, torrent, is_external):        infohash = torrent.infohash        if infohash == self.starting_torrent:            self.starting_torrent = None        self.running_torrents.remove(infohash)        t = self.torrents[infohash]        t.state = KNOWN        if is_external:            t.completion = self.multitorrent.get_completion(                self.config, t.metainfo, t.dlpath)        else:            t.completion = None        totals = t.dl.get_total_transfer()        t.uptotal_old += totals[0]        t.uptotal = t.uptotal_old        t.downtotal_old += totals[1]        t.downtotal = t.downtotal_old        t.dl = None        self.other_torrents.append(infohash)        self._send_state(infohash)        if not self.doneflag.isSet():            self._check_queue()            self._dump_state()    def finished(self, torrent):        infohash = torrent.infohash        if infohash == self.starting_torrent:            t = self.torrents[infohash]            if self.queue:                ratio = self.config['next_torrent_ratio'] / 100            else:                ratio = self.config['last_torrent_ratio'] / 100            if ratio and t.uptotal >= t.downtotal * ratio:                raise BTShutdown("Not starting torrent as it already meets "                               "the current settings for when to stop seeding")        self.torrents[torrent.infohash].finishtime = bttime()    def started(self, torrent):        infohash = torrent.infohash        assert infohash == self.starting_torrent        self.starting_torrent = None        self._check_queue()    def error(self, torrent, level, text):        self.run_ui_task(self.ui.error, torrent.infohash, level, text)class ThreadWrappedQueue(object):    def __init__(self, wrapped):        self.wrapped = wrapped    def set_done(self):        self.wrapped.doneflag.set()        # add a dummy task to make sure the thread wakes up and notices flag        def dummy():            pass        self.wrapped.rawserver.external_add_task(dummy, 0)def _makemethod(methodname):    def wrapper(self, *args, **kws):        def f():            getattr(self.wrapped, methodname)(*args, **kws)        self.wrapped.rawserver.external_add_task(f, 0)    return wrapperfor methodname in "request_status set_config start_new_torrent remove_torrent set_save_location change_torrent_state check_completion".split():    setattr(ThreadWrappedQueue, methodname, _makemethod(methodname))del _makemethod, methodname

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级在线观看| 亚洲啪啪综合av一区二区三区| 天天综合色天天综合| 欧美三级视频在线| 亚洲大尺度视频在线观看| 欧美日韩情趣电影| 蜜臀91精品一区二区三区 | 欧美一区日韩一区| 日韩av一二三| 欧美精品一区二区蜜臀亚洲| 成人午夜电影久久影院| 中文字幕欧美一区| 欧美性感一类影片在线播放| 美女久久久精品| 国产日韩在线不卡| 色哟哟一区二区| 日日夜夜精品视频免费| 久久午夜电影网| 91无套直看片红桃| 日韩电影免费在线| 亚洲国产成人一区二区三区| 日本道精品一区二区三区| 日本成人在线视频网站| 国产亚洲欧洲一区高清在线观看| 96av麻豆蜜桃一区二区| 三级不卡在线观看| 国产精品丝袜一区| 4438x成人网最大色成网站| 国产在线不卡一区| 一级特黄大欧美久久久| 精品国精品自拍自在线| 99精品欧美一区二区三区小说| 亚洲一区二区视频在线| 久久久精品日韩欧美| 欧美日韩一区不卡| 国产麻豆视频一区| 亚洲va韩国va欧美va精品| 久久久www免费人成精品| 欧美亚洲国产一区在线观看网站| 精品制服美女丁香| 亚洲二区在线观看| 中文字幕日韩一区| 精品蜜桃在线看| 91色在线porny| 极品尤物av久久免费看| 亚洲国产精品久久一线不卡| 久久久久久一二三区| 欧美卡1卡2卡| 色狠狠av一区二区三区| 国产一区二区网址| 天堂蜜桃91精品| 亚洲女同女同女同女同女同69| 日韩欧美一区在线观看| 欧美亚洲另类激情小说| 播五月开心婷婷综合| 极品少妇xxxx偷拍精品少妇| 丝袜亚洲另类丝袜在线| 一区二区三区四区激情| 中文子幕无线码一区tr| 精品福利二区三区| 欧美一区二区久久久| 欧美色图免费看| 91社区在线播放| av一区二区不卡| 国产91在线|亚洲| 国产精品69久久久久水密桃| 久久国产精品露脸对白| 日韩国产欧美三级| 午夜久久久影院| 亚洲一区二区在线免费观看视频| 国产精品久久久久久久久搜平片 | 北条麻妃国产九九精品视频| 国产呦萝稀缺另类资源| 免费成人在线观看| 日韩精品久久久久久| 亚洲一区二区视频在线| 亚洲自拍偷拍麻豆| 亚洲狠狠爱一区二区三区| 亚洲一区二区欧美激情| 亚洲视频1区2区| 一区二区三区中文字幕精品精品 | 一区二区激情视频| 亚洲人成7777| 亚洲免费电影在线| 亚洲精品国产高清久久伦理二区| 亚洲婷婷综合色高清在线| 日韩毛片高清在线播放| 一区二区三区精品| 天天色 色综合| 男人的j进女人的j一区| 精品午夜久久福利影院| 粉嫩av亚洲一区二区图片| www.爱久久.com| 色爱区综合激月婷婷| 欧美中文一区二区三区| 911精品国产一区二区在线| 欧美一区二区三区成人| 日韩一卡二卡三卡| 国产校园另类小说区| 1000精品久久久久久久久| 一区二区三区成人在线视频| 天天综合天天做天天综合| 久久成人免费日本黄色| 成人听书哪个软件好| 日本久久精品电影| 欧美一区二区三区在线电影| 亚洲精品在线一区二区| 中文字幕五月欧美| 亚洲成年人网站在线观看| 久久99久久久久| 成人午夜伦理影院| 欧美日韩久久不卡| 久久精品一二三| 一区二区欧美国产| 极品少妇xxxx精品少妇偷拍| 大白屁股一区二区视频| 欧美在线你懂得| 久久只精品国产| 亚洲精品老司机| 久久精品国产亚洲5555| 91在线视频免费观看| 日韩欧美自拍偷拍| 中文字幕亚洲综合久久菠萝蜜| 天天做天天摸天天爽国产一区 | 精品视频999| 久久新电视剧免费观看| 一区二区不卡在线播放 | 亚洲在线观看免费| 国产美女久久久久| 欧美中文字幕亚洲一区二区va在线 | 日韩欧美一区二区不卡| 中文字幕一区二区三区四区 | 国产综合色精品一区二区三区| 波多野结衣中文字幕一区二区三区| 欧美无砖砖区免费| 国产精品嫩草影院com| 美女视频网站久久| 欧美色图一区二区三区| 国产精品私房写真福利视频| 麻豆91在线看| 欧美三片在线视频观看| 自拍偷拍亚洲欧美日韩| 国产精品一区二区三区乱码 | 日本成人中文字幕| 在线观看91精品国产入口| 中文在线一区二区| 国产一区二区三区久久悠悠色av| 欧美日韩电影在线播放| 亚洲欧洲综合另类在线| 成人美女在线观看| 久久久影视传媒| 蜜臂av日日欢夜夜爽一区| 在线观看欧美黄色| 亚洲另类在线视频| 成人av片在线观看| 欧美激情中文字幕一区二区| 美女被吸乳得到大胸91| 精品视频色一区| 亚洲国产另类av| 欧美午夜精品久久久久久超碰| 亚洲色图第一区| 96av麻豆蜜桃一区二区| 国产精品免费视频一区| 高清不卡在线观看| 日本一区二区三区国色天香| 国产精品自拍一区| 久久久久久久久久久久电影 | 91福利在线看| 亚洲一二三区不卡| 欧美日韩五月天| 亚洲国产一区二区三区| 欧美在线观看一区二区| 一区二区三区精品视频在线| 日本韩国精品一区二区在线观看| 亚洲少妇30p| 欧美自拍偷拍一区| 图片区小说区区亚洲影院| 91精品国产综合久久久蜜臀图片 | 日本不卡123| 精品sm在线观看| 国产精品18久久久久久久久久久久 | 制服丝袜亚洲精品中文字幕| 亚洲成a人片在线不卡一二三区| 欧美视频一区二区三区在线观看| 亚洲成人一二三| 日韩一二在线观看| 国产在线播放一区三区四| 国产亚洲精品7777| 91蜜桃免费观看视频| 亚洲在线观看免费| 欧美一区二区在线观看| 国产一区二区三区| 国产精品电影院| 欧美性猛交xxxx乱大交退制版| 日韩中文字幕91| 久久亚洲欧美国产精品乐播| 成人禁用看黄a在线| 亚洲国产中文字幕| 精品欧美乱码久久久久久1区2区| 丁香一区二区三区|