              logger.trace(retval)
              yield retval
  
      def load_items(self):
          """ Load the face names into dictionary """
          faces = dict()
          for face in self.file_list_sorted:
              faces.setdefault(face["face_hash"], list()).append((face["face_name"],
                                                                  face["face_extension"]))
          logger.trace(faces)
 
</s> remove             faces.setdefault(face["face_hash"], list()).append((face["face_name"],
                                                                face["face_extension"]))
 </s> add             faces.setdefault(face["source_filename"], list()).append(face["face_index"]) </s> remove         filelist = [os.path.join(self.folder, face)
                    for face in os.listdir(self.folder)
                    if self.valid_extension(face)]
        for fullpath, face_hash in tqdm(read_image_hash_batch(filelist),
                                        total=len(filelist),
                                        desc="Reading Face Hashes"):
            filename = os.path.basename(fullpath)
            face_name, extension = os.path.splitext(filename)
            retval = {"face_fullname": filename,
                      "face_name": face_name,
                      "face_extension": extension,
                      "face_hash": face_hash}
            logger.trace(retval)
 </s> add         if self._alignments is not None:  # Legacy updating
            filelist = [os.path.join(self.folder, face)
                        for face in os.listdir(self.folder)
                        if self.valid_extension(face)]
        else:
            filelist = [os.path.join(self.folder, face)
                        for face in os.listdir(self.folder)
                        if os.path.splitext(face)[-1] == ".png"]

        log_once = False
        for fullpath, metadata in tqdm(read_image_meta_batch(filelist),
                                       total=len(filelist),
                                       desc="Reading Face Data"):

            if "itxt" not in metadata or "source" not in metadata["itxt"]:
                if self._alignments is None:  # Can't update legacy
                    raise FaceswapError(
                        f"The folder '{self.folder}' contains images that do not include Faceswap "
                        "metadata.\nAll images in the provided folder should contain faces "
                        "generated from Faceswap's extraction process.\nPlease double check the "
                        "source and try again.")

                if not log_once:
                    logger.warning("Legacy faces discovered. These faces will be updated")
                    log_once = True
                data = update_legacy_png_header(fullpath, self._alignments)
                if not data:
                    raise FaceswapError(
                        "Some of the faces being passed in from '{}' could not be matched to the "
                        "alignments file '{}'\nPlease double check your sources and try "
                        "again.".format(self.folder, self._alignments.file))
                retval = data["source"]
            else:
                retval = metadata["itxt"]["source"]

            retval["current_filename"] = os.path.basename(fullpath) </s> remove         """ Return the items sorted by face name """
        items = sorted(self.process_folder(), key=lambda x: (x["face_name"]))
 </s> add         """ Return the items sorted by the saved file name.

        Returns
        --------
        list
            List of `dict` objects for each face found, sorted by the face's current filename
        """
        items = sorted(self.process_folder(), key=lambda x: (x["current_filename"])) </s> remove             ret_side = dict()
 </s> add             retval[side] = dict() </s> remove         """ Iterate through the faces folder pulling out various information """
 </s> add         """ Iterate through the faces folder pulling out various information for each face.

        Yields
        ------
        dict
            A dictionary for each face found containing the keys returned from
            :class:`lib.image.read_image_meta_batch`
        """
        """ Load the face names into dictionary.

        Returns
        -------
        dict
            The source filename as key with list of face indices for the frame as value
        """
              logger.trace(retval)
              yield retval
  
      def load_items(self):
        """ Load the face names into dictionary.

        Returns
        -------
        dict
            The source filename as key with list of face indices for the frame as value
        """
          faces = dict()
          for face in self.file_list_sorted:
              faces.setdefault(face["face_hash"], list()).append((face["face_name"],
                                                                  face["face_extension"]))
          logger.trace(faces)
keep keep keep keep replace keep keep keep keep keep
 Update extracted faces to use PNG EXIF data (#1123)

Documentation
  - Update Usage.md, align.rst and image.rst
lib.image.py
  - read_image - Remove hash return, add metadata return
  - Remove read_image_hash functions
  - Add read_image_meta functios
  - Replace encode_image_with_hash with encode_image (to store metadata)
  - Add png meta reading and writing functions
  - Update Image Loaders/Savers to handle metadata rather than hashes
lib.training_data
  - Naming updates to remove references to hashes
lib.align.Alignments
  - Add versioning notes
  - Increment alignments version to 2.1
  - Deprecate hashing lookup functions
  - Replace filter_hashes with filter_faces
lib.align.detected_face
  - DetectedFace
    - Remove hash property
    - Add png header data serializing/deserializing functions
  - Mask
    - Add png header data serializing/deserializing functions
  - add update_legacy_png_header function to update png meta data
lib.cli.args - Deprecate alignments files for training
- plugins.train.trainer
  - Update alignments/mask code to read png header data
- scripts.convert
  - Aligned images folder - read data from png headers
- scripts.extract
  - Write png header information and no longer store hash of face
- tools.alignments
  - remove leftover-faces, merge and update-hashes jobs
  - Update jobs to use png meta data rather than hashes
- tools.manual
  - Update extract code to output png meta data and don't store hashes
  - Perform check on launch that tool is not pointing at a faces folder
tools.mask
  - Update to use png meta data
tools.sort
  - Update to use png meta data 
tools/alignments/media.py