repo_description: DeepFaceLab is the leading software for creating deepfakes.
repo_topics: arxiv creating-deepfakes deep-face-swap deep-learning deep-neural-networks deepface deepfacelab deepfakes deeplearning face-swap faceswap fakeapp machine-learning neural-nets neural-networks
code: from pathlib import Path
  from os import scandir
  
  image_extensions = [".jpg", ".jpeg", ".png", ".tif", ".tiff"]
  
  def write_bytes_safe(p, bytes_data):
      """
      writes to .tmp first and then rename to target filename
      """
      p_tmp = p.parent / (p.name + '.tmp')
      p_tmp.write_bytes(bytes_data)
      if p.exists():
          p.unlink()
      p_tmp.rename (p)
  
  def scantree(path):
      """Recursively yield DirEntry objects for given directory."""
      for entry in scandir(path):
          if entry.is_dir(follow_symlinks=False):
              yield from scantree(entry.path)  # see below for Python 2.x
          else:
              yield entry
  
  def get_image_paths(dir_path, image_extensions=image_extensions, subdirs=False, return_Path_class=False):
      dir_path = Path (dir_path)
  
      result = []
      if dir_path.exists():
  
          if subdirs:
              gen = scantree(str(dir_path))
          else:
              gen = scandir(str(dir_path))
  
          for x in list(gen):
              if any([x.name.lower().endswith(ext) for ext in image_extensions]):
                  result.append( x.path if not return_Path_class else Path(x.path) )
      return sorted(result)
  
  def get_image_unique_filestem_paths(dir_path, verbose_print_func=None):
      result = get_image_paths(dir_path)
      result_dup = set()
  
      for f in result[:]:
          f_stem = Path(f).stem
          if f_stem in result_dup:
              result.remove(f)
              if verbose_print_func is not None:
                  verbose_print_func ("Duplicate filenames are not allowed, skipping: %s" % Path(f).name )
              continue
          result_dup.add(f_stem)
  
      return sorted(result)
  
  def get_paths(dir_path):
      dir_path = Path (dir_path)
  
      if dir_path.exists():
          return [ Path(x) for x in sorted([ x.path for x in list(scandir(str(dir_path))) ]) ]
      else:
          return []
          
  def get_file_paths(dir_path):
      dir_path = Path (dir_path)
  
      if dir_path.exists():
          return [ Path(x) for x in sorted([ x.path for x in list(scandir(str(dir_path))) if x.is_file() ]) ]
      else:
          return []
  
  def get_all_dir_names (dir_path):
      dir_path = Path (dir_path)
  
      if dir_path.exists():
          return sorted([ x.name for x in list(scandir(str(dir_path))) if x.is_dir() ])
      else:
          return []
  
  def get_all_dir_names_startswith (dir_path, startswith):
      dir_path = Path (dir_path)
      startswith = startswith.lower()
  
      result = []
      if dir_path.exists():
          for x in list(scandir(str(dir_path))):
              if x.name.lower().startswith(startswith):
                  result.append ( x.name[len(startswith):] )
      return sorted(result)
  
  def get_first_file_by_stem (dir_path, stem, exts=None):
      dir_path = Path (dir_path)
      stem = stem.lower()
  
      if dir_path.exists():
          for x in sorted(list(scandir(str(dir_path))), key=lambda x: x.name):
              if not x.is_file():
                  continue
              xp = Path(x.path)
              if xp.stem.lower() == stem and (exts is None or xp.suffix.lower() in exts):
                  return xp
  
      return None
  
  def move_all_files (src_dir_path, dst_dir_path):
      paths = get_file_paths(src_dir_path)
      for p in paths:
          p = Path(p)
          p.rename ( Path(dst_dir_path) / p.name )
  
  def delete_all_files (dir_path):
      paths = get_file_paths(dir_path)
      for p in paths:
          p = Path(p)
          p.unlink()
  