def on_download_files(self, widget, prefix=""): if not self.frame.np.transfers: return folder = self.selected_folder for d, f in self.shares: # Find the wanted directory if d != folder: continue for file in f: # Find the wanted file if file[1] not in self.selected_files: continue path = "\\".join([folder, file[1]]) size = file[2] h_bitrate, bitrate, h_length, length = get_result_bitrate_length(size, file[4]) # Get the file self.frame.np.transfers.get_file(self.user, path, prefix, size=size, bitrate=h_bitrate, length=h_length, checkduplicate=True) # We have found the wanted directory: we can break out of the loop break
def download_directory(self, folder, prefix="", recurse=0): if folder is None: return ldir = prefix + folder.split("\\")[-1] # Check if folder already exists on system ldir = self.frame.np.transfers.folder_destination(self.user, ldir) for d, f in self.shares: # Find the wanted directory if d != folder: continue priorityfiles = [] normalfiles = [] if self.frame.np.config.sections["transfers"]["prioritize"]: for file in f: parts = file[1].rsplit('.', 1) if len(parts) == 2 and parts[1] in ['sfv', 'md5', 'nfo']: priorityfiles.append(file) else: normalfiles.append(file) else: normalfiles = f if self.frame.np.config.sections["transfers"]["reverseorder"]: deco = [(x[1], x) for x in normalfiles] deco.sort(reverse=True) normalfiles = [x for junk, x in deco] for file in priorityfiles + normalfiles: path = "\\".join([folder, file[1]]) size = file[2] h_bitrate, bitrate, h_length = get_result_bitrate_length(size, file[4]) self.frame.np.transfers.get_file( self.user, path, ldir, size=size, bitrate=h_bitrate, length=h_length, checkduplicate=True ) if not recurse: return for subdir, subf in self.shares: if dir in subdir and dir != subdir: self.download_directory(subdir, os.path.join(ldir, ""))
def on_file_properties(self, _action, _state, all_files=False): data = [] folder = self.selected_folder selected_size = 0 selected_length = 0 if all_files: files = self.shares.get(folder) if not files: return for file_data in files: filename = file_data[1] file_size = file_data[2] virtual_path = "\\".join([folder, filename]) h_bitrate, _bitrate, h_length, length = get_result_bitrate_length( file_size, file_data[4]) selected_size += file_size selected_length += length data.append({ "user": self.user, "fn": virtual_path, "filename": filename, "directory": folder, "size": file_size, "bitrate": h_bitrate, "length": h_length }) else: model, paths = self.FileTreeView.get_selection().get_selected_rows( ) for path in paths: iterator = model.get_iter(path) filename = model.get_value(iterator, 0) file_size = model.get_value(iterator, 4) virtual_path = "\\".join([folder, filename]) selected_size += file_size selected_length += model.get_value(iterator, 6) data.append({ "user": self.user, "fn": virtual_path, "filename": filename, "directory": folder, "size": file_size, "bitrate": model.get_value(iterator, 2), "length": model.get_value(iterator, 3) }) if data: FileProperties(self.frame, data, selected_size, selected_length).show()
def download_folder(self, user, requested_folder, shares_list, prefix="", recurse=False): if requested_folder is None: return old_parent_folder = destination = None for folder, files in shares_list.items(): if not recurse and requested_folder != folder: continue if requested_folder not in folder: # Not a subfolder of the requested folder, skip continue parent_folder = folder.rsplit("\\", 1)[0] if parent_folder != old_parent_folder: if destination: prefix = os.path.join(destination, "") old_parent_folder = parent_folder # Remember custom download location self.core.transfers.requested_folders[user][folder] = prefix # Get final download destination destination = self.core.transfers.get_folder_destination( user, folder) if files: if self.config.sections["transfers"]["reverseorder"]: files.sort(key=lambda x: x[1], reverse=True) for file_data in files: virtualpath = "\\".join([folder, file_data[1]]) size = file_data[2] h_bitrate, _bitrate, h_length, _length = get_result_bitrate_length( size, file_data[4]) self.core.transfers.get_file(user, virtualpath, destination, size=size, bitrate=h_bitrate, length=h_length) if not recurse: # Downloading a single folder, no need to continue return
def set_directory(self, directory): # Temporarily disable sorting for improved performance self.file_store.set_default_sort_func(lambda *args: 0) self.file_store.set_sort_column_id(-1, Gtk.SortType.ASCENDING) self.selected_folder = directory self.file_store.clear() self.files.clear() found_dir = False for d, f in self.shares: if d == directory: found_dir = True files = f break if not found_dir: return for file in files: # Filename, HSize, Bitrate, HLength, Size, Length, RawFilename try: size = int(file[2]) except ValueError: size = 0 f = [file[1], human_size(size)] h_bitrate, bitrate, h_length, length = get_result_bitrate_length( size, file[4]) f += [ h_bitrate, h_length, GObject.Value(GObject.TYPE_UINT64, int(size)), GObject.Value(GObject.TYPE_UINT64, bitrate), GObject.Value(GObject.TYPE_UINT64, length) ] try: self.files[f[0]] = self.file_store.insert_with_valuesv( -1, self.file_column_numbers, f) except Exception as msg: log.add( _("Error while attempting to display folder '%(folder)s', reported error: %(error)s" ), { 'folder': directory, 'error': msg }) self.file_store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
def download_file(self, user, folder, file_data, prefix=""): virtualpath = "\\".join([folder, file_data[1]]) size = file_data[2] h_bitrate, _bitrate, h_length, _length = get_result_bitrate_length( size, file_data[4]) self.core.transfers.get_file(user, virtualpath, prefix, size=size, bitrate=h_bitrate, length=h_length)
def set_directory(self, directory): self.selected_folder = directory self.file_store.clear() self.files.clear() found_dir = False for d, f in self.shares: if d == directory: found_dir = True files = f break if not found_dir: return for file in files: # Filename, HSize, Bitrate, HLength, Size, Length, RawFilename try: size = int(file[2]) # Some clients send incorrect file sizes if size < 0 or size > maxsize: size = 0 except ValueError: size = 0 f = [file[1], human_size(size)] h_bitrate, bitrate, h_length, length = get_result_bitrate_length( size, file[4]) f += [ h_bitrate, h_length, GObject.Value(GObject.TYPE_UINT64, int(size)), GObject.Value(GObject.TYPE_UINT64, bitrate), GObject.Value(GObject.TYPE_UINT64, length) ] try: self.files[f[0]] = self.file_store.insert_with_valuesv( -1, self.file_column_numbers, f) except Exception as msg: log.add( _("Error while attempting to display folder '%(folder)s', reported error: %(error)s" ), { 'folder': directory, 'error': msg })
def set_directory(self, iter_user_data): directory = self.dir_user_data.get(iter_user_data) if directory is None or self.selected_folder == directory: return self.selected_folder = directory self.file_store.clear() self.file_iters.clear() files = self.shares.get(directory) if not files: return # Temporarily disable sorting for increased performance sort_column, sort_type = self.file_store.get_sort_column_id() self.file_store.set_default_sort_func(lambda *_args: 0) self.file_store.set_sort_column_id(-1, Gtk.SortType.ASCENDING) selected_folder_size = 0 for file in files: # Filename, HSize, Bitrate, HLength, Size, Length filename = file[1] size = file[2] selected_folder_size += size h_bitrate, bitrate, h_length, length = get_result_bitrate_length( size, file[4]) file_row = [ filename, human_size(size), h_bitrate, h_length, GObject.Value(GObject.TYPE_UINT64, size), GObject.Value(GObject.TYPE_UINT64, bitrate), GObject.Value(GObject.TYPE_UINT64, length) ] self.file_iters[filename] = self.file_store.insert_with_valuesv( -1, self.file_column_numbers, file_row) self.selected_folder_size = selected_folder_size if sort_column is not None and sort_type is not None: self.file_store.set_sort_column_id(sort_column, sort_type)
def download_directory(self, folder, prefix="", recurse=0): if self.frame.np.transfers is None or folder is None: return ldir = prefix + folder.split("\\")[-1] # Check if folder already exists on system ldir = self.frame.np.transfers.folder_destination(self.user, ldir) for d, files in self.shares: # Find the wanted directory if d != folder: continue if self.frame.np.config.sections["transfers"]["reverseorder"]: files.sort(key=lambda x: x[1], reverse=True) for file in files: path = "\\".join([folder, file[1]]) size = file[2] h_bitrate, bitrate, h_length, length = get_result_bitrate_length(size, file[4]) self.frame.np.transfers.get_file( self.user, path, ldir, size=size, bitrate=h_bitrate, length=h_length, checkduplicate=True ) if not recurse: return for subdir, subf in self.shares: if folder in subdir and folder != subdir: self.download_directory(subdir, os.path.join(ldir, ""))
def download_directory(self, folder, prefix="", recurse=False): if not self.frame.np.active_server_conn or folder is None: return # Remember custom download location self.frame.np.transfers.requested_folders[self.user][folder] = prefix # Get final download destination destination = self.frame.np.transfers.get_folder_destination( self.user, folder) for d, files in self.shares: # Find the wanted directory if d != folder: continue if config.sections["transfers"]["reverseorder"]: files.sort(key=lambda x: x[1], reverse=True) for file in files: virtualpath = "\\".join([folder, file[1]]) size = file[2] h_bitrate, bitrate, h_length, length = get_result_bitrate_length( size, file[4]) self.frame.np.transfers.get_file(self.user, virtualpath, destination, size=size, bitrate=h_bitrate, length=h_length, checkduplicate=True) if not recurse: return for subdir, subf in self.shares: if folder in subdir and folder != subdir: self.download_directory(subdir, prefix=os.path.join(destination, ""))
def add_user_results(self, msg, user, country): if user in self.users: return self.users.add(user) counter = len(self.all_data) + 1 inqueue = msg.inqueue ulspeed = msg.ulspeed h_speed = human_speed(ulspeed) if msg.freeulslots: imdl = "Y" inqueue = 0 else: imdl = "N" h_queue = humanize(inqueue) append = False maxstoredresults = self.searches.maxstoredresults for result in msg.list: if counter > maxstoredresults: break fullpath = result[1] fullpath_lower = fullpath.lower() if any(word in fullpath_lower for word in self.searchterm_words_ignore): """ Filter out results with filtered words (e.g. nicotine -music) """ log.add_search(_("Filtered out excluded search result " + fullpath + " from user " + user)) continue if not any(word in fullpath_lower for word in self.searchterm_words_include): """ Some users may send us wrong results, filter out such ones """ log.add_search(_("Filtered out inexact or incorrect search result " + fullpath + " from user " + user)) continue fullpath_split = reversed(fullpath.split('\\')) name = next(fullpath_split) directory = '\\'.join(fullpath_split) size = result[2] h_size = human_size(size) h_bitrate, bitrate, h_length = get_result_bitrate_length(size, result[4]) self.append([counter, user, self.get_flag(user, country), imdl, h_speed, h_queue, directory, name, h_size, h_bitrate, h_length, bitrate, fullpath, country, size, ulspeed, inqueue]) append = True counter += 1 if append: # If this search wasn't initiated by us (e.g. wishlist), and the results aren't spoofed, show tab if not self.showtab: self.searches.show_tab(self, self.id, self.text, self.mode) self.showtab = True # Update counter self.Counter.set_text("Results: %d/%d" % (self.numvisibleresults, len(self.all_data))) # Update tab notification self.frame.searches.request_changed(self.Main) if self.frame.MainNotebook.get_current_page() != self.frame.MainNotebook.page_num(self.frame.searchvbox): self.frame.SearchTabLabel.get_child().set_image(self.frame.images["online"])
def add_result_list(self, result_list, user, country, inqueue, ulspeed, h_speed, h_queue, color, private=False): """ Adds a list of search results to the treeview. Lists can either contain publicly or privately shared files. """ update_ui = False for result in result_list: if self.num_results_found >= self.max_limit: self.max_limited = True break fullpath = result[1] fullpath_lower = fullpath.lower() if any(word in fullpath_lower for word in self.searchterm_words_ignore): # Filter out results with filtered words (e.g. nicotine -music) log.add_debug(( "Filtered out excluded search result %(filepath)s from user %(user)s for " "search term \"%(query)s\""), { "filepath": fullpath, "user": user, "query": self.text }) continue if not any(word in fullpath_lower for word in self.searchterm_words_include): # Certain users may send us wrong results, filter out such ones log.add_search( _("Filtered out incorrect search result %(filepath)s from user %(user)s for " "search query \"%(query)s\""), { "filepath": fullpath, "user": user, "query": self.text }) continue self.num_results_found += 1 fullpath_split = fullpath.split('\\') if config.sections["ui"]["reverse_file_paths"]: # Reverse file path, file name is the first item. next() retrieves the name and removes # it from the iterator. fullpath_split = reversed(fullpath_split) name = next(fullpath_split) else: # Regular file path, file name is the last item. Retrieve it and remove it from the list. name = fullpath_split.pop() # Join the resulting items into a folder path directory = '\\'.join(fullpath_split) size = result[2] h_size = human_size(size) h_bitrate, bitrate, h_length, length = get_result_bitrate_length( size, result[4]) if private: name = _("[PRIVATE] %s") % name is_result_visible = self.append([ self.num_results_found, user, get_flag_icon_name(country), h_speed, h_queue, directory, name, h_size, h_bitrate, h_length, GObject.Value(GObject.TYPE_UINT, bitrate), fullpath, country, GObject.Value(GObject.TYPE_UINT64, size), GObject.Value(GObject.TYPE_UINT, ulspeed), GObject.Value(GObject.TYPE_UINT64, inqueue), GObject.Value(GObject.TYPE_UINT, length), GObject.Value(GObject.TYPE_STRING, color) ]) if is_result_visible: update_ui = True return update_ui
def add_user_results(self, msg, user, country): if user in self.users: return self.users.add(user) counter = len(self.all_data) + 1 inqueue = msg.inqueue ulspeed = msg.ulspeed h_speed = human_speed(ulspeed) if msg.freeulslots: imdl = "Y" inqueue = 0 else: imdl = "N" color_id = (imdl == "Y" and "search" or "searchq") color = config.sections["ui"][color_id] or None h_queue = humanize(inqueue) update_ui = False maxstoredresults = config.sections["searches"]["max_stored_results"] for result in msg.list: if counter > maxstoredresults: break fullpath = result[1] fullpath_lower = fullpath.lower() if any(word in fullpath_lower for word in self.searchterm_words_ignore): """ Filter out results with filtered words (e.g. nicotine -music) """ log.add_search( _("Filtered out excluded search result " + fullpath + " from user " + user)) continue if not any(word in fullpath_lower for word in self.searchterm_words_include): """ Some users may send us wrong results, filter out such ones """ log.add_search( _("Filtered out inexact or incorrect search result " + fullpath + " from user " + user)) continue fullpath_split = reversed(fullpath.split('\\')) name = next(fullpath_split) directory = '\\'.join(fullpath_split) size = result[2] h_size = human_size(size) h_bitrate, bitrate, h_length, length = get_result_bitrate_length( size, result[4]) is_result_visible = self.append([ GObject.Value(GObject.TYPE_UINT64, counter), user, GObject.Value(GObject.TYPE_OBJECT, self.frame.get_flag_image(country)), imdl, h_speed, h_queue, directory, name, h_size, h_bitrate, h_length, GObject.Value(GObject.TYPE_UINT64, bitrate), fullpath, country, GObject.Value(GObject.TYPE_UINT64, size), GObject.Value(GObject.TYPE_UINT64, ulspeed), GObject.Value(GObject.TYPE_UINT64, inqueue), GObject.Value(GObject.TYPE_UINT64, length), GObject.Value(GObject.TYPE_STRING, color) ]) if is_result_visible: update_ui = True counter += 1 if update_ui: # If this search wasn't initiated by us (e.g. wishlist), and the results aren't spoofed, show tab if not self.showtab: self.searches.show_tab(self, self.id, self.text, self.mode) self.showtab = True # Update number of results self.update_result_counter() # Update tab notification self.frame.searches.request_changed(self.Main) self.frame.request_tab_icon(self.frame.SearchTabLabel)
def add_result_list(self, result_list, counter, user, country, inqueue, ulspeed, h_speed, imdl, h_queue, color, private=False): """ Adds a list of search results to the treeview. Lists can either contain publicly or privately shared files. """ update_ui = False max_results = config.sections["searches"]["max_displayed_results"] for result in result_list: if counter > max_results: break fullpath = result[1] fullpath_lower = fullpath.lower() if any(word in fullpath_lower for word in self.searchterm_words_ignore): """ Filter out results with filtered words (e.g. nicotine -music) """ log.add_search( _("Filtered out excluded search result " + fullpath + " from user " + user)) continue if not any(word in fullpath_lower for word in self.searchterm_words_include): """ Some users may send us wrong results, filter out such ones """ log.add_search( _("Filtered out inexact or incorrect search result " + fullpath + " from user " + user)) continue fullpath_split = fullpath.split('\\') if config.sections["ui"]["reverse_file_paths"]: # Reverse file path, file name is the first item. next() retrieves the name and removes # it from the iterator. fullpath_split = reversed(fullpath_split) name = next(fullpath_split) else: # Regular file path, file name is the last item. Retrieve it and remove it from the list. name = fullpath_split.pop() # Join the resulting items into a folder path directory = '\\'.join(fullpath_split) size = result[2] h_size = human_size(size) h_bitrate, bitrate, h_length, length = get_result_bitrate_length( size, result[4]) if private: name = "[PRIVATE FILE] " + name is_result_visible = self.append([ GObject.Value(GObject.TYPE_UINT64, counter), user, GObject.Value(GObject.TYPE_OBJECT, self.frame.get_flag_image(country)), imdl, h_speed, h_queue, directory, name, h_size, h_bitrate, h_length, GObject.Value(GObject.TYPE_UINT64, bitrate), fullpath, country, GObject.Value(GObject.TYPE_UINT64, size), GObject.Value(GObject.TYPE_UINT64, ulspeed), GObject.Value(GObject.TYPE_UINT64, inqueue), GObject.Value(GObject.TYPE_UINT64, length), GObject.Value(GObject.TYPE_STRING, color) ]) if is_result_visible: update_ui = True counter += 1 return update_ui, counter