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.

8.6 KB

# Sorti·Ka

Toutes les sorties et tous les événements du Québec — concerts, festivals, spectacles, expos, sport, famille — au même endroit.

Site Nœud Port PM2 Python FastAPI SQLite Groupe KA

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

Accueil — desktop Accueil — mobile

# 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 : 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_KEY requise).
  • 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

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, 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_KEY dans .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).
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          # 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 main

Secrets (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 — Simon-Pierre Boucher · contact@spboucher.ai

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

Files · 05f55caa6e093daba371e353621625dfdc9ab950
Menu

Theme