summaryrefslogtreecommitdiff
path: root/server.py
diff options
context:
space:
mode:
authoryyamashita <8nmdh5w22f@privaterelay.appleid.com>2026-11-01 08:59:15 +0900
committeryyamashita <8nmdh5w22f@privaterelay.appleid.com>2026-11-01 08:59:15 +0900
commita661eedbd30206e940ed8fb6a19f139311adbdfb (patch)
tree6eed45d0a1d7b9be04de04c6d93f491a5071109c /server.py
西荻窪周辺スタジオの空き枠一覧ページを追加
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'server.py')
-rw-r--r--server.py63
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()