Files
CCF-for-hydrooj/tools/create_hydro_zips.py
T
2026-09-09 09:28:29 +08:00

50 lines
1.9 KiB
Python

"""Package one exam's extracted problems into one Hydro ZIP."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
from build_hydrooj import create_hydro_bundle_zip, normalize_problem_id
def load_statement_pdfs(manifest_path: Path) -> dict[str, list[Path]]:
if not manifest_path.exists():
return {}
manifest = json.loads(manifest_path.read_text())
result: dict[str, list[Path]] = {}
for entry in manifest.get("entries", []):
exam_id = normalize_problem_id(entry.get("title", ""))
for resource in entry.get("resources", []):
path = manifest_path.parent / resource.get("file", "")
if path.exists() and path.read_bytes()[:5] == b"%PDF-":
result.setdefault(exam_id, []).append(path)
return result
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--input", default="dist/hydrooj", help="extracted data root")
parser.add_argument("--output", default="dist/hydro-zips", help="ZIP output root")
parser.add_argument("--manifest", default="dist/manifest.json", help="download manifest containing statement PDFs")
args = parser.parse_args()
source = Path(args.input)
output = Path(args.output)
pdfs = load_statement_pdfs(Path(args.manifest))
exams = {}
for data_dir in sorted(source.rglob("data")):
problem_dir = data_dir.parent
exam_id = problem_dir.parent.name
exams.setdefault(exam_id, []).append((problem_dir.name, data_dir))
for exam_id, problems in sorted(exams.items()):
target = output / f"{exam_id}.zip"
target.parent.mkdir(parents=True, exist_ok=True)
create_hydro_bundle_zip(target, exam_id, exam_id, problems, pdfs.get(exam_id, []))
print(f"created {len(exams)} exam bundles containing {sum(len(v) for v in exams.values())} problems")
return 0
if __name__ == "__main__":
raise SystemExit(main())