📄 abcengine.py
字号:
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 + -