def loadSubscriptionData(self): print >> sys.stderr, 'load subscription data' torrentfeed = TorrentFeedThread.getInstance() urls = torrentfeed.getURLs() bcsub = self.utility.session.get_start_recommender() web2sub = self.utility.lang.get('web2subscription') bcactive = self.utility.session.get_start_recommender() bcstatus = 'inactive' if bcactive: bcstatus = 'active' web2active = self.utility.config.Read('enableweb2search', "boolean") web2status = 'inactive' if web2active: web2status = 'active' reclist = [] record = {'url':bcsub,'status':bcstatus,'persistent':'BC'} reclist.append(record) record = {'url':web2sub,'status':web2status,'persistent':'Web2.0'} reclist.append(record) for url in urls: record = {} record['url'] = url record['status'] = urls[url] reclist.append(record) self.data[self.mode]['data'] = reclist self.data[self.mode]['grid'].setData(reclist)
def loadSubscriptionData(self): print >> sys.stderr, 'load subscription data' torrentfeed = TorrentFeedThread.getInstance() urls = torrentfeed.getURLs() bcsub = self.utility.session.get_start_recommender() web2sub = self.utility.lang.get('web2subscription') bcactive = self.utility.session.get_start_recommender() bcstatus = 'inactive' if bcactive: bcstatus = 'active' web2active = self.utility.config.Read('enableweb2search', "boolean") web2status = 'inactive' if web2active: web2status = 'active' reclist = [] record = {'url': bcsub, 'status': bcstatus, 'persistent': 'BC'} reclist.append(record) record = {'url': web2sub, 'status': web2status, 'persistent': 'Web2.0'} reclist.append(record) for url in urls: record = {} record['url'] = url record['status'] = urls[url] reclist.append(record) self.data[self.mode]['data'] = reclist self.data[self.mode]['grid'].setData(reclist)
def __init__(self, cols, subPanelHeight, orientation='horizontal', viewmode='thumbnails'): self.initReady = False self.data = None self.detailPanel = None self.orientation = orientation self.subPanelClass = None self.items = 0 #number of items that are currently visible self.currentRows = 0 self.sizeMode = 'auto' self.columnHeader = None self.topMargin = 5 self.panels = [] self.viewmode = viewmode self.guiUtility = GUIUtility.getInstance() self.utility = self.guiUtility.utility self.gridManager = GridManager(self, self.utility) pre = wx.PrePanel() # the Create step is done by XRC. self.PostCreate(pre) self.Bind(wx.EVT_WINDOW_CREATE, self.OnCreate) if type(cols) == int: self.cols = cols self.columnTypes = None self.subPanelHeight = subPanelHeight else: self.columnTypes = cols self.subPanelHeights = subPanelHeight if self.viewmode == 'thumbnails': self.cols = cols[0] self.subPanelHeight = self.subPanelHeights[0] elif self.viewmode == 'list': self.cols = cols[1] self.subPanelHeight = self.subPanelHeights[1] else: raise Exception('unknown viewmode: %s' % self.viewmode) self.superpeer_db = SuperPeerDBHandler.getInstance() self.torrentfeed = TorrentFeedThread.getInstance() self.guiserver = GUITaskQueue.getInstance()
def __init__(self, cols, subPanelHeight, orientation='horizontal', viewmode = 'thumbnails'): self.initReady = False self.data = None self.detailPanel = None self.orientation = orientation self.subPanelClass = None self.items = 0 #number of items that are currently visible self.currentRows = 0 self.sizeMode = 'auto' self.columnHeader = None self.topMargin = 5 self.panels = [] self.viewmode = viewmode self.guiUtility = GUIUtility.getInstance() self.utility = self.guiUtility.utility self.gridManager = GridManager(self, self.utility) pre = wx.PrePanel() # the Create step is done by XRC. self.PostCreate(pre) self.Bind(wx.EVT_WINDOW_CREATE, self.OnCreate) if type(cols) == int: self.cols = cols self.columnTypes = None self.subPanelHeight = subPanelHeight else: self.columnTypes = cols self.subPanelHeights = subPanelHeight if self.viewmode == 'thumbnails': self.cols = cols[0] self.subPanelHeight = self.subPanelHeights[0] elif self.viewmode == 'list': self.cols = cols[1] self.subPanelHeight = self.subPanelHeights[1] else: raise Exception('unknown viewmode: %s' % self.viewmode) self.superpeer_db = SuperPeerDBHandler.getInstance() self.torrentfeed = TorrentFeedThread.getInstance() self.guiserver = GUITaskQueue.getInstance()
def main(): command_line_parser = optparse.OptionParser() command_line_parser.add_option("--statedir", action="store", type="string", help="Use an alternate statedir") command_line_parser.add_option("--port", action="store", type="int", help="Listen at this port") command_line_parser.add_option("--rss", action="store", type="string", help="Url where to fetch rss feed, or several seperated with ';'") command_line_parser.add_option("--nickname", action="store", type="string", help="The moderator name") # parse command-line arguments opt, args = command_line_parser.parse_args() if not (opt.rss): print "Usage: python Tribler/Main/metadata-injector.py --help" print "Example: python Tribler/Main/metadata-injector.py --rss http://frayja.com/rss.php --nickname frayja" sys.exit() print "Press Ctrl-C to stop the metadata-injector" sscfg = SessionStartupConfig() if opt.statedir: sscfg.set_state_dir(os.path.realpath(opt.statedir)) if opt.port: sscfg.set_listen_port(opt.port) if opt.nickname: sscfg.set_nickname(opt.nickname) # Agressively promote own moderations: sscfg.set_moderationcast_promote_own(True) sscfg.set_megacache(True) sscfg.set_overlay(True) # turn torrent collecting on. this will cause torrents to be distributed sscfg.set_torrent_collecting(True) sscfg.set_dialback(False) sscfg.set_internal_tracker(False) session = Session(sscfg) print >>sys.stderr, time.asctime(),'-', "permid: ", permid_for_user(session.get_permid()) if opt.rss: moderation_cast_db = session.open_dbhandler(NTFY_MODERATIONCAST) torrent_feed_thread = TorrentFeedThread.getInstance() def on_torrent_callback(rss_url, infohash, torrent_data): """ A torrent file is discovered through rss. Create a new moderation. """ if "info" in torrent_data and "name" in torrent_data["info"]: print >>sys.stderr, time.asctime(),'-', "Creating moderation for %s" % torrent_data["info"]["name"] else: print >>sys.stderr, time.asctime(),'-', "Creating moderation" moderation = {} moderation['infohash'] = bin2str(infohash) torrenthash = sha.sha(bencode(data)).digest() moderation['torrenthash'] = bin2str(torrenthash) moderation_cast_db.addOwnModeration(moderation) torrent_feed_thread.register(session,120,1) for rss in opt.rss.split(";"): print >>sys.stderr, time.asctime(),'-', "Adding RSS: %s" % rss torrent_feed_thread.addURL(rss, on_torrent_callback=on_torrent_callback) # set_moderationcast_promote_own() will ensure your moderations on # the RSS feed items are sent to any peer you connect to on the # overlay. torrent_feed_thread.start() # 22/10/08. Boudewijn: connect to a specific peer # connect to a specific peer using the overlay # def after_connect(*args): # print "CONNECTED", args # from Tribler.Core.Overlay.SecureOverlay import SecureOverlay # overlay = SecureOverlay.getInstance() # overlay.connect_dns(("130.161.158.24", 7762), after_connect) # condition variable would be prettier, but that don't listen to # KeyboardInterrupt #time.sleep(sys.maxint/2048) try: while True: x = sys.stdin.read() except: print_exc() session.shutdown() print "Shutting down..." time.sleep(5)
class GUIUtility: __single = None def __init__(self, utility = None, params = None): if GUIUtility.__single: raise RuntimeError, "GUIUtility is singleton" GUIUtility.__single = self # do other init self.xrcResource = None self.utility = utility self.vwxGUI_path = os.path.join(utility.abcpath, 'Tribler', 'Main', 'vwxGUI') self.utility.guiUtility = self self.params = params self.frame = None self.selectedMainButton = None # Arno: 2008-04-16: I want to keep this for searching, as an extension # of the standardGrid.GridManager self.torrentsearch_manager = TorrentSearchGridManager.getInstance(self) self.peersearch_manager = PeerSearchGridManager.getInstance(self) self.guiOpen = Event() self.selectedColour = wx.Colour(255,200,187) self.unselectedColour = wx.WHITE self.unselectedColour2 = wx.Colour(230,230,230) self.unselectedColourDownload = wx.Colour(198,226,147) self.unselectedColour2Download = wx.Colour(190,209,139) self.selectedColourDownload = wx.Colour(145,173,78) self.triblerRed = wx.Colour(255, 51, 0) self.max_remote_queries = 10 # max number of remote peers to query self.remote_search_threshold = 20 # start remote search when results is less than this number def getInstance(*args, **kw): if GUIUtility.__single is None: GUIUtility(*args, **kw) return GUIUtility.__single getInstance = staticmethod(getInstance) def buttonClicked(self, event): "One of the buttons in the GUI has been clicked" event.Skip(True) #should let other handlers use this event!!!!!!! name = "" obj = event.GetEventObject() try: name = obj.GetName() except: print >>sys.stderr,'GUIUtil: Error: Could not get name of buttonObject: %s' % obj if DEBUG: print >>sys.stderr,'GUIUtil: Button clicked %s' % name if name.startswith('mainButton'): self.mainButtonClicked(name, obj) elif name.lower().find('detailstab') > -1: self.detailsTabClicked(name) elif name == 'refresh': self.refreshTracker() elif name == "addAsFriend" or name == 'deleteFriend': self.standardDetails.addAsFriend() elif name == 'download': self.standardDetails.download() elif name == 'addFriend': #print >>sys.stderr,"GUIUtil: buttonClicked: parent is",obj.GetParent().GetName() dialog = MakeFriendsDialog(obj,self.utility) ret = dialog.ShowModal() dialog.Destroy() elif name == 'inviteFriends': self.emailFriend(event) #else: # print >>sys.stderr,"GUIUtil: buttonClicked: dlbooster: Torrent is None" elif (name == 'edit' or name == "top10Sharers" or name.startswith('bgPanel')) and obj.GetParent().GetName() == "profileOverview": self.standardOverview.currentPanel.sendClick(event) self.detailsTabClicked(name) #a panel was clicked in the profile overview and this is the most elegant so far method of informing the others elif name == "takeMeThere0" : #a button to go to preferences was clicked panel_name = self.standardDetails.currentPanel.GetName() if panel_name == "profileDetails_Files": #self.utility.actions[ACTION_PREFERENCES].action() self.utility.actions[ACTION_PREFERENCES].action(openname=self.utility.lang.get('triblersetting')) self.selectData(self.standardDetails.getData()) if panel_name == "profileDetails_Download": #self.utility.actions[ACTION_PREFERENCES].action(openname=self.utility.lang.get('triblersetting')) self.utility.actions[ACTION_PREFERENCES].action(openname=self.utility.lang.get('videosetting')) self.selectData(self.standardDetails.getData()) elif panel_name == "profileDetails_Presence": self.emailFriend(event) #self.mainButtonClicked( 'mainButtonPersons', self.frame.mainButtonPersons) #generate event to change page -> this should be done as a parameter to action because is modal #event = wx.TreeEvent(wx.EVT_TREE_ITEM_ACTIVATED) #wx.PostEvent() elif name == "takeMeThere1": #switch to another view panel_name = self.standardDetails.currentPanel.GetName() if panel_name == "profileDetails_Download": self.emailFriend(event) #self.mainButtonClicked( 'mainButtonPersons', self.frame.mainButtonPersons) if panel_name == "profileDetails_Presence": URL = 'http://www.tribler.org/' webbrowser.open(URL) else: print >>sys.stderr,'GUIUtil: A button was clicked, but no action is defined for: %s' % name elif name == "takeMeThere2": #switch to another view panel_name = self.standardDetails.currentPanel.GetName() if panel_name == "profileDetails_Download": URL = 'http://www.tribler.org/' webbrowser.open(URL) elif name == "search": # search files/persons button if DEBUG: print >>sys.stderr,'GUIUtil: search button clicked' self.dosearch() elif name == 'subscribe': self.subscribe() elif name == 'firewallStatus': self.firewallStatusClick() elif name == 'options': self.standardDetails.rightMouseButton(event) elif name == 'viewModus': self.onChangeViewModus() elif name == 'searchClear': # this has to be a callafter to avoid segmentation fault # otherwise the panel with the event generating button is destroyed # in the execution of the event. self.standardOverview.clearSearch() wx.CallAfter(self.standardOverview.toggleSearchDetailsPanel, False) elif name == 'familyFilterOn' or name == 'familyFilterOff': if ((self.familyButtonOn.isToggled() and name == 'familyFilterOff') or (self.familyButtonOff.isToggled() and name == 'familyFilterOn')): catobj = Category.getInstance() ff_enabled = not catobj.family_filter_enabled() print 'Setting family filter to: %s' % ff_enabled catobj.set_family_filter(ff_enabled) self.familyButtonOn.setToggled() self.familyButtonOff.setToggled() # obj.setToggled(ff_enabled) for filtername in ['filesFilter', 'libraryFilter']: filterCombo = xrc.XRCCTRL(self.frame, filtername) if filterCombo: filterCombo.refresh() elif DEBUG: print 'GUIUtil: A button was clicked, but no action is defined for: %s' % name def mainButtonClicked(self, name, button): "One of the mainbuttons in the top has been clicked" if not button.isSelected(): if self.selectedMainButton: self.selectedMainButton.setSelected(False) button.setSelected(True) self.selectedMainButton = button if name == 'mainButtonFiles': self.standardFilesOverview() elif name == 'mainButtonPersons': self.standardPersonsOverview() elif name == 'mainButtonProfile': self.standardProfileOverview() elif name == 'mainButtonLibrary': self.standardLibraryOverview() elif name == 'mainButtonFriends': self.standardFriendsOverview() elif name == 'mainButtonRss': self.standardSubscriptionsOverview() elif name == 'mainButtonMessages': self.standardMessagesOverview() elif DEBUG: print >>sys.stderr,"GUIUtil: MainButtonClicked: unhandled name",name def standardFilesOverview(self ): self.standardOverview.setMode('filesMode') gridState = self.standardOverview.getFilter().getState() #if filters: # filters[1] = 'seeder' if not gridState or not gridState.isValid(): gridState = GridState('filesMode', 'all', 'num_seeders') self.standardOverview.filterChanged(gridState) try: if self.standardDetails: self.standardDetails.setMode('filesMode', None) except: pass def standardPersonsOverview(self): self.standardOverview.setMode('personsMode') if not self.standardOverview.getSorting(): gridState = GridState('personsMode', 'all', 'last_connected', reverse=False) self.standardOverview.filterChanged(gridState) self.standardDetails.setMode('personsMode') #self.standardOverview.clearSearch() #self.standardOverview.toggleSearchDetailsPanel(False) def standardFriendsOverview(self): self.standardOverview.setMode('friendsMode') if not self.standardOverview.getSorting(): gridState = GridState('friendsMode', 'all', 'name', reverse=True) self.standardOverview.filterChanged(gridState) self.standardDetails.setMode('friendsMode') #self.standardOverview.clearSearch() #self.standardOverview.toggleSearchDetailsPanel(False) def standardProfileOverview(self): profileList = [] self.standardOverview.setMode('profileMode') self.standardDetails.setMode('profileMode') def standardLibraryOverview(self): self.standardOverview.setMode('libraryMode') gridState = self.standardOverview.getFilter().getState() if not gridState or not gridState.isValid(): gridState = GridState('libraryMode', 'all', 'name') self.standardOverview.filterChanged(gridState) self.standardDetails.setMode('libraryMode') def standardSubscriptionsOverview(self): self.standardOverview.setMode('subscriptionsMode') gridState = GridState('subscriptionMode', 'all', 'name') self.standardOverview.filterChanged(gridState) self.standardDetails.setMode('subscriptionsMode') def standardMessagesOverview(self): if DEBUG: print >>sys.stderr,'GUIUtil: standardMessagesOverview: Not yet implemented;' def initStandardOverview(self, standardOverview): "Called by standardOverview when ready with init" self.standardOverview = standardOverview self.standardFilesOverview() wx.CallAfter(self.refreshOnResize) # Preselect mainButtonFiles filesButton = xrc.XRCCTRL(self.frame, 'mainButtonFiles') filesButton.setSelected(True) self.selectedMainButton = filesButton # Init family filter self.familyButtonOn = xrc.XRCCTRL(self.frame, 'familyFilterOn') self.familyButtonOff = xrc.XRCCTRL(self.frame, 'familyFilterOff') catobj = Category.getInstance() if catobj.family_filter_enabled(): self.familyButtonOn.setToggled(True) else: self.familyButtonOff.setToggled(True) def getOverviewElement(self): """should get the last selected item for the current standard overview, or the first one if none was previously selected""" firstItem = self.standardOverview.getFirstItem() return firstItem def initStandardDetails(self, standardDetails): "Called by standardDetails when ready with init" self.standardDetails = standardDetails firstItem = self.standardOverview.getFirstItem() self.standardDetails.setMode('filesMode', firstItem) self.standardDetails.refreshStatusPanel(True) self.guiOpen.set() def deleteTorrent(self, torrent): if torrent.get('web2'): return self.torrentsearch_manager.deleteTorrent(torrent['infohash'],delete_file=True) def deleteSubscription(self,subscrip): self.standardOverview.loadSubscriptionData() self.standardOverview.refreshData() def addTorrentAsHelper(self): if self.standardOverview.mode == 'libraryMode': self.standardOverview.filterChanged(None) #self.standardOverview.refreshData() def selectData(self, data): "User clicked on item. Has to be selected in detailPanel" self.standardDetails.setData(data) self.standardOverview.updateSelection() def selectTorrent(self, torrent): "User clicked on torrent. Has to be selected in detailPanel" self.standardDetails.setData(torrent) self.standardOverview.updateSelection() def selectPeer(self, peer_data): "User clicked on peer. Has to be selected in detailPanel" self.standardDetails.setData(peer_data) self.standardOverview.updateSelection() def selectSubscription(self, sub_data): "User clicked on subscription. Has to be selected in detailPanel" self.standardDetails.setData(sub_data) self.standardOverview.updateSelection() def detailsTabClicked(self, name): "A tab in the detailsPanel was clicked" self.standardDetails.tabClicked(name) def refreshOnResize(self): try: if DEBUG: print >>sys.stderr,'GuiUtility: explicit refresh' self.mainSizer.FitInside(self.frame) self.standardDetails.Refresh() self.frame.topBackgroundRight.Refresh() self.frame.topBackgroundRight.GetSizer().Layout() #self.frame.topBackgroundRight.GetContainingSizer().Layout() self.updateSizeOfStandardOverview() self.standardDetails.Layout() self.standardDetail.GetContainingSizer.Layout() self.standardOverview.Refresh() except: pass # When resize is done before panels are loaded: no refresh def updateSizeOfStandardOverview(self): if self.standardOverview.gridIsAutoResizing(): #print 'size1: %d, size2: %d' % (self.frame.GetClientSize()[1], self.frame.window.GetClientSize()[1]) margin = 10 newSize = (-1, #self.scrollWindow.GetClientSize()[1] - self.frame.GetClientSize()[1] - 100 - # height of top bar self.standardOverview.getPager().GetSize()[1] - margin) else: newSize = self.standardOverview.GetSize() #print 'ClientSize: %s, virtual : %s' % (str(self.scrollWindow.GetClientSize()), str(self.scrollWindow.GetVirtualSize())) #print 'Position: %s' % str(self.standardOverview.GetPosition()) self.standardOverview.SetSize(newSize) self.standardOverview.SetMinSize(newSize) self.standardOverview.SetMaxSize(newSize) #print 'Overview is now: %s' % str(self.standardOverview.GetSize()) self.standardOverview.GetContainingSizer().Layout() def refreshTracker(self): torrent = self.standardDetails.getData() if not torrent: return if DEBUG: print >>sys.stderr,'GUIUtility: refresh ' + repr(torrent.get('content_name', 'no_name')) if torrent: check = TorrentChecking(torrent['infohash']) check.start() def refreshTorrentStats(self,dslist): """ Called from ABCApp by MainThread to refresh statistics of downloading torrents""" try: if self.guiOpen.isSet(): self.standardDetails.refreshTorrentStats(dslist) except: print_exc() def emailFriend(self, event): ip = self.utility.config.Read('bind') if ip is None or ip == '': ip = self.utility.session.lm.get_ext_ip() mypermid = self.utility.session.get_permid() permid_txt = self.utility.lang.get('permid')+": "+show_permid(mypermid) ip_txt = self.utility.lang.get('ipaddress')+": "+ip # port = self.utility.controller.listen_port port = self.utility.config.Read('minport', 'int') port_txt = self.utility.lang.get('portnumber')+" "+str(port) subject = self.utility.lang.get('invitation_subject') invitation_body = self.utility.lang.get('invitation_body') invitation_body = invitation_body.replace('\\n', '\n') invitation_body += ip_txt + '\n\r' invitation_body += port_txt + '\n\r' invitation_body += permid_txt + '\n\r\n\r\n\r' if sys.platform == "darwin": body = invitation_body.replace('\\r','') body = body.replace('\r','') else: body = urllib.quote(invitation_body) mailToURL = 'mailto:%s?subject=%s&body=%s'%('', subject, body) try: webbrowser.open(mailToURL) except: text = invitation_body.split("\n") InviteFriendsDialog(text) def get_nat_type(self): return self.utility.session.get_nat_type() def dosearch(self): sf = self.standardOverview.getSearchField() if sf is None: return input = sf.GetValue().strip() if input == '': return self.standardOverview.toggleSearchDetailsPanel(True) if self.standardOverview.mode in ["filesMode", "libraryMode"]: self.searchFiles(self.standardOverview.mode, input) elif self.standardOverview.mode in ["personsMode", 'friendsMode']: self.searchPersons(self.standardOverview.mode, input) def searchFiles(self, mode, input): if DEBUG: print >>sys.stderr,"GUIUtil: searchFiles:",input low = input.lower() wantkeywords = [i for i in low.split(' ') if i] self.torrentsearch_manager.setSearchKeywords(wantkeywords, mode) #print "******** gui uti searchFiles", wantkeywords gridstate = GridState(self.standardOverview.mode, 'all', 'num_seeders') self.standardOverview.filterChanged(gridstate) if mode == 'filesMode': # # Query the peers we are connected to # nhits = self.torrentsearch_manager.getCurrentHitsLen() if nhits < self.remote_search_threshold and mode == 'filesMode': q = 'SIMPLE ' for kw in wantkeywords: q += kw+' ' num_remote_queries = min((self.remote_search_threshold - nhits)/2, self.max_remote_queries) if num_remote_queries > 0: self.utility.session.query_connected_peers(q,self.sesscb_got_remote_hits,num_remote_queries) self.standardOverview.setSearchFeedback('remote', False, 0, wantkeywords) # # Query YouTube, etc. # if mode == 'filesMode': self.torrentsearch_manager.searchWeb2(60) # 3 pages, TODO: calc from grid size def sesscb_got_remote_hits(self,permid,query,hits): # Called by SessionCallback thread print >>sys.stderr,"GUIUtil: sesscb_got_remote_hits",`hits` kws = query.split() wx.CallAfter(self.torrentsearch_manager.gotRemoteHits,permid,kws,hits,self.standardOverview.getMode()) def stopSearch(self): mode = self.standardOverview.getMode() if mode == 'filesMode' or mode == 'libraryMode': self.torrentsearch_manager.stopSearch() if mode == 'personsMode' or mode == 'friendsMode': self.peersearch_manager.stopSearch() def clearSearch(self): mode = self.standardOverview.getMode() if mode == 'filesMode' or mode == 'libraryMode': self.torrentsearch_manager.setSearchKeywords([],mode) if mode == 'personsMode' or mode == 'friendsMode': self.peersearch_manager.setSearchKeywords([],mode) def searchPersons(self, mode, input): if DEBUG: print >>sys.stderr,"GUIUtil: searchPersons:",input low = input.lower().strip() wantkeywords = low.split(' ') self.peersearch_manager.setSearchKeywords(wantkeywords, mode) #print "******** gui uti searchFiles", wantkeywords gridstate = GridState(self.standardOverview.mode, 'all', 'last_seen') self.standardOverview.filterChanged(gridstate) def OnSearchKeyDown(self,event): keycode = event.GetKeyCode() #if event.CmdDown(): #print "OnSearchKeyDown: keycode",keycode if keycode == wx.WXK_RETURN: self.dosearch() else: event.Skip() def OnSubscribeKeyDown(self,event): keycode = event.GetKeyCode() if keycode == wx.WXK_RETURN: self.subscribe() event.Skip() def OnSubscribeMouseAction(self,event): obj = event.GetEventObject() # TODO: smarter behavior obj.SetSelection(-1,-1) event.Skip() def subscribe(self): rssurlctrl = self.standardOverview.getRSSUrlCtrl() url = rssurlctrl.GetValue() if not url: return if not "://" in url: url = "http://" + url if DEBUG: print >>sys.stderr,"GUIUtil: subscribe:",url try: stream = urllib2.urlopen(url) stream.close() except Exception,e: dlg = wx.MessageDialog(self.standardOverview, "Could not resolve URL:\n\n"+str(e), 'Tribler Warning',wx.OK | wx.ICON_WARNING) result = dlg.ShowModal() dlg.Destroy() return torrentfeed = TorrentFeedThread.getInstance() torrentfeed.addURL(url) self.standardOverview.loadSubscriptionData() self.standardOverview.refreshData()
def main(): command_line_parser = optparse.OptionParser() command_line_parser.add_option("--statedir", action="store", type="string", help="Use an alternate statedir") command_line_parser.add_option("--port", action="store", type="int", help="Listen at this port") command_line_parser.add_option("--rss", action="store", type="string", help="Url where to fetch rss feed, or several seperated with ';'") command_line_parser.add_option("--dir", action="store", type="string", help="Directory to watch for .torrent files, or several seperated with ';'") command_line_parser.add_option("--nickname", action="store", type="string", help="The moderator name") # parse command-line arguments opt, args = command_line_parser.parse_args() if not (opt.rss or opt.dir): command_line_parser.print_help() print "\nExample: python Tribler/Main/metadata-injector.py --rss http://frayja.com/rss.php --nickname frayja" sys.exit() print "Press Ctrl-C to stop the metadata-injector" sscfg = SessionStartupConfig() if opt.statedir: sscfg.set_state_dir(os.path.realpath(opt.statedir)) if opt.port: sscfg.set_listen_port(opt.port) if opt.nickname: sscfg.set_nickname(opt.nickname) sscfg.set_megacache(True) sscfg.set_overlay(True) # turn torrent collecting on. this will cause torrents to be distributed sscfg.set_torrent_collecting(True) sscfg.set_dialback(False) sscfg.set_internal_tracker(False) session = Session(sscfg) print >>sys.stderr, "permid: ", permid_for_user(session.get_permid()) torrent_feed_thread = TorrentFeedThread.getInstance() torrent_feed_thread.register(session) dir_feed_thread = DirectoryFeedThread(torrent_feed_thread) if opt.rss: def on_torrent_callback(rss_url, infohash, torrent_data): """ A torrent file is discovered through rss. Add it to our channel. """ torrentdef = TorrentDef.load_from_dict(torrent_data) print >>sys.stderr,"*** Added a torrent to channel: %s" % torrentdef.get_name_as_unicode() for rss in opt.rss.split(";"): print >>sys.stderr, "Adding RSS: %s" % rss torrent_feed_thread.addURL(rss, callback=on_torrent_callback) if opt.dir: def on_torrent_callback(dirpath, infohash, torrent_data): torrentdef = TorrentDef.load_from_dict(torrent_data) print '*** Added a torrent to channel: %s' % torrentdef.get_name_as_unicode() for dirpath in opt.dir.split(";"): print >>sys.stderr, "Adding DIR: %s" % dirpath dir_feed_thread.addDir(dirpath, callback=on_torrent_callback) torrent_feed_thread.start() dir_feed_thread.start() # 22/10/08. Boudewijn: connect to a specific peer # connect to a specific peer using the overlay # def after_connect(*args): # print "CONNECTED", args # from Tribler.Core.Overlay.SecureOverlay import SecureOverlay # overlay = SecureOverlay.getInstance() # overlay.connect_dns(("130.161.158.24", 7762), after_connect) # condition variable would be prettier, but that don't listen to # KeyboardInterrupt #time.sleep(sys.maxint/2048) try: while True: x = sys.stdin.read() except: print_exc() torrent_feed_thread.shutdown() dir_feed_thread.shutdown() session.shutdown() print "Shutting down..." time.sleep(5)