from dataclasses import dataclass, field from pathlib import Path import yaml @dataclass class FilenameConfig: video_in_zip: str = "left.mp4" video_tmp_suffix: str = ".mp4" zip_extension: str = ".zip" mask: str = "mask.png" metadata: str = "metadata.json" frame: str = "frame.png" overlay: str = "overlay.png" mask_vis: str = "mask_vis.png" gif_original_hires: str = "video_original_hires.gif" gif_original_lowres: str = "video_original_lowres.gif" gif_overlay_hires: str = "video_overlay_hires.gif" gif_overlay_lowres: str = "video_overlay_lowres.gif" @dataclass class AppConfig: display_max: int = 480 fps_fallback: int = 25 max_frames: int = 100 data_dir: str = "data/clips" out_dir: str = "data/annotation_results" clips_file: str = "config/clips.txt" questions: list = field(default_factory=list) filenames: FilenameConfig = field(default_factory=FilenameConfig) def get_questions(self): return [ ( s["section"], [ ( item["key"], item["label"], [str(o) for o in item["options"]], str(item["default"]) if item.get("default") is not None else None, ) for item in s["items"] ], ) for s in self.questions ] def load_config(path: Path) -> AppConfig: with open(path) as f: data = yaml.safe_load(f) fn_data = data.pop("filenames", {}) cfg = AppConfig(**data) cfg.filenames = FilenameConfig(**fn_data) return cfg