/ scripts / fetch-guestbook-data.py
fetch-guestbook-data.py
 1  #!/usr/bin/env python3
 2  """Fetch all approved guestbook entries and download drawing images.
 3  
 4  Writes _data/guestbook.json with image_url pointing to local assets.
 5  Run this before `jekyll build`.
 6  """
 7  
 8  import json
 9  import os
10  import urllib.request
11  
12  API_BASE = "https://guestbook.chenna.me"
13  ROOT = os.path.join(os.path.dirname(__file__), "..")
14  DATA_FILE = os.path.join(ROOT, "_data", "guestbook.json")
15  IMAGES_DIR = os.path.join(ROOT, "assets", "guestbook")
16  
17  
18  def fetch_all_entries():
19      entries = []
20      page = 1
21      while True:
22          url = f"{API_BASE}/api/entries?page={page}&per_page=48"
23          with urllib.request.urlopen(url) as resp:
24              data = json.loads(resp.read())
25          entries.extend(data["entries"])
26          if page >= data["pagination"]["total_pages"]:
27              break
28          page += 1
29      return entries
30  
31  
32  def download_image(entry_id, image_url):
33      os.makedirs(IMAGES_DIR, exist_ok=True)
34      dest = os.path.join(IMAGES_DIR, f"{entry_id}.png")
35      if not os.path.exists(dest):
36          with urllib.request.urlopen(image_url) as resp:
37              with open(dest, "wb") as f:
38                  f.write(resp.read())
39      return f"/assets/guestbook/{entry_id}.png"
40  
41  
42  def main():
43      os.makedirs(os.path.dirname(DATA_FILE), exist_ok=True)
44      entries = fetch_all_entries()
45  
46      for entry in entries:
47          if entry.get("entry_type") == "drawing" and entry.get("image_url"):
48              entry["image_url"] = download_image(entry["id"], entry["image_url"])
49  
50      with open(DATA_FILE, "w") as f:
51          json.dump(entries, f, indent=2)
52  
53      print(f"Fetched {len(entries)} guestbook entries")
54  
55  
56  if __name__ == "__main__":
57      main()