Spaces:
Running
Running
File size: 2,177 Bytes
d646dd7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #!/usr/bin/env python3
"""Migrate all valid session projects to the project-level LeRobot v2.1 layout.
The command is deliberately backup-preserving. A legacy project is rebuilt
under ``data/meta/videos`` and the old project tree is moved below
``<storage-root>/.backups/session-migrations``. Existing canonical projects
with ``meta/depth`` PNG sidecars are converted to lossless HEVC depth videos.
"""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from app.project_dataset import (
is_project_dataset,
migrate_project_dataset,
migrate_project_depth_pngs,
verify_project_dataset,
)
def migrate(root: Path, project_name: str | None = None) -> list[dict]:
root = Path(root).expanduser().resolve()
if not root.is_dir():
raise SystemExit(f"Session root does not exist: {root}")
projects = [root / project_name] if project_name else sorted(
path for path in root.iterdir()
if path.is_dir() and not path.name.startswith(".")
)
results = []
for project in projects:
if not project.is_dir():
results.append({"project": project.name, "skipped": "missing"})
continue
try:
if is_project_dataset(project):
result = migrate_project_depth_pngs(project, keep_backup=True)
if not result.get("changed"):
result["verification"] = verify_project_dataset(project)
else:
result = migrate_project_dataset(project, keep_backup=True)
results.append(result)
except Exception as exc: # continue to report other projects
results.append({"project": project.name, "error": str(exc)})
return results
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("sessions_root", type=Path)
parser.add_argument("--project", default=None)
args = parser.parse_args()
print(json.dumps(migrate(args.sessions_root, args.project),
ensure_ascii=False, indent=2))
if __name__ == "__main__":
main()
|