You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.0 KiB
72 lines
2.0 KiB
"""Container bootstrap helpers for first-run runtime state."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
from typing import Any, Dict
|
|
|
|
import tomlkit
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
|
|
|
|
def _default_from_template(node: Dict[str, Any]) -> Dict[str, Any]:
|
|
defaults: Dict[str, Any] = {}
|
|
for key, value in node.items():
|
|
if isinstance(value, dict) and "optional" in value:
|
|
if "default" in value:
|
|
defaults[key] = value["default"]
|
|
else:
|
|
value_type = value.get("type")
|
|
if value_type == "bool":
|
|
defaults[key] = False
|
|
elif value_type in {"int", "float"}:
|
|
defaults[key] = 0
|
|
else:
|
|
defaults[key] = ""
|
|
elif isinstance(value, dict):
|
|
defaults[key] = _default_from_template(value)
|
|
return defaults
|
|
|
|
|
|
def _ensure_json(path: Path, content: str) -> None:
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
if not path.exists():
|
|
path.write_text(content, encoding="utf-8")
|
|
|
|
|
|
def _ensure_config(path: Path) -> None:
|
|
if path.exists():
|
|
return
|
|
|
|
template_path = ROOT / "utils/.config.template.toml"
|
|
template = tomlkit.loads(template_path.read_text(encoding="utf-8"))
|
|
defaults = _default_from_template(template)
|
|
path.write_text(tomlkit.dumps(defaults), encoding="utf-8")
|
|
|
|
|
|
def ensure_runtime_state() -> None:
|
|
"""Create runtime files and directories expected by the app."""
|
|
for relative in (
|
|
"assets/temp",
|
|
"assets/backgrounds/audio",
|
|
"assets/backgrounds/video",
|
|
".cache",
|
|
"results",
|
|
"video_creation/data",
|
|
):
|
|
(ROOT / relative).mkdir(parents=True, exist_ok=True)
|
|
|
|
_ensure_config(ROOT / "config.toml")
|
|
_ensure_json(ROOT / "video_creation/data/videos.json", "[]\n")
|
|
_ensure_json(ROOT / "utils/backgrounds.json", "{}\n")
|
|
|
|
|
|
def main() -> None:
|
|
ensure_runtime_state()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|