SPB Git

spb/sorti-ka

Public

Toutes les sorties et tous les événements du Québec, un seul endroit — 7 connecteurs, fiches SSR, design Groupe KA.

18.5 KB

Sorti·Ka — Toutes les sorties, dans les 17 régions

Sorti·Ka

Toutes les sorties, dans les 17 régions

Site Documentation PDF Nœud Port PM2

Événements actifs À venir Gratuits à venir Villes Sources actives Régions Catégories

Python FastAPI SQLite pytest ngrok Groupe KA remote-first

Sorti·Ka est un agrégateur indépendant de sorties et d'événements couvrant les 17 régions administratives du Québec : 18 186 événements actifs (au 2026-08-24) dans 332 villes, avec dates, lieux, gratuité (3 614 é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 (30 connecteurs actifs, 44 sources au registre — les 14 restantes sont documentées comme abandonnées ou mortes à la source, avec preuves) 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.

# Chiffres clés (live sur /api/stats, vérifiés au 2026-08-24)

Métrique Valeur
Événements actifs 18 186 (dont 18 170 à venir)
Gratuits à venir 3 614
Villes couvertes 332 — rattachées aux 17/17 régions administratives
Sources actives / au registre 30 / 44 (13 abandonnées documentées + 1 morte à la source)
Catégories canoniques 14
En quarantaine qualité 2
Top régions Montréal 6 703 · Capitale-Nationale 3 185 · Montérégie 1 067 · Estrie 918
Top catégories arts-scène 3 031 · musique 2 893 · sport 1 079 · plein-air 749

# Visite guidée

Accueil — desktop
Accueil — liste des événements (desktop)
Accueil — mobile
Accueil — mobile
Fiche d'événement
Fiche d'événement — dates, lieu, prix, lien billetterie

# Guide pas à pas (« Utiliser le site en 4 étapes », depuis /doc)

Étape 1 — accueil de Sorti·Ka
Étape 1 — Arriver sur l'accueil
Étape 2 — recherche filtrée d'événements
Étape 2 — Filtrer la liste
Étape 3 — fiche d'événement avec lien billetterie
Étape 3 — Ouvrir la fiche d'un événement
Étape 4 — tableau de bord statistiques
Étape 4 — Consulter les statistiques

# 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_label original), carte, événements similaires ; SSR + JSON-LD Event (/evenement/{uid}) pour le SEO, sitemaps et robots.txt.
  • 30 connecteurs actifs (31 modules dans sortika/connectors/, dont Ticketmaster prêt) couvrant billetteries, données ouvertes, diffuseurs et portails régionaux (tableau ci-dessous).
  • 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, quarantaine qualité, historique des synchronisations.
  • SEO programmatique — SSR de l'accueil (title avec stats live, JSON-LD WebSite/Organization), pages régions + catégories rendues en HTML, hreflang/BreadcrumbList sur les fiches.
  • Page /stats — tableau de bord analytique + rapports PDF Groupe-KA (kit kacharts/kapdf v3, rapports personnalisés par catalogue de blocs).
  • Widget KA Agent (v3, bulle déplaçable) + favoris « Mon univers Ka » (KA ID, hub groupe-ka.com).
  • Tests sur fixtures réelles, zéro réseau — 69 tests pytest (connecteurs, normalisation, DB, auth, expansion).

# Connecteurs & sources

30 connecteurs actifs / 44 sources au registre (data/sources.json : 30 actives, 13 abandonnées avec preuves, 1 morte à la source) — 45 fiches de conformité générées dans docs/connecteurs/.

Famille Sources Accès
Billetteries Le point de vente, evenko (Algolia), Ticketpro (API multi-tenants : St-Denis, Fun Nation, ExpoCité…), Ticket Accès, Tuxedo Billet (acteur Apify ka-tuxedo), Réseau Ovation, Eventbrite API/JSON publics des billetteries
Données ouvertes officielles SIT Québec / Tourinsoft (licence CC 4.0), Ville de Montréal (CKAN, CC BY 4.0), Laval, Sherbrooke, Brossard, Longueuil portails de données ouvertes
Diffuseurs & salles La Vitrine, Place des Arts, salles via JSON-LD (dont Odyscène) pages publiques structurées
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… calendriers régionaux publics
Autres Atuvu.ca (via Scrapfly), Bandsintown, LHJMQ, Québec animée HTML/JSON publics
Prêt (clé requise) Ticketmaster (TICKETMASTER_API_KEY) API officielle
Sondées et écartées (avec preuves) Zeffy, Showpass, Weezevent, Accès culture… (13 abandonnées + 1 morte à la source) documentées au registre

Cadence de resync : horaire — le watcher PM2 sorti-ka-sync (run.py watch --interval 3600) visite les sources en continu ; chaque événement passe par la normalisation (schema.py + normalize.py), l'upsert par hash, le délai de grâce (2 syncs) et l'alerte de dérive. Les connecteurs fragiles passent par une chaîne de fetch anti-bot résiliente (Oxylabs → Scrapfly → Bright Data).

# Architecture

text
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, quarantaine, historique de syncs, géocodage (geocode.py, venues.py — annuaire de salles appris/OSM/Nominatim).
  • Frontend : SPA sans build (HTML/JS, routeur History API), design system Groupe KA « éditorial sharp » (ka-ui), widget KA Agent.
  • Anti-bot : chaîne résiliente Oxylabs → Scrapfly → Bright Data (Atuvu via SCRAPFLY_API_KEY).

# API — endpoints principaux

Endpoint Méthode Rôle
/api/events GET recherche filtrée : région, ville, catégorie, période, gratuité, texte, tri, pagination
/api/events/{uid} GET fiche complète d'un événement (+ SSR SEO sur /evenement/{uid})
/api/regions · /api/categories GET référentiels (17 régions, 14 catégories canoniques)
/api/sources GET registre des sources, état et santé des connecteurs (44 entrées)
/api/stats GET agrégats publics (source des pastilles dynamiques ci-dessus)
/api/stats/catalog · /api/stats/dashboard GET catalogue de blocs + tableau de bord (kit stats v3 Groupe KA)
/api/stats/report · /api/stats/report/custom GET/POST rapports PDF Groupe-KA (modèles + personnalisés)
/api/favorites · /api/favorites/toggle GET/POST favoris « Mon univers Ka » (KA ID)
/api/health · /healthz GET santé du service

# Données & conformité

  • Provenance : uniquement des sources publiques — API de billetteries, données ouvertes officielles (SIT Québec CC 4.0, Montréal CC BY 4.0…), pages publiques structurées (JSON-LD). Chaque fiche cite et lie sa source originale.
  • Cadence : resync horaire (watcher run.py watch --interval 3600) ; retrait doux après 2 syncs d'absence, alerte de dérive par source.
  • Index fidèle, pas une billetterie : aucun prix inventé, aucune date devinée ; price_label original conservé ; la billetterie encaisse, Sorti·Ka référence.
  • Registre auditable : data/sources.json — 44 sources dont 30 actives ; chaque abandon est documenté avec preuves (Zeffy, Showpass, Weezevent, Accès culture, laval…).
  • Fiches de conformité : docs/CONFORMITE.md + 45 fiches générées dans docs/connecteurs/ (base d'accès légale, extraction, cadence par source).

# 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 (chaîne anti-bot) — 31 modules
frontend/ SPA sans build (index.html, ka-agent.js, assets) + guide /doc (page, images, PDF)
data/ base SQLite + villes_regions.json (répertoire MAMH) + sources.json (registre) — la BD n'est pas versionnée
tests/ pytest sur fixtures réelles, zéro réseau — 69 tests (test_connectors, test_normalize, test_db, test_auth, test_expansion, test_phase4)
scripts/ utilitaires (génération de docs, maintenance)
docs/ CONFORMITE.md, fiches connecteurs/ (45), captures d'écran
apify/ acteurs/outils d'appoint pour l'ingestion (ka-tuxedo…)
run.py point d'entrée CLI : sync · web · watch
requirements.txt fastapi, uvicorn, requests, fpdf2, pytest

# Démarrage rapide

bash
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          # 69 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
.venv/bin/python run.py watch --interval 3600 # watcher horaire (en prod : PM2)

# 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).
bash
cd ~/apps/sorti-ka
.venv/bin/python -m pytest tests/ -q          # avant de pousser
pm2 restart sorti-ka-web                      # après changement
git add <fichiers> && git commit -m "…" && git push origin main

# Variables d'environnement

Noms seulement — aucun secret n'est versionné (gabarit : .env.example).

Variable Rôle
SCRAPFLY_API_KEY anti-bot pour le connecteur Atuvu.ca (et repli de la chaîne résiliente)
TICKETMASTER_API_KEY active le connecteur Ticketmaster (prêt, en attente de clé)
SESSION_SECRET signature des sessions
KA_SSO_SECRET · KA_HUB_URL SSO KA ID (hub groupe-ka.com)
SORTIKA_BASE_URL URL canonique du site (SEO, liens absolus)

# Déploiement

Nœud M3U96a (cluster MacLustr) — ~/apps/sorti-ka
Port 8120
Domaine www.sorti-ka.com via tunnel ngrok
Processus PM2 Commande réelle Rôle
sorti-ka-web run.py web --host 0.0.0.0 --port 8120 API + frontend + SSR SEO
sorti-ka-sync run.py watch --interval 3600 watcher horaire — ingestion continue des sources
sorti-ka-ngrok ngrok http --url=www.sorti-ka.com 8120 tunnel vers www.sorti-ka.com

# Documentation

  • Guide utilisateur en ligne : www.sorti-ka.com/doc/ — à quoi sert le site, utilisation en 4 étapes, provenance des données, FAQ.
  • Guide PDF téléchargeable : sorti-ka-documentation.pdf.
  • Conformité & connecteurs : docs/CONFORMITE.md + une fiche par connecteur dans docs/connecteurs/ (45 fiches).

# Historique

Date Jalon
2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec + connexion KA ID
2026-08-18 vagues 2-3 d'enrichissement : heure précise, artistes, géocodage des salles, Ticketmaster/Eventbrite/Longueuil/Cantons-de-l'Est, docs standardisées
2026-08-19 phases 2-3 : archivage des passés, statut/end_time, quarantaine, séances, villes MAMH, annuaire de salles (venues), registre 34 sources + conformité
2026-08-21/22 phases 4-5 : 7 connecteurs régions + billetteries QC (Ticket Accès, Ovation, Tuxedo, Ticketpro), chaîne anti-bot résiliente, SSR SEO de l'accueil, 4 billetteries écartées avec preuves
2026-08-23 SEO programmatique (régions + catégories en HTML), stats v3 (rapports PDF personnalisés), favoris « Mon univers Ka »
2026-08-24 page /doc (guide + captures + PDF), README v3

# Écosystème Groupe KA

Site Univers
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

# Contact

Simon-Pierre Boucher — fondateur, Groupe KA 📧 contact@spboucher.ai


© Groupe KA — Simon-Pierre Boucher · contact@spboucher.ai

Ce dépôt vit sur spbgit (git perso — https://git.spboucher.ai).

Files · 84363e153bc0659c6bb295fdfeffb6d81dacfe20
Menu

Theme