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()