#!/usr/bin/env python3 """ Generate plugin update manifest (api/plugin/info.json). Run this script after rebuilding the WordPress plugin ZIP or before starting the HTTP server. """ from __future__ import annotations import hashlib import json import os import re import time from pathlib import Path ROOT = Path(__file__).resolve().parents[1] PLUGIN_PHP = ROOT / "wordpress-plugin" / "ss-crawler-importer" / "ss-crawler-importer.php" ZIP_PATH = ROOT / "wordpress-plugin" / "ss-crawler-importer.zip" INFO_PATH = ROOT / "api" / "plugin" / "info.json" def extract_version() -> str: """Read plugin version from the PHP header.""" default_version = "1.0.0" if not PLUGIN_PHP.exists(): return default_version content = PLUGIN_PHP.read_text(encoding="utf-8", errors="ignore") match = re.search(r"Version:\s*([0-9A-Za-z\.\-\+]+)", content) if match: return match.group(1).strip() return default_version def compute_checksum(path: Path) -> str: if not path.exists(): return "" sha256 = hashlib.sha256() with path.open("rb") as f: for chunk in iter(lambda: f.read(65536), b""): sha256.update(chunk) return sha256.hexdigest() def main() -> None: # Check if version was passed via environment variable (from rebuild_plugin.sh) version = os.environ.get("PLUGIN_VERSION", "").strip() if not version: # Fallback to extracting from PHP file version = extract_version() else: print(f"[update_plugin_manifest] Using version from environment: {version}") file_size = ZIP_PATH.stat().st_size if ZIP_PATH.exists() else 0 last_modified = int(ZIP_PATH.stat().st_mtime) if ZIP_PATH.exists() else 0 checksum = compute_checksum(ZIP_PATH) data = { "version": version, "zip_path": "/wordpress-plugin/ss-crawler-importer.zip", "file_size": file_size, "last_modified": last_modified, "checksum": checksum, "generated_at": int(time.time()), } INFO_PATH.parent.mkdir(parents=True, exist_ok=True) INFO_PATH.write_text(json.dumps(data, indent=2), encoding="utf-8") print(f"[update_plugin_manifest] Wrote {INFO_PATH} (version {version})") if __name__ == "__main__": main()