whaleprep/scripts/shrink_qimg.py

61 lines
1.9 KiB
Python

#!/usr/bin/env python3
"""Convert static/qimg/*.png to resized WebP and update DB references.
Question figures only need ~900px width for the exam card; WebP q80
cuts the folder to about a fifth of its PNG size.
Usage: python3 scripts/shrink_qimg.py DB_PATH
"""
import re
import sqlite3
import sys
from pathlib import Path
from PIL import Image
ROOT = Path(__file__).resolve().parent.parent
QIMG = ROOT / "static" / "qimg"
def main():
db = sqlite3.connect(sys.argv[1])
cur = db.cursor()
converted = 0
for png in sorted(QIMG.glob("*.png")):
webp = png.with_suffix(".webp")
if webp.exists():
continue
try:
im = Image.open(png)
if im.mode in ("P", "RGBA", "LA"):
im = im.convert("RGB")
w, h = im.size
if w > 900:
im = im.resize((900, int(h * 900 / w)))
im.save(webp, "WEBP", quality=80)
png.unlink()
converted += 1
except Exception as e:
print(f"skip {png.name}: {e}")
continue
print(f"converted {converted} pngs to webp")
# rewrite DB references
n = 0
for (qid, stem, a, b, c, d, sol) in cur.execute(
"SELECT id, stem, opt_a, opt_b, opt_c, opt_d, solution FROM questions"):
vals = [stem, a, b, c, d, sol]
changed = False
for i, v in enumerate(vals):
if v and "/static/qimg/" in v and ".png" in v:
nv = re.sub(r"(/static/qimg/[A-Za-z0-9_-]+)\.png", r"\1.webp", v)
if nv != v:
vals[i] = nv
changed = True
if changed:
cur.execute("UPDATE questions SET stem=?, opt_a=?, opt_b=?, opt_c=?, opt_d=?, solution=? WHERE id=?",
(vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], qid))
n += 1
db.commit()
print(f"updated {n} question rows")
db.close()
if __name__ == "__main__":
main()