⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abcengine.py

📁 BitTorrentABC-Linux-V.2.4.3源码
💻 PY
📖 第 1 页 / 共 2 页
字号:
from wxPython.wx import *
from wxPython import *
from BitTorrent.download import *
from BitTorrent.zurllib import urlopen
from threading import Event, Thread, Timer
from os.path import join
from os import getcwd
from time import strftime
from getscrapedata import getScrapeData

#from BitTorrent.bencode import *
#from BitTorrent.zurllib import urlopen
#from sha import sha
#import re


def hours(n):
    if n == -1:
        return '<unknown>'
    if n == 0:
        return ''
    n = int(n)
    h, r = divmod(n, 60 * 60)
    m, sec = divmod(r, 60)
    if h > 1000000:
        return '<unknown>'
    if h > 0:
        return '%d:%02d:%02d' % (h, m, sec)
    else:
        return '%02d:%02d' % (m, sec)

wxEVT_INVOKE = wxNewEventType()

def EVT_INVOKE(win, func):
    win.Connect(-1, -1, wxEVT_INVOKE, func)
    
def DELEVT_INVOKE(win):
    win.Disconnect(-1, -1, wxEVT_INVOKE)


    
class InvokeEvent(wxPyEvent):
    def __init__(self, func, args, kwargs):
        wxPyEvent.__init__(self)
        self.SetEventType(wxEVT_INVOKE)
        self.func = func
        self.args = args
        self.kwargs = kwargs


class ABCEngine(wxEvtHandler):
    def __init__(self, parent, listid, firsttime_flag, flag, prio, guiman, olddownsize, oldupsize):   #pos = map position of thread in CtrlList
        wxEvtHandler.__init__(self)
        self.guiman = guiman
        self.prio   = prio
        self.listid = listid
        self.parent = parent
        self.list   = parent.list
        self.firsttime_flag = firsttime_flag
        self.flag = flag
        self.errormsg = ""
        self.fileDestPath = ""
        self.fin = false
        self.iscancel = True
        self.config = None
        self.timer  = None
        self.shareratio = 0
        self.detailwin = None
        self.spewwait = time()
        self.superseed = false
        self.reannouncelast = 0
        self.lastexternalannounce = ''
        self.olddownsize = olddownsize
        self.oldupsize   = oldupsize
        self.newdownsize = 0
        self.newupsize   = 0
        self.lastgetscrape = 0            # V.2.3.1 add current, seed,peer display
        self.currentpeer = "0"
        self.currentseed = "0"
    
        EVT_INVOKE(self, self.onInvoke)

    def onInvoke(self, event):
        if not self.flag.isSet():
            event.func(*event.args, **event.kwargs)
    def invokeLater(self, func, args = [], kwargs = {}):
        if not self.flag.isSet():
            wxPostEvent(self, InvokeEvent(func, args, kwargs))

    def updateStatus(self, fractionDone = None,
            timeEst = None, downRate = None, upRate = None,
            activity = None, statistics = None, spew = None, sizeDone = None,
            **kws):
        self.invokeLater(self.onUpdateStatus, [fractionDone, timeEst, downRate, upRate, activity, statistics, spew, sizeDone])

    def getDownUpSize(self):
        return (self.olddownsize + self.newdownsize), (self.oldupsize + self.newupsize)
    
    def onUpdateStatus(self, fractionDone, timeEst, downRate, upRate, activity, statistics, spew, sizeDone):
            # V 2.3.1 add get scrape data every 20 minutes
            if (statistics is not None) and ((time() - self.lastgetscrape) > 1200):
                Thread(target = getScrapeData, args=[self.parent.getResponse(self.listid),
                                                     self]).start()
                   
                self.lastgetscrape = time()    

        
            for rank in range(0, self.guiman.getNumCol()):
                colid = self.guiman.getIDfromRank(rank)
                
                if  colid == 4   :  # Title
                    self.list.SetStringItem(self.listid, rank, self.filename)
                elif colid == 5 :   # Progress
                    if fractionDone is not None and not self.fin:
                        self.list.SetStringItem(self.listid, rank, ('%.1f' % (float(fractionDone) * 100)) + "%")
                elif colid == 6:    # Status
                    if timeEst is not None and not self.fin:
                        self.list.SetStringItem(self.listid, rank, "working")
                    else:
                        if activity is not None and not self.fin:
                            self.list.SetStringItem(self.listid, rank, activity)
                elif colid == 7 :   # Priority
                    self.list.SetStringItem(self.listid, rank, self.parent.priotext[self.prio])
                elif colid == 8:    #Time Remaining            
                    if timeEst is not None and not self.fin:
                        self.list.SetStringItem(self.listid, rank, hours(timeEst))  
                elif colid == 9 :   # Total Size
                    self.list.SetStringItem(self.listid, rank, self.totalsize)                         

                elif colid == 10:   # DL Speed
                    if downRate is not None and not self.fin:
                        self.list.SetStringItem(self.listid, rank, ('%.1f Kb/s'%(float(downRate)/(1 <<10))))
                        
                elif colid == 11:   # UL Speed
                    if upRate is not None:
                        self.list.SetStringItem(self.listid, rank, ('%.1f Kb/s'%(float(upRate)/(1 <<10))))

                elif colid == 12:   # Share Ratio
                    if statistics is not None:
                        if self.olddownsize + float(statistics.downTotal) == 0:
                            self.list.SetStringItem(self.listid, rank, " oo %")
                            self.shareratio = float(55555)
                        else:
                            self.shareratio = float(((self.oldupsize + float(statistics.upTotal))/(self.olddownsize + float(statistics.downTotal)))*100)
                            self.list.SetStringItem(self.listid, rank, ('%.1f'% self.shareratio)+ "%")
                elif colid == 13:   # Error message
                    self.list.SetStringItem(self.listid, rank, self.errormsg)
                elif colid == 14:   # #Seed
                    if statistics is not None:
                        if not self.fin:
                            self.list.SetStringItem(self.listid, rank, ('%d' % statistics.numSeeds) + ' (' + self.currentseed + ')')
                        else:
                            self.list.SetStringItem(self.listid, rank, ('%d' % statistics.numOldSeeds))

                elif colid == 15:   # #Peer
                    if statistics is not None:
                        self.list.SetStringItem(self.listid, rank, ('%d' % statistics.numPeers) + ' (' + self.currentpeer + ')')

                elif colid == 16:   # #Copie
                    if statistics is not None:
                        self.list.SetStringItem(self.listid, rank, ('%.3f' % float(0.001*int(1000*statistics.numCopies))))

                elif colid == 17:   # #Peer Avg Progress
                    if statistics is not None:
                        self.list.SetStringItem(self.listid, rank, ('%.1f %%'%statistics.percentDone))

                elif colid == 18:   # Download Size
                    if statistics is not None:
                        self.list.SetStringItem(self.listid, rank, ('%.2f MB' % ((float(self.olddownsize)+float(statistics.downTotal)) / (1 << 20))))

                elif colid == 19:   # Upload Size
                    if statistics is not None:
                        self.list.SetStringItem(self.listid, rank, ('%.2f MB' % ((float(self.oldupsize)+ float(statistics.upTotal)) / (1 << 20))))
                        
                elif colid == 20:   # Total Speed
                    if statistics is not None:
                        self.list.SetStringItem(self.listid, rank, ('%.0f kB/s' % (float(statistics.torrentRate)/(1000))))

            if statistics is not None:
                self.newdownsize = float(statistics.downTotal)
                self.newupsize   = float(statistics.upTotal)
                if self.olddownsize + float(statistics.downTotal) == 0:
                    self.shareratio = float(55555)
                else:
                    self.shareratio = float(((self.oldupsize + float(statistics.upTotal))/(self.olddownsize + float(statistics.downTotal)))*100)

            #####################################################
            # Detail Window display part
            #####################################################
            if self.parent.proctab[self.listid][14] is not None:
                self.detailwin = self.parent.proctab[self.listid][14]
                if statistics is not None:
                    self.detailwin.downsize.SetLabel('%.2f MB' % ((float(self.olddownsize) + float(statistics.downTotal)) / (1 << 20)))
                    self.detailwin.upsize.SetLabel('%.2f MB' % ((float(self.oldupsize)+ float(statistics.upTotal)) / (1 << 20)))
                    if not self.fin:
                        self.detailwin.seedtitle.SetLabel('# Connected seed')
                        self.detailwin.numseed.SetLabel(('%d' % statistics.numSeeds) + ' (' + self.currentseed + ')')
                    else:
                        self.detailwin.seedtitle.SetLabel('# Seen seed')
                        self.detailwin.numseed.SetLabel(('%d' % statistics.numOldSeeds)+ ' (' + self.currentseed + ')')
                    self.detailwin.numpeer.SetLabel(('%d' % statistics.numPeers) + ' (' + self.currentpeer + ')')
                    self.detailwin.totalspeed.SetLabel('%.0f kB/s' % (float(statistics.torrentRate)/(1000)))
                    self.detailwin.avgprogress.SetLabel('%.1f %%'%statistics.percentDone)
                    self.detailwin.numcopy.SetLabel('%.3f' % float(0.001*int(1000*statistics.numCopies)))
                    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -