def __update_monitors(self): """ Sets up or removes library monitors """ with self.__lock: if self.props.monitored: for directory in common.walk_directories(self.__root): monitor = directory.monitor_directory() monitor.connect('changed', self.on_location_changed) self.__monitors[directory] = monitor else: for directory, monitor in self.__monitors.iteritems(): monitor.cancel() self.__monitors = {}
def on_location_changed(self, monitor, gfile, other_gfile, event): """ Updates the library on changes of the location """ if event == gio.FILE_MONITOR_EVENT_CHANGES_DONE_HINT: if gfile in self.__queue: self.emit("file-added", gfile) self.__queue.remove(gfile) elif event == gio.FILE_MONITOR_EVENT_CREATED: # Enqueue tracks retrieval fileinfo = gfile.query_info('standard::type') if fileinfo.get_file_type() == gio.FILE_TYPE_REGULAR: if gfile not in self.__queue: self.__queue += [gfile] # Set up new monitor if directory if fileinfo.get_file_type() == gio.FILE_TYPE_DIRECTORY and \ gfile not in self.__monitors: for directory in common.walk_directories(gfile): monitor = directory.monitor_directory() monitor.connect('changed', self.on_location_changed) self.__monitors[directory] = monitor self.emit('folder-added', directory) elif event == gio.FILE_MONITOR_EVENT_DELETED: self.emit("location-removed", gfile) # Remove obsolete monitors removed_directories = [d for d in self.__monitors \ if d == gfile or d.has_prefix(gfile)] for directory in removed_directories: self.__monitors[directory].cancel() del self.__monitors[directory]