| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- """Compute sha256 hashes for files and update metadata.yaml."""
- from pathlib import Path
- import yaml
- from pooch.hashes import file_hash
- def _update_file_hash(
- file_path: Path,
- metadata_dict: dict,
- hash_key: str,
- ) -> None:
- """Update hash for a single file if the file exists and hash differs.
- Parameters
- ----------
- file_path : Path
- Path to the file to check and update hash for.
- metadata_dict : dict
- The metadata dictionary to update.
- hash_key : str
- The key in metadata_dict where the hash should be stored.
- """
- existing_hash = metadata_dict[hash_key]
- if file_path.exists():
- computed_hash = file_hash(file_path.as_posix())
- if existing_hash != computed_hash or existing_hash is None:
- metadata_dict[hash_key] = computed_hash
- print(
- f"Updated hash for {file_path.name}: "
- f"{existing_hash} -> {computed_hash}"
- )
- else:
- print(f"WARNING: Could not find {file_path}.")
- def _update_dataset_hashes(sample_metadata: dict, root_dir: Path) -> None:
- """Update all hashes (dataset, frame, video) for a single dataset.
- Parameters
- ----------
- sample_metadata : dict
- Metadata dictionary for a single sample dataset.
- root_dir : Path
- Root of the sample data directory.
- """
- filename = list(sample_metadata.keys())[0]
- sample_metadata = sample_metadata[filename]
- ds_type = sample_metadata["type"]
- # Update main dataset hash
- dataset_path = root_dir / ds_type / filename
- _update_file_hash(
- file_path=dataset_path,
- metadata_dict=sample_metadata,
- hash_key="sha256sum",
- )
-
- # Update frame hash if frame file exists
- frame_file_name = sample_metadata["frame"]["file_name"]
- if frame_file_name is not None:
- frame_path = root_dir / "frames" / frame_file_name
- _update_file_hash(
- file_path=frame_path,
- metadata_dict=sample_metadata["frame"],
- hash_key="sha256sum",
- )
-
- # Update video hash if video file exists
- video_file_name = sample_metadata["video"]["file_name"]
- if video_file_name is not None:
- video_path = root_dir / "videos" / video_file_name
- _update_file_hash(
- file_path=video_path,
- metadata_dict=sample_metadata["video"],
- hash_key="sha256sum",
- )
- def update_hashes_in_metadata(metadata_path: Path):
- """Update metadata.yaml with computed SHA256 hashes.
- Parameters
- ----------
- metadata_path : Path
- Path to the metadata.yaml file, which should be in the root
- of the sample data directory.
- """
- # Load existing metadata
- with open(metadata_path) as f:
- metadata = yaml.safe_load(f)
- # Get folder where metadata.yaml is located
- root_dir = metadata_path.parent
- # Update hashes for each dataset
- for sample_name in metadata:
- sample_metadata = {sample_name: metadata[sample_name]}
- _update_dataset_hashes(sample_metadata, root_dir)
- # Save updated metadata
- with open(metadata_path, 'w') as f:
- yaml.dump(
- metadata,
- f,
- default_flow_style=False,
- sort_keys=False,
- )
- print("Metadata updated successfully!")
- if __name__ == "__main__":
- metadata_path = Path.cwd() / "metadata.yaml"
- update_hashes_in_metadata(metadata_path)
|