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.

docs: README ultra détaillé + visite guidée en 10 captures

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Aug 29, 2026) parent 198a27a Browse files

11 changed files +116 −45

modified README.md +116 −45
@@ -32,35 +32,102 @@
32 ![Python](https://img.shields.io/badge/Python-3.14-3776ab?style=flat-square&logo=python&logoColor=white) 32 ![Python](https://img.shields.io/badge/Python-3.14-3776ab?style=flat-square&logo=python&logoColor=white)
33 ![FastAPI](https://img.shields.io/badge/FastAPI-API%20%2B%20SSR-009688?style=flat-square&logo=fastapi&logoColor=white) 33 ![FastAPI](https://img.shields.io/badge/FastAPI-API%20%2B%20SSR-009688?style=flat-square&logo=fastapi&logoColor=white)
34 ![SQLite](https://img.shields.io/badge/SQLite-diff%20%2B%20historique-141814?style=flat-square&logo=sqlite) 34 ![SQLite](https://img.shields.io/badge/SQLite-diff%20%2B%20historique-141814?style=flat-square&logo=sqlite)
35−![pytest](https://img.shields.io/badge/pytest-69%20tests%20hors%20ligne-141814?style=flat-square&logo=pytest) 35+![pytest](https://img.shields.io/badge/pytest-131%20tests%20hors%20ligne-141814?style=flat-square&logo=pytest)
36 ![ngrok](https://img.shields.io/badge/tunnel-ngrok-140a3c?style=flat-square&logo=ngrok) 36 ![ngrok](https://img.shields.io/badge/tunnel-ngrok-140a3c?style=flat-square&logo=ngrok)
37 ![Groupe KA](https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square) 37 ![Groupe KA](https://img.shields.io/badge/Groupe-KA-b7f000?style=flat-square)
38 ![remote-first](https://img.shields.io/badge/remote--first-spbgit-24292f?style=flat-square&logo=git&logoColor=white) 38 ![remote-first](https://img.shields.io/badge/remote--first-spbgit-24292f?style=flat-square&logo=git&logoColor=white)
39 39
40 </div> 40 </div>
41 41
42−**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. 42+**Sorti·Ka** est un **agrégateur indépendant de sorties et d'événements** couvrant les **17 régions administratives du Québec** : **26 559 événements actifs** (au 2026-08-28) dans **517 villes**, avec dates, lieux, gratuité (**5 050 événements gratuits à venir**), fiche par événement et **lien direct vers la billetterie ou la source originale**. Mise à jour **horaire**, automatiquement.
43 43
44−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. 44+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** (**61 sources actives**, **68 au registre** — les 7 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.
45 45
46−## Chiffres clés (live sur [/api/stats](https://www.sorti-ka.com/api/stats), vérifiés au 2026-08-24) 46+## Chiffres clés (live sur [/api/stats](https://www.sorti-ka.com/api/stats), vérifiés au 2026-08-28)
47 47
48 | Métrique | Valeur | 48 | Métrique | Valeur |
49 |---|---| 49 |---|---|
50−| Événements actifs | **18 186** (dont 18 170 à venir) | 50+| Événements actifs | **26 559** (dont 26 488 à venir) |
51−| Gratuits à venir | **3 614** | 51+| Gratuits à venir | **5 050** |
52−| Villes couvertes | **332** — rattachées aux **17/17 régions administratives** | 52+| Villes couvertes | **517** — rattachées aux **17/17 régions administratives** |
53−| Sources actives / au registre | **30 / 44** (13 abandonnées documentées + 1 morte à la source) | 53+| Sources actives / au registre | **61 / 68** (6 abandonnées documentées + 1 morte à la source) |
54+| Connecteurs (modules) | **62** dans `sortika/connectors/` |
54 | Catégories canoniques | **14** | 55 | Catégories canoniques | **14** |
55−| En quarantaine qualité | 2 | 56+| En quarantaine qualité | 8 |
56−| Top régions | Montréal 6 703 · Capitale-Nationale 3 185 · Montérégie 1 067 · Estrie 918 | 57+| Top régions | Montréal 8 919 · Capitale-Nationale 4 263 · Estrie 2 141 · Centre-du-Québec 1 619 |
57−| Top catégories | arts-scène 3 031 · musique 2 893 · sport 1 079 · plein-air 749 | 58+| Top catégories | arts-scène 4 225 · musique 4 070 · sport 1 439 · famille 932 |
58 59
59−## Visite guidée 60+## Visite guidée — le site en 10 captures
60 61
61−*Captures du 2026-08-25 — frontend v2 « guide culturel » (mobile 390×844 · desktop 1440×900).* 62+*Captures du 2026-08-28 — frontend v2 « guide culturel » en production sur [www.sorti-ka.com](https://www.sorti-ka.com).*
62 63
63−### Mobile 64+<table>
65+ <tr>
66+ <td align="center" width="50%">
67+ <img src="docs/screenshots/01-accueil.jpg" alt="Accueil de Sorti·Ka" width="440"><br>
68+ <sub><b>1 · Accueil</b> — <a href="https://www.sorti-ka.com/">sorti-ka.com</a><br>
69+ Hero éditorial avec mosaïque d'images réelles et compteurs live en phrase, recherche centrale, accès rapides (Ce soir · Fin de semaine · Gratuit · Près de moi), timeline de jours et sections « À la une » dédoublonnées.</sub>
70+ </td>
71+ <td align="center" width="50%">
72+ <img src="docs/screenshots/02-regions.jpg" alt="Répertoire des 17 régions" width="440"><br>
73+ <sub><b>2 · Répertoire des régions</b> — <a href="https://www.sorti-ka.com/regions">/regions</a><br>
74+ Les 17 régions administratives du Québec, chacune avec son compteur d'événements actifs — porte d'entrée géographique de tout le catalogue.</sub>
75+ </td>
76+ </tr>
77+ <tr>
78+ <td align="center">
79+ <img src="docs/screenshots/03-categories.jpg" alt="Répertoire des catégories" width="440"><br>
80+ <sub><b>3 · Répertoire des catégories</b> — <a href="https://www.sorti-ka.com/categories">/categories</a><br>
81+ Les 14 catégories canoniques (musique, arts-scène, festival, sport, famille, plein-air, exposition-musée…) vers lesquelles chaque source est normalisée.</sub>
82+ </td>
83+ <td align="center">
84+ <img src="docs/screenshots/04-stats.jpg" alt="Tableau de bord statistiques" width="440"><br>
85+ <sub><b>4 · Statistiques</b> — <a href="https://www.sorti-ka.com/stats">/stats</a><br>
86+ Tableau de bord analytique du catalogue (kit stats v3 Groupe KA) : répartitions par région, catégorie, gratuité, sources — et rapports PDF téléchargeables.</sub>
87+ </td>
88+ </tr>
89+ <tr>
90+ <td align="center">
91+ <img src="docs/screenshots/05-contact.jpg" alt="Page contact" width="440"><br>
92+ <sub><b>5 · Contact</b> — <a href="https://www.sorti-ka.com/contact">/contact</a><br>
93+ Page contact standardisée Groupe KA : coordonnées du fondateur, mission du site et liens vers l'écosystème.</sub>
94+ </td>
95+ <td align="center">
96+ <img src="docs/screenshots/06-region-montreal.jpg" alt="Page région Montréal" width="440"><br>
97+ <sub><b>6 · Page région — Montréal</b> — <a href="https://www.sorti-ka.com/region/montreal">/region/montreal</a><br>
98+ Résultats filtrés par région (8 919 événements à Montréal) : cartes image-first, bascule Liste|Carte (Leaflet à la demande), pilules de filtres actifs, page SEO rendue en HTML.</sub>
99+ </td>
100+ </tr>
101+ <tr>
102+ <td align="center">
103+ <img src="docs/screenshots/07-categorie-arts-scene.jpg" alt="Page catégorie arts et scène" width="440"><br>
104+ <sub><b>7 · Page catégorie — Arts & scène</b> — <a href="https://www.sorti-ka.com/categorie/arts-scene">/categorie/arts-scene</a><br>
105+ Vue par catégorie (4 225 événements arts-scène) combinable avec les filtres région, ville, période et gratuité — indexable par les moteurs.</sub>
106+ </td>
107+ <td align="center">
108+ <img src="docs/screenshots/08-evenement-abitibi-16522.jpg" alt="Fiche événement" width="440"><br>
109+ <sub><b>8 · Fiche événement</b> — <a href="https://www.sorti-ka.com/evenement/abitibi:16522">/evenement/{uid}</a><br>
110+ La fiche complète (ici un événement d'Abitibi-Témiscamingue) : dates et heure locale, lieu géocodé sur carte, prix original (`price_label`), événements similaires, CTA sticky vers la billetterie ou la source — SSR + JSON-LD Event.</sub>
111+ </td>
112+ </tr>
113+ <tr>
114+ <td align="center">
115+ <img src="docs/screenshots/09-favoris.jpg" alt="Favoris Mon univers Ka" width="440"><br>
116+ <sub><b>9 · Favoris « Mon univers Ka »</b> — <a href="https://www.sorti-ka.com/favoris">/favoris</a><br>
117+ Les événements sauvegardés via KA ID (SSO du hub groupe-ka.com) — le même compte et les mêmes favoris sur les 12 sites du Groupe KA.</sub>
118+ </td>
119+ <td align="center">
120+ <img src="docs/screenshots/10-docs.jpg" alt="Documentation en ligne" width="440"><br>
121+ <sub><b>10 · Documentation</b> — <a href="https://www.sorti-ka.com/docs">/docs</a><br>
122+ Le guide utilisateur en ligne : à quoi sert Sorti·Ka, utilisation pas à pas, provenance des données, FAQ — aussi disponible en PDF téléchargeable.</sub>
123+ </td>
124+ </tr>
125+</table>
126+
127+### Galerie mobile & desktop (frontend v2, 2026-08-25)
128+
129+<details>
130+<summary><b>Mobile (390×844)</b> — 6 captures WebP</summary>
64 131
65 <table> 132 <table>
66 <tr> 133 <tr>
@@ -75,7 +142,10 @@ Trouver quoi faire au Québec, c'est normalement ouvrir dix sites : les billette
75 </tr> 142 </tr>
76 </table> 143 </table>
77 144
78−### Desktop 145+</details>
146+
147+<details>
148+<summary><b>Desktop (1440×900)</b> — 6 captures WebP</summary>
79 149
80 <table> 150 <table>
81 <tr> 151 <tr>
@@ -92,13 +162,7 @@ Trouver quoi faire au Québec, c'est normalement ouvrir dix sites : les billette
92 </tr> 162 </tr>
93 </table> 163 </table>
94 164
95−### Nouveautés front-end (2026-08-25) 165+</details>
96−
97−- **Frontend v2 « guide culturel »** — refonte majeure mobile-first : hero éditorial avec mosaïque d'images réelles et compteurs en phrase, recherche centrale, accès rapides (Ce soir / Fin de semaine / Gratuit / Près de moi), timeline de jours, accueil par sections dédoublonnées (À la une, carrousels, grille), fiches image-first, résultats Liste|Carte (Leaflet à la demande), pilules de filtres actifs, bottom sheet de filtres, CTA sticky sur mobile.
98−- **Filtre géographique `near=lat,lng`** + tri par distance côté API.
99−- **KA Tabbar v1** — barre de navigation mobile commune Groupe KA (Découvrir · Recherche · Carte · Favoris).
100−- **Vague connecteurs 2026-08-25** — +26 sources actives (ATR, municipales, billetteries) : 61 sources, 22 900+ événements actifs.
101−- **Widget ka-agent v4** — cartes d'événements cliquables et choix en boutons.
102 166
103 > 🗄️ Les captures d'époque (v1) sont conservées dans [`docs/archive/`](docs/archive/). 167 > 🗄️ Les captures d'époque (v1) sont conservées dans [`docs/archive/`](docs/archive/).
104 168
@@ -117,30 +181,33 @@ Trouver quoi faire au Québec, c'est normalement ouvrir dix sites : les billette
117 181
118 ## Fonctionnalités 182 ## Fonctionnalités
119 183
120−- **Recherche filtrée** — région, ville, catégorie (14 catégories canoniques), période, **gratuité**, texte libre, tri et pagination (`GET /api/events`). 184+- **Recherche filtrée** — région, ville, catégorie (14 catégories canoniques), période, **gratuité**, texte libre, **proximité (`near=lat,lng` + tri par distance)**, tri et pagination (`GET /api/events`).
121 - **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. 185 - **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.
122−- **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). 186+- **61 sources actives via 62 connecteurs** (`sortika/connectors/`) couvrant billetteries, données ouvertes, diffuseurs, ATR (associations touristiques régionales), calendriers municipaux et portails régionaux (tableau ci-dessous).
123 - **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. 187 - **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.
124 - **Répertoire des municipalités MAMH** — 1 250 villes + arrondissements + alias, homonymes résolus par population ; rattachement automatique aux 17 régions. 188 - **Répertoire des municipalités MAMH** — 1 250 villes + arrondissements + alias, homonymes résolus par population ; rattachement automatique aux 17 régions.
125 - **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. 189 - **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.
126 - **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. 190 - **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.
127 - **Page /stats** — tableau de bord analytique + **rapports PDF Groupe-KA** (kit kacharts/kapdf v3, rapports personnalisés par catalogue de blocs). 191 - **Page /stats** — tableau de bord analytique + **rapports PDF Groupe-KA** (kit kacharts/kapdf v3, rapports personnalisés par catalogue de blocs).
128−- **Widget KA Agent** (v3, bulle déplaçable) + **favoris « Mon univers Ka »** (KA ID, hub groupe-ka.com). 192+- **Personnalisation KA ID v2** (`sortika/kaid.py` + `/api/kaid`) — journal serveur (recherches, fiches vues, favoris), recommandations « Recommandé pour vous » en mode annotation (ordre chronologique préservé), filtrage collaboratif (modèle ALS partagé Groupe KA), pilules « Sauvegarder cette recherche » / « Pas pour moi ».
129−- **Tests sur fixtures réelles, zéro réseau** — **69 tests pytest** (connecteurs, normalisation, DB, auth, expansion). 193+- **Frontend v2 « guide culturel »** — mobile-first : bascule Liste|Carte (Leaflet à la demande), bottom sheet de filtres, CTA sticky, **KA Tabbar v1** (barre de navigation mobile commune Groupe KA : Découvrir · Recherche · Carte · Favoris).
194+- **Widget KA Agent** (v4, cartes d'événements cliquables + choix en boutons) + **favoris « Mon univers Ka »** (KA ID, hub groupe-ka.com).
195+- **Tests sur fixtures réelles, zéro réseau** — **131 tests pytest** (connecteurs, normalisation, DB, auth, expansion, phases 4+).
130 196
131 ## Connecteurs & sources 197 ## Connecteurs & sources
132 198
133−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/`. 199+**61 sources actives / 68 au registre** (`data/sources.json` : 61 actives, 6 abandonnées avec preuves, 1 morte à la source) — **62 modules connecteurs** dans `sortika/connectors/` et **70 fiches de conformité** générées dans `docs/connecteurs/`.
134 200
135−| Famille | Sources | Accès | 201+| Famille | Sources (exemples) | Accès |
136 |---|---|---| 202 |---|---|---|
137 | **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 | 203 | **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 |
138 | **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 | 204 | **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 |
139−| **Diffuseurs & salles** | La Vitrine, Place des Arts, salles via JSON-LD (dont Odyscène) | pages publiques structurées | 205+| **Diffuseurs & salles** | La Vitrine, Place des Arts, salles via JSON-LD (dont Odyscène — +13 salles à la vague du 2026-08-25) | pages publiques structurées |
140−| **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 | 206+| **ATR & portails régionaux** | Abitibi-Témiscamingue, Charlevoix, Côte-Nord, Gaspésie, Îles-de-la-Madeleine, Mauricie, Laurentides, Lanaudière, Montérégie, Outaouais, Cantons-de-l'Est, Chaudière-Appalaches, Bas-Saint-Laurent, Centre-du-Québec, Saguenay, Eeyou Istchee… | calendriers régionaux publics |
141−| **Autres** | Atuvu.ca (via Scrapfly), Bandsintown, LHJMQ, Québec animée | HTML/JSON publics | 207+| **Calendriers municipaux** | Gatineau, Lévis, Trois-Rivières, Sherbrooke, Drummondville, Granby, Magog, Joliette, Terrebonne, Saint-Jérôme, Saint-Hyacinthe, Sorel-Tracy, Shawinigan, Rimouski, Rouyn-Noranda, Victoriaville, Signé Laval… | sites municipaux publics |
208+| **Agrégateurs & autres** | Atuvu.ca (via Scrapfly), Quoi faire, MTL.org, Québec Cité, BAnQ, Bandsintown, LHJMQ, Québec animée, Événements & Attractions | HTML/JSON publics |
142 | **Prêt (clé requise)** | Ticketmaster (`TICKETMASTER_API_KEY`) | API officielle | 209 | **Prêt (clé requise)** | Ticketmaster (`TICKETMASTER_API_KEY`) | API officielle |
143−| **Sondées et écartées (avec preuves)** | Zeffy, Showpass, Weezevent, Accès culture… (13 abandonnées + 1 morte à la source) | documentées au registre | 210+| **Sondées et écartées (avec preuves)** | Zeffy, Showpass, Weezevent… (6 abandonnées + 1 morte à la source, documentées au registre) | documentées au registre |
144 211
145 **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). 212 **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).
146 213
@@ -155,23 +222,24 @@ watcher horaire (PM2) frontend SPA + fiches ← API FastAPI + SSR
155 run.py watch frontend/index.html web.py + seo.py 222 run.py watch frontend/index.html web.py + seo.py
156 ``` 223 ```
157 224
158−- **Backend** : Python 3.14 + **FastAPI** (uvicorn) — API JSON, SSR SEO des fiches, stats, PDF (fpdf2), SSO/favoris KA ID (`auth.py`, `hubfav.py`). 225+- **Backend** : Python 3.14 + **FastAPI** (uvicorn) — API JSON, SSR SEO des fiches, stats, PDF (fpdf2), SSO/favoris KA ID (`auth.py`, `hubfav.py`), personnalisation (`kaid.py`).
159 - **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). 226 - **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).
160−- **Frontend** : SPA **sans build** (HTML/JS, routeur History API), design system Groupe KA « éditorial sharp » (ka-ui), widget KA Agent. 227+- **Frontend** : SPA **sans build** (HTML/JS, routeur History API), design system Groupe KA « éditorial sharp » (ka-ui), KA Tabbar mobile, widget KA Agent.
161 - **Anti-bot** : chaîne résiliente Oxylabs → Scrapfly → Bright Data (Atuvu via `SCRAPFLY_API_KEY`). 228 - **Anti-bot** : chaîne résiliente Oxylabs → Scrapfly → Bright Data (Atuvu via `SCRAPFLY_API_KEY`).
162 229
163 ## API — endpoints principaux 230 ## API — endpoints principaux
164 231
165 | Endpoint | Méthode | Rôle | 232 | Endpoint | Méthode | Rôle |
166 |---|---|---| 233 |---|---|---|
167−| `/api/events` | GET | recherche filtrée : région, ville, catégorie, période, gratuité, texte, tri, pagination | 234+| `/api/events` | GET | recherche filtrée : région, ville, catégorie, période, gratuité, texte, `near=lat,lng`, tri, pagination |
168 | `/api/events/{uid}` | GET | fiche complète d'un événement (+ SSR SEO sur `/evenement/{uid}`) | 235 | `/api/events/{uid}` | GET | fiche complète d'un événement (+ SSR SEO sur `/evenement/{uid}`) |
169 | `/api/regions` · `/api/categories` | GET | référentiels (17 régions, 14 catégories canoniques) | 236 | `/api/regions` · `/api/categories` | GET | référentiels (17 régions, 14 catégories canoniques) |
170−| `/api/sources` | GET | registre des sources, état et santé des connecteurs (44 entrées) | 237+| `/api/sources` | GET | registre des sources, état et santé des connecteurs (68 entrées) |
171 | `/api/stats` | GET | agrégats publics (source des pastilles dynamiques ci-dessus) | 238 | `/api/stats` | GET | agrégats publics (source des pastilles dynamiques ci-dessus) |
172 | `/api/stats/catalog` · `/api/stats/dashboard` | GET | catalogue de blocs + tableau de bord (kit stats v3 Groupe KA) | 239 | `/api/stats/catalog` · `/api/stats/dashboard` | GET | catalogue de blocs + tableau de bord (kit stats v3 Groupe KA) |
173 | `/api/stats/report` · `/api/stats/report/custom` | GET/POST | rapports PDF Groupe-KA (modèles + personnalisés) | 240 | `/api/stats/report` · `/api/stats/report/custom` | GET/POST | rapports PDF Groupe-KA (modèles + personnalisés) |
174 | `/api/favorites` · `/api/favorites/toggle` | GET/POST | favoris « Mon univers Ka » (KA ID) | 241 | `/api/favorites` · `/api/favorites/toggle` | GET/POST | favoris « Mon univers Ka » (KA ID) |
242+| `/api/kaid/*` | GET/POST | personnalisation KA ID v2 — journal d'événements, recommandations, préférences |
175 | `/api/health` · `/healthz` | GET | santé du service | 243 | `/api/health` · `/healthz` | GET | santé du service |
176 244
177 ## Données & conformité 245 ## Données & conformité
@@ -179,20 +247,20 @@ run.py watch frontend/index.html web.py + seo.py
179 - **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**. 247 - **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**.
180 - **Cadence** : resync **horaire** (watcher `run.py watch --interval 3600`) ; retrait doux après 2 syncs d'absence, alerte de dérive par source. 248 - **Cadence** : resync **horaire** (watcher `run.py watch --interval 3600`) ; retrait doux après 2 syncs d'absence, alerte de dérive par source.
181 - **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. 249 - **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.
182−- **Registre auditable** : `data/sources.json` — 44 sources dont 30 actives ; chaque abandon est documenté avec preuves (Zeffy, Showpass, Weezevent, Accès culture, laval…). 250+- **Registre auditable** : `data/sources.json` — 68 sources dont 61 actives ; chaque abandon est documenté avec preuves (Zeffy, Showpass, Weezevent…).
183−- **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). 251+- **Fiches de conformité** : `docs/CONFORMITE.md` + 70 fiches générées dans `docs/connecteurs/` (base d'accès légale, extraction, cadence par source).
184 252
185 ## Structure du repo 253 ## Structure du repo
186 254
187 | Répertoire / fichier | Rôle | 255 | Répertoire / fichier | Rôle |
188 |---|---| 256 |---|---|
189−| `sortika/` | paquet Python : connecteurs, schéma `Event`, normalisation, régions MAMH, DB, web/SSR, stats, PDF, auth KA ID | 257+| `sortika/` | paquet Python : connecteurs, schéma `Event`, normalisation, régions MAMH, DB, web/SSR, stats, PDF, auth KA ID, personnalisation `kaid.py` |
190−| `sortika/connectors/` | un module par source (auto-découverts), base commune + `_resilient.py` (chaîne anti-bot) — 31 modules | 258+| `sortika/connectors/` | un module par source (auto-découverts), base commune + `_resilient.py` (chaîne anti-bot) — 62 modules |
191−| `frontend/` | SPA sans build (`index.html`, `ka-agent.js`, assets) + guide `/doc` (page, images, PDF) | 259+| `frontend/` | SPA sans build (`index.html`, `ka-agent.js`, `ka-id.js`, assets) + guide `/doc` (page, images, PDF) |
192 | `data/` | base SQLite + `villes_regions.json` (répertoire MAMH) + `sources.json` (registre) — la BD n'est pas versionnée | 260 | `data/` | base SQLite + `villes_regions.json` (répertoire MAMH) + `sources.json` (registre) — la BD n'est pas versionnée |
193−| `tests/` | pytest sur fixtures réelles, zéro réseau — 69 tests (`test_connectors`, `test_normalize`, `test_db`, `test_auth`, `test_expansion`, `test_phase4`) | 261+| `tests/` | pytest sur fixtures réelles, zéro réseau — 131 tests (`test_connectors`, `test_normalize`, `test_db`, `test_auth`, `test_expansion`, `test_phase4`…) |
194 | `scripts/` | utilitaires (génération de docs, maintenance) | 262 | `scripts/` | utilitaires (génération de docs, maintenance) |
195−| `docs/` | `CONFORMITE.md`, fiches `connecteurs/` (45), captures d'écran | 263+| `docs/` | `CONFORMITE.md`, fiches `connecteurs/` (70), captures d'écran (`screenshots/` : visite guidée + galeries mobile/desktop, archives v1 dans `archive/`) |
196 | `apify/` | acteurs/outils d'appoint pour l'ingestion (ka-tuxedo…) | 264 | `apify/` | acteurs/outils d'appoint pour l'ingestion (ka-tuxedo…) |
197 | `run.py` | point d'entrée CLI : `sync` · `web` · `watch` | 265 | `run.py` | point d'entrée CLI : `sync` · `web` · `watch` |
198 | `requirements.txt` | fastapi, uvicorn, requests, fpdf2, pytest | 266 | `requirements.txt` | fastapi, uvicorn, requests, fpdf2, pytest |
@@ -202,7 +270,7 @@ run.py watch frontend/index.html web.py + seo.py
202 ```bash 270 ```bash
203 ssh M3U96a && cd ~/apps/sorti-ka 271 ssh M3U96a && cd ~/apps/sorti-ka
204 python3 -m venv .venv && .venv/bin/pip install -r requirements.txt # au besoin 272 python3 -m venv .venv && .venv/bin/pip install -r requirements.txt # au besoin
205−.venv/bin/python -m pytest tests/ -q # 69 tests — fixtures réelles, zéro réseau 273+.venv/bin/python -m pytest tests/ -q # 131 tests — fixtures réelles, zéro réseau
206 .venv/bin/python run.py sync # ingestion des sources 274 .venv/bin/python run.py sync # ingestion des sources
207 .venv/bin/python run.py web --port 8120 # API + frontend + SSR 275 .venv/bin/python run.py web --port 8120 # API + frontend + SSR
208 .venv/bin/python run.py watch --interval 3600 # watcher horaire (en prod : PM2) 276 .venv/bin/python run.py watch --interval 3600 # watcher horaire (en prod : PM2)
@@ -251,7 +319,7 @@ Noms seulement — **aucun secret n'est versionné** (gabarit : `.env.example`).
251 319
252 - **Guide utilisateur en ligne** : [www.sorti-ka.com/doc/](https://www.sorti-ka.com/doc/) — à quoi sert le site, utilisation en 4 étapes, provenance des données, FAQ. 320 - **Guide utilisateur en ligne** : [www.sorti-ka.com/doc/](https://www.sorti-ka.com/doc/) — à quoi sert le site, utilisation en 4 étapes, provenance des données, FAQ.
253 - **Guide PDF téléchargeable** : [sorti-ka-documentation.pdf](https://www.sorti-ka.com/doc/sorti-ka-documentation.pdf). 321 - **Guide PDF téléchargeable** : [sorti-ka-documentation.pdf](https://www.sorti-ka.com/doc/sorti-ka-documentation.pdf).
254−- **Conformité & connecteurs** : `docs/CONFORMITE.md` + une fiche par connecteur dans `docs/connecteurs/` (45 fiches). 322+- **Conformité & connecteurs** : `docs/CONFORMITE.md` + une fiche par connecteur dans `docs/connecteurs/` (70 fiches).
255 323
256 ## Historique 324 ## Historique
257 325
@@ -263,6 +331,9 @@ Noms seulement — **aucun secret n'est versionné** (gabarit : `.env.example`).
263 | 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 | 331 | 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 |
264 | 2026-08-23 | SEO programmatique (régions + catégories en HTML), stats v3 (rapports PDF personnalisés), favoris « Mon univers Ka » | 332 | 2026-08-23 | SEO programmatique (régions + catégories en HTML), stats v3 (rapports PDF personnalisés), favoris « Mon univers Ka » |
265 | 2026-08-24 | page `/doc` (guide + captures + PDF), README v3 | 333 | 2026-08-24 | page `/doc` (guide + captures + PDF), README v3 |
334+| 2026-08-25 | vague connecteurs : **+26 sources actives** (10 ATR, 15 municipales, 6 billetteries/agrégateurs), 20 connecteurs enrichis, +13 salles JSON-LD → **61 sources actives** ; frontend v2 « guide culturel » (refonte mobile-first) + filtre `near=lat,lng` + KA Tabbar v1 |
335+| 2026-08-26 | personnalisation KA ID v2 (`kaid.py`, journal serveur, recommandations en mode annotation, filtrage collaboratif ALS, SDK `ka-id.js`) |
336+| 2026-08-28 | README v4 — visite guidée du site en 10 captures (`docs/screenshots/`) |
266 337
267 ## Écosystème Groupe KA 338 ## Écosystème Groupe KA
268 339
added docs/screenshots/01-accueil.jpg +0 −0

Binary file not shown.

added docs/screenshots/02-regions.jpg +0 −0

Binary file not shown.

added docs/screenshots/03-categories.jpg +0 −0

Binary file not shown.

added docs/screenshots/04-stats.jpg +0 −0

Binary file not shown.

added docs/screenshots/05-contact.jpg +0 −0

Binary file not shown.

added docs/screenshots/06-region-montreal.jpg +0 −0

Binary file not shown.

added docs/screenshots/07-categorie-arts-scene.jpg +0 −0

Binary file not shown.

added docs/screenshots/08-evenement-abitibi-16522.jpg +0 −0

Binary file not shown.

added docs/screenshots/09-favoris.jpg +0 −0

Binary file not shown.

added docs/screenshots/10-docs.jpg +0 −0

Binary file not shown.

Menu

Theme