import re from pathlib import Path def parse_pose_data_filename(file_name: str, extension: str | None = None) -> dict: """ Parse your posture dataset file naming convention. Expected style: 20241114_1643_hyz_N_TC-Head_000_012.npy Extracted fields: - capture_date - capture_time - human_model_name - label - extensions - weight - frame_number """ if extension is not None: file_name = file_name.replace(extension, "") parts = re.split(r"_", file_name) if len(parts) not in range(6, 8): raise ValueError(f"Invalid posture filename format: {file_name}") return { "capture_date": int(parts[0]), "capture_time": int(parts[1]), "human_model_name": str(parts[2]), "label": str(parts[3]), "extensions": str(parts[4]), "weight": float(parts[5][:1] + "." + parts[5][1:]), "frame_number": int(parts[6]) if len(parts) > 6 else None, } def get_video_properties(video_name: str, item: str | None = None) -> dict | int | str: """ Parse your phone-data video naming convention. Expected style without extension: 20250512_1427_model_position_greeninfo_Lphone Your current project uses: - date - time - model name - position - color info - hand info Returns full dict or one selected item. """ if video_name.endswith(".mp4"): raise ValueError("video_name must not include file extension") values = tuple(video_name.split("_")) keys = ["date", "time", "model name", "position", "color info", "hand info"] if len(values) < len(keys): raise ValueError(f"Invalid video filename format: {video_name}") properties = {key: value for key, value in zip(keys, values)} hand_prefix = properties["hand info"][0] if hand_prefix not in {"L", "R", "B"}: raise ValueError(f"Invalid hand code in video name: {video_name}") properties["hand index"] = {"L": 0, "R": 1, "B": 2}[hand_prefix] properties["hand item"] = properties["hand info"][1:] del properties["hand info"] if item is None: return properties valid_items = list(properties.keys()) + ["hex id"] if item not in valid_items: raise KeyError(f"Invalid item '{item}'. Supported: {valid_items}") if item == "hex id": return f"{properties['date'][:8]}_{properties['time']}" return properties[item] def video_name_to_hand_index(video_name: str) -> int: """ Small helper used in your current phone dataset gathering logic. Returns: - 0 for left hand - 1 for right hand - 2 for both hands """ properties = tuple(video_name.split("_")) hand_prefix = properties[-1][0] if hand_prefix not in {"L", "R", "B"}: raise ValueError(f"Invalid hand code in video name: {video_name}") return {"L": 0, "R": 1, "B": 2}[hand_prefix] def get_file_stem(path_like: str | Path) -> str: """ Return file name without extension. """ return Path(path_like).stem