VIDraft/WorldForge
0
1"""Static server for local checks, plus POST /capture to save a canvas frame.2 3The browser can render a WebGL scene but cannot hand the pixels back to this4machine, and its downloads land somewhere unreachable. So the page posts the data5URL here and the frame lands on disk, where it can actually be looked at.6 7 python dev_server.py [port]8 fetch('/capture', {method:'POST', body: canvas.toDataURL('image/jpeg', 0.6)})9"""10import base6411import os12import sys13from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer14 15ROOT = os.path.dirname(os.path.abspath(__file__))16OUT = os.path.join(ROOT, "captures")17 18 19class Handler(SimpleHTTPRequestHandler):20 def do_POST(self):21 if self.path.split("?")[0] != "/capture":22 self.send_error(404)23 return24 length = int(self.headers.get("Content-Length", 0))25 body = self.rfile.read(length).decode("utf-8", "replace")26 header, _, payload = body.partition(",")27 ext = "png" if "png" in header else "jpg"28 name = self.headers.get("X-Name") or "capture"29 os.makedirs(OUT, exist_ok=True)30 path = os.path.join(OUT, f"{name}.{ext}")31 with open(path, "wb") as f:32 f.write(base64.b64decode(payload))33 print(f"[capture] {path} ({os.path.getsize(path)} bytes)", flush=True)34 self.send_response(200)35 self.send_header("Content-Type", "text/plain")36 self.end_headers()37 self.wfile.write(path.encode())38 39 def end_headers(self):40 self.send_header("Cache-Control", "no-store")41 super().end_headers()42 43 def log_message(self, *args):44 pass45 46 47if __name__ == "__main__":48 port = int(sys.argv[1]) if len(sys.argv) > 1 else 814049 os.chdir(ROOT)50 print(f"serving {ROOT} on http://127.0.0.1:{port}", flush=True)51 ThreadingHTTPServer(("127.0.0.1", port), Handler).serve_forever()52 