Sorti·Ka
Toutes les sorties et tous les événements du Québec — concerts, festivals, spectacles, expos, sport, famille — au même endroit.
Sorti·Ka est un agrégateur indépendant de sorties et d'événements couvrant les 17 régions administratives du Québec : plus de 18 000 événements actifs dans ~330 villes, avec dates, lieux, gratuité (plus de 3 600 événements gratuits à venir), fiche par événement et lien direct vers la billetterie ou la source originale. Mise à jour horaire, automatiquement.
Trouver quoi faire au Québec, c'est normalement ouvrir dix sites : les billetteries ne montrent que leurs propres spectacles, les calendriers municipaux que leur ville, les sites touristiques que leurs membres. Sorti·Ka retourne le problème : un connecteur dédié par source (une trentaine de connecteurs actifs, 44 sources au registre) visite chaque calendrier, normalise chaque événement vers un schéma unique, déduplique les doublons inter-sources et détecte les changements en continu. Sorti·Ka n'est pas une billetterie : c'est un index fidèle — aucun prix inventé, aucune date devinée, chaque fiche est attribuée à sa source. Pour qui ? Quiconque cherche quoi faire, ce soir ou cet été, n'importe où au Québec.
Captures d'écran
Fonctionnalités
- Recherche filtrée — région, ville, catégorie (14 catégories canoniques), période, gratuité, texte libre, tri et pagination (
GET /api/events). - Fiche par événement — dates, heure locale, artistes, lieu, prix (avec
price_labeloriginal), carte, événements similaires ; SSR + JSON-LD Event (/evenement/{uid}) pour le SEO, sitemaps et robots.txt. - ~30 connecteurs actifs : billetteries (Le point de vente, evenko/Algolia, Ticketpro, Ticket Accès, Tuxedo Billet, Ovation, Eventbrite), données ouvertes officielles (SIT Québec/Tourinsoft, Ville de Montréal CKAN, Laval, Sherbrooke, Brossard, Longueuil), diffuseurs et salles (La Vitrine, Place des Arts, salles via JSON-LD), portails régionaux (Montérégie, Outaouais, Lanaudière, Cantons-de-l'Est, Chaudière-Appalaches, Bas-Saint-Laurent, Gaspésie, Centre-du-Québec, Saguenay…), Atuvu.ca (via Scrapfly), Bandsintown, LHJMQ, Québec animée — Ticketmaster prêt (clé
TICKETMASTER_API_KEYrequise). - Déduplication inter-sources — empreinte titre + ville + date : un même concert publié par 3 sources = une seule carte, la fiche la plus riche gagne.
- Répertoire des municipalités MAMH — 1 250 villes + arrondissements + alias, homonymes résolus par population ; rattachement automatique aux 17 régions.
- Persistance robuste — upsert par hash de contenu, délai de grâce de 2 syncs avant retrait, alerte de dérive quand une source casse, historique des synchronisations.
- Page /stats — tableau de bord analytique + rapports PDF Groupe-KA (kit kacharts/kapdf v3, rapports personnalisés).
- Widget KA Agent + favoris « Mon univers Ka » (KA ID, hub groupe-ka.com).
- Tests sur fixtures réelles, zéro réseau (pytest).
Architecture
connecteurs (1 module / source) normalisation (Event) SQLite (diff + grâce)
sortika/connectors/*.py → schema.py + normalize.py → db.py
▲ auto-découverts + regions.py (MAMH) │
│ ▼
watcher horaire (PM2) frontend SPA + fiches ← API FastAPI + SSR SEO
run.py watch frontend/index.html web.py + seo.py- Backend : Python 3.14 + FastAPI (uvicorn) — API JSON, SSR SEO des fiches, stats, PDF (fpdf2), SSO/favoris KA ID (
auth.py,hubfav.py). - Base de données : SQLite — événements, diff par hash, délai de grâce, historique de syncs, géocodage (
geocode.py,venues.py). - Frontend : SPA sans build (HTML/JS, routeur History API), design system Groupe KA « éditorial sharp » (ka-ui), widget KA Agent.
- Anti-bot : Scrapfly pour Atuvu (clé
SCRAPFLY_API_KEYdans.env). - Processus PM2 :
sorti-ka-web— uvicorn sur le port 8120 (API + frontend + SSR) ;sorti-ka-sync— watcher horaire (run.py watch) : ingestion continue des sources ;sorti-ka-ngrok— tunnel ngrok vers www.sorti-ka.com.
Structure du repo
| Répertoire / fichier | Rôle |
|---|---|
sortika/ |
paquet Python : connecteurs, schéma Event, normalisation, régions MAMH, DB, web/SSR, stats, PDF, auth KA ID |
sortika/connectors/ |
un module par source (auto-découverts), base commune + _resilient.py |
frontend/ |
SPA sans build (index.html, ka-agent.js, assets) |
data/ |
base SQLite + villes_regions.json (répertoire MAMH) — non versionnés pour la BD |
tests/ |
pytest sur fixtures réelles, zéro réseau |
scripts/ |
utilitaires (génération de docs, maintenance) |
docs/ |
CONFORMITE.md, fiches connecteurs/, captures d'écran |
apify/ |
acteurs/outils d'appoint pour l'ingestion |
run.py |
point d'entrée CLI : sync · web · watch |
requirements.txt |
fastapi, uvicorn, requests, fpdf2, pytest |
Développement (remote-first)
⚠️ La source de vérité est le repo git sur le nœud M3U96a (~/apps/sorti-ka) — on n'édite jamais les copies laptop. Toute modification se fait sur le nœud via SSH : édition, tests, redémarrage PM2, puis commit + push depuis le nœud.
- Remote
origin= spbgit (git perso, https://git.spboucher.ai) — sur M3U96a, l'origin est le chemin local/Users/simon-pierreboucher/srv/git/sorti-ka.git(bare repo).
ssh M3U96a
cd ~/apps/sorti-ka
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt # au besoin
.venv/bin/python -m pytest tests/ -q # tests (fixtures réelles, zéro réseau)
.venv/bin/python run.py sync # ingestion des sources
.venv/bin/python run.py web --port 8120 # API + frontend + SSR
pm2 restart sorti-ka-web # après changement
git add <fichiers> && git commit -m "…" && git push origin mainSecrets (gabarit .env.example) : SCRAPFLY_API_KEY (Atuvu), TICKETMASTER_API_KEY (active le connecteur Ticketmaster).
Déploiement
| Nœud | M3U96a (cluster MacLustr) — ~/apps/sorti-ka |
| Port | 8120 |
| Processus PM2 | sorti-ka-web (uvicorn) + sorti-ka-sync (watcher horaire) + sorti-ka-ngrok (tunnel) |
| Domaine | www.sorti-ka.com via tunnel ngrok |
Écosystème Groupe KA
- groupe-ka.com — portail
- lou-ka.com — logements à louer
- immo-ka.com — propriétés à vendre
- vrai-prix.com — estimation immobilière
- auto-ka.com — véhicules
- fabri-ka.com — produits québécois
- food-ka.com — épicerie / alimentation
- resto-ka.com — restaurants
- sorti-ka.com — sorties et événements
- job-ka.com — emplois
- crea-ka.com — créateurs
- trouve-ka.com — petites annonces
- api-ka.com — API de données
© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai
Ce dépôt vit sur spbgit (git perso — https://git.spboucher.ai).