Files
sci-gui-agent-benchmark/annotation/ducktrack/metadata.py

60 lines
2.0 KiB
Python

import json
import os
import uuid
from datetime import datetime
from platform import uname
from screeninfo import get_monitors
class MetadataManager:
"""
Handles various system metadata collection.
"""
def __init__(self, recording_path: str, natural_scrolling: bool):
self.recording_path = recording_path
self.metadata = uname()._asdict()
self.metadata["id"] = uuid.getnode()
main_monitor = get_monitors()[0]
self.metadata["screen_width"] = main_monitor.width
self.metadata["screen_height"] = main_monitor.height
try:
match self.metadata["system"]:
case "Windows":
import wmi
for item in wmi.WMI().Win32_ComputerSystem():
self.metadata["model"] = item.Model
break
case "Darwin":
import subprocess
model = subprocess.check_output(["sysctl", "-n", "hw.model"]).decode().strip()
self.metadata["model"] = model
case "Linux":
with open("/sys/devices/virtual/dmi/id/product_name", "r") as f:
self.metadata["model"] = f.read().strip()
except:
self.metadata["model"] = "Unknown"
self.metadata["scroll_direction"] = -1 if natural_scrolling else 1
def save_metadata(self):
metadata_path = os.path.join(self.recording_path, "metadata.json")
with open(metadata_path, "w") as f:
json.dump(self.metadata, f, indent=4)
def collect(self):
self.metadata["start_time"] = self._get_time_stamp()
def end_collect(self):
self.metadata["stop_time"] = self._get_time_stamp()
def add_obs_record_state_timings(self, record_state_events: dict[str, float]):
self.metadata["obs_record_state_timings"] = record_state_events
def _get_time_stamp(self):
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")