                                                       total=self._images.process_count,
                                                       file=sys.stdout,
                                                       desc=desc,
                                                       leave=False)):
                  self._check_thread_error()
                  if is_final:
                      self._output_processing(extract_media, size)
                      self._output_faces(saver, extract_media)
                      if self._save_interval and (idx + 1) % self._save_interval == 0:
                          self._alignments.save()
 
</s> remove                                                      total=self._images.process_count,
 </s> add                                                      total=self._loader.process_count, </s> remove             self._check_thread_error()
 </s> add             self._loader.check_thread_error() </s> remove             detected_faces = {}
 </s> add             detected_faces: Dict[str, ExtractMedia] = {} </s> remove         skip_list = []
        for idx, filename in enumerate(self._images.file_list):
            if idx % self._skip_num != 0:
                logger.trace("Adding image '%s' to skip list due to "  # type: ignore
                             "extract_every_n = %s", filename, self._skip_num)
                skip_list.append(idx)
            # Items may be in the alignments file if skip-existing[-faces] is selected
            elif os.path.basename(filename) in self._alignments.data:
                self._existing_count += 1
                logger.trace("Removing image: '%s' due to previously existing",  # type: ignore
                             filename)
                skip_list.append(idx)
        if self._existing_count != 0:
            logger.info("Skipping %s frames due to skip_existing/skip_existing_faces.",
                        self._existing_count)
        logger.debug("Adding skip list: %s", skip_list)
        self._images.add_skip_list(skip_list)
 </s> add  </s> remove             if exception:
                break
 </s> add 
                self._loader.check_thread_error()
                                                       total=self._images.process_count,
                                                       file=sys.stdout,
                                                       desc=desc,
                                                       leave=False)):
                self._loader.check_thread_error()
                  if is_final:
                      self._output_processing(extract_media, size)
                      self._output_faces(saver, extract_media)
                      if self._save_interval and (idx + 1) % self._save_interval == 0:
                          self._alignments.save()
keep keep keep keep replace keep keep keep keep keep
 Update Face Filter
  - Remove old face filter
  - plugins.extract.pipeline: Expose plugins directly
  - Change `is_aligned` from plugin level to ExtractMedia level
  - Allow extract pipeline to take faceswap aligned images
  - Add ability for recognition plugins to accept aligned faces as input
  - Add face filter to recognition plugin
  - Move extractor pipeline IO ops to own class 
scripts/extract.py