From: <bel...@us...> - 2003-03-28 21:09:40
|
Update of /cvsroot/btplusplus/BT++/src In directory sc8-pr-cvs1:/tmp/cvs-serv17312/src Modified Files: Loader.py LoaderManager.py WT++.py WT++.pyw Added Files: InfoManager.py Log Message: Implemented InfoManager for tracker info (namely seeds/downloaders). It manages updates so only one request is sent per tracker if multiple torrents use the same one. Some minor fixes. --- NEW FILE: InfoManager.py --- from threading import * from urllib import FancyURLopener from core.bencode import bdecode from BTConstants import * from time import * class InfoServer: loaders = [] server = '' Updating = False ThrDownLoad = None log = None refreshed = 0.0 update = 5 def __init__(self, server, log = None, update = 5): self.loaders = [] self.server = server self.update = update self.log = log self.opener = FancyURLopener() def AddLoader(self, loader): for aloader in self.loaders: if aloader.Config['InfoHash']==loader.Config['InfoHash']: return False self.log('['+self.server+'] added '+loader.Config['File'], loglevel = LOG_TRIVIAL) self.loaders.append(loader) self.ForcedUpdate() def RemoveLoader(self, loader): self.loaders.remove(loader) def DownLoader(self): self.Updating = True h = self.opener.open(self.server) try: self.log('['+self.server+'] Info Download started', loglevel = LOG_TRIVIAL) except: pass data = h.read() try: self.log('['+self.server+'] Info Download finished', loglevel = LOG_TRIVIAL) except: pass h.close() failed = False try: data = bdecode(data) except: try: self.log('['+self.server+'] Info Download failed', loglevel = LOG_TRIVIAL) except: pass failed = True files = {} try: files = data['files'] except: pass for loader in self.loaders: if files.has_key(loader.Config['InfoHash']): info = files[loader.Config['InfoHash']] loader.UpdateExtendedInfo(info['complete'], info['incomplete']) else: loader.UpdateExtendedInfo('error') if failed: self.refreshed = time() - (60 * self.update) else: self.refreshed = time() self.Updating = False def Update(self): if time() > (self.refreshed + (60 * self.update)): self.ForcedUpdate() def ForcedUpdate(self): if not self.Updating: self.ThrDownLoad = Thread( target = self.DownLoader ) self.ThrDownLoad.setDaemon(True) self.ThrDownLoad.start() class InfoManager: servers = [] managers = [] log = None update = 5 def __init__(self, update = 5, log = None): self.log = log self.update = update def Update(self): for manager in self.managers: for loader in manager.Loaders: self.AddLoader(loader) for server in self.servers: server.Update() def UpdateUpdate(self, update): self.update = update for server in self.servers: server.update = update def AddLoader(self, loader): for server in self.servers: if server.server == loader.Config['Scrape']: server.AddLoader(loader) return True server = InfoServer(loader.Config['Scrape'], log = self.log, update = self.update) self.servers.append(server) server.AddLoader(loader) def RemoveLoader(self, loader): for server in self.servers: if server.server == loader.Config['Scrape']: server.RemoveLoader(loader) return True def AddManager(self, manager): self.managers.append(manager) Index: Loader.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/Loader.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** Loader.py 28 Mar 2003 14:58:27 -0000 1.7 --- Loader.py 28 Mar 2003 21:09:34 -0000 1.8 *************** *** 8,11 **** --- 8,12 ---- from sha import sha from socket import error as socketerror + from string import split, join from core.Choker import Choker *************** *** 90,93 **** --- 91,100 ---- self.Config['Tracker'] = torrent['announce'] + t = split(torrent['announce'],'/') + if t[-1]=='': + t[-2] = 'scrape' + else: + t[-1] = 'scrape' + self.Config['Scrape'] = join(t, '/'); self.Config['File'] = torinfo['name'] self.Config['Filename'] = path.join(self.Config['DirTemp'], torinfo['name']) *************** *** 134,137 **** --- 141,146 ---- self.Info['Size'] = self.Config['Size'] self.Info['File'] = self.Config['File'] + + self.UpdateExtendedInfo() return true *************** *** 270,273 **** --- 279,289 ---- else: return '%d min %02d sec' % (m, s) + + ########################################################################################################### + ########################################################################################################### + + def UpdateExtendedInfo( self, complete = '?', incomplete = '?' ): + self.Info['complete'] = complete + self.Info['incomplete'] = incomplete ########################################################################################################### Index: LoaderManager.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/LoaderManager.py,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** LoaderManager.py 28 Mar 2003 13:38:04 -0000 1.9 --- LoaderManager.py 28 Mar 2003 21:09:34 -0000 1.10 *************** *** 3,6 **** --- 3,7 ---- from Loader import Loader from BTConstants import * + from core.CurrentRateMeasure import GlobalMeasure class LoaderManager: *************** *** 53,57 **** if self.Log != None: self.Log( 'Error adding torrent "' + torrent + '"...', loglevel = LOG_ERROR ) ! return None --- 54,58 ---- if self.Log != None: self.Log( 'Error adding torrent "' + torrent + '"...', loglevel = LOG_ERROR ) ! return None Index: WT++.py =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WT++.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** WT++.py 11 Mar 2003 01:07:10 -0000 1.4 --- WT++.py 28 Mar 2003 21:09:34 -0000 1.5 *************** *** 33,41 **** pass - print ("Started") httpd = BTWebServer() httpdth = Thread(target = httpd.server) httpdth.setDaemon(1) httpdth.start() inthr = Thread(target = evalinput) --- 33,41 ---- pass httpd = BTWebServer() httpdth = Thread(target = httpd.server) httpdth.setDaemon(1) httpdth.start() + print ("Started") inthr = Thread(target = evalinput) Index: WT++.pyw =================================================================== RCS file: /cvsroot/btplusplus/BT++/src/WT++.pyw,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** WT++.pyw 25 Mar 2003 00:27:02 -0000 1.1 --- WT++.pyw 28 Mar 2003 21:09:34 -0000 1.2 *************** *** 25,33 **** pass - print ("Started") httpd = BTWebServer() httpdth = Thread(target = httpd.server) httpdth.setDaemon(1) httpdth.start() BTWait.wait() --- 25,33 ---- pass httpd = BTWebServer() httpdth = Thread(target = httpd.server) httpdth.setDaemon(1) httpdth.start() + print ("Started") BTWait.wait() |