                      if f_idx + 1 != frame_faces:
                          self._rollover = ExtractMedia(
                              item.filename,
                              item.image,
                              detected_faces=item.detected_faces[f_idx + 1:])
                          logger.trace("Rolled over %s faces of %s to next batch "  # type:ignore
                                       "for '%s'", len(self._rollover.detected_faces), frame_faces,
                                       item.filename)
                      break
          if batch.filename:
 
</s> remove                             detected_faces=item.detected_faces[f_idx + 1:])
 </s> add                             detected_faces=item.detected_faces[f_idx + 1:],
                            is_aligned=item.is_aligned) </s> remove                             detected_faces=item.detected_faces[f_idx + 1:])
 </s> add                             detected_faces=item.detected_faces[f_idx + 1:],
                            is_aligned=item.is_aligned) </s> remove     def process(self) -> None:
        """ The entry point for triggering the Extraction Process.
 </s> add         if len(item.detected_faces) == 1:
            logger.debug("Adding identity for %s from file '%s'", lbl, item.filename)
            embeddings[idx] = identities
            return </s> remove             self._check_thread_error()
 </s> add             self._loader.check_thread_error() </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 
                            detected_faces=item.detected_faces[f_idx + 1:],
                            is_aligned=item.is_aligned)
                      if f_idx + 1 != frame_faces:
                          self._rollover = ExtractMedia(
                              item.filename,
                              item.image,
                            detected_faces=item.detected_faces[f_idx + 1:],
                            is_aligned=item.is_aligned)
                          logger.trace("Rolled over %s faces of %s to next batch "  # type:ignore
                                       "for '%s'", len(self._rollover.detected_faces), frame_faces,
                                       item.filename)
                      break
          if batch.filename:
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 
plugins/extract/align/_base.py