From dcb35334905f914dfd3eaa7453f0b019bd777588 Mon Sep 17 00:00:00 2001 From: yyamashita Date: Sun, 1 Nov 2026 09:19:55 +0900 Subject: スタジオセットごとにリンキィディンクの実際の空き枠を表示する MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ダミーデータをやめ、Reserve Mart の会員ページから日別状況を読む。 取得結果は 5 分キャッシュし、ノアなど取れないスタジオは電話番号とリンクを出す。 Co-Authored-By: Claude Opus 5.5 --- README.md | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to 'README.md') diff --git a/README.md b/README.md index 1eb452e..39dda67 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,39 @@ # studio-slots -西荻窪周辺の音楽スタジオの空き枠を、日付ごとに一覧で見るためのローカルWebページ。 +スタジオの空き枠を「スタジオセット」(西荻窪周辺、吉祥寺など)ごとにまとめて見る Web ページ。 +https://studio.yyamashita.com ```sh python3 server.py # → http://localhost:8000 ``` -依存ライブラリなし(Python 3.9 以上)。 +依存ライブラリなし(Python 3.9 以上)。リンキィディンクの空き枠は会員ページから読むので、 +`.env` に会員情報が要る(リポジトリには入れない)。 + +``` +RINKY_ID=会員番号またはメールアドレス +RINKY_PASSWORD=パスワード +``` ## 構成 -- `studios.json` … スタジオの一覧(名前、部屋、営業時間、予約ページ、電話番号、使う provider) -- `providers/` … 空き枠の取得元。`fetch(studio, date)` が `[{"room", "hour", "status"}]` を返す - - `sample` … 画面確認用のダミーデータ(今はすべてこれ) - - `manual` … `manual_slots.json` に手で書いた予約済み枠を読む -- `server.py` … `/api/slots?date=YYYY-MM-DD` と `static/` を配信 -- `static/index.html` … 一覧画面 +- `studios.json` … スタジオセットとスタジオ(名前、公式サイト、電話番号、使う provider) +- `providers/` … 空き枠の取得元。取得結果は 5 分キャッシュする + - `rinky` … リンキィディンク(Reserve Mart / reserve1.jp)。1 回ログインして店舗(`grand`)と日付を切り替えて読む +- `server.py` … `/api/sets`、`/api/slots?set=&date=YYYY-MM-DD` と `static/` を配信 +- `static/index.html` … 一覧画面。`?set=kichijoji&date=2026-11-07` のように URL で開ける -## 実データに切り替えるには +`provider` が `null` のスタジオ(ノア、UEN、Akseli)は空き枠を取れないので、電話番号とリンクだけ出す。 +サウンドスタジオノアは公式サイトが自動アクセスを 403 で弾くため取得していない。 -1. `studios.json` の部屋名と営業時間を実際のものに直す(今はすべて仮の値) -2. `providers/` に取得用のモジュールを足して `providers/__init__.py` の `PROVIDERS` に登録する -3. 該当スタジオの `"provider"` をそのモジュール名に変える +## スタジオを足すには -リンキィディンクは Reserve Mart(reserve1.jp)で予約を受けていて、空き枠を見るには会員ログインが必要。 -ID とパスワードは `.env` などに置き、リポジトリには入れないこと。 +1. `studios.json` の `studios` に追加し、見せたいセットの `studios` に id を並べる +2. リンキィディンクの別店舗なら `"provider": "rinky"` と `"grand"`(店舗番号。公式サイトの予約ボタンの `gr`)だけでよい +3. 別の予約システムなら `providers/` にモジュールを足して `PROVIDERS` に登録する ## デプロイ `git push` で post-receive フックが `/app/studio-slots` にチェックアウトし、`docker compose up -d --build` する。 -コンテナ名は `studio-app`(web ネットワーク、ポート 8000)。設定は hetzner-infra 側(`git/repos.txt`、`git/hooks/studio-slots/`)。 +コンテナ名は `studio-app`(web ネットワーク、ポート 8000)。Caddy が studio.yyamashita.com で HTTPS を終端する。 +設定は hetzner-infra 側(`git/repos.txt`、`git/hooks/studio-slots/`、`caddy/Caddyfile`)。 -- cgit v1.3