#!/usr/bin/env python3 """Local relay: receives poster images and metadata JSON from the Plex web page (running in the browser, which holds the auth token) and writes them to disk. The Plex token never has to pass through the assistant's context. """ import json import os from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) POSTERS_DIR = os.path.join(ROOT, "public", "posters") DATA_PATH = os.path.join(ROOT, "data", "plex-shows.json") os.makedirs(POSTERS_DIR, exist_ok=True) os.makedirs(os.path.dirname(DATA_PATH), exist_ok=True) class Handler(BaseHTTPRequestHandler): def _cors(self): self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Methods", "POST, OPTIONS") self.send_header("Access-Control-Allow-Headers", "Content-Type") def do_OPTIONS(self): self.send_response(204) self._cors() self.end_headers() def do_POST(self): length = int(self.headers.get("Content-Length", 0)) body = self.rfile.read(length) if self.path.startswith("/poster/"): rating_key = self.path.split("/poster/", 1)[1] rating_key = "".join(c for c in rating_key if c.isalnum()) with open(os.path.join(POSTERS_DIR, f"{rating_key}.jpg"), "wb") as f: f.write(body) elif self.path == "/metadata": data = json.loads(body.decode("utf-8")) with open(DATA_PATH, "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2) else: self.send_response(404) self._cors() self.end_headers() return self.send_response(200) self._cors() self.end_headers() def log_message(self, format, *args): pass if __name__ == "__main__": server = ThreadingHTTPServer(("127.0.0.1", 8765), Handler) print("relay listening on 127.0.0.1:8765") server.serve_forever()