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 __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]
    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]