                  logger.trace("EOF received")  # type: ignore
                  exhausted = True
                  break
              # Put frames with no faces into the out queue to keep TQDM consistent
              if not item.detected_faces:
                  self._queues["out"].put(item)
                  continue
              for f_idx, face in enumerate(item.detected_faces):
  
                  image = item.get_image_copy(self.color_format)
 
</s> remove             # Put frames with no faces into the out queue to keep TQDM consistent
            if not item.detected_faces:
 </s> add             # Put frames with no faces or are already aligned into the out queue
            if not item.detected_faces or item.is_aligned: </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 not self._image_is_aligned:
 </s> add                 if not item.is_aligned:
            if not item.is_aligned and not item.detected_faces:
                  logger.trace("EOF received")  # type: ignore
                  exhausted = True
                  break
              # Put frames with no faces into the out queue to keep TQDM consistent
            if not item.is_aligned and not item.detected_faces:
                  self._queues["out"].put(item)
                  continue
              for f_idx, face in enumerate(item.detected_faces):
  
                  image = item.get_image_copy(self.color_format)
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/recognition/_base.py