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

📄 maketorrent.py

📁 bittorrent source by python. please enjoy
💻 PY
📖 第 1 页 / 共 2 页
字号:
        else:            announce = self.dht_nodes.GetValue()        return announce    def make(self, widget):        file_name = self.get_file()        piece_size_exponent = self.get_piece_size_exponent()        announce = self.get_announce()        title = self.title.GetValue()        comment = self.comment_text.GetValue()        if self.config['use_tracker']:            self.add_tracker(announce)        errored = False        if not errored:            d = ProgressDialog(self, [file_name,], announce,                               piece_size_exponent, title, comment,                               self.config)            d.main()    def check_buttons(self, *widgets):        file_name = self.get_file()        tracker = self.announce_entry.GetValue()        if file_name not in (None, '') and os.path.exists(file_name):            if self.config['use_tracker']:                if len(tracker) >= len('http://x.cc'):                    self.makebutton.Enable(True)                else:                    self.makebutton.Enable(False)            else:                self.makebutton.Enable(True)        else:            self.makebutton.Enable(False)    def save_config(self):        def error_callback(error, string): print string        configfile.save_global_config(self.config, 'maketorrent', error_callback, ui_options)    def add_tracker(self, tracker_name):        try:            self.tracker_list.pop(self.tracker_list.index(tracker_name))        except ValueError:            pass        self.tracker_list[0:0] = [tracker_name,]        self.config['tracker_list'] = ','.join(self.tracker_list)        if not self.announce_entry.IsEmpty():            self.announce_entry.Clear()        for t in self.tracker_list:            self.announce_entry.Append(t)class NodeList(Grid):    def __init__(self, parent, nodelist):        Grid.__init__(self, parent, style=wx.WANTS_CHARS)        self.CreateGrid( 0, 2, wx.grid.Grid.SelectRows)        self.SetColLabelValue(0, _("Host"))        self.SetColLabelValue(1, _("Port"))        self.SetColRenderer(1, wx.grid.GridCellNumberRenderer())        self.SetColEditor(1, wx.grid.GridCellNumberEditor(0, 65535))        self.SetColLabelSize(self.GetTextExtent("l")[1]+4)        self.SetRowLabelSize(1)        self.SetSize((1000,1000))        self.storing = False        self.Bind(wx.grid.EVT_GRID_CMD_CELL_CHANGE, self.store_value)        self.append_node(('router.bittorrent.com', '65536'))        for i, e in enumerate(nodelist.split(',')):            host, port = e.split(':')            self.append_node((host,port))        self.append_node(('',''))    def append_node(self, (host, port)):        self.InsertRows(self.GetNumberRows(), 1)        self.SetCellValue(self.GetNumberRows()-1, 0, host)        self.SetCellValue(self.GetNumberRows()-1, 1, port)        self.AutoSizeColumn(0)        self.SetColSize(1, self.GetTextExtent('65536')[0] * 2)        ###self.AutoSize()    def store_value(self, event):        if self.storing:            return        self.storing = True        table = self.GetTable()        row = event.GetRow()        col = event.GetCol()        value = table.GetValue(row, col)        if col == 0:            self.store_host_value(row, value)        elif col == 1:            self.store_port_value(row, value)        self.storing = False    def store_host_value(self, row, value):        parts = value.split('.')        if value != '':            for p in parts:                if not p.isalnum():                    return                try:                    value = value.encode('idna')                except UnicodeError:                    return        self.check_row(row)    def store_port_value(self, row, value):        if value != '':            try:                v = int(value)                if v > 65535:                    value = 65535                if v < 0:                    value = 0            except ValueError:                return # return on non-integer values        self.check_row(row)    def check_row(self, row):        # called after editing to see whether we should add a new        # blank row, or remove the now blank currently edited row.        table = self.GetTable()        host_value = table.GetValue(row, 0)        port_value = table.GetValue(row, 1)        if (host_value and            port_value and            int(row) == self.GetNumberRows()-1):            self.append_node(('',''))        elif (host_value == '' and              (not port_value or int(port_value) == 0) and              int(row) != self.GetNumberRows()-1):            self.DeleteRows(row, 1)    def get_nodes(self):        retlist = []        id = -1        table = self.GetTable()        for row in xrange(self.GetNumberRows()):            host = table.GetValue(row, 0)            port = table.GetValue(row, 1)            if host != '' and port != '' and port != 0:                retlist.append((host,port))        return retlist    def GetValue(self):        nodelist = self.get_nodes()        return ','.join(['%s:%s'%node for node in nodelist])def deunicode(s):    try:        s = s.decode('utf8', 'replace').encode('utf8')    except:        pass    return sclass ProgressDialog(BTDialog):    def __init__(self, parent, file_list, announce, piece_length, title,                 comment, config):        BTDialog.__init__(self, parent=parent, size=(400,-1))        self.SetTitle(_("Building torrents..."))        self.file_list = file_list        self.announce = deunicode(announce)        self.piece_length = piece_length        self.title = deunicode(title)        self.comment = deunicode(comment)        self.config = config        self.flag = Event() # ???        self.vbox = VSizer()        self.label = wx.StaticText(self, label=_("Checking file sizes..."))        #self.label.set_line_wrap(True)        self.vbox.AddFirst(self.label, flag=wx.ALIGN_LEFT)        self.progressbar = wx.Gauge(self, range = 1000, size=(400, 25), style = wx.GA_SMOOTH)        self.vbox.Add(self.progressbar, flag=wx.GROW)        self.vbox.Add(wx.StaticLine(self, style=wx.LI_HORIZONTAL), flag=wx.GROW)        self.action_area = wx.BoxSizer(wx.HORIZONTAL)        self.cancelbutton = wx.Button(self, label=_("&Abort"))        self.cancelbutton.Bind(wx.EVT_BUTTON, self.cancel)        self.action_area.Add(self.cancelbutton,                             flag=wx.LEFT|wx.RIGHT|wx.BOTTOM, border=SPACING)        self.done_button = wx.Button(self, label=_("&Ok"))        self.done_button.Bind(wx.EVT_BUTTON, self.cancel)        self.action_area.Add(self.done_button,                             flag=wx.LEFT|wx.RIGHT|wx.BOTTOM, border=SPACING)        self.action_area.Show(self.done_button, False)        self.seed_button = wx.Button(self, label=_("&Start seeding"))        self.seed_button.Bind(wx.EVT_BUTTON, self.seed)        self.action_area.Add(self.seed_button,                             flag=wx.RIGHT|wx.BOTTOM, border=SPACING)        self.action_area.Show(self.seed_button, False)        self.Bind(wx.EVT_CLOSE, self.cancel)        self.vbox.Add(self.action_area, flag=wx.ALIGN_RIGHT,                      border=0)        self.SetSizerAndFit(self.vbox)        self.Show()    def main(self):        self.complete()    def seed(self, widget=None):        for f in self.file_list:            btspawn('bittorrent', f+EXTENSION, '--publish', f)        self.cancel()    def cancel(self, widget=None):        self.flag.set()        self.Destroy()    def set_progress_value(self, value):        self.progressbar.SetValue(value * 1000)        self._update_gui()    def set_file(self, filename):        self.label.SetLabel(_("building: ") + filename + EXTENSION)        self.vbox.Layout()        self.Fit()        self._update_gui()    def _update_gui(self):        wx.GetApp().Yield(True)    def complete(self):        try:            make_meta_files(self.announce.encode('utf8'),                            self.file_list,                            flag=self.flag,                            progressfunc=self.set_progress_value,                            filefunc=self.set_file,                            piece_len_pow2=self.piece_length,                            title=self.title,                            comment=self.comment,                            use_tracker=self.config['use_tracker'],                            data_dir=self.config['data_dir'],                            )            if not self.flag.isSet():                self.SetTitle(_("Done."))                self.label.SetLabel(_("Done building torrents."))                self.set_progress_value(1)                self.action_area.Show(self.cancelbutton, False)                self.action_area.Show(self.seed_button, True)                self.action_area.Show(self.done_button, True)                self.vbox.Layout()        except (OSError, IOError), e:            self.SetTitle(_("Error!"))            self.label.SetLabel(_("Error building torrents: ") + unicode(e.args[0]))def run(argv=[]):    config, args = configfile.parse_configuration_and_args(defaults,                                    'maketorrent', argv, 0, None)    # BUG: hack to make verbose mode be the default    config['verbose'] = not config['verbose']    MainLoop(config)class MainLoop(BTApp):    def __init__(self, config):        self.config = config        self.main_window = None        BTApp.__init__(self, 0)        self.MainLoop()    def OnInit(self):        BTApp.OnInit(self)        self.main_window = MainWindow(self.config)        return Trueif __name__ == '__main__':    run(argv=sys.argv[1:])

⌨️ 快捷键说明

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