#!/usr/bin/env python3 # ============================================================================== # Author: Simon-Pierre Boucher # File: run.py # Desc: Resto·Ka — point d'entrée : `sync`, `watch`, `serve`, `geocode`, # `dedup`. Même patron que le run.py de Lou·Ka. # ============================================================================== """Utilisation : python run.py sync [source ...] # synchronise les restos + menus python run.py watch [heures] # synchronise en boucle (défaut 24 h) python run.py serve [port] # démarre l'API + le frontend (défaut 8115) python run.py geocode [n] # géocode les restos sans coordonnées python run.py dedup # déduplication inter-sources """ from __future__ import annotations import os import sys from pathlib import Path # Charger .env (SCRAPFLY_KEY, FIRECRAWL_API_KEY…) sans dépendance externe _env = Path(__file__).parent / ".env" if _env.exists(): for line in _env.read_text().splitlines(): line = line.strip() if line and not line.startswith("#") and "=" in line: k, _, v = line.partition("=") os.environ.setdefault(k.strip(), v.strip()) def main() -> None: cmd = sys.argv[1] if len(sys.argv) > 1 else "serve" args = sys.argv[2:] if cmd == "sync": from restoka import ingest ingest.run(args or None) ingest.enrich() elif cmd == "watch": from restoka import ingest hours = float(args[0]) if args else 24.0 ingest.watch(int(hours * 3600)) elif cmd == "serve": import uvicorn port = int(args[0]) if args else 8115 uvicorn.run("restoka.web:app", host="0.0.0.0", port=port) elif cmd == "geocode": from restoka import geocode geocode.run_batch(int(args[0]) if args else 200) elif cmd == "dedup": from restoka import dedup print(dedup.run()) else: print(__doc__) sys.exit(1) if __name__ == "__main__": main()