      def compile_output(self):
          """ Compile list of frames that meet criteria """
          action = self.job.replace("-", "_")
          processor = getattr(self, "get_{}".format(action))
          return [item for item in processor()]
  
      def get_no_faces(self):
          """ yield each frame that has no face match in alignments file """
          self.output_message = "Frames with no faces"
          for frame in tqdm(self.items, desc=self.output_message):
 
</s> remove         for frame in tqdm(self.items, total=len(self.items)):
 </s> add         for frame in tqdm(self.items, desc=self.output_message):
            logger.trace(frame) </s> remove         for frame in tqdm(self.alignments.data.keys(),
                          total=len(self.alignments.frames_count)):
 </s> add         for frame in tqdm(self.alignments.data.keys(), desc=self.output_message): </s> remove         for frame in tqdm(self.items, total=len(self.items)):
 </s> add         for frame in tqdm(self.items, desc=self.output_message): </s> remove             frame_key = "frame_name"
 </s> add             frame_key = "face_hash"
        logger.debug("Processor: %s", processor)
      def compile_output(self):
          """ Compile list of frames that meet criteria """
          action = self.job.replace("-", "_")
          processor = getattr(self, "get_{}".format(action))
        logger.debug("Processor: %s", processor)
          return [item for item in processor()]
  
      def get_no_faces(self):
          """ yield each frame that has no face match in alignments file """
          self.output_message = "Frames with no faces"
          for frame in tqdm(self.items, desc=self.output_message):
keep keep keep add keep keep keep keep keep keep
 Add Face Hashes to Alignments (#550)

* Convert main scripts to use face hashes

* Alignment tool: Use hashes, add logging, add face rename function

* More logging. Update Manual tool to work with hashing 
tools/lib_alignments/jobs.py