def on_remove_task_button_clicked(self,*arg): def is_current_selection_null(): if not self.current_selection or not self.current_selection[1] : dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("NO File is selected.!") dialog.run() dialog.destroy() return True else: return False def after_delete_task(data,error): self.info_label.set_text("Deletion is done") self.init_view(self.bdstoken) self.spinn.destroy() if is_current_selection_null(): return store,treepaths = self.current_selection for tpath in treepaths: task = () for i in store[tpath]: task = task + (i,) task_id = task[5] self.spinn = SpinnerDialog(self) self.spinn.show() self.info_label.set_text("Deleting task %s "%task[1]) utils.async_call(cloudapi.delete_task, self.bdstoken,task_id , callback=after_delete_task)
def on_start_task_button_clicked(self, *arg): if self.is_current_selection_null(): return self.spinn = SpinnerDialog(self) self.spinn.show() store, treepaths = self.current_selection self.q = queue.LifoQueue() for tpath in treepaths: print(store[tpath][2], store[tpath][4]) row = store[tpath] num = row[0] filename = row[2] path = row[4] isdir = row[5] fsid = row[6] spath = row[8] if not self.in_list(row, self.downlink): print(filename, fsid) npath = os.path.join(path, filename) utils.async_call(cloudapi.get_dlink, self.tokens, fsid, npath, num, callback=self.get_down_link) self.downlink.append((filename, None, spath, fsid)) print('0000sync888', self.downlink)
def __init__(self, parent, url): Gtk.Dialog.__init__( self, "Verification Code", parent, 0, ) self.file_list = [] #self.downlink = [] #self.tokens = tokens self.url = url #self.bdstoken,sign1,sign3,timestamp = self.tokens self.vcodefile = "image/vcode.jpeg" self.set_default_size(300, 200) self.set_border_width(10) label = Gtk.Label("Please input verification code above to proceed.") self.spinn = SpinnerDialog(self) self.spinn.show() self.vcodeimg = Gtk.Image.new() self.box = self.get_content_area() self.entry = Gtk.Entry() self.entry.connect("activate", self.on_enter_entry) self.entry.set_can_focus(True) self.entry.grab_focus() self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf) pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") self.liststore.append([pix]) iconview = Gtk.IconView.new() iconview.set_model(self.liststore) iconview.set_pixbuf_column(0) #self.liststore.append([pix]) self.show_vcode("image/loading.gif", None) #"image/loading.gif", self.box.add(iconview) #pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") #Gtk.Image.new_from_pixbuf(pix) button = Gtk.Button("Refresh Code") button.connect("clicked", self.on_click_refresh_clicked) self.on_click_refresh_clicked(button) #self.entry.set_text("Input vcode above") self.okbtn = self.add_button("OK", 22) self.okbtn.connect("clicked", self.on_click_OK_clicked) self.box.set_child_packing(button, False, False, 1, Gtk.PackType.START) self.box.set_spacing(8) self.box.add(label) self.box.add(self.entry) self.box.add(button) #self.box.add(okbtn) self.box.show_all()
def on_click_login(self, button): self.username = self.uentry.get_text() self.password = self.pentry.get_text() if not self.username or not self.password: self.info_label.set_text("Username or Password is blank.") return self.info_label.set_text("Going to index") logger.info("Username|Password %s %s" % (self.username, self.password)) self.spinn = SpinnerDialog(self) self.spinn.show() utils.async_call(auth.index, callback=self.after_goto_index) #bdstoken,sign1,sign3,timestamp = auth.index() print("click")
def on_start_task_button_clicked(self,*arg): if self.is_current_selection_null(): return self.spinn = SpinnerDialog(self) self.spinn.show() store,treepaths = self.current_selection self.q = queue.LifoQueue() for tpath in treepaths: print(store[tpath][2],store[tpath][4]) row = store[tpath] num = row[0] filename = row[2] path = row[4] isdir = row[5] fsid = row[6] spath = row[8] if not self.in_list(row,self.downlink): print(filename,fsid) npath = os.path.join(path,filename) utils.async_call(cloudapi.get_dlink,self.tokens,fsid,npath,num, callback=self.get_down_link) self.downlink.append((filename,None,spath,fsid)) print('0000sync888',self.downlink)
def __init__(self,parent,url): Gtk.Dialog.__init__(self, "Verification Code", parent, 0,) self.file_list = [] #self.downlink = [] #self.tokens = tokens self.url = url #self.bdstoken,sign1,sign3,timestamp = self.tokens self.vcodefile = "image/vcode.jpeg" self.set_default_size(300, 200) self.set_border_width(10) label = Gtk.Label("Please input verification code above to proceed.") self.spinn = SpinnerDialog(self) self.spinn.show() self.vcodeimg = Gtk.Image.new() self.box = self.get_content_area() self.entry = Gtk.Entry() self.entry.connect("activate",self.on_enter_entry) self.entry.set_can_focus(True) self.entry.grab_focus() self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf) pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") self.liststore.append([pix]) iconview = Gtk.IconView.new() iconview.set_model(self.liststore) iconview.set_pixbuf_column(0) #self.liststore.append([pix]) self.show_vcode("image/loading.gif",None)#"image/loading.gif", self.box.add(iconview) #pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") #Gtk.Image.new_from_pixbuf(pix) button = Gtk.Button("Refresh Code") button.connect("clicked", self.on_click_refresh_clicked) self.on_click_refresh_clicked(button) #self.entry.set_text("Input vcode above") self.okbtn = self.add_button("OK", 22) self.okbtn.connect("clicked", self.on_click_OK_clicked) self.box.set_child_packing(button,False,False,1,Gtk.PackType.START) self.box.set_spacing(8) self.box.add(label) self.box.add(self.entry) self.box.add(button) #self.box.add(okbtn) self.box.show_all()
def init_view(self, path): self.current_selection = None self.current_path = path logger.debug("Current Path: %s" % self.current_path) #list_json = cloudapi.list_path(self.current_path,500, # settings.DRY,self.bdstoken) utils.async_call(cloudapi.list_path, self.current_path, 500, settings.DRY, self.bdstoken, callback=self.populate_view) #logger.debug("Size of list json: %s"%str(len(list_json))) #file_list = cloudapi.get_list(list_json) #logger.debug("Size of file_list: %s"%str(len(file_list))) #self.liststore.clear() #self.fill_liststore(file_list) #self.loading_spin.start() #self.loading_spin.show_all() self.spinn = SpinnerDialog(self) self.spinn.show() file_list = [] pix_list = self.get_pix_list(file_list) self.fill_liststore(pix_list)
def on_click_login(self,button): self.username = self.uentry.get_text() self.password = self.pentry.get_text() if not self.username or not self.password: self.info_label.set_text("Username or Password is blank.") return self.info_label.set_text("Going to index") logger.info("Username|Password %s %s"%(self.username,self.password)) self.spinn = SpinnerDialog(self) self.spinn.show() utils.async_call(auth.index, callback=self.after_goto_index) #bdstoken,sign1,sign3,timestamp = auth.index() print("click")
def init_view(self,path): self.current_selection = None self.current_path = path logger.debug("Current Path: %s"%self.current_path) #list_json = cloudapi.list_path(self.current_path,500, # settings.DRY,self.bdstoken) utils.async_call(cloudapi.list_path, self.current_path,500, settings.DRY,self.bdstoken, callback=self.populate_view) #logger.debug("Size of list json: %s"%str(len(list_json))) #file_list = cloudapi.get_list(list_json) #logger.debug("Size of file_list: %s"%str(len(file_list))) #self.liststore.clear() #self.fill_liststore(file_list) #self.loading_spin.start() #self.loading_spin.show_all() self.spinn = SpinnerDialog(self) self.spinn.show() file_list = [] pix_list = self.get_pix_list(file_list) self.fill_liststore(pix_list)
class LoginDialog(Gtk.Dialog): def __init__(self, parent): Gtk.Dialog.__init__(self, "Login...", parent, 0) self.set_default_size(350, 200) self.set_border_width(15) grid = Gtk.Grid() grid.set_row_spacing(10) #grid.set_row_baseline_position(1,Gtk.BaselinePosition.CENTER ) #labelu = Gtk.Label("User Name:") #labelu.set_markup("<span style=\"oblique\">%s</span>") #labelp = Gtk.Label("Password:"******"xivhwo2002") self.pentry.set_text("mnja12") self.pentry.set_visibility(False) lbutton = self.add_button("Login...", 11) #Gtk.Button("Login...") lbutton.props.xalign = 0.5 lbutton.connect("clicked", self.on_click_login) offline = Gtk.CheckButton("Offline Mode") offline.connect("toggled", self.on_toggle_offline) verbose = Gtk.CheckButton("Verbose Mode") verbose.connect("toggled", self.on_toggle_verbose) box = self.get_content_area() box.set_spacing(8) #box.add(grid) box.add(self.uentry) box.add(self.pentry) box.add(offline) box.add(verbose) #grid.add(labelu) #grid.attach_next_to(self.uentry,labelu,Gtk.PositionType.RIGHT,13,1) #grid.attach(labelp,0, 2, 1, 1) #grid.attach_next_to(self.pentry,labelp,Gtk.PositionType.RIGHT,13,1) #grid.attach_next_to(lbutton,self.pentry,Gtk.PositionType.BOTTOM,13,1) self.infobar = Gtk.InfoBar() self.infobar.set_message_type(Gtk.MessageType.ERROR) #box.pack_end(self.infobar, False, False, 0) #grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1) box.add(self.infobar) info_content = self.infobar.get_content_area() self.info_label = Gtk.Label.new("Input username/password to log in..") info_content.pack_start(self.info_label, False, False, 0) self.infobar.hide() self.show_all() def on_click_login(self, button): self.username = self.uentry.get_text() self.password = self.pentry.get_text() if not self.username or not self.password: self.info_label.set_text("Username or Password is blank.") return self.info_label.set_text("Going to index") logger.info("Username|Password %s %s" % (self.username, self.password)) self.spinn = SpinnerDialog(self) self.spinn.show() utils.async_call(auth.index, callback=self.after_goto_index) #bdstoken,sign1,sign3,timestamp = auth.index() print("click") #self.destroy() def after_goto_index(self, data, error): print(data) bdstoken, sign1, sign3, timestamp = data if not bdstoken: self.info_label.set_text("Geting token") #token = auth.get_token() utils.async_call(auth.get_token, callback=self.after_get_token) else: info = "bdstoken %s existing,no need to login again!" % bdstoken logger.info(info) self.info_label.set_text(info) self.spinn.destroy() def after_get_token(self, token, error): self.token = token self.info_label.set_text("Geting public key") utils.async_call(auth.get_public_key, self.token, callback=self.after_get_public_key) #rsakey,pubkey = auth.get_public_key(token) def after_get_public_key(self, data, error): rsakey, pubkey = data self.info_label.set_text("Loging in now") #xml = auth.login(rsakey,pubkey,self.username,self.password,self.token) utils.async_call(auth.login, rsakey, pubkey, self.username, self.password, self.token, callback=self.after_login) def after_login(self, data, error): xml, errdict = data if errdict['err_no'] == 257: #Need verification Code codestring = errdict['codeString'] url = 'https://passport.baidu.com/cgi-bin/genimage?' + codestring vd = VcodeDialog(self, url) vd.run() vf = vd.get_user_input() if not vf or len(vf) != 4: self.info_label.set_text( "Verification Code missing or incorrect!") return else: vd.destory() utils.async_call(auth.relogin, rsakey, pubkey, self.username, self.password, vf, codeString, callback=self.after_login) elif errdict['err_no'] == 0: self.info_label.set_text("Login Successfully!") self.hide() self.spinn.destroy() def on_toggle_offline(self, button): if button.get_active(): settings.DRY = True else: settings.DRY = False logger.info("Flag DRY toggled to %s" % settings.DRY) def on_toggle_verbose(self, button): if button.get_active(): settings.VERBOSE = True else: settings.VERBOSE = False logger.info("Flag VERBOSE toggled to %s" % settings.VERBOSE)
class VcodeDialog(Gtk.Dialog): __metaclass__ = Singleton def __init__(self, parent, url): Gtk.Dialog.__init__( self, "Verification Code", parent, 0, ) self.file_list = [] #self.downlink = [] #self.tokens = tokens self.url = url #self.bdstoken,sign1,sign3,timestamp = self.tokens self.vcodefile = "image/vcode.jpeg" self.set_default_size(300, 200) self.set_border_width(10) label = Gtk.Label("Please input verification code above to proceed.") self.spinn = SpinnerDialog(self) self.spinn.show() self.vcodeimg = Gtk.Image.new() self.box = self.get_content_area() self.entry = Gtk.Entry() self.entry.connect("activate", self.on_enter_entry) self.entry.set_can_focus(True) self.entry.grab_focus() self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf) pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") self.liststore.append([pix]) iconview = Gtk.IconView.new() iconview.set_model(self.liststore) iconview.set_pixbuf_column(0) #self.liststore.append([pix]) self.show_vcode("image/loading.gif", None) #"image/loading.gif", self.box.add(iconview) #pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") #Gtk.Image.new_from_pixbuf(pix) button = Gtk.Button("Refresh Code") button.connect("clicked", self.on_click_refresh_clicked) self.on_click_refresh_clicked(button) #self.entry.set_text("Input vcode above") self.okbtn = self.add_button("OK", 22) self.okbtn.connect("clicked", self.on_click_OK_clicked) self.box.set_child_packing(button, False, False, 1, Gtk.PackType.START) self.box.set_spacing(8) self.box.add(label) self.box.add(self.entry) self.box.add(button) #self.box.add(okbtn) self.box.show_all() def on_enter_entry(self, *arg): self.okbtn.clicked() def on_click_refresh_clicked(self, *arg): utils.async_call(self.download_vcodeimg, self.url, self.vcodefile, callback=self.show_vcode) def new_url(self, url): self.url = url def on_click_OK_clicked(self, *arg): if not self.entry.get_text().strip(): dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("Nothing is input!") dialog.run() dialog.destroy() return def get_user_input(self, *arg): print(arg) inputtxt = self.entry.get_text().strip() return inputtxt def download_vcodeimg(self, imgurl, vcodeimg): f = open(vcodeimg, "wb") fp = fetch(imgurl, {}, "GetVcode") f.write(fp) f.close() return vcodeimg def show_vcode(self, imgfile, error): print('filename:', imgfile, error) pix = GdkPixbuf.Pixbuf.new_from_file(imgfile) fmat = GdkPixbuf.Pixbuf.get_file_info(imgfile) print(fmat[0].get_description(), fmat[0].get_extensions(), fmat[0].get_mime_types()) print(pix) #if not self.vcodeimg: #self.vcodeimg.clear() #self.vcodeimg = Gtk.Image.new_from_pixbuf(pix) path = Gtk.TreePath(0) #self.liststore.append([pix]) treeiter = self.liststore.get_iter(path) self.liststore.set_value(treeiter, 0, pix) #else: # self.vcodeimg = Gtk.Image.set_from_pixbuf(pix) #self.vcodeimg.show() self.spinn.destroy()
class DownloadDialog(Gtk.Dialog): __metaclass__ = Singleton def __init__(self, parent, file_list=[], tokens=None): Gtk.Dialog.__init__(self, "Download Task", parent, 0) self.file_list = file_list self.downlink = [] self.tokens = tokens #self.file_list = nlist #self.remove_list = file_list self.current_selection = None #self.draw_widget(file_list) #def draw_widget(self,file_list): self.set_default_size(1100, 500) self.set_border_width(10) box = self.get_content_area() ## num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status # 0 1 2 3 4 5 6 7 8 9 10 11 self.liststore = Gtk.ListStore(int, GdkPixbuf.Pixbuf, str, str, str, int, str, int, str, str, int, str) self.liststore.connect("row-changed", self.row_changed) self.fill_liststore(self.file_list) #creating the treeview, making it use the filter as a model, and adding the columns self.treeview = Gtk.TreeView(model=self.liststore) for i, column_title in enumerate([ "Num", "Thumb", "File", "Size", "Status", "Saving Path", "Speed", "Progress" ]): if column_title == "Thumb": renderer_pixbuf = Gtk.CellRendererPixbuf() column = Gtk.TreeViewColumn(column_title, renderer_pixbuf, pixbuf=i) elif column_title == "Saving Path": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=8) elif column_title == "Speed": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=9) elif column_title == "Status": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=11) elif column_title == "Progress": renderer = Gtk.CellRendererProgress() column = Gtk.TreeViewColumn(column_title, renderer, value=1) else: renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) self.treeview.append_column(column) self.treeview.props.activate_on_single_click = False self.treeview.connect("row-activated", self.on_row_double_click) self.selection = self.treeview.get_selection() self.selection.connect("changed", self.on_tree_selection_changed) self.selection.set_mode(Gtk.SelectionMode.MULTIPLE) self.buttons = list() for act in [ "Select All", "Unselect All", "Start Task", "Stop Task", "Remove Task" ]: button = Gtk.Button(act) self.buttons.append(button) funcname = "on_%s_button_clicked" % act.lower().replace(" ", "_") func = getattr(self, funcname) button.connect("clicked", func) self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) box.pack_start(self.scrollable_treelist, True, True, 0) for i, button in enumerate(self.buttons): #box.pack_start(self.buttons[i], False,False, 0) self.add_action_widget(self.buttons[i], i + 1) self.scrollable_treelist.add(self.treeview) box.show_all() def row_changed(self, store, path, treeiter): print("rowchange:", path) row = tuple(i for i in store[path]) print(row) print(self.file_list) self.file_list[int(path.to_string())] = row print(self.file_list) def fill_liststore(self, file_list): if file_list: for i, filerow in enumerate(file_list): self.liststore.append(list(filerow)) def on_tree_selection_changed(self, selection): #print(selection.get_selected_rows() ) references = [] self.current_selection = selection.get_selected_rows() def on_row_double_click(self, treeview, treepath, treeviewcolumn): print("Double click") def on_select_all_button_clicked(self, *arg): self.selection.select_all() def on_unselect_all_button_clicked(self, *arg): self.selection.unselect_all() def set_value(self, num, value, pos): path = Gtk.TreePath(num) treeiter = self.liststore.get_iter(path) self.liststore.set_value(treeiter, pos, value) #self.liststore.row_changed(path,treeiter) def get_down_link(self, link_data, error): if not error: link, fsid, num = link_data logger.debug("Download Link Ready = %s" % str(link)) for i, row in enumerate(self.downlink): if row[3] == fsid: listrow = list(row) listrow[1] = link self.downlink[i] = tuple(listrow) self.q.put(self.downlink[i]) break print('----async---', self.downlink) print(self.q) status = "Download Link Ready" self.set_value(num, status, 11) else: logger.debug("Get download link error %s" % str(error)) self.spinn.destroy() def download_progress(): while not self.q.empty(): task = self.q.get() print(task) fn = task[0] link = task[1] spath = task[2] url = re.sub("http://([^/]*)/", 'http://hot.baidupcs.com/', link) #cmd=['aria2c','-c', '-s1', '-x1','-j1', url,'-o',fn] cmd = "cd %s && aria2c -c -s1 -x1 -j1 -o '%s' '%s'" % (spath, fn, url) logger.info(cmd) print(cmd) import shlex #os.system("cd %s && %s"%(downpath,cmd)) #cmd = 'ls /etc/fstab /etc/non-existent-file' self.downproc = Popen(shlex.split(cmd), shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT) output = self.downproc.stdout.read() #output,errs = self.downproc.communicate() #STDOUT output = output.decode('utf-8') print(output) speedmat = re.search("\|([^|]*\/s)\|", output) if speedmat: speed = speedmat.group(1).strip() else: spmat = re.findall("DL:([^\s|^\]]*)", output, re.MULTILINE) if spmat: speed = spmat[len(spmat) - 1] else: speed = '0B/s' errmat = re.search("(errorCode[^\n]*status[^\n]*)", output) progmat = re.findall("\(([^)]*)\)", output, re.MULTILINE) progress = 0 if progmat: progress = int(progmat[len(progmat) - 1].strip("%")) error = '' if speedmat: error = errmat.group(1) self.set_value(num, error, 11) print(speed, progress) self.set_value(num, speed, 9) self.set_value(num, progress, 10) def on_start_task_button_clicked(self, *arg): if self.is_current_selection_null(): return self.spinn = SpinnerDialog(self) self.spinn.show() store, treepaths = self.current_selection self.q = queue.LifoQueue() for tpath in treepaths: print(store[tpath][2], store[tpath][4]) row = store[tpath] num = row[0] filename = row[2] path = row[4] isdir = row[5] fsid = row[6] spath = row[8] if not self.in_list(row, self.downlink): print(filename, fsid) npath = os.path.join(path, filename) utils.async_call(cloudapi.get_dlink, self.tokens, fsid, npath, num, callback=self.get_down_link) self.downlink.append((filename, None, spath, fsid)) print('0000sync888', self.downlink) def on_stop_task_button_clicked(self, *arg): print('-------------after-------------', self.downlink) self.downproc.terminate() def on_remove_task_button_clicked(self, *arg): if self.is_current_selection_null(): return store, treepaths = self.current_selection for tpath in treepaths: task = () for i in store[tpath]: task = task + (i, ) if task in self.file_list: self.file_list.remove(task) self.liststore.clear() self.fill_liststore(self.file_list) def is_current_selection_null(self): if not self.current_selection or not self.current_selection[1]: dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("NO File is selected.!") dialog.run() dialog.destroy() return True else: return False def remove_task_in_list(self, task, dlist): for row in dlist: if task[2] == row[2]: old_task = row break dlist.remove(old_task) def in_list(self, item, dlist): for row in dlist: print(item[6], row[3]) if item[6] == row[3]: return True return False
class VcodeDialog(Gtk.Dialog): __metaclass__ = Singleton def __init__(self,parent,url): Gtk.Dialog.__init__(self, "Verification Code", parent, 0,) self.file_list = [] #self.downlink = [] #self.tokens = tokens self.url = url #self.bdstoken,sign1,sign3,timestamp = self.tokens self.vcodefile = "image/vcode.jpeg" self.set_default_size(300, 200) self.set_border_width(10) label = Gtk.Label("Please input verification code above to proceed.") self.spinn = SpinnerDialog(self) self.spinn.show() self.vcodeimg = Gtk.Image.new() self.box = self.get_content_area() self.entry = Gtk.Entry() self.entry.connect("activate",self.on_enter_entry) self.entry.set_can_focus(True) self.entry.grab_focus() self.liststore = Gtk.ListStore(GdkPixbuf.Pixbuf) pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") self.liststore.append([pix]) iconview = Gtk.IconView.new() iconview.set_model(self.liststore) iconview.set_pixbuf_column(0) #self.liststore.append([pix]) self.show_vcode("image/loading.gif",None)#"image/loading.gif", self.box.add(iconview) #pix = GdkPixbuf.Pixbuf.new_from_file("image/loading.gif") #Gtk.Image.new_from_pixbuf(pix) button = Gtk.Button("Refresh Code") button.connect("clicked", self.on_click_refresh_clicked) self.on_click_refresh_clicked(button) #self.entry.set_text("Input vcode above") self.okbtn = self.add_button("OK", 22) self.okbtn.connect("clicked", self.on_click_OK_clicked) self.box.set_child_packing(button,False,False,1,Gtk.PackType.START) self.box.set_spacing(8) self.box.add(label) self.box.add(self.entry) self.box.add(button) #self.box.add(okbtn) self.box.show_all() def on_enter_entry(self,*arg): self.okbtn.clicked() def on_click_refresh_clicked(self,*arg): utils.async_call(self.download_vcodeimg,self.url,self.vcodefile, callback=self.show_vcode) def new_url(self,url): self.url = url def on_click_OK_clicked(self,*arg): if not self.entry.get_text().strip(): dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("Nothing is input!") dialog.run() dialog.destroy() return def get_user_input(self,*arg): print(arg) inputtxt = self.entry.get_text().strip() return inputtxt def download_vcodeimg(self,imgurl,vcodeimg): f=open(vcodeimg,"wb") fp = fetch(imgurl,{},"GetVcode") f.write(fp) f.close() return vcodeimg def show_vcode(self,imgfile,error): print('filename:',imgfile,error) pix = GdkPixbuf.Pixbuf.new_from_file(imgfile) fmat = GdkPixbuf.Pixbuf.get_file_info(imgfile) print(fmat[0].get_description(),fmat[0].get_extensions(),fmat[0].get_mime_types()) print(pix) #if not self.vcodeimg: #self.vcodeimg.clear() #self.vcodeimg = Gtk.Image.new_from_pixbuf(pix) path = Gtk.TreePath(0) #self.liststore.append([pix]) treeiter = self.liststore.get_iter(path) self.liststore.set_value(treeiter, 0, pix) #else: # self.vcodeimg = Gtk.Image.set_from_pixbuf(pix) #self.vcodeimg.show() self.spinn.destroy()
def __init__(self,parent,tokens,save_path): Gtk.Dialog.__init__(self, "Download Task", parent, 0) self.file_list = [] #self.downlink = [] self.tokens = tokens self.bdstoken,sign1,sign3,timestamp = self.tokens #self.file_list = nlist #self.remove_list = file_list self.current_selection = None self.save_path = save_path #self.draw_widget(file_list) #def draw_widget(self,file_list): self.set_default_size(800, 500) self.set_border_width(10) box = self.get_content_area() ## num,filename,size,status,path, # 0 1 2 3 4 self.liststore = Gtk.ListStore(int,str, str, str,str,str) #self.liststore.connect("row-changed",self.row_changed) self.spinn = SpinnerDialog(self) self.spinn.show() self.init_view(self.bdstoken) #creating the treeview, making it use the filter as a model, and adding the columns self.treeview = Gtk.TreeView(model=self.liststore) for i, column_title in enumerate(["Num","File", "Size","Status", "Path"]): renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer,text=i) self.treeview.append_column(column) self.treeview.props.activate_on_single_click = False self.treeview.connect("row-activated",self.on_row_double_click) self.selection = self.treeview.get_selection() self.selection.connect("changed", self.on_tree_selection_changed) self.selection.set_mode(Gtk.SelectionMode.MULTIPLE) self.buttons = list() for act in ["Add Magnet or Ed2k Link File","Select All","Unselect All", "Remove Task"]: button = Gtk.Button(act) self.buttons.append(button) funcname = "on_%s_button_clicked"%act.lower().replace(" ","_") func = getattr(self, funcname) button.connect("clicked", func) self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) box.pack_start(self.scrollable_treelist, True, True, 0) for i, button in enumerate(self.buttons): #box.pack_start(self.buttons[i], False,False, 0) self.add_action_widget(self.buttons[i],i+1) self.scrollable_treelist.add(self.treeview) self.infobar = Gtk.InfoBar() self.infobar.set_message_type(Gtk.MessageType.ERROR) #box.pack_end(self.infobar, False, False, 0) #grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1) box.add(self.infobar) info_content = self.infobar.get_content_area() self.info_label = Gtk.Label.new("Add magnet/ed2k file to add offline download task") info_content.pack_start(self.info_label, False, False, 0) self.infobar.hide() box.show_all()
def on_add_magnet_or_ed2k_link_file_button_clicked(self,*arg): dialog = Gtk.FileChooserDialog("Please choose a file", self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) response = dialog.run() if response == Gtk.ResponseType.OK: #linkfile = dialog.get_file().read() filename = dialog.get_filename() print("Open clicked") print("File selected: " + dialog.get_filename()) elif response == Gtk.ResponseType.CANCEL: return dialog.destroy() link_list = open(filename).read() task_list = [] invalid_list = [] for line in link_list.split("\n"): line = line.strip() if line and ( line.startswith("magnet:?xt=urn") or \ line.startswith("ed2k://") ): task_list.append(line) elif line: invalid_list.append(line) if invalid_list: dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK, "Attention") dialog.format_secondary_text( "Only magnet or ed2k protocal is support! Invalid lines :%s"%str(invalid_list)) response = dialog.run() dialog.destroy() return print(self.save_path) maglist = [ i['source_url'] for i in self.task_list if "magnet:?xt=urn:" in i['source_url'] ] logger.debug("maglist: %s "%str(maglist)) for i,l in enumerate(task_list): mag = re.search('(&.*$)',l).group(1) task_name = dict(urllib.parse.parse_qsl(mag))['dn'] txt = "%s out of %s | %s is running."%(str(i),len(task_list),str(task_name)) logger.info(txt) self.info_label.set_text(txt) maglink = re.search("(magnet[^&]*)",l).group(1) logger.debug("maglink: %s "%maglink) self.spinn = SpinnerDialog(self) self.spinn.show() if maglink not in maglist: self.info_label.set_text("Adding task: %s "%task_name) taskjson = cloudapi.add_task(self.bdstoken, l,self.save_path,self) self.init_view(self.bdstoken) self.spinn.destroy() #taskjson = cloudapi.add_task(l,self.save_path) logger.debug("taskjson: %s "%taskjson) if 'task_id' in taskjson.keys(): self.spinn = SpinnerDialog(self) self.spinn.show() self.info_label.set_text("Querying task: %s "%task_name) task_id = str(taskjson['task_id']) utils.async_call(cloudapi.query_task, self.bdstoken,task_id, callback=self.after_query_task) self.spinn.destroy() else: error = taskjson['error_msg'] logger.info(error) self.info_label.set_text(error) #self.spinn.destroy() else: info = "Already existed,pass" logger.info(info) self.info_label.set_text(info) self.spinn.destroy()
class TaskDialog(Gtk.Dialog): __metaclass__ = Singleton def __init__(self,parent,tokens,save_path): Gtk.Dialog.__init__(self, "Download Task", parent, 0) self.file_list = [] #self.downlink = [] self.tokens = tokens self.bdstoken,sign1,sign3,timestamp = self.tokens #self.file_list = nlist #self.remove_list = file_list self.current_selection = None self.save_path = save_path #self.draw_widget(file_list) #def draw_widget(self,file_list): self.set_default_size(800, 500) self.set_border_width(10) box = self.get_content_area() ## num,filename,size,status,path, # 0 1 2 3 4 self.liststore = Gtk.ListStore(int,str, str, str,str,str) #self.liststore.connect("row-changed",self.row_changed) self.spinn = SpinnerDialog(self) self.spinn.show() self.init_view(self.bdstoken) #creating the treeview, making it use the filter as a model, and adding the columns self.treeview = Gtk.TreeView(model=self.liststore) for i, column_title in enumerate(["Num","File", "Size","Status", "Path"]): renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer,text=i) self.treeview.append_column(column) self.treeview.props.activate_on_single_click = False self.treeview.connect("row-activated",self.on_row_double_click) self.selection = self.treeview.get_selection() self.selection.connect("changed", self.on_tree_selection_changed) self.selection.set_mode(Gtk.SelectionMode.MULTIPLE) self.buttons = list() for act in ["Add Magnet or Ed2k Link File","Select All","Unselect All", "Remove Task"]: button = Gtk.Button(act) self.buttons.append(button) funcname = "on_%s_button_clicked"%act.lower().replace(" ","_") func = getattr(self, funcname) button.connect("clicked", func) self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) box.pack_start(self.scrollable_treelist, True, True, 0) for i, button in enumerate(self.buttons): #box.pack_start(self.buttons[i], False,False, 0) self.add_action_widget(self.buttons[i],i+1) self.scrollable_treelist.add(self.treeview) self.infobar = Gtk.InfoBar() self.infobar.set_message_type(Gtk.MessageType.ERROR) #box.pack_end(self.infobar, False, False, 0) #grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1) box.add(self.infobar) info_content = self.infobar.get_content_area() self.info_label = Gtk.Label.new("Add magnet/ed2k file to add offline download task") info_content.pack_start(self.info_label, False, False, 0) self.infobar.hide() box.show_all() def on_tree_selection_changed(self,*arg): self.current_selection = self.selection.get_selected_rows() def populate_view(self,*arg): listjson,error = arg print(listjson) if 'task_info' in list(listjson.keys()): task_list = listjson['task_info'] file_list = [] for i,row in enumerate(task_list): if int(row['status']) == 0: status = "Success" else: status = "Not Finised" nrow = (i,row['task_name'],'0B',status,row['save_path'],row['task_id']) file_list.append(nrow) self.fill_liststore(file_list) elif 'error_msg' in list(listjson.keys()): info =listjson['error_msg'] logger.info(info) self.info_label.set_text(info) self.spinn.destroy() def init_view(self,bdstoken): utils.async_call(cloudapi.list_task, bdstoken, callback=self.populate_view) self.fill_liststore([]) def fill_liststore(self,file_list): if file_list: self.liststore.clear() for i,filerow in enumerate(file_list): self.liststore.append(list(filerow)) def on_select_all_button_clicked(self,*arg): self.selection.select_all() def on_unselect_all_button_clicked(self,*arg): self.selection.unselect_all() def on_remove_task_button_clicked(self,*arg): def is_current_selection_null(): if not self.current_selection or not self.current_selection[1] : dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("NO File is selected.!") dialog.run() dialog.destroy() return True else: return False def after_delete_task(data,error): self.info_label.set_text("Deletion is done") self.init_view(self.bdstoken) self.spinn.destroy() if is_current_selection_null(): return store,treepaths = self.current_selection for tpath in treepaths: task = () for i in store[tpath]: task = task + (i,) task_id = task[5] self.spinn = SpinnerDialog(self) self.spinn.show() self.info_label.set_text("Deleting task %s "%task[1]) utils.async_call(cloudapi.delete_task, self.bdstoken,task_id , callback=after_delete_task) #self.liststore.clear() #self.fill_liststore(file_list) def on_row_double_click(self,*arg): pass def after_cancel_task(self,*arg): taskdata,error = arg canceljson,task_id,task_name = taskdata logger.debug("canceljson: %s "%canceljson) info ="Task:%s,id:%s is cancelled."%(task_name,task_id) logger.info(info) self.info_label.set_text(info) self.init_view(self.bdstoken) self.spinn.destroy() def after_query_task(self,*arg): taskdata,error = arg taskjson,task_id = taskdata #self.init_view(self.bdstoken) #taskjson = cloudapi.query_task(task_id) logger.debug("taskjson: %s "%taskjson) #if task_json: file_size = int(taskjson['task_info'][task_id]['file_size']) finished_size = int(taskjson['task_info'][task_id]['finished_size']) task_name = taskjson['task_info'][task_id]['task_name'] logger.debug("file_size: %s "%file_size) logger.debug("finished_size: %s "%finished_size) if finished_size/file_size < 1 : info = "%s : Finished rate is less than 0.6, canceling."%task_name logger.info(info) self.info_label.set_text(info) utils.async_call(cloudapi.cancel_task, self.bdstoken,task_id,task_name, callback=self.after_cancel_task) else: info = "Task:%s,id:%s is successfully created."%(task_name,task_id) logger.info(info) self.info_label.set_text(info) #self.init_view(self.bdstoken) self.spinn.destroy() def after_add_task(self,*arg): taskjson,error = arg logger.debug("taskjson: %s "%taskjson) if 'task_id' in taskjson.keys(): task_id = str(taskjson['task_id']) utils.async_call(cloudapi.query_task, self.bdstoken,task_id, callback=self.after_query_task) else: error = taskjson['error_msg'] logger.info(error) self.info_label.set_text(error) #self.init_view(self.bdstoken) self.spinn.destroy() #self.spinn.destroy() def on_add_magnet_or_ed2k_link_file_button_clicked(self,*arg): dialog = Gtk.FileChooserDialog("Please choose a file", self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) response = dialog.run() if response == Gtk.ResponseType.OK: #linkfile = dialog.get_file().read() filename = dialog.get_filename() print("Open clicked") print("File selected: " + dialog.get_filename()) elif response == Gtk.ResponseType.CANCEL: return dialog.destroy() link_list = open(filename).read() task_list = [] invalid_list = [] for line in link_list.split("\n"): line = line.strip() if line and ( line.startswith("magnet:?xt=urn") or \ line.startswith("ed2k://") ): task_list.append(line) elif line: invalid_list.append(line) if invalid_list: dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK, "Attention") dialog.format_secondary_text( "Only magnet or ed2k protocal is support! Invalid lines :%s"%str(invalid_list)) response = dialog.run() dialog.destroy() return print(self.save_path) maglist = [ i['source_url'] for i in self.task_list if "magnet:?xt=urn:" in i['source_url'] ] logger.debug("maglist: %s "%str(maglist)) for i,l in enumerate(task_list): mag = re.search('(&.*$)',l).group(1) task_name = dict(urllib.parse.parse_qsl(mag))['dn'] txt = "%s out of %s | %s is running."%(str(i),len(task_list),str(task_name)) logger.info(txt) self.info_label.set_text(txt) maglink = re.search("(magnet[^&]*)",l).group(1) logger.debug("maglink: %s "%maglink) self.spinn = SpinnerDialog(self) self.spinn.show() if maglink not in maglist: self.info_label.set_text("Adding task: %s "%task_name) taskjson = cloudapi.add_task(self.bdstoken, l,self.save_path,self) self.init_view(self.bdstoken) self.spinn.destroy() #taskjson = cloudapi.add_task(l,self.save_path) logger.debug("taskjson: %s "%taskjson) if 'task_id' in taskjson.keys(): self.spinn = SpinnerDialog(self) self.spinn.show() self.info_label.set_text("Querying task: %s "%task_name) task_id = str(taskjson['task_id']) utils.async_call(cloudapi.query_task, self.bdstoken,task_id, callback=self.after_query_task) self.spinn.destroy() else: error = taskjson['error_msg'] logger.info(error) self.info_label.set_text(error) #self.spinn.destroy() else: info = "Already existed,pass" logger.info(info) self.info_label.set_text(info) self.spinn.destroy()
class MajorWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title="Cloud Disk") self.set_border_width(10) self.maximize() #Setting up the self.grid in which the elements are to be positionned self.grid = Gtk.Grid() self.grid.set_column_homogeneous(True) self.grid.set_row_homogeneous(True) self.add(self.grid) #box = Gtk.Box(spacing=6) #self.add(box) self.tokens = auth.index() self.bdstoken, self.sign1, self.sign3, self.timestamp = self.tokens #self.connect('activate', self.on_login_dialog_close) #self.connect("delete-event", Gtk.main_quit) if not self.bdstoken: dialog = LoginDialog(self) #dialog.connect("close",self.on_login_dialog_close) response = dialog.run() dialog.destroy() if response == Gtk.ResponseType.DELETE_EVENT: print(response) print("quit") #self.close() self.destroy() return elif response == 11: print("login") else: return self.down_list = [] self.current_path = "/" self.current_selection = None ## num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status # 0 1 2 3 4 5 6 7 8 9 10 11 self.liststore = Gtk.ListStore(int, GdkPixbuf.Pixbuf, str, str, str, int, str, int, str, str, int, str) self.current_list = [] #self.loading_spin = Gtk.Spinner() #self.loading_spin.props.valign = Gtk.Align.CENTER #box.pack_start(self.loading_spin, False, False, 0) #self.grid.add(self.loading_spin) self.init_view(self.current_path) #self.spinn.hide() #list_json = cloudapi.list_path(self.current_path,500,settings.DRY,self.bdstoken) #logger.debug("list json: %s"%str(len(list_json)) #file_list = cloudapi.get_list(list_json) #logger.debug("file_list: %s"%str(file_list)) #self.populate_view(file_list) self.stop_gif = False #creating the treeview, making it use the filter as a model, and adding the columns self.treeview = Gtk.TreeView(model=self.liststore) for i, column_title in enumerate( ["Num", "Thumb", "File", "Size", "Path"]): if column_title != "Thumb": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) else: renderer_pixbuf = Gtk.CellRendererPixbuf() column = Gtk.TreeViewColumn(column_title, renderer_pixbuf, pixbuf=i) #if not column_title == 'isdir' and not column_title == 'fsid' and not column_title == 'cate' : self.treeview.append_column(column) self.treeview.props.activate_on_single_click = False self.treeview.connect("row-activated", self.on_row_double_click) self.selection = self.treeview.get_selection() self.selection.connect("changed", self.on_tree_selection_changed) self.selection.set_mode(Gtk.SelectionMode.MULTIPLE) #select = selection.get_selected_rows() #creating buttons to filter by programming language, and setting up their events self.buttons = list() for act in [ "Up level", "Refresh View", "Batch Add Task", "Remove File", "Download", "CleanUp", "Search" ]: button = Gtk.Button(act) self.buttons.append(button) funcname = "on_%s_button_clicked" % act.lower().replace(" ", "_") print(funcname) func = getattr(self, funcname) button.connect("clicked", func) #setting up the layout, putting the treeview in a scrollwindow, and the buttons in a row self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) #self.grid.attach(self.loading_spin, 0, 0, 10, 20) #self.grid.attach_next_to(self.scrollable_treelist,self.loading_spin, Gtk.PositionType.BOTTOM, 10, 23) self.grid.attach(self.scrollable_treelist, 0, 0, 8, 20) #box.pack_start(self.scrollable_treelist, True, True, 0) self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1) for i, button in enumerate(self.buttons[1:]): self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1) #self.add_action_widget(self.buttons[i],i+1) #box.pack_start(self.buttons[i], False, False, 0) self.scrollable_treelist.add(self.treeview) #box.show_all() self.grid.show_all() #self.loading_spin.start() #self.loading_spin.show_all() #self.loading_spin.hide() #self.hide() def reload_pix(self, re_data, error): pix = None if not error: num, thumbimg = re_data path = Gtk.TreePath(int(num)) if len(self.liststore) > 0: treeiter = self.liststore.get_iter(path) if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]: pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg) else: pix = None logger.debug("reloading pix,pix = %s" % str(pix)) self.stop_gif = True self.liststore.set_value(treeiter, 1, pix) else: logger.debug("reload_pix error %s" % str(error)) def get_pix_list(self, file_list): current_list = [] def advance_frame(*user_data): num, pixiter = user_data #pass# if pixiter.advance() and not self.stop_gif: pix = pixiter.get_pixbuf() path = Gtk.TreePath(int(num)) if len(self.liststore) > 0: treeiter = self.liststore.get_iter(path) self.liststore.set_value(treeiter, 1, pix) return True else: return False def down_img(num, thumbimg, link, fsid, header, path): logger.debug(" %s is downloading" % str(fsid)) f = open(thumbimg, "wb") img = fetch(link, {}, fsid, header, path) f.write(img) f.close() return (num, thumbimg) def create_img_pix(thumbimg): if not GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]: return None else: return GdkPixbuf.Pixbuf.new_from_file(thumbimg) for row in file_list: #if cate == 1: #(num,thumb,filename,size,path,isdir,fsid,cate) num = row[0] thumb = row[1] path = row[4] isdir = row[5] fsid = row[6] cate = row[7] host = urlparse(thumb)[1] header = { 'Host': host, 'Referer': DISK_HOME, } if not os.path.exists("image"): os.makedirs("image") thumbimg = "image/" + fsid + ".jpg" if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]: pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg) elif thumb: self.stop_gif = False pixan = GdkPixbuf.PixbufAnimation.new_from_file( "image/loading.gif") pixiter = pixan.get_iter() pix = pixiter.get_pixbuf() #pix.set_loop(True) GLib.timeout_add(pixiter.get_delay_time(), advance_frame, num, pixiter) logger.debug("Async call download for file %s " % str(fsid)) utils.async_call(down_img, num, thumbimg, thumb, fsid, header, path, callback=self.reload_pix) elif isdir: pix = GdkPixbuf.Pixbuf.new_from_file("image/folder.png") else: pix = None rowlist = list(row) rowlist[1] = pix #elif cate == 6: # pix = create_img_pix("image/folder.png") current_list.append( tuple(rowlist) + (SAVINGPATH, "0B", 0, "pending")) return current_list def populate_view(self, list_json, error=None): if list_json: self.current_list = [] file_list = cloudapi.get_list(list_json) logger.debug("Size of file_list: %s" % str(len(file_list))) pix_list = self.get_pix_list(file_list) self.fill_liststore(pix_list) #self.loading_spin.stop() #self.loading_spin.hide() #self.spinn.hide() self.spinn.destroy() def fill_liststore(self, file_list): self.liststore.clear() for i, filerow in enumerate(file_list): #logger.info("Creating TreeView at %s"%str(i)) self.liststore.append(list(filerow)) def on_tree_selection_changed(self, selection): #print(selection.get_selected_rows() ) references = [] self.current_selection = selection.get_selected_rows() def on_login_dialog_close(self, *arg): print("close dialog") print(*arg) self.close() def init_view(self, path): self.current_selection = None self.current_path = path logger.debug("Current Path: %s" % self.current_path) #list_json = cloudapi.list_path(self.current_path,500, # settings.DRY,self.bdstoken) utils.async_call(cloudapi.list_path, self.current_path, 500, settings.DRY, self.bdstoken, callback=self.populate_view) #logger.debug("Size of list json: %s"%str(len(list_json))) #file_list = cloudapi.get_list(list_json) #logger.debug("Size of file_list: %s"%str(len(file_list))) #self.liststore.clear() #self.fill_liststore(file_list) #self.loading_spin.start() #self.loading_spin.show_all() self.spinn = SpinnerDialog(self) self.spinn.show() file_list = [] pix_list = self.get_pix_list(file_list) self.fill_liststore(pix_list) def on_row_double_click(self, treeview, treepath, treeviewcolumn): print("Double click") print(self.liststore[treepath]) #treeiter = self.liststore.get_iter(treepath) #num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress = row = self.liststore[treepath] #num = row[0] filename = row[2] #thumb = row[1] path = row[4] isdir = row[5] #fsid = row[6] #cate = row[7] logger.debug("row : %s" % (','.join(str(i) for i in row))) if isdir: npath = os.path.join(path, filename) self.init_view(npath) return True def on_up_level_button_clicked(self, *arg): path = os.path.abspath(os.path.join(self.current_path, "..")) self.init_view(path) def on_refresh_view_button_clicked(self, *arg): settings.DRY = False self.init_view(self.current_path) settings.DRY = True def on_batch_add_task_button_clicked(self, *arg): print("Click", arg) settings.DRY = False td = TaskDialog(self, self.tokens, self.current_path) response = td.show() if response == Gtk.ResponseType.DELETE_EVENT: settings.DRY = True def on_remove_file_button_clicked(self, *arg): if self.is_current_selection_null(): return store, treepaths = self.current_selection remove_list = [] for tpath in treepaths: row = store[tpath] filename = row[2] path = row[4] isdir = row[5] remove_list.append(os.path.join(path, filename)) fl = '["' + '","'.join(str(i) for i in remove_list) + '"]' logger.debug("Flist: %s" % fl) if not self.agree_to_action(fl, "remove"): return cloudapi.delete_file(self.bdstoken, fl) settings.DRY = False self.init_view(self.current_path) settings.DRY = True def task_in_list(self, task, dlist): for row in dlist: #num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress = row if task[6] == row[6]: return True return False def on_download_button_clicked(self, *arg): #if self.is_current_selection_null(): # return if self.current_selection and self.current_selection[1]: store, treepaths = self.current_selection for tpath in treepaths: task = store[tpath] num = task[0] filename = task[2] thumb = task[1] path = task[4] isdir = task[5] fsid = task[6] cate = task[7] if not isdir and not self.task_in_list(task, self.down_list): self.down_list.append(task) else: tasks = self.recursive_selected([task]) for task in tasks: if not self.task_in_list(task, self.down_list): self.down_list.append(task) print(self.down_list) self.downdialog = DownloadDialog(self, self.down_list, self.tokens) #self.downdialog.connect("delete-event",self.hide_down_dialog) #self.downdialog.hide() #self.downdialog.liststore.clear() #self.downdialog.fill_liststore(self.down_list) response = self.downdialog.show() if response == Gtk.ResponseType.DELETE_EVENT: print(response) self.downdialog.hide() self.selection.unselect_all() def on_cleanup_button_clicked(self, *arg): print("Click", arg) def on_search_button_clicked(self, button): print("Click", button) url = 'http://pan.baidu.com/genimage?33324238656332346361663334656637323237633636373637643239666664336662343932343631383931303030303030303030303030303031343335353131313938D9224DC2E75F22A923706D077C0CD5B2' vd = VcodeDialog(self, url) response = vd.run() print(response) if response == 22: print("The OK button was clicked") vcode = vd.get_user_input() vd.destroy() elif response == Gtk.ResponseType.DELETE_EVENT: vd.destroy() def is_current_selection_null(self): if not self.current_selection or not self.current_selection[1]: dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("NO File is selected.!") dialog.run() dialog.destroy() return True else: return False def agree_to_action(self, fl, action): dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "%s Confirmation" % action.title()) dialog.format_secondary_text("Are you sure to %s file(s) : %s" % (action, fl)) response = dialog.run() dialog.destroy() if response == Gtk.ResponseType.YES: return True elif response == Gtk.ResponseType.NO: return False def hide_down_dialog(self, *arg): self.downdialog.hide() def recursive_selected(self, lists): task_list = [] folder = [] for row in lists: filename = row[2] path = row[4] isdir = row[5] if not isdir: task_list.append(row) else: folder.append((path, filename)) for path, filename in folder: npath = os.path.join(path, filename) list_json = cloudapi.list_path(npath, 300, True, self.bdstoken) nlists = [] for row in self.get_pix_list(cloudapi.get_list(list_json)): nlists.append(row) task_list += self.recursive_selected(nlists) return task_list
class DownloadDialog(Gtk.Dialog): __metaclass__ = Singleton def __init__(self,parent,file_list=[],tokens=None): Gtk.Dialog.__init__(self, "Download Task", parent, 0) self.file_list = file_list self.downlink = [] self.tokens = tokens #self.file_list = nlist #self.remove_list = file_list self.current_selection = None #self.draw_widget(file_list) #def draw_widget(self,file_list): self.set_default_size(1100, 500) self.set_border_width(10) box = self.get_content_area() ## num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status # 0 1 2 3 4 5 6 7 8 9 10 11 self.liststore = Gtk.ListStore(int,GdkPixbuf.Pixbuf,str, str, str,int,str,int,str,str,int,str) self.liststore.connect("row-changed",self.row_changed) self.fill_liststore(self.file_list) #creating the treeview, making it use the filter as a model, and adding the columns self.treeview = Gtk.TreeView(model=self.liststore) for i, column_title in enumerate(["Num","Thumb","File", "Size","Status", "Saving Path","Speed","Progress"]): if column_title == "Thumb": renderer_pixbuf = Gtk.CellRendererPixbuf() column = Gtk.TreeViewColumn(column_title, renderer_pixbuf,pixbuf=i) elif column_title == "Saving Path": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer,text=8) elif column_title == "Speed": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer,text=9) elif column_title == "Status": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer,text=11) elif column_title == "Progress": renderer = Gtk.CellRendererProgress() column = Gtk.TreeViewColumn(column_title, renderer, value=1) else: renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer,text=i) self.treeview.append_column(column) self.treeview.props.activate_on_single_click = False self.treeview.connect("row-activated",self.on_row_double_click) self.selection = self.treeview.get_selection() self.selection.connect("changed", self.on_tree_selection_changed) self.selection.set_mode(Gtk.SelectionMode.MULTIPLE) self.buttons = list() for act in ["Select All","Unselect All", "Start Task","Stop Task", "Remove Task"]: button = Gtk.Button(act) self.buttons.append(button) funcname = "on_%s_button_clicked"%act.lower().replace(" ","_") func = getattr(self, funcname) button.connect("clicked", func) self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) box.pack_start(self.scrollable_treelist, True, True, 0) for i, button in enumerate(self.buttons): #box.pack_start(self.buttons[i], False,False, 0) self.add_action_widget(self.buttons[i],i+1) self.scrollable_treelist.add(self.treeview) box.show_all() def row_changed(self,store,path,treeiter): print("rowchange:",path) row = tuple( i for i in store[path] ) print(row) print(self.file_list) self.file_list[int(path.to_string())] = row print(self.file_list) def fill_liststore(self,file_list): if file_list: for i,filerow in enumerate(file_list): self.liststore.append(list(filerow)) def on_tree_selection_changed(self,selection): #print(selection.get_selected_rows() ) references = [] self.current_selection = selection.get_selected_rows() def on_row_double_click(self,treeview,treepath,treeviewcolumn): print("Double click") def on_select_all_button_clicked(self,*arg): self.selection.select_all() def on_unselect_all_button_clicked(self,*arg): self.selection.unselect_all() def set_value(self,num,value,pos): path = Gtk.TreePath(num) treeiter = self.liststore.get_iter(path) self.liststore.set_value(treeiter, pos, value) #self.liststore.row_changed(path,treeiter) def get_down_link(self,link_data,error): if not error: link,fsid,num = link_data logger.debug("Download Link Ready = %s"%str(link)) for i,row in enumerate(self.downlink): if row[3] == fsid: listrow = list(row) listrow[1] = link self.downlink[i] = tuple(listrow) self.q.put(self.downlink[i]) break print('----async---',self.downlink) print(self.q) status = "Download Link Ready" self.set_value(num,status,11) else: logger.debug("Get download link error %s"%str(error)) self.spinn.destroy() def download_progress(): while not self.q.empty(): task = self.q.get() print(task) fn = task[0] link = task[1] spath = task[2] url = re.sub("http://([^/]*)/",'http://hot.baidupcs.com/',link) #cmd=['aria2c','-c', '-s1', '-x1','-j1', url,'-o',fn] cmd="cd %s && aria2c -c -s1 -x1 -j1 -o '%s' '%s'"%(spath,fn,url) logger.info( cmd ) print(cmd) import shlex #os.system("cd %s && %s"%(downpath,cmd)) #cmd = 'ls /etc/fstab /etc/non-existent-file' self.downproc = Popen(shlex.split(cmd), shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT) output = self.downproc.stdout.read() #output,errs = self.downproc.communicate() #STDOUT output = output.decode('utf-8') print(output) speedmat = re.search("\|([^|]*\/s)\|",output) if speedmat: speed = speedmat.group(1).strip() else: spmat = re.findall("DL:([^\s|^\]]*)",output,re.MULTILINE) if spmat : speed = spmat[len(spmat)-1] else: speed = '0B/s' errmat = re.search("(errorCode[^\n]*status[^\n]*)",output) progmat = re.findall("\(([^)]*)\)",output,re.MULTILINE) progress = 0 if progmat: progress = int(progmat[len(progmat)-1].strip("%")) error = '' if speedmat : error = errmat.group(1) self.set_value(num,error,11) print(speed,progress) self.set_value(num,speed,9) self.set_value(num,progress,10) def on_start_task_button_clicked(self,*arg): if self.is_current_selection_null(): return self.spinn = SpinnerDialog(self) self.spinn.show() store,treepaths = self.current_selection self.q = queue.LifoQueue() for tpath in treepaths: print(store[tpath][2],store[tpath][4]) row = store[tpath] num = row[0] filename = row[2] path = row[4] isdir = row[5] fsid = row[6] spath = row[8] if not self.in_list(row,self.downlink): print(filename,fsid) npath = os.path.join(path,filename) utils.async_call(cloudapi.get_dlink,self.tokens,fsid,npath,num, callback=self.get_down_link) self.downlink.append((filename,None,spath,fsid)) print('0000sync888',self.downlink) def on_stop_task_button_clicked(self,*arg): print('-------------after-------------',self.downlink) self.downproc.terminate() def on_remove_task_button_clicked(self,*arg): if self.is_current_selection_null(): return store,treepaths = self.current_selection for tpath in treepaths: task = () for i in store[tpath]: task = task + (i,) if task in self.file_list: self.file_list.remove(task) self.liststore.clear() self.fill_liststore(self.file_list) def is_current_selection_null(self): if not self.current_selection or not self.current_selection[1] : dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("NO File is selected.!") dialog.run() dialog.destroy() return True else: return False def remove_task_in_list(self,task,dlist): for row in dlist: if task[2] == row[2]: old_task = row break dlist.remove(old_task) def in_list(self,item,dlist): for row in dlist: print(item[6],row[3]) if item[6] == row[3]: return True return False
class LoginDialog(Gtk.Dialog): def __init__(self, parent): Gtk.Dialog.__init__(self, "Login...", parent, 0) self.set_default_size(350, 200) self.set_border_width(15) grid = Gtk.Grid() grid.set_row_spacing(10) #grid.set_row_baseline_position(1,Gtk.BaselinePosition.CENTER ) #labelu = Gtk.Label("User Name:") #labelu.set_markup("<span style=\"oblique\">%s</span>") #labelp = Gtk.Label("Password:"******"xivhwo2002") self.pentry.set_text("mnja12") self.pentry.set_visibility(False) lbutton = self.add_button("Login...",11) #Gtk.Button("Login...") lbutton.props.xalign = 0.5 lbutton.connect("clicked",self.on_click_login) offline = Gtk.CheckButton("Offline Mode") offline.connect("toggled",self.on_toggle_offline) verbose = Gtk.CheckButton("Verbose Mode") verbose.connect("toggled",self.on_toggle_verbose) box = self.get_content_area() box.set_spacing(8) #box.add(grid) box.add(self.uentry) box.add(self.pentry) box.add(offline) box.add(verbose) #grid.add(labelu) #grid.attach_next_to(self.uentry,labelu,Gtk.PositionType.RIGHT,13,1) #grid.attach(labelp,0, 2, 1, 1) #grid.attach_next_to(self.pentry,labelp,Gtk.PositionType.RIGHT,13,1) #grid.attach_next_to(lbutton,self.pentry,Gtk.PositionType.BOTTOM,13,1) self.infobar = Gtk.InfoBar() self.infobar.set_message_type(Gtk.MessageType.ERROR) #box.pack_end(self.infobar, False, False, 0) #grid.attach_next_to(self.infobar,lbutton,Gtk.PositionType.BOTTOM,13,1) box.add(self.infobar) info_content = self.infobar.get_content_area() self.info_label = Gtk.Label.new("Input username/password to log in..") info_content.pack_start(self.info_label, False, False, 0) self.infobar.hide() self.show_all() def on_click_login(self,button): self.username = self.uentry.get_text() self.password = self.pentry.get_text() if not self.username or not self.password: self.info_label.set_text("Username or Password is blank.") return self.info_label.set_text("Going to index") logger.info("Username|Password %s %s"%(self.username,self.password)) self.spinn = SpinnerDialog(self) self.spinn.show() utils.async_call(auth.index, callback=self.after_goto_index) #bdstoken,sign1,sign3,timestamp = auth.index() print("click") #self.destroy() def after_goto_index(self,data,error): print(data) bdstoken,sign1,sign3,timestamp = data if not bdstoken: self.info_label.set_text("Geting token") #token = auth.get_token() utils.async_call(auth.get_token, callback=self.after_get_token) else: info = "bdstoken %s existing,no need to login again!"%bdstoken logger.info(info) self.info_label.set_text(info) self.spinn.destroy() def after_get_token(self,token,error): self.token = token self.info_label.set_text("Geting public key") utils.async_call(auth.get_public_key,self.token, callback=self.after_get_public_key) #rsakey,pubkey = auth.get_public_key(token) def after_get_public_key(self,data,error): rsakey,pubkey = data self.info_label.set_text("Loging in now") #xml = auth.login(rsakey,pubkey,self.username,self.password,self.token) utils.async_call(auth.login,rsakey,pubkey,self.username,self.password,self.token, callback=self.after_login) def after_login(self,data,error): xml,errdict = data if errdict['err_no'] == 257 : #Need verification Code codestring = errdict['codeString'] url = 'https://passport.baidu.com/cgi-bin/genimage?' + codestring vd = VcodeDialog(self,url) vd.run() vf = vd.get_user_input() if not vf or len(vf) != 4: self.info_label.set_text("Verification Code missing or incorrect!") return else: vd.destory() utils.async_call(auth.relogin,rsakey,pubkey,self.username,self.password,vf,codeString, callback=self.after_login) elif errdict['err_no'] == 0: self.info_label.set_text("Login Successfully!") self.hide() self.spinn.destroy() def on_toggle_offline(self,button): if button.get_active(): settings.DRY = True else: settings.DRY = False logger.info("Flag DRY toggled to %s"%settings.DRY) def on_toggle_verbose(self,button): if button.get_active(): settings.VERBOSE = True else: settings.VERBOSE = False logger.info("Flag VERBOSE toggled to %s"%settings.VERBOSE)
class MajorWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title="Cloud Disk") self.set_border_width(10) self.maximize() #Setting up the self.grid in which the elements are to be positionned self.grid = Gtk.Grid() self.grid.set_column_homogeneous(True) self.grid.set_row_homogeneous(True) self.add(self.grid) #box = Gtk.Box(spacing=6) #self.add(box) self.tokens = auth.index() self.bdstoken,self.sign1,self.sign3,self.timestamp = self.tokens #self.connect('activate', self.on_login_dialog_close) #self.connect("delete-event", Gtk.main_quit) if not self.bdstoken: dialog = LoginDialog(self) #dialog.connect("close",self.on_login_dialog_close) response = dialog.run() dialog.destroy() if response == Gtk.ResponseType.DELETE_EVENT: print(response) print("quit") #self.close() self.destroy() return elif response == 11: print("login") else: return self.down_list = [] self.current_path = "/" self.current_selection = None ## num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress,status # 0 1 2 3 4 5 6 7 8 9 10 11 self.liststore = Gtk.ListStore(int,GdkPixbuf.Pixbuf,str, str, str,int,str,int,str,str,int,str) self.current_list = [] #self.loading_spin = Gtk.Spinner() #self.loading_spin.props.valign = Gtk.Align.CENTER #box.pack_start(self.loading_spin, False, False, 0) #self.grid.add(self.loading_spin) self.init_view(self.current_path) #self.spinn.hide() #list_json = cloudapi.list_path(self.current_path,500,settings.DRY,self.bdstoken) #logger.debug("list json: %s"%str(len(list_json)) #file_list = cloudapi.get_list(list_json) #logger.debug("file_list: %s"%str(file_list)) #self.populate_view(file_list) self.stop_gif = False #creating the treeview, making it use the filter as a model, and adding the columns self.treeview = Gtk.TreeView(model=self.liststore) for i, column_title in enumerate(["Num","Thumb","File", "Size", "Path"]): if column_title != "Thumb": renderer = Gtk.CellRendererText() column = Gtk.TreeViewColumn(column_title, renderer, text=i) else: renderer_pixbuf = Gtk.CellRendererPixbuf() column = Gtk.TreeViewColumn(column_title, renderer_pixbuf,pixbuf=i) #if not column_title == 'isdir' and not column_title == 'fsid' and not column_title == 'cate' : self.treeview.append_column(column) self.treeview.props.activate_on_single_click = False self.treeview.connect("row-activated",self.on_row_double_click) self.selection = self.treeview.get_selection() self.selection.connect("changed", self.on_tree_selection_changed) self.selection.set_mode(Gtk.SelectionMode.MULTIPLE) #select = selection.get_selected_rows() #creating buttons to filter by programming language, and setting up their events self.buttons = list() for act in ["Up level", "Refresh View", "Batch Add Task", "Remove File", "Download","CleanUp","Search"]: button = Gtk.Button(act) self.buttons.append(button) funcname = "on_%s_button_clicked"%act.lower().replace(" ","_") print(funcname) func = getattr(self, funcname) button.connect("clicked", func) #setting up the layout, putting the treeview in a scrollwindow, and the buttons in a row self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) #self.grid.attach(self.loading_spin, 0, 0, 10, 20) #self.grid.attach_next_to(self.scrollable_treelist,self.loading_spin, Gtk.PositionType.BOTTOM, 10, 23) self.grid.attach(self.scrollable_treelist, 0, 0, 8, 20) #box.pack_start(self.scrollable_treelist, True, True, 0) self.grid.attach_next_to(self.buttons[0], self.scrollable_treelist, Gtk.PositionType.BOTTOM, 1, 1) for i, button in enumerate(self.buttons[1:]): self.grid.attach_next_to(button, self.buttons[i], Gtk.PositionType.RIGHT, 1, 1) #self.add_action_widget(self.buttons[i],i+1) #box.pack_start(self.buttons[i], False, False, 0) self.scrollable_treelist.add(self.treeview) #box.show_all() self.grid.show_all() #self.loading_spin.start() #self.loading_spin.show_all() #self.loading_spin.hide() #self.hide() def reload_pix(self,re_data,error): pix = None if not error: num,thumbimg = re_data path = Gtk.TreePath(int(num)) if len(self.liststore) > 0 : treeiter = self.liststore.get_iter(path) if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]: pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg) else: pix = None logger.debug("reloading pix,pix = %s"%str(pix)) self.stop_gif = True self.liststore.set_value(treeiter, 1, pix) else: logger.debug("reload_pix error %s"%str(error)) def get_pix_list(self,file_list): current_list = [] def advance_frame(*user_data): num,pixiter = user_data #pass# if pixiter.advance() and not self.stop_gif: pix = pixiter.get_pixbuf() path = Gtk.TreePath(int(num)) if len(self.liststore) > 0: treeiter = self.liststore.get_iter(path) self.liststore.set_value(treeiter, 1, pix) return True else: return False def down_img(num,thumbimg,link,fsid,header,path): logger.debug(" %s is downloading"%str(fsid)) f=open(thumbimg,"wb") img = fetch(link,{},fsid,header,path) f.write(img) f.close() return (num,thumbimg) def create_img_pix(thumbimg): if not GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]: return None else: return GdkPixbuf.Pixbuf.new_from_file(thumbimg) for row in file_list: #if cate == 1: #(num,thumb,filename,size,path,isdir,fsid,cate) num = row[0] thumb = row[1] path = row[4] isdir =row[5] fsid = row[6] cate = row[7] host = urlparse(thumb)[1] header = { 'Host':host, 'Referer':DISK_HOME, } if not os.path.exists("image"): os.makedirs("image") thumbimg = "image/" + fsid + ".jpg" if GdkPixbuf.Pixbuf.get_file_info(thumbimg)[0]: pix = GdkPixbuf.Pixbuf.new_from_file(thumbimg) elif thumb: self.stop_gif = False pixan = GdkPixbuf.PixbufAnimation.new_from_file("image/loading.gif") pixiter = pixan.get_iter() pix = pixiter.get_pixbuf() #pix.set_loop(True) GLib.timeout_add(pixiter.get_delay_time(), advance_frame,num,pixiter) logger.debug("Async call download for file %s "%str(fsid)) utils.async_call(down_img, num,thumbimg,thumb,fsid,header,path, callback=self.reload_pix) elif isdir: pix = GdkPixbuf.Pixbuf.new_from_file("image/folder.png") else: pix = None rowlist = list(row) rowlist[1] = pix #elif cate == 6: # pix = create_img_pix("image/folder.png") current_list.append( tuple(rowlist) + (SAVINGPATH,"0B",0,"pending")) return current_list def populate_view(self,list_json,error=None): if list_json: self.current_list = [] file_list = cloudapi.get_list(list_json) logger.debug("Size of file_list: %s"%str(len(file_list))) pix_list = self.get_pix_list(file_list) self.fill_liststore(pix_list) #self.loading_spin.stop() #self.loading_spin.hide() #self.spinn.hide() self.spinn.destroy() def fill_liststore(self,file_list): self.liststore.clear() for i,filerow in enumerate(file_list): #logger.info("Creating TreeView at %s"%str(i)) self.liststore.append(list(filerow)) def on_tree_selection_changed(self,selection): #print(selection.get_selected_rows() ) references = [] self.current_selection = selection.get_selected_rows() def on_login_dialog_close(self,*arg): print("close dialog") print(*arg) self.close() def init_view(self,path): self.current_selection = None self.current_path = path logger.debug("Current Path: %s"%self.current_path) #list_json = cloudapi.list_path(self.current_path,500, # settings.DRY,self.bdstoken) utils.async_call(cloudapi.list_path, self.current_path,500, settings.DRY,self.bdstoken, callback=self.populate_view) #logger.debug("Size of list json: %s"%str(len(list_json))) #file_list = cloudapi.get_list(list_json) #logger.debug("Size of file_list: %s"%str(len(file_list))) #self.liststore.clear() #self.fill_liststore(file_list) #self.loading_spin.start() #self.loading_spin.show_all() self.spinn = SpinnerDialog(self) self.spinn.show() file_list = [] pix_list = self.get_pix_list(file_list) self.fill_liststore(pix_list) def on_row_double_click(self,treeview,treepath,treeviewcolumn): print("Double click") print(self.liststore[treepath]) #treeiter = self.liststore.get_iter(treepath) #num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress = row = self.liststore[treepath] #num = row[0] filename = row[2] #thumb = row[1] path = row[4] isdir = row[5] #fsid = row[6] #cate = row[7] logger.debug("row : %s"%(','.join(str(i) for i in row ))) if isdir: npath = os.path.join(path,filename) self.init_view(npath) return True def on_up_level_button_clicked(self,*arg): path = os.path.abspath(os.path.join(self.current_path,"..")) self.init_view(path) def on_refresh_view_button_clicked(self,*arg): settings.DRY = False self.init_view(self.current_path) settings.DRY = True def on_batch_add_task_button_clicked(self,*arg): print("Click",arg) settings.DRY = False td = TaskDialog(self,self.tokens,self.current_path) response = td.show() if response == Gtk.ResponseType.DELETE_EVENT: settings.DRY = True def on_remove_file_button_clicked(self,*arg): if self.is_current_selection_null(): return store,treepaths = self.current_selection remove_list = [] for tpath in treepaths: row = store[tpath] filename = row[2] path = row[4] isdir = row[5] remove_list.append(os.path.join(path,filename)) fl = '["' + '","'.join(str(i) for i in remove_list) + '"]' logger.debug("Flist: %s"%fl) if not self.agree_to_action(fl,"remove"): return cloudapi.delete_file(self.bdstoken,fl) settings.DRY = False self.init_view(self.current_path) settings.DRY = True def task_in_list(self,task,dlist): for row in dlist: #num,pix,filename,size,path,isdir,fsid,cate,spath,speed,progress = row if task[6] == row[6]: return True return False def on_download_button_clicked(self,*arg): #if self.is_current_selection_null(): # return if self.current_selection and self.current_selection[1]: store,treepaths = self.current_selection for tpath in treepaths: task = store[tpath] num = task[0] filename = task[2] thumb = task[1] path = task[4] isdir = task[5] fsid = task[6] cate = task[7] if not isdir and not self.task_in_list(task,self.down_list): self.down_list.append(task) else: tasks = self.recursive_selected([task]) for task in tasks: if not self.task_in_list(task,self.down_list): self.down_list.append(task) print(self.down_list) self.downdialog = DownloadDialog(self,self.down_list,self.tokens) #self.downdialog.connect("delete-event",self.hide_down_dialog) #self.downdialog.hide() #self.downdialog.liststore.clear() #self.downdialog.fill_liststore(self.down_list) response = self.downdialog.show() if response == Gtk.ResponseType.DELETE_EVENT: print(response) self.downdialog.hide() self.selection.unselect_all() def on_cleanup_button_clicked(self,*arg): print("Click",arg) def on_search_button_clicked(self,button): print("Click",button) url = 'http://pan.baidu.com/genimage?33324238656332346361663334656637323237633636373637643239666664336662343932343631383931303030303030303030303030303031343335353131313938D9224DC2E75F22A923706D077C0CD5B2' vd = VcodeDialog(self,url) response = vd.run() print(response) if response == 22: print("The OK button was clicked") vcode = vd.get_user_input() vd.destroy() elif response == Gtk.ResponseType.DELETE_EVENT: vd.destroy() def is_current_selection_null(self): if not self.current_selection or not self.current_selection[1] : dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.INFO, Gtk.ButtonsType.OK, "Attention.......") dialog.format_secondary_text("NO File is selected.!") dialog.run() dialog.destroy() return True else: return False def agree_to_action(self,fl,action): dialog = Gtk.MessageDialog(self, 0, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, "%s Confirmation"%action.title()) dialog.format_secondary_text( "Are you sure to %s file(s) : %s"%(action,fl)) response = dialog.run() dialog.destroy() if response == Gtk.ResponseType.YES: return True elif response == Gtk.ResponseType.NO: return False def hide_down_dialog(self,*arg): self.downdialog.hide() def recursive_selected(self,lists): task_list = [] folder = [] for row in lists: filename = row[2] path = row[4] isdir = row[5] if not isdir: task_list.append(row) else: folder.append((path,filename)) for path,filename in folder: npath = os.path.join(path,filename) list_json = cloudapi.list_path(npath,300,True,self.bdstoken) nlists = [] for row in self.get_pix_list(cloudapi.get_list(list_json )): nlists.append(row) task_list += self.recursive_selected(nlists) return task_list