diff options
| author | yyamashita <8nmdh5w22f@privaterelay.appleid.com> | 2026-11-01 08:59:15 +0900 |
|---|---|---|
| committer | yyamashita <8nmdh5w22f@privaterelay.appleid.com> | 2026-11-01 08:59:15 +0900 |
| commit | a661eedbd30206e940ed8fb6a19f139311adbdfb (patch) | |
| tree | 6eed45d0a1d7b9be04de04c6d93f491a5071109c /server.py | |
西荻窪周辺スタジオの空き枠一覧ページを追加
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'server.py')
| -rw-r--r-- | server.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/server.py b/server.py new file mode 100644 index 0000000..0629e67 --- /dev/null +++ b/server.py @@ -0,0 +1,63 @@ +"""スタジオ空き枠一覧のローカルサーバー。 + + python3 server.py # http://localhost:8000 + python3 server.py 8080 # ポート指定 +""" + +import json +import sys +from datetime import date +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from urllib.parse import parse_qs, urlparse + +import providers + +ROOT = Path(__file__).resolve().parent +STATIC = ROOT / "static" + + +def load_studios(): + return json.loads((ROOT / "studios.json").read_text(encoding="utf-8")) + + +def slots_for(day): + result = [] + for studio in load_studios(): + try: + slots = providers.fetch(studio, day) + error = None + except Exception as e: # 1軒の取得失敗で一覧全体を落とさない + slots, error = [], str(e) + result.append({**studio, "slots": slots, "error": error}) + return result + + +class Handler(SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + super().__init__(*args, directory=str(STATIC), **kwargs) + + def do_GET(self): + url = urlparse(self.path) + if url.path != "/api/slots": + return super().do_GET() + qs = parse_qs(url.query) + try: + day = date.fromisoformat(qs.get("date", [date.today().isoformat()])[0]) + except ValueError: + return self.send_json({"error": "date は YYYY-MM-DD で指定してください"}, 400) + self.send_json({"date": day.isoformat(), "studios": slots_for(day)}) + + def send_json(self, body, status=200): + data = json.dumps(body, ensure_ascii=False).encode("utf-8") + self.send_response(status) + self.send_header("Content-Type", "application/json; charset=utf-8") + self.send_header("Content-Length", str(len(data))) + self.end_headers() + self.wfile.write(data) + + +if __name__ == "__main__": + port = int(sys.argv[1]) if len(sys.argv) > 1 else 8000 + print(f"http://localhost:{port}") + ThreadingHTTPServer(("127.0.0.1", port), Handler).serve_forever() |
