class BackgroundApp(BaseApp): def __init__(self, logdir, appname, appversion, params, single_instance_checker, installdir, i2iport, sport, httpport, ws_serverport, bt_port): # Running WebSocket server SockJS Tornado Router = SockJSRouter(WsConnection, '/websocket') ws_serv = WsServer(i2iport,ws_serverport) ws_serv.start() # Almost generic HTTP server self.videoHTTPServer = VideoHTTPServer(httpport) self.videoHTTPServer.register(self.videoservthread_error_callback,self.videoservthread_set_status_callback) # Running BitTorrent HTTP server self.q = Queue() self.p = Process(target=serveHTTP, args=(self.q,)) self.p.start() period_upnp() BaseApp.__init__(self, logdir, appname, appversion, params, single_instance_checker, installdir, i2iport, sport) self.httpport = httpport # SEARCH:P2P # Maps a query ID to the original searchstr, timestamp and all hits (local + remote) self.id2hits = Query2HitsMap() # Maps a URL path received by HTTP server to the requested resource, # reading or generating it dynamically. # # For saving .torrents received in hits to P2P searches using # SIMPLE+METADATA queries self.tqueue = TimedTaskQueue(nameprefix="BGTaskQueue") self.searchmapper = SearchPathMapper(self.s,self.id2hits,self.tqueue) self.hits2anypathmapper = Hits2AnyPathMapper(self.s,self.id2hits) self.videoHTTPServer.add_path_mapper(self.searchmapper) self.videoHTTPServer.add_path_mapper(self.hits2anypathmapper) # WEB Interface # Maps a URL path received by HTTP server to the requested resource, # reading or generating it dynamically. self.webIFmapper = WebIFPathMapper(self, self.s) self.videoHTTPServer.add_path_mapper(self.webIFmapper) # Generic HTTP server start. Don't add mappers dynamically afterwards! self.videoHTTPServer.background_serve() # Maps Downloads to a using InstanceConnection and streaminfo when it # plays. So it contains the Downloads in VOD mode for which there is # active interest from a plugin. # # At the moment each Download is used/owned by a single IC and a new # request for the same torrent will stop playback to the original IC # and resume it to the new user. # self.dusers = {} self.approxplayerstate = MEDIASTATE_STOPPED self.counter = 0 # counter for the stats reported periodically self.interval = 120 # report interval self.iseedeadpeople = False if sys.platform == "win32": # If the BG Process is started by the plug-in notify it with an event try: startupEvent = win32event.CreateEvent( None, 0, 0, 'startupEvent' ) win32event.SetEvent( startupEvent ) win32api.CloseHandle( startupEvent ) # TODO : is it possible to avoid importing win32api just to close an handler? except: pass def OnInit(self): try: # Do common initialization BaseApp.OnInitBase(self) # Arno, 2010-07-15: We try to detect browser presence by looking # at get_speed_info JSON request from Firefox statusbar. However. # these calls are unreliable, i.e., somethings the XmlHTTPRequest # at the client doesn't reach the server, although the server is # capable of replying to the request. Hence, we disable self-destruct # for now. if KILLONIDLE: print >>sys.stderr,time.asctime(),'-', "bg: Kill-on-idle test enabled" self.i2is.add_task(self.i2i_kill_on_browser_gone,IDLE_BEFORE_SELFKILL/2) else: print >>sys.stderr,time.asctime(),'-', "bg: Kill-on-idle test disabled" print >>sys.stderr,time.asctime(),'-', "bg: Awaiting commands" return True except Exception,e: print_exc() self.show_error(str(e)) self.OnExit() return False