def __init__(self, providerlist, gladefilepath): self._providerlist = providerlist self._gladefile = gladefilepath self._widget_tree = gtk.glade.XML(self._gladefile) self.stop_event = Event() # get gui elements self._window = self._widget_tree.get_widget("bpyloadr_window") self._provider_field = self._widget_tree.get_widget("provider_field") self._tags_field = self._widget_tree.get_widget("tags_field") self._filepath_field = self._widget_tree.get_widget("filepath_field") self._btn_get = self._widget_tree.get_widget("btn_get") self._btn_stop = self._widget_tree.get_widget("btn_stop") self._btn_stop.set_sensitive(False) self._lbl_progress = self._widget_tree.get_widget("lbl_progress") self._total_progress = self._widget_tree.get_widget("total_progress") self._image_field = self._widget_tree.get_widget("latest_image") # cell renderer self._cell_renderer = gtk.CellRendererText() self._provider_field.pack_start(self._cell_renderer, True) self._provider_field.add_attribute( self._cell_renderer, 'text', 0) # create model for provider self._provider_model = gtk.ListStore(gobject.TYPE_STRING) # initialize BooruPy self._booru_handler = BooruManager(self._providerlist, False) # fill provider list for item in self._booru_handler.provider_list: self._add_provider(item.name) self._provider_field.set_model(self._provider_model) self._window.connect("destroy", self._quit) self._btn_get.connect("clicked", self.btn_get_clicked, self._window) self._btn_stop.connect("clicked", self.btn_stop_clicked, self._window) self._init_ui_worker_thread() glib.idle_add(self._ui_idle_change)
class BooruPyLoadr(): def __init__(self, providerlist, gladefilepath): self._providerlist = providerlist self._gladefile = gladefilepath self._widget_tree = gtk.glade.XML(self._gladefile) self.stop_event = Event() # get gui elements self._window = self._widget_tree.get_widget("bpyloadr_window") self._provider_field = self._widget_tree.get_widget("provider_field") self._tags_field = self._widget_tree.get_widget("tags_field") self._filepath_field = self._widget_tree.get_widget("filepath_field") self._btn_get = self._widget_tree.get_widget("btn_get") self._btn_stop = self._widget_tree.get_widget("btn_stop") self._btn_stop.set_sensitive(False) self._lbl_progress = self._widget_tree.get_widget("lbl_progress") self._total_progress = self._widget_tree.get_widget("total_progress") self._image_field = self._widget_tree.get_widget("latest_image") # cell renderer self._cell_renderer = gtk.CellRendererText() self._provider_field.pack_start(self._cell_renderer, True) self._provider_field.add_attribute( self._cell_renderer, 'text', 0) # create model for provider self._provider_model = gtk.ListStore(gobject.TYPE_STRING) # initialize BooruPy self._booru_handler = BooruManager(self._providerlist, False) # fill provider list for item in self._booru_handler.provider_list: self._add_provider(item.name) self._provider_field.set_model(self._provider_model) self._window.connect("destroy", self._quit) self._btn_get.connect("clicked", self.btn_get_clicked, self._window) self._btn_stop.connect("clicked", self.btn_stop_clicked, self._window) self._init_ui_worker_thread() glib.idle_add(self._ui_idle_change) def _ui_idle_change(self): try: item = self.ui_queue.get_nowait() except Empty: return True if item[0] == UiActions.image: self._image_field.set_from_pixbuf(item[1]) elif item[0] == UiActions.file_progress: self._lbl_progress.set_text(item[1]) self._total_progress.set_fraction(item[2]) return True def _init_ui_worker_thread(self): self._ui_worker_thread = UiWorker() self.ui_queue = self._ui_worker_thread.ui_queue self.ui_worker_queue = self._ui_worker_thread.ui_worker_queue self._ui_worker_thread.start() def show(self): self._window.show_all() gtk.gdk.threads_init() gtk.main() def _quit(self, event): gtk.main_quit() sys.exit() def _add_provider(self, provider_name): self._provider_model.append([provider_name]) def get_provider(self): provider_id = self._provider_field.get_active() return self._booru_handler.get_provider_by_id(int(provider_id)) def get_tags(self): return self._tags_field.get_text().split(' ') def get_filepath(self): path = self._filepath_field.get_current_folder() if not path[-1] is "/": path += "/" return path def toggle_button(self): sensitive = self._btn_get.get_sensitive() self._btn_get.set_sensitive(False if sensitive else True) self._btn_stop.set_sensitive(sensitive) def btn_get_clicked(self, widget, data=None): self.toggle_button() self.stop_event.clear() thread = Thread(target=self._download) thread.daemon = True thread.start() def btn_stop_clicked(self, widget, data=None): self.toggle_button() self.stop_event.set() def _get_md5_checksum_from_file(self, path): _file = open(path, 'rb') md5 = hashlib.md5() while True: data = _file.read(8192) if not data: break md5.update(data) return md5.hexdigest() def _download(self): provider = self.get_provider() tags = self.get_tags() folder_name = "%s-%s" % (provider.shortname, "-".join(tags)) path = join(self.get_filepath(), folder_name) if not os.path.exists(path): os.mkdir(path) for i in provider.get_images(tags): if self.stop_event.is_set(): return file_name = "%s[%s].%s" % ( provider.shortname, i.md5, i.url.split('.')[-1]) target_path = join(path, file_name) # check file md5 checksum if os.path.exists(target_path): status = MD5StatusTask(self.ui_worker_queue, file_name) filemd5 = self._get_md5_checksum_from_file(target_path) status.report_progress(100) if i.md5 == filemd5: continue res = urllib2.urlopen(i.url) _file = open(target_path, 'wb') meta = res.info() file_size = int(meta.getheaders("Content-Length")[0]) file_size_dl = 0 block_sz = 8192 status = ShowStatusTask(self.ui_worker_queue, target_path) while True: buffer = res.read(block_sz) if not buffer: status.finished() break file_size_dl += len(buffer) _file.write(buffer) status.report_progress(file_size_dl * 100 / file_size) self.toggle_button()