hishamstarpilot's picture
Starpilot Data Sample: cross-embodiment industrial manipulation explorer
f9be3e9 verified
Raw History Blame Contribute Delete
2.39 kB
"""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()