"""Serve the sampler locally with HTTP Range support (plain `python -m http.server` can't seek videos). python serve.py [port] then open http://localhost:8000/ """ import os import re import sys from functools import partial from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer SITE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "site") class RangeHandler(SimpleHTTPRequestHandler): extensions_map = {**SimpleHTTPRequestHandler.extensions_map, ".js": "text/javascript", ".mp4": "video/mp4"} def end_headers(self): self.send_header("Accept-Ranges", "bytes") self.send_header("Cache-Control", "no-cache") super().end_headers() def send_head(self): rng = self.headers.get("Range") path = self.translate_path(self.path) if not rng or not os.path.isfile(path): return super().send_head() m = re.match(r"bytes=(\d*)-(\d*)", rng) size = os.path.getsize(path) if not m: return super().send_head() a = int(m.group(1)) if m.group(1) else max(0, size - int(m.group(2) or 0)) b = int(m.group(2)) if m.group(1) and m.group(2) else size - 1 b = min(b, size - 1) if a > b: self.send_error(416) return None f = open(path, "rb") f.seek(a) self.send_response(206) self.send_header("Content-Type", self.guess_type(path)) self.send_header("Content-Range", f"bytes {a}-{b}/{size}") self.send_header("Content-Length", str(b - a + 1)) self.end_headers() self._remaining = b - a + 1 return f def copyfile(self, src, dst): n = getattr(self, "_remaining", None) if n is None: return super().copyfile(src, dst) try: while n > 0: buf = src.read(min(1 << 16, n)) if not buf: break dst.write(buf) n -= len(buf) except (ConnectionResetError, BrokenPipeError, ConnectionAbortedError): pass def log_message(self, *a): pass if __name__ == "__main__": port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000 print(f"Starpilot Sampler -> http://localhost:{port}/") ThreadingHTTPServer(("127.0.0.1", port), partial(RangeHandler, directory=SITE)).serve_forever()