Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)
Python 69.3%
TypeScript 16.7%
CSS 7.9%
JavaScript 4.7%
HTML 1.4%
1#!/usr/bin/env python32# ==============================================================================3# Author: Simon-Pierre Boucher <contact@spboucher.ai>4# File: run.py5# Desc: Resto·Ka — point d'entrée : `sync`, `watch`, `serve`, `geocode`,6# `dedup`. Même patron que le run.py de Lou·Ka.7# ==============================================================================8"""Utilisation :9 python run.py sync [source ...] # synchronise les restos + menus10 python run.py watch [heures] # synchronise en boucle (défaut 24 h)11 python run.py serve [port] # démarre l'API + le frontend (défaut 8115)12 python run.py geocode [n] # géocode les restos sans coordonnées13 python run.py dedup # déduplication inter-sources14"""15from __future__ import annotations1617import os18import sys19from pathlib import Path2021# Charger .env (SCRAPFLY_KEY, FIRECRAWL_API_KEY…) sans dépendance externe22_env = Path(__file__).parent / ".env"23if _env.exists():24 for line in _env.read_text().splitlines():25 line = line.strip()26 if line and not line.startswith("#") and "=" in line:27 k, _, v = line.partition("=")28 os.environ.setdefault(k.strip(), v.strip())293031def main() -> None:32 cmd = sys.argv[1] if len(sys.argv) > 1 else "serve"33 args = sys.argv[2:]3435 if cmd == "sync":36 from restoka import ingest37 ingest.run(args or None)38 ingest.enrich()39 elif cmd == "watch":40 from restoka import ingest41 hours = float(args[0]) if args else 24.042 ingest.watch(int(hours * 3600))43 elif cmd == "serve":44 import uvicorn45 port = int(args[0]) if args else 811546 uvicorn.run("restoka.web:app", host="0.0.0.0", port=port)47 elif cmd == "geocode":48 from restoka import geocode49 geocode.run_batch(int(args[0]) if args else 200)50 elif cmd == "dedup":51 from restoka import dedup52 print(dedup.run())53 else:54 print(__doc__)55 sys.exit(1)565758if __name__ == "__main__":59 main()60