50 lines
1.9 KiB
Python
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())
|