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.

Phase 4 — 7 nouveaux connecteurs : régions manquantes (Montérégie, Centre-du-Québec, Chaudière-Appalaches, Gaspésie via Scrapfly) + billetteries QC (TicketAcces, Réseau Ovation, Tuxedo via acteur Apify ka-tuxedo)

- ATR : monteregie (WP REST cpt_event + JSON-LD fiche), centreduquebec (SSR),
  chaudiereappalaches (SSR paginé, JSON-LD Event complet), gaspesie (RÉACTIVÉE —
  WAF contourné via Scrapfly consigné et budgété)
- Billetteries : ticketacces (calendrier agrégé, 47 orgs QC dont 14 en Abitibi,
  ~1 320 séances, Crawl-delay 120 honoré PAR HÔTE + TTL 6 h), ovation (26 orgs
  100 % QC, artistes/adresses/heures, Crawl-delay 30 honoré + TTL 20 h),
  tuxedobillet (RÉACTIVÉE — 29 tenants QC, SPA Firebase rendue par l'acteur
  Apify maison gorgeous_thistle/ka-tuxedo, code versionné dans apify/ka-tuxedo/)
- Configs annuaires : data/ovation_orgs.json, data/tuxedo_tenants.json
- Registre 39 sources, CONFORMITE.md (robots.txt lus, crawl-delays honorés),
  fiches docs régénérées, 10 nouveaux tests sur fixtures réelles (69 verts)
- Couverture : +1 900 séances futures ; Abitibi +312, Gaspésie réamorcée,
  Centre-du-Québec première source

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

72 changed files +3,957 −917

72 changed files
added apify/ka-tuxedo/.actor/actor.json +13 −0
@@ -0,0 +1,13 @@
1+{
2+ "actorSpecification": 1,
3+ "name": "ka-tuxedo",
4+ "title": "KA Tuxedo Billet — spectacles des tenants québécois",
5+ "description": "Rend les billetteries Tuxedo (*.tuxedobillet.com, SPA Angular/Firebase) avec Playwright et extrait la liste des spectacles (titre, sous-titre, date, image, lien) par tenant. Sorti-Ka / Groupe Ka.",
6+ "version": "0.1",
7+ "buildTag": "latest",
8+ "meta": {
9+ "author": "Simon-Pierre Boucher <contact@spboucher.ai>"
10+ },
11+ "input": "./input_schema.json",
12+ "dockerfile": "../Dockerfile"
13+}
added apify/ka-tuxedo/.actor/input_schema.json +28 −0
@@ -0,0 +1,28 @@
1+{
2+ "title": "KA Tuxedo Billet — entrée",
3+ "type": "object",
4+ "schemaVersion": 1,
5+ "properties": {
6+ "tenants": {
7+ "title": "Tenants",
8+ "type": "array",
9+ "description": "Sous-domaines *.tuxedobillet.com à moissonner (ex. espacetheatre).",
10+ "editor": "stringList",
11+ "prefill": ["espacetheatre"]
12+ },
13+ "renderWaitMs": {
14+ "title": "Attente de rendu (ms)",
15+ "type": "integer",
16+ "description": "Délai supplémentaire après le chargement pour laisser Angular peindre la liste.",
17+ "default": 6000
18+ },
19+ "proxyConfiguration": {
20+ "title": "Proxy",
21+ "type": "object",
22+ "description": "Proxy Apify (résidentiel CA recommandé).",
23+ "editor": "proxy",
24+ "default": {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"], "apifyProxyCountry": "CA"}
25+ }
26+ },
27+ "required": ["tenants"]
28+}
added apify/ka-tuxedo/Dockerfile +13 −0
@@ -0,0 +1,13 @@
1+# ==============================================================================
2+# Author: Simon-Pierre Boucher <contact@spboucher.ai>
3+# File: Dockerfile
4+# Desc: Image de l'acteur Apify ka-tuxedo (Playwright + Python).
5+# ==============================================================================
6+FROM apify/actor-python-playwright:3.13
7+
8+COPY requirements.txt ./
9+RUN pip install --no-cache-dir -r requirements.txt
10+
11+COPY . ./
12+
13+CMD ["python3", "-m", "src"]
added apify/ka-tuxedo/requirements.txt +7 −0
@@ -0,0 +1,7 @@
1+# ==============================================================================
2+# Author: Simon-Pierre Boucher <contact@spboucher.ai>
3+# File: requirements.txt
4+# Desc: Dépendances de l'acteur ka-tuxedo (rien d'épinglé sauf nécessité —
5+# gotcha de build Apify consigné 2026-08).
6+# ==============================================================================
7+apify
added apify/ka-tuxedo/src/__main__.py +10 −0
@@ -0,0 +1,10 @@
1+# ==============================================================================
2+# Author: Simon-Pierre Boucher <contact@spboucher.ai>
3+# File: src/__main__.py
4+# Desc: Point d'entrée de l'acteur Apify ka-tuxedo.
5+# ==============================================================================
6+import asyncio
7+
8+from .main import main
9+
10+asyncio.run(main())
added apify/ka-tuxedo/src/main.py +105 −0
@@ -0,0 +1,105 @@
1+# ==============================================================================
2+# Author: Simon-Pierre Boucher <contact@spboucher.ai>
3+# File: src/main.py
4+# Desc: Acteur Apify ka-tuxedo — billetteries Tuxedo (*.tuxedobillet.com).
5+# Les tenants sont des SPA Angular sur Firebase (RTDB verrouillée,
6+# 401 même avec jeton anonyme — vérifié 2026-08-21) : le rendu
7+# navigateur est la seule voie. Playwright (Chromium) + proxy Apify
8+# (résidentiel CA par défaut) rend chaque tenant et extrait les tuiles
9+# .tuxCmsEdit__webShowTile : titre, sous-titre, date, image, lien
10+# /main/<slug>. Un item de dataset par spectacle.
11+# ==============================================================================
12+from __future__ import annotations
13+
14+import asyncio
15+from urllib.parse import urlparse
16+
17+from apify import Actor
18+from playwright.async_api import async_playwright
19+
20+CONCURRENCY = 4 # pages simultanées (29 tenants ≈ 6 vagues)
21+
22+
23+def _pw_proxy(url: str | None) -> dict | None:
24+ """URL de proxy Apify → dict Playwright (identifiants SÉPARÉS du server —
25+ Playwright ignore les credentials inline, cause de timeouts silencieux)."""
26+ if not url:
27+ return None
28+ p = urlparse(url)
29+ proxy = {"server": f"{p.scheme}://{p.hostname}:{p.port}"}
30+ if p.username:
31+ proxy["username"] = p.username
32+ proxy["password"] = p.password or ""
33+ return proxy
34+
35+TILE = ".tuxCmsEdit__webShowTile"
36+
37+EXTRACT_JS = """
38+() => Array.from(document.querySelectorAll('.tuxCmsEdit__webShowTile')).map(t => {
39+ const q = (sel) => { const e = t.querySelector(sel); return e ? e.textContent.trim() : ''; };
40+ const a = t.querySelector('a[href^="/main/"]');
41+ const img = t.querySelector('img.tuxCmsEdit__webShowTile--showImage');
42+ return {
43+ slug: a ? a.getAttribute('href').replace('/main/', '') : '',
44+ title: q('.tuxCmsEdit__webShowTile--showTitle'),
45+ subtitle: q('.tuxCmsEdit__webShowTile--showSubtitle'),
46+ date_raw: q('.tuxCmsEdit__webShowTile--showDate'),
47+ image: img ? img.getAttribute('src') : '',
48+ };
49+})
50+"""
51+
52+
53+async def main() -> None:
54+ async with Actor:
55+ inp = await Actor.get_input() or {}
56+ tenants = [t.strip().lower() for t in inp.get("tenants", []) if t.strip()]
57+ wait_ms = int(inp.get("renderWaitMs", 6000))
58+ proxy_cfg = await Actor.create_proxy_configuration(
59+ actor_proxy_input=inp.get("proxyConfiguration"))
60+ proxy_url = await proxy_cfg.new_url() if proxy_cfg else None
61+
62+ async with async_playwright() as pw:
63+ browser = await pw.chromium.launch(
64+ headless=True, proxy=_pw_proxy(proxy_url))
65+ context = await browser.new_context(
66+ locale="fr-CA", viewport={"width": 1366, "height": 900})
67+ sem = asyncio.Semaphore(CONCURRENCY)
68+
69+ async def scrape(tenant: str) -> None:
70+ url = f"https://{tenant}.tuxedobillet.com/"
71+ async with sem:
72+ page = await context.new_page()
73+ try:
74+ await page.goto(url, wait_until="domcontentloaded",
75+ timeout=45_000)
76+ try:
77+ await page.wait_for_selector(TILE, timeout=25_000)
78+ except Exception:
79+ Actor.log.warning(f"{tenant}: aucune tuile rendue")
80+ await page.wait_for_timeout(wait_ms)
81+ # défilement : certaines listes chargent paresseusement
82+ for _ in range(6):
83+ await page.mouse.wheel(0, 2400)
84+ await page.wait_for_timeout(300)
85+ shows = await page.evaluate(EXTRACT_JS)
86+ seen: set[str] = set()
87+ for s in shows:
88+ if (not s["title"] or not s["slug"]
89+ or s["slug"] in seen):
90+ continue
91+ seen.add(s["slug"])
92+ await Actor.push_data({
93+ "tenant": tenant,
94+ "url": (f"https://{tenant}.tuxedobillet.com"
95+ f"/main/{s['slug']}"),
96+ **s,
97+ })
98+ Actor.log.info(f"{tenant}: {len(seen)} spectacle(s)")
99+ except Exception as exc:
100+ Actor.log.exception(f"{tenant}: échec ({exc})")
101+ finally:
102+ await page.close()
103+
104+ await asyncio.gather(*(scrape(t) for t in tenants))
105+ await browser.close()
added data/ovation_orgs.json +31 −0
@@ -0,0 +1,31 @@
1+{
2+ "_comment": "Sorti-Ka — Organisations du Réseau Ovation (m.ovation.ca) à moissonner. Auteur : Simon-Pierre Boucher — contact@spboucher.ai. Codes base36 validés par balayage 000000-00002Z le 2026-08-21 (un code valide répond 200 sur /fr/Search/AllEvents, un invalide 302). Réseau 100 % québécois — ajouter une organisation = un bloc ici, 0 code. Les clubs sportifs à 0 événement hors saison restent listés (la saison les réactive).",
3+ "organisations": [
4+ {"code": "00000O", "nom": "Centre culturel de l'Université de Sherbrooke", "ville": "Sherbrooke"},
5+ {"code": "00000P", "nom": "Maison des Arts Desjardins Drummondville", "ville": "Drummondville"},
6+ {"code": "00000Q", "nom": "Salle Albert-Rousseau", "ville": "Québec"},
7+ {"code": "00000R", "nom": "Diffusion Saguenay", "ville": "Saguenay"},
8+ {"code": "00000V", "nom": "Salle Odyssée — Maison de la culture de Gatineau", "ville": "Gatineau"},
9+ {"code": "00000W", "nom": "Culture Trois-Rivières", "ville": "Trois-Rivières"},
10+ {"code": "00000Z", "nom": "Palace de Granby", "ville": "Granby"},
11+ {"code": "000011", "nom": "Ville de Gatineau — Spectacles et théâtre", "ville": "Gatineau"},
12+ {"code": "000012", "nom": "Théâtre du Vieux Terrebonne", "ville": "Terrebonne"},
13+ {"code": "000016", "nom": "Théâtre Granada", "ville": "Sherbrooke"},
14+ {"code": "00001A", "nom": "Festival Western de St-Tite", "ville": "Saint-Tite"},
15+ {"code": "00001D", "nom": "Saguenéens de Chicoutimi", "ville": "Saguenay"},
16+ {"code": "00001E", "nom": "Grand Prix de Trois-Rivières", "ville": "Trois-Rivières"},
17+ {"code": "00001F", "nom": "Diablos de Trois-Rivières", "ville": "Trois-Rivières"},
18+ {"code": "00001G", "nom": "Marquis de Jonquière", "ville": "Saguenay"},
19+ {"code": "00001H", "nom": "Le Memphis Cabaret", "ville": "Trois-Rivières"},
20+ {"code": "00001I", "nom": "Voltigeurs de Drummondville", "ville": "Drummondville"},
21+ {"code": "00001J", "nom": "Théâtre Petit Champlain", "ville": "Québec"},
22+ {"code": "00001K", "nom": "Vieux Clocher de Magog", "ville": "Magog"},
23+ {"code": "00001M", "nom": "Cataractes de Shawinigan", "ville": "Shawinigan"},
24+ {"code": "00001P", "nom": "Vieux Clocher de Waterloo", "ville": "Waterloo"},
25+ {"code": "00001Q", "nom": "Complexe Félix-Leclerc — CDAC Ville de La Tuque", "ville": "La Tuque"},
26+ {"code": "00001R", "nom": "Loisirs Longueuil", "ville": "Longueuil"},
27+ {"code": "00001T", "nom": "Centre des arts de la scène Jean-Besré", "ville": "Sherbrooke"},
28+ {"code": "00001Y", "nom": "Ville de Coteau-du-Lac", "ville": "Coteau-du-Lac"},
29+ {"code": "00001Z", "nom": "Théâtre de Rougemont", "ville": "Rougemont"}
30+ ]
31+}
modified data/sources.json +457 −402
@@ -1,403 +1,458 @@
1 { 1 {
2− "_comment": "Sorti-Ka — Registre des sources d'événements (province de Québec). Auteur : Simon-Pierre Boucher — contact@spboucher.ai", 2+ "_comment": "Sorti-Ka — Registre des sources d'événements (province de Québec). Auteur : Simon-Pierre Boucher — contact@spboucher.ai",
3− "sources": [ 3+ "sources": [
4− { 4+ {
5− "id": "sitq", 5+ "id": "sitq",
6− "name": "SIT Québec — Ministère du Tourisme", 6+ "name": "SIT Québec — Ministère du Tourisme",
7− "url": "https://www.donneesquebec.ca/recherche/dataset/sit-quebec-evenements", 7+ "url": "https://www.donneesquebec.ca/recherche/dataset/sit-quebec-evenements",
8− "type": "donnees-ouvertes", 8+ "type": "donnees-ouvertes",
9− "extraction": "API JSON (Tourinsoft, syndication publique) — dates, géoloc, thèmes, contacts (TelephonePrincipals/Courriels → description « Renseignements : … ») ; le flux ne publie ni Descriptions* ni tarifs (vérifié 2026-08)", 9+ "extraction": "API JSON (Tourinsoft, syndication publique) — dates, géoloc, thèmes, contacts (TelephonePrincipals/Courriels → description « Renseignements : … ») ; le flux ne publie ni Descriptions* ni tarifs (vérifié 2026-08)",
10− "acces_legal": "Licence Creative Commons 4.0 (Données Québec) — API officielle publiée par le Ministère du Tourisme", 10+ "acces_legal": "Licence Creative Commons 4.0 (Données Québec) — API officielle publiée par le Ministère du Tourisme",
11− "couverture": "Événements touristiques, toutes les régions du Québec", 11+ "couverture": "Événements touristiques, toutes les régions du Québec",
12− "cadence": "horaire (watcher PM2)", 12+ "cadence": "horaire (watcher PM2)",
13− "statut": "actif" 13+ "statut": "actif"
14− }, 14+ },
15− { 15+ {
16− "id": "montreal", 16+ "id": "montreal",
17− "name": "Ville de Montréal — Événements publics", 17+ "name": "Ville de Montréal — Événements publics",
18− "url": "https://donnees.montreal.ca/dataset/evenements-publics", 18+ "url": "https://donnees.montreal.ca/dataset/evenements-publics",
19− "type": "donnees-ouvertes", 19+ "type": "donnees-ouvertes",
20− "extraction": "API CKAN datastore_search (JSON, paginée) — venue = emplacement (si vrai nom de lieu) ou titre_adresse ; address = adresse_principale + adresse_secondaire ; le jeu de données ne publie pas l'heure → heure locale captée dans le JSON-LD des fiches montreal.ca (« startDate »:\"…T19:30:00-04:00\") lors de l'enrichissement og:image incrémental (cache, plafond MTL_IMG_MAX/sync)", 20+ "extraction": "API CKAN datastore_search (JSON, paginée) — venue = emplacement (si vrai nom de lieu) ou titre_adresse ; address = adresse_principale + adresse_secondaire ; le jeu de données ne publie pas l'heure → heure locale captée dans le JSON-LD des fiches montreal.ca (« startDate »:\"…T19:30:00-04:00\") lors de l'enrichissement og:image incrémental (cache, plafond MTL_IMG_MAX/sync)",
21− "acces_legal": "Licence CC BY 4.0 (donnees.montreal.ca) — attribution : Ville de Montréal", 21+ "acces_legal": "Licence CC BY 4.0 (donnees.montreal.ca) — attribution : Ville de Montréal",
22− "couverture": "Événements municipaux, île de Montréal", 22+ "couverture": "Événements municipaux, île de Montréal",
23− "cadence": "horaire (watcher PM2)", 23+ "cadence": "horaire (watcher PM2)",
24− "statut": "actif" 24+ "statut": "actif"
25− }, 25+ },
26− { 26+ {
27− "id": "lepointdevente", 27+ "id": "lepointdevente",
28− "name": "Le point de vente — billetterie québécoise", 28+ "name": "Le point de vente — billetterie québécoise",
29− "url": "https://lepointdevente.com/billets", 29+ "url": "https://lepointdevente.com/billets",
30− "type": "billetterie", 30+ "type": "billetterie",
31− "extraction": "pages de liste HTML rendues serveur (paginées), parse des cartes (titre, date FR + heure « 17 août 2026, 20h00 » → start_time, salle, ville, image) + fiches détail /billets/<id> incrémentales (cache data/lepointdevente_cache.json, 150 fiches/sync, re-visite 7 j) : description og:description, heure précise, tarifs JSON réels via /plugins/rates/<id> → price_min/price_label/is_free ; artistes extraits des titres par patrons sûrs seulement (« Artiste - Salle », « X en concert »)", 31+ "extraction": "pages de liste HTML rendues serveur (paginées), parse des cartes (titre, date FR + heure « 17 août 2026, 20h00 » → start_time, salle, ville, image) + fiches détail /billets/<id> incrémentales (cache data/lepointdevente_cache.json, 150 fiches/sync, re-visite 7 j) : description og:description, heure précise, tarifs JSON réels via /plugins/rates/<id> → price_min/price_label/is_free ; artistes extraits des titres par patrons sûrs seulement (« Artiste - Salle », « X en concert »)",
32− "acces_legal": "robots.txt : « User-Agent: * / Allow: * » — GET throttlés, identification honnête, lien direct vers chaque billetterie", 32+ "acces_legal": "robots.txt : « User-Agent: * / Allow: * » — GET throttlés, identification honnête, lien direct vers chaque billetterie",
33− "couverture": "Concerts, humour, théâtre, festivals — partout au Québec (~2 500 événements à venir)", 33+ "couverture": "Concerts, humour, théâtre, festivals — partout au Québec (~2 500 événements à venir)",
34− "cadence": "horaire (watcher PM2)", 34+ "cadence": "horaire (watcher PM2)",
35− "statut": "actif" 35+ "statut": "actif"
36− }, 36+ },
37− { 37+ {
38− "id": "laval", 38+ "id": "laval",
39− "name": "Ville de Laval — Calendrier des activités", 39+ "name": "Ville de Laval — Calendrier des activités",
40− "url": "https://www.donneesquebec.ca/recherche/dataset/calendrier-des-activites", 40+ "url": "https://www.donneesquebec.ca/recherche/dataset/calendrier-des-activites",
41− "type": "donnees-ouvertes", 41+ "type": "donnees-ouvertes",
42− "extraction": "fichier JSON officiel (Données Québec) — EventDate/EndDate publiés en UTC (vérifié 2026-08) → convertis en date + heure locales Québec (minuit local = « toute la journée », pas d'heure) ; détection du préfixe « ANNULÉ - » du titre → statut cancelled (Phase 2)", 42+ "extraction": "fichier JSON officiel (Données Québec) — EventDate/EndDate publiés en UTC (vérifié 2026-08) → convertis en date + heure locales Québec (minuit local = « toute la journée », pas d'heure) ; détection du préfixe « ANNULÉ - » du titre → statut cancelled (Phase 2)",
43− "acces_legal": "Licence CC 4.0 (Données Québec) — Ville de Laval", 43+ "acces_legal": "Licence CC 4.0 (Données Québec) — Ville de Laval",
44− "couverture": "Activités municipales, Laval", 44+ "couverture": "Activités municipales, Laval",
45− "cadence": "horaire (watcher PM2)", 45+ "cadence": "horaire (watcher PM2)",
46− "statut": "morte-a-la-source", 46+ "statut": "morte-a-la-source",
47− "decision": "2026-08-19 (audit Phase 1 + Phase 2) : le jeu ouvert est MORT À LA SOURCE — 293 enregistrements, EventDate max 2025-12-09, plus aucun événement futur publié depuis fin 2025 alors que le connecteur tourne sans erreur (41 runs verts). Le connecteur reste branché (archivage naturel du stock + réveil automatique si la Ville republie), mais la source ne compte plus comme active. REMPLACEMENT prévu en Phase 3 : calendrier vivant laval.ca / Tourisme Laval (voir 04-SOURCES-CANDIDATES de l'audit).", 47+ "decision": "2026-08-19 (audit Phase 1 + Phase 2) : le jeu ouvert est MORT À LA SOURCE — 293 enregistrements, EventDate max 2025-12-09, plus aucun événement futur publié depuis fin 2025 alors que le connecteur tourne sans erreur (41 runs verts). Le connecteur reste branché (archivage naturel du stock + réveil automatique si la Ville republie), mais la source ne compte plus comme active. REMPLACEMENT prévu en Phase 3 : calendrier vivant laval.ca / Tourisme Laval (voir 04-SOURCES-CANDIDATES de l'audit).",
48− "note": " REMPLACÉE 2026-08-19 (Phase 3) par la source « lavalweb » (calendrier vivant laval.ca)." 48+ "note": " REMPLACÉE 2026-08-19 (Phase 3) par la source « lavalweb » (calendrier vivant laval.ca)."
49− }, 49+ },
50− { 50+ {
51− "id": "sherbrooke", 51+ "id": "sherbrooke",
52− "name": "Ville de Sherbrooke — Calendrier des événements", 52+ "name": "Ville de Sherbrooke — Calendrier des événements",
53− "url": "https://www.sherbrooke.ca/fr/culture-sports-et-loisirs/calendrier-des-activites", 53+ "url": "https://www.sherbrooke.ca/fr/culture-sports-et-loisirs/calendrier-des-activites",
54− "type": "municipal", 54+ "type": "municipal",
55− "extraction": "la page rend TOUT le calendrier dans window['TRANSFER_CACHE'] (JSON embarqué, CMS Maruche) → 1 seule requête, ~270 événements (nom, périodes en UTC → date + heure locales Québec, gratuité `payant`, catégories, clientèles, images)", 55+ "extraction": "la page rend TOUT le calendrier dans window['TRANSFER_CACHE'] (JSON embarqué, CMS Maruche) → 1 seule requête, ~270 événements (nom, périodes en UTC → date + heure locales Québec, gratuité `payant`, catégories, clientèles, images)",
56− "acces_legal": "page municipale publique (référencée sur Données Québec) — GET direct, identification honnête", 56+ "acces_legal": "page municipale publique (référencée sur Données Québec) — GET direct, identification honnête",
57− "couverture": "Événements municipaux et culturels, Sherbrooke (Estrie)", 57+ "couverture": "Événements municipaux et culturels, Sherbrooke (Estrie)",
58− "cadence": "horaire (watcher PM2)", 58+ "cadence": "horaire (watcher PM2)",
59− "statut": "actif" 59+ "statut": "actif"
60− }, 60+ },
61− { 61+ {
62− "id": "longueuil", 62+ "id": "longueuil",
63− "name": "Ville de Longueuil — Événements (nouveau portail)", 63+ "name": "Ville de Longueuil — Événements (nouveau portail)",
64− "url": "https://longueuil.quebec/fr/evenements", 64+ "url": "https://longueuil.quebec/fr/evenements",
65− "type": "municipal", 65+ "type": "municipal",
66− "extraction": "page liste rendue serveur (portail Nuxt) — cartes <article class=\"event__item\"> : <time datetime> (date + heure locales, début/fin), titre, lien, extrait ; enrichissement par fiche incrémental (cache data/longueuil_cache.json, 30 fiches/sync, re-visite 30 j) : adresse civique, code postal, municipalité depuis l'état Nuxt (address_line1/postal_code/locality) ; GPS via le géocodeur central", 66+ "extraction": "page liste rendue serveur (portail Nuxt) — cartes <article class=\"event__item\"> : <time datetime> (date + heure locales, début/fin), titre, lien, extrait ; enrichissement par fiche incrémental (cache data/longueuil_cache.json, 30 fiches/sync, re-visite 30 j) : adresse civique, code postal, municipalité depuis l'état Nuxt (address_line1/postal_code/locality) ; GPS via le géocodeur central",
67− "acces_legal": "portail municipal public, rendu serveur — GET throttlés 0,8 s, identification honnête", 67+ "acces_legal": "portail municipal public, rendu serveur — GET throttlés 0,8 s, identification honnête",
68− "couverture": "Événements municipaux, Longueuil (Montérégie)", 68+ "couverture": "Événements municipaux, Longueuil (Montérégie)",
69− "cadence": "horaire (watcher PM2, incrémental)", 69+ "cadence": "horaire (watcher PM2, incrémental)",
70− "statut": "actif", 70+ "statut": "actif",
71− "note": "Remplace le jeu Données Québec « evenements » périmé (dernière date 2017-03, vérifié 2026-08-17) par le portail vivant longueuil.quebec." 71+ "note": "Remplace le jeu Données Québec « evenements » périmé (dernière date 2017-03, vérifié 2026-08-17) par le portail vivant longueuil.quebec."
72− }, 72+ },
73− { 73+ {
74− "id": "eventbrite", 74+ "id": "eventbrite",
75− "name": "Eventbrite — billetterie libre-service (Québec)", 75+ "name": "Eventbrite — billetterie libre-service (Québec)",
76− "url": "https://www.eventbrite.ca/d/canada--montreal/all-events/", 76+ "url": "https://www.eventbrite.ca/d/canada--montreal/all-events/",
77− "type": "billetterie", 77+ "type": "billetterie",
78− "extraction": "pages de découverte publiques /d/<lieu>/all-events/?page=N (7 lieux QC pondérés : Montréal, Québec, Laval, Gatineau, Sherbrooke, Longueuil, Trois-Rivières) — window.__SERVER_DATA__ livre 20 résultats/page : nom, résumé, date + heure locales, salle géocodée (lat/lng, adresse, code postal), image, catégories (tags Eventbrite*), URL ; prix par fiche détail /e/<slug> incrémentale (JSON-LD AggregateOffer lowPrice/highPrice CAD ; cache data/eventbrite_cache.json, 150 fiches/sync, re-visite 7 j) ; en ligne exclus, filtre region=QC strict", 78+ "extraction": "pages de découverte publiques /d/<lieu>/all-events/?page=N (7 lieux QC pondérés : Montréal, Québec, Laval, Gatineau, Sherbrooke, Longueuil, Trois-Rivières) — window.__SERVER_DATA__ livre 20 résultats/page : nom, résumé, date + heure locales, salle géocodée (lat/lng, adresse, code postal), image, catégories (tags Eventbrite*), URL ; prix par fiche détail /e/<slug> incrémentale (JSON-LD AggregateOffer lowPrice/highPrice CAD ; cache data/eventbrite_cache.json, 150 fiches/sync, re-visite 7 j) ; en ligne exclus, filtre region=QC strict",
79− "acces_legal": "robots.txt « User-agent: * » n'interdit ni /d/ ni /e/ (seuls /directory/, checkout et endpoints privés) — GET throttlés 0,8 s, identification honnête, lien direct vers chaque fiche", 79+ "acces_legal": "robots.txt « User-agent: * » n'interdit ni /d/ ni /e/ (seuls /directory/, checkout et endpoints privés) — GET throttlés 0,8 s, identification honnête, lien direct vers chaque fiche",
80− "couverture": "Événements communautaires, ateliers, festivals, affaires — grandes villes du Québec", 80+ "couverture": "Événements communautaires, ateliers, festivals, affaires — grandes villes du Québec",
81− "cadence": "horaire (watcher PM2, incrémental)", 81+ "cadence": "horaire (watcher PM2, incrémental)",
82− "statut": "actif" 82+ "statut": "actif"
83− }, 83+ },
84− { 84+ {
85− "id": "cantonsdelest", 85+ "id": "cantonsdelest",
86− "name": "Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie)", 86+ "name": "Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie)",
87− "url": "https://www.cantonsdelest.com/evenements", 87+ "url": "https://www.cantonsdelest.com/evenements",
88− "type": "tourisme-regional", 88+ "type": "tourisme-regional",
89− "extraction": "page liste rendue serveur (~25 fiches à venir) puis fiches détail incrémentales (cache data/cantonsdelest_cache.json, 40 fiches/sync, re-visite 7 j) : JSON-LD Event complet (nom, dates, description riche, adresse civique, images Tourinsoft mto.media.tourinsoft.eu) + GPS exact (data-lat/data-lng de la carte) ; même plateforme Tourinsoft que le SIT Québec → recoupement géré par dedup_key", 89+ "extraction": "page liste rendue serveur (~25 fiches à venir) puis fiches détail incrémentales (cache data/cantonsdelest_cache.json, 40 fiches/sync, re-visite 7 j) : JSON-LD Event complet (nom, dates, description riche, adresse civique, images Tourinsoft mto.media.tourinsoft.eu) + GPS exact (data-lat/data-lng de la carte) ; même plateforme Tourinsoft que le SIT Québec → recoupement géré par dedup_key",
90− "acces_legal": "pages publiques de l'ATR, rendu serveur — GET throttlés 0,8 s, identification honnête, lien vers la fiche originale", 90+ "acces_legal": "pages publiques de l'ATR, rendu serveur — GET throttlés 0,8 s, identification honnête, lien vers la fiche originale",
91− "couverture": "Festivals, spectacles, événements — Cantons-de-l'Est (Estrie)", 91+ "couverture": "Festivals, spectacles, événements — Cantons-de-l'Est (Estrie)",
92− "cadence": "horaire (watcher PM2, incrémental)", 92+ "cadence": "horaire (watcher PM2, incrémental)",
93− "statut": "actif" 93+ "statut": "actif"
94− }, 94+ },
95− { 95+ {
96− "id": "saguenay", 96+ "id": "saguenay",
97− "name": "Ville de Saguenay — Événements culturels", 97+ "name": "Ville de Saguenay — Événements culturels",
98− "url": "https://www.donneesquebec.ca/recherche/dataset/sag_evenements-culturels", 98+ "url": "https://www.donneesquebec.ca/recherche/dataset/sag_evenements-culturels",
99− "type": "donnees-ouvertes", 99+ "type": "donnees-ouvertes",
100− "extraction": "CSV (Données Québec)", 100+ "extraction": "CSV (Données Québec)",
101− "acces_legal": "Licence CC 4.0 (Données Québec)", 101+ "acces_legal": "Licence CC 4.0 (Données Québec)",
102− "couverture": "Saguenay", 102+ "couverture": "Saguenay",
103− "cadence": "n/d", 103+ "cadence": "n/d",
104− "statut": "abandonnee", 104+ "statut": "abandonnee",
105− "note": "Jeu de données périmé — dernière date d'événement : 2022-06 (vérifié 2026-08-17). REMPLACÉE 2026-08-19 (Phase 3) par la source « saguenaysorties » (portail sorties.saguenay.ca)." 105+ "note": "Jeu de données périmé — dernière date d'événement : 2022-06 (vérifié 2026-08-17). REMPLACÉE 2026-08-19 (Phase 3) par la source « saguenaysorties » (portail sorties.saguenay.ca)."
106− }, 106+ },
107− { 107+ {
108− "id": "repentigny", 108+ "id": "repentigny",
109− "name": "Ville de Repentigny — Événements", 109+ "name": "Ville de Repentigny — Événements",
110− "url": "https://www.donneesquebec.ca/recherche/dataset/evenement-sur-le-territoire-de-la-ville", 110+ "url": "https://www.donneesquebec.ca/recherche/dataset/evenement-sur-le-territoire-de-la-ville",
111− "type": "donnees-ouvertes", 111+ "type": "donnees-ouvertes",
112− "extraction": "CSV (Données Québec)", 112+ "extraction": "CSV (Données Québec)",
113− "acces_legal": "Licence CC 4.0 (Données Québec)", 113+ "acces_legal": "Licence CC 4.0 (Données Québec)",
114− "couverture": "Repentigny (Lanaudière)", 114+ "couverture": "Repentigny (Lanaudière)",
115− "cadence": "n/d", 115+ "cadence": "n/d",
116− "statut": "abandonnee", 116+ "statut": "abandonnee",
117− "note": "Jeu de données périmé — dernière date d'événement : 2021-09 (vérifié 2026-08-17)" 117+ "note": "Jeu de données périmé — dernière date d'événement : 2021-09 (vérifié 2026-08-17)"
118− }, 118+ },
119− { 119+ {
120− "id": "evenko", 120+ "id": "evenko",
121− "name": "evenko — grands concerts et festivals", 121+ "name": "evenko — grands concerts et festivals",
122− "url": "https://evenko.ca/fr/evenements", 122+ "url": "https://evenko.ca/fr/evenements",
123− "type": "promoteur", 123+ "type": "promoteur",
124− "extraction": "API /api/search (proxy Algolia) — format percé : GET ?body=base64({params:[query,options],lang:'fr-CA'}), filters entity_type:evenko_show, ~5 requêtes/sync ; heure locale du spectacle via show_time (epoch → America/Montreal, respect de hide_show_time) ; artistes = champ headliners explicite ; gratuité : champ free (sondé null sur 100 % des hits, 2026-08) + étiquettes « gratuit » (event_tag/promotional_tag) ; aucun montant exposé par l'index", 124+ "extraction": "API /api/search (proxy Algolia) — format percé : GET ?body=base64({params:[query,options],lang:'fr-CA'}), filters entity_type:evenko_show, ~5 requêtes/sync ; heure locale du spectacle via show_time (epoch → America/Montreal, respect de hide_show_time) ; artistes = champ headliners explicite ; gratuité : champ free (sondé null sur 100 % des hits, 2026-08) + étiquettes « gratuit » (event_tag/promotional_tag) ; aucun montant exposé par l'index",
125− "acces_legal": "robots.txt : Allow /api/search* (explicite) — lien billets = URL Ticketmaster officielle", 125+ "acces_legal": "robots.txt : Allow /api/search* (explicite) — lien billets = URL Ticketmaster officielle",
126− "couverture": "Grands concerts (Centre Bell, Place Bell, MTELUS…), festivals (Osheaga, ÎleSoniq…)", 126+ "couverture": "Grands concerts (Centre Bell, Place Bell, MTELUS…), festivals (Osheaga, ÎleSoniq…)",
127− "cadence": "horaire (watcher PM2)", 127+ "cadence": "horaire (watcher PM2)",
128− "statut": "actif" 128+ "statut": "actif"
129− }, 129+ },
130− { 130+ {
131− "id": "atuvu", 131+ "id": "atuvu",
132− "name": "Atuvu.ca — calendrier culturel", 132+ "name": "Atuvu.ca — calendrier culturel",
133− "url": "https://atuvu.ca/", 133+ "url": "https://atuvu.ca/",
134− "type": "agregateur", 134+ "type": "agregateur",
135− "extraction": "Scrapfly (Cloudflare) — sitemaps lastmod + fiches .event-play (date FR + heure « 20h00 » → start_time), cache incrémental data/atuvu_cache.json, plafond 120 fiches/sync", 135+ "extraction": "Scrapfly (Cloudflare) — sitemaps lastmod + fiches .event-play (date FR + heure « 20h00 » → start_time), cache incrémental data/atuvu_cache.json, plafond 120 fiches/sync",
136− "acces_legal": "robots.txt : Allow / + sitemap public", 136+ "acces_legal": "robots.txt : Allow / + sitemap public",
137− "couverture": "Sorties culturelles, Grand Montréal", 137+ "couverture": "Sorties culturelles, Grand Montréal",
138− "cadence": "horaire (watcher PM2, incrémental)", 138+ "cadence": "horaire (watcher PM2, incrémental)",
139− "statut": "actif" 139+ "statut": "actif"
140− }, 140+ },
141− { 141+ {
142− "id": "lavitrine", 142+ "id": "lavitrine",
143− "name": "La Vitrine culturelle", 143+ "name": "La Vitrine culturelle",
144− "url": "https://www.lavitrine.com/", 144+ "url": "https://www.lavitrine.com/",
145− "type": "billetterie", 145+ "type": "billetterie",
146− "extraction": "GET directs — sitemap.xml (2 000 fiches evenement + 185 exposition) + fiches HTML (bloc event_calendar), cache incrémental, 150 fiches/sync, re-visite 7 j", 146+ "extraction": "GET directs — sitemap.xml (2 000 fiches evenement + 185 exposition) + fiches HTML (bloc event_calendar), cache incrémental, 150 fiches/sync, re-visite 7 j",
147− "acces_legal": "robots.txt : Allow / + Content-Signal search=yes, use=reference — usage index + lien vers la fiche originale", 147+ "acces_legal": "robots.txt : Allow / + Content-Signal search=yes, use=reference — usage index + lien vers la fiche originale",
148− "couverture": "Spectacles et sorties culturelles, Grand Montréal", 148+ "couverture": "Spectacles et sorties culturelles, Grand Montréal",
149− "cadence": "horaire (watcher PM2, incrémental)", 149+ "cadence": "horaire (watcher PM2, incrémental)",
150− "statut": "actif" 150+ "statut": "actif"
151− }, 151+ },
152− { 152+ {
153− "id": "brossard", 153+ "id": "brossard",
154− "name": "Ville de Brossard — Calendrier des événements", 154+ "name": "Ville de Brossard — Calendrier des événements",
155− "url": "https://brossard.ca/calendrier-des-evenements/", 155+ "url": "https://brossard.ca/calendrier-des-evenements/",
156− "type": "municipal", 156+ "type": "municipal",
157− "extraction": "API REST WordPress publique /wp-json/wp/v2/city-event (JSON paginé, ~400 fiches) + dates/heures par fiche : bannière « Cet événement aura lieu le … » (fiches ville) ou JSON-LD Event (fiches biblio.brossard.ca) — cache incrémental data/brossard_cache.json, 80 fiches/sync, re-visite 7 j ; repli : date entre parenthèses dans le titre", 157+ "extraction": "API REST WordPress publique /wp-json/wp/v2/city-event (JSON paginé, ~400 fiches) + dates/heures par fiche : bannière « Cet événement aura lieu le … » (fiches ville) ou JSON-LD Event (fiches biblio.brossard.ca) — cache incrémental data/brossard_cache.json, 80 fiches/sync, re-visite 7 j ; repli : date entre parenthèses dans le titre",
158− "acces_legal": "API REST WordPress publique (aucune authentification) — GET throttlés 0,8 s, identification honnête", 158+ "acces_legal": "API REST WordPress publique (aucune authentification) — GET throttlés 0,8 s, identification honnête",
159− "couverture": "Événements municipaux et de bibliothèque, Brossard (Montérégie)", 159+ "couverture": "Événements municipaux et de bibliothèque, Brossard (Montérégie)",
160− "cadence": "horaire (watcher PM2, incrémental)", 160+ "cadence": "horaire (watcher PM2, incrémental)",
161− "statut": "actif" 161+ "statut": "actif"
162− }, 162+ },
163− { 163+ {
164− "id": "ticketmaster", 164+ "id": "ticketmaster",
165− "name": "Ticketmaster — Discovery API (Québec)", 165+ "name": "Ticketmaster — Discovery API (Québec)",
166− "url": "https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/", 166+ "url": "https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/",
167− "type": "billetterie", 167+ "type": "billetterie",
168− "extraction": "SANS clé (mode par défaut) : scraping léger des pages découverte publiques www.ticketmaster.ca/discover/<ville>?page=N (montreal, quebec-city, gatineau) — l'état Next.js (__NEXT_DATA__, requête serveur cityEvents) livre 20 événements/page : titre, date UTC + fuseau → date/heure locales, salle géolocalisée (lat/lng), adresse, code postal, ville, URL billetterie, catégorie majeure, plan de salle (image) ; plafonds TM_MAX_EVENTS=360 / TM_PAGES_PER_CITY=8 ; Scrapfly ASP sans render_js en secours anti-bot ; aucun prix publié dans ce flux → jamais inventé. REPLI AUTOMATIQUE : si TICKETMASTER_API_KEY apparaît dans .env, bascule sur la Discovery API v2 officielle (priceRanges, attractions → artistes, images 16:9) — identifiants identiques, zéro doublon.", 168+ "extraction": "SANS clé (mode par défaut) : scraping léger des pages découverte publiques www.ticketmaster.ca/discover/<ville>?page=N (montreal, quebec-city, gatineau) — l'état Next.js (__NEXT_DATA__, requête serveur cityEvents) livre 20 événements/page : titre, date UTC + fuseau → date/heure locales, salle géolocalisée (lat/lng), adresse, code postal, ville, URL billetterie, catégorie majeure, plan de salle (image) ; plafonds TM_MAX_EVENTS=360 / TM_PAGES_PER_CITY=8 ; Scrapfly ASP sans render_js en secours anti-bot ; aucun prix publié dans ce flux → jamais inventé. REPLI AUTOMATIQUE : si TICKETMASTER_API_KEY apparaît dans .env, bascule sur la Discovery API v2 officielle (priceRanges, attractions → artistes, images 16:9) — identifiants identiques, zéro doublon.",
169− "acces_legal": "pages découverte publiques rendues serveur — robots.txt n'interdit pas /discover/ (seuls /api/ismds/*) ; GET throttlés 1 s, lien direct vers la billetterie officielle ; API officielle (clé gratuite) utilisée dès qu'une clé est fournie", 169+ "acces_legal": "pages découverte publiques rendues serveur — robots.txt n'interdit pas /discover/ (seuls /api/ismds/*) ; GET throttlés 1 s, lien direct vers la billetterie officielle ; API officielle (clé gratuite) utilisée dès qu'une clé est fournie",
170− "couverture": "Grands spectacles, sports et concerts — Montréal/Laval/Brossard, Québec, Gatineau", 170+ "couverture": "Grands spectacles, sports et concerts — Montréal/Laval/Brossard, Québec, Gatineau",
171− "cadence": "horaire (watcher PM2)", 171+ "cadence": "horaire (watcher PM2)",
172− "statut": "actif", 172+ "statut": "actif",
173− "note": "Fonctionne sans clé (scraping découverte). TICKETMASTER_API_KEY optionnelle : active le mode API riche (prix, artistes, images)." 173+ "note": "Fonctionne sans clé (scraping découverte). TICKETMASTER_API_KEY optionnelle : active le mode API riche (prix, artistes, images)."
174− }, 174+ },
175− { 175+ {
176− "id": "bandsintown", 176+ "id": "bandsintown",
177− "name": "Bandsintown — dates de concerts par artiste", 177+ "name": "Bandsintown — dates de concerts par artiste",
178− "url": "https://rest.bandsintown.com/", 178+ "url": "https://rest.bandsintown.com/",
179− "type": "agregateur", 179+ "type": "agregateur",
180− "extraction": "API publique /artists/{artiste}/events (app_id format widget « js_www.sorti-ka.com », testé accepté 2026-08 ; un app_id arbitraire simple est refusé) — pas de recherche géographique : on interroge les artistes déjà extraits de la base (evenko/lepointdevente/ticketmaster, événements à venir), plafond 100 artistes/sync avec rotation et cache data/bandsintown_cache.json (re-visite 3 j) ; on ne garde que les dates au Québec (venue.region=QC) : datetime local (date+heure), salle géolocalisée, lineup → artistes, free → gratuité, lien billets", 180+ "extraction": "API publique /artists/{artiste}/events (app_id format widget « js_www.sorti-ka.com », testé accepté 2026-08 ; un app_id arbitraire simple est refusé) — pas de recherche géographique : on interroge les artistes déjà extraits de la base (evenko/lepointdevente/ticketmaster, événements à venir), plafond 100 artistes/sync avec rotation et cache data/bandsintown_cache.json (re-visite 3 j) ; on ne garde que les dates au Québec (venue.region=QC) : datetime local (date+heure), salle géolocalisée, lineup → artistes, free → gratuité, lien billets",
181− "acces_legal": "API publique Bandsintown (app_id d'identification) — usage index + lien vers la fiche originale", 181+ "acces_legal": "API publique Bandsintown (app_id d'identification) — usage index + lien vers la fiche originale",
182− "couverture": "Concerts au Québec des artistes en tournée connus de la base", 182+ "couverture": "Concerts au Québec des artistes en tournée connus de la base",
183− "cadence": "horaire (watcher PM2, rotation d'artistes)", 183+ "cadence": "horaire (watcher PM2, rotation d'artistes)",
184− "statut": "actif" 184+ "statut": "actif"
185− }, 185+ },
186− { 186+ {
187− "id": "gatineau", 187+ "id": "gatineau",
188− "name": "Ville de Gatineau — Événements", 188+ "name": "Ville de Gatineau — Événements",
189− "url": "https://www.gatineau.ca/", 189+ "url": "https://www.gatineau.ca/",
190− "type": "municipal", 190+ "type": "municipal",
191− "extraction": "n/d", 191+ "extraction": "n/d",
192− "acces_legal": "n/d", 192+ "acces_legal": "n/d",
193− "couverture": "Gatineau (Outaouais)", 193+ "couverture": "Gatineau (Outaouais)",
194− "cadence": "n/d", 194+ "cadence": "n/d",
195− "statut": "abandonnee", 195+ "statut": "abandonnee",
196− "note": "Aucun jeu de données « événements » sur Données Québec (portail Gatineau : géomatique seulement) et site 100 % JavaScript sans API découverte (vérifié 2026-08-18)" 196+ "note": "Aucun jeu de données « événements » sur Données Québec (portail Gatineau : géomatique seulement) et site 100 % JavaScript sans API découverte (vérifié 2026-08-18)"
197− }, 197+ },
198− { 198+ {
199− "id": "trois-rivieres", 199+ "id": "trois-rivieres",
200− "name": "Ville de Trois-Rivières — Événements", 200+ "name": "Ville de Trois-Rivières — Événements",
201− "url": "https://www.v3r.net/", 201+ "url": "https://www.v3r.net/",
202− "type": "municipal", 202+ "type": "municipal",
203− "extraction": "n/d", 203+ "extraction": "n/d",
204− "acces_legal": "n/d", 204+ "acces_legal": "n/d",
205− "couverture": "Trois-Rivières (Mauricie)", 205+ "couverture": "Trois-Rivières (Mauricie)",
206− "cadence": "n/d", 206+ "cadence": "n/d",
207− "statut": "abandonnee", 207+ "statut": "abandonnee",
208− "note": "API REST WordPress verrouillée (401 rest_not_logged_in) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18)" 208+ "note": "API REST WordPress verrouillée (401 rest_not_logged_in) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18)"
209− }, 209+ },
210− { 210+ {
211− "id": "levis", 211+ "id": "levis",
212− "name": "Ville de Lévis — Calendrier", 212+ "name": "Ville de Lévis — Calendrier",
213− "url": "https://www.ville.levis.qc.ca/", 213+ "url": "https://www.ville.levis.qc.ca/",
214− "type": "municipal", 214+ "type": "municipal",
215− "extraction": "n/d", 215+ "extraction": "n/d",
216− "acces_legal": "n/d", 216+ "acces_legal": "n/d",
217− "couverture": "Lévis (Chaudière-Appalaches)", 217+ "couverture": "Lévis (Chaudière-Appalaches)",
218− "cadence": "n/d", 218+ "cadence": "n/d",
219− "statut": "abandonnee", 219+ "statut": "abandonnee",
220− "note": "Site derrière un WAF (403 sur GET identifiés) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18)" 220+ "note": "Site derrière un WAF (403 sur GET identifiés) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18)"
221− }, 221+ },
222− { 222+ {
223− "id": "terrebonne", 223+ "id": "terrebonne",
224− "name": "Ville de Terrebonne — Calendrier", 224+ "name": "Ville de Terrebonne — Calendrier",
225− "url": "https://terrebonne.ca/calendrier/", 225+ "url": "https://terrebonne.ca/calendrier/",
226− "type": "municipal", 226+ "type": "municipal",
227− "extraction": "n/d", 227+ "extraction": "n/d",
228− "acces_legal": "n/d", 228+ "acces_legal": "n/d",
229− "couverture": "Terrebonne (Lanaudière)", 229+ "couverture": "Terrebonne (Lanaudière)",
230− "cadence": "n/d", 230+ "cadence": "n/d",
231− "statut": "abandonnee", 231+ "statut": "abandonnee",
232− "note": "Cloudflare bloque tout GET non navigateur (403) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18)" 232+ "note": "Cloudflare bloque tout GET non navigateur (403) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18)"
233− }, 233+ },
234− { 234+ {
235− "id": "lavalweb", 235+ "id": "lavalweb",
236− "name": "Ville de Laval — calendrier vivant laval.ca", 236+ "name": "Ville de Laval — calendrier vivant laval.ca",
237− "url": "https://www.laval.ca/calendrier-activites/", 237+ "url": "https://www.laval.ca/calendrier-activites/",
238− "type": "municipal", 238+ "type": "municipal",
239− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = WordPress rendu serveur, pagination ?findstr[group]=events&findstr[page]=N (58 pages × ~8 cartes ≈ 460 activités à venir mesurées) ; l'API REST /wp-json/wp/v2/events (764 fiches) ne publie PAS la date de l'événement → listes SSR retenues ; volume mesuré ~460 ; couverture = activités municipales/culturelles/sportives Laval ; robots.txt lu : Disallow /wp-admin/ seulement ; effort ●●.", 239+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = WordPress rendu serveur, pagination ?findstr[group]=events&findstr[page]=N (58 pages × ~8 cartes ≈ 460 activités à venir mesurées) ; l'API REST /wp-json/wp/v2/events (764 fiches) ne publie PAS la date de l'événement → listes SSR retenues ; volume mesuré ~460 ; couverture = activités municipales/culturelles/sportives Laval ; robots.txt lu : Disallow /wp-admin/ seulement ; effort ●●.",
240− "extraction": "listes SSR paginées (cartes .event-item : date FR « 18 août 2026 | 18 h » → date + heure, titre, lieu, lien, image lazy) + fiches détail incrémentales (cache data/lavalweb_cache.json, LAVALWEB_FICHE_MAX/sync, re-visite 7 j) : og:description ; GPS via annuaire de salles + géocodeur", 240+ "extraction": "listes SSR paginées (cartes .event-item : date FR « 18 août 2026 | 18 h » → date + heure, titre, lieu, lien, image lazy) + fiches détail incrémentales (cache data/lavalweb_cache.json, LAVALWEB_FICHE_MAX/sync, re-visite 7 j) : og:description ; GPS via annuaire de salles + géocodeur",
241− "acces_legal": "robots.txt laval.ca : Disallow /wp-admin/ seulement — pages calendrier publiques, GET throttlés 0,5 s, identification honnête", 241+ "acces_legal": "robots.txt laval.ca : Disallow /wp-admin/ seulement — pages calendrier publiques, GET throttlés 0,5 s, identification honnête",
242− "couverture": "Activités municipales, Laval (remplace le jeu Données Québec mort à la source depuis 2025-12)", 242+ "couverture": "Activités municipales, Laval (remplace le jeu Données Québec mort à la source depuis 2025-12)",
243− "cadence": "horaire (watcher PM2, incrémental)", 243+ "cadence": "horaire (watcher PM2, incrémental)",
244− "statut": "actif" 244+ "statut": "actif"
245− }, 245+ },
246− { 246+ {
247− "id": "outaouais", 247+ "id": "outaouais",
248− "name": "Tourisme Outaouais — calendrier des événements (ATR)", 248+ "name": "Tourisme Outaouais — calendrier des événements (ATR)",
249− "url": "https://tourismeoutaouais.com/calendrier-des-evenements", 249+ "url": "https://tourismeoutaouais.com/calendrier-des-evenements",
250− "type": "tourisme-regional", 250+ "type": "tourisme-regional",
251− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = site Astro, la page calendrier embarque TOUT le calendrier dans les props sérialisées de l'îlot CalendrierDesEvenements (162 événements dont 25 futurs mesurés) — 1 GET/sync ; l'API GraphQL admin.tourismeoutaouais.com exige un jeton (403) ; robots.txt lu : Allow / ; effort ●.", 251+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = site Astro, la page calendrier embarque TOUT le calendrier dans les props sérialisées de l'îlot CalendrierDesEvenements (162 événements dont 25 futurs mesurés) — 1 GET/sync ; l'API GraphQL admin.tourismeoutaouais.com exige un jeton (403) ; robots.txt lu : Allow / ; effort ●.",
252− "extraction": "props JSON de l'îlot Astro (déballage [type, valeur]) : id, titre, url (interne ou site officiel), municipalité, territoire, photo CDN, startDate/endDate ISO ; ni heure ni tarif publiés → jamais inventés", 252+ "extraction": "props JSON de l'îlot Astro (déballage [type, valeur]) : id, titre, url (interne ou site officiel), municipalité, territoire, photo CDN, startDate/endDate ISO ; ni heure ni tarif publiés → jamais inventés",
253− "acces_legal": "robots.txt : User-agent: * / Allow: / — GET direct throttlé 0,8 s, identification honnête, lien vers la fiche/site officiel", 253+ "acces_legal": "robots.txt : User-agent: * / Allow: / — GET direct throttlé 0,8 s, identification honnête, lien vers la fiche/site officiel",
254− "couverture": "Festivals et événements, Outaouais (337 fiches seulement au baseline régional)", 254+ "couverture": "Festivals et événements, Outaouais (337 fiches seulement au baseline régional)",
255− "cadence": "horaire (watcher PM2)", 255+ "cadence": "horaire (watcher PM2)",
256− "statut": "actif" 256+ "statut": "actif"
257− }, 257+ },
258− { 258+ {
259− "id": "lanaudiere", 259+ "id": "lanaudiere",
260− "name": "Tourisme Lanaudière — événements (ATR)", 260+ "name": "Tourisme Lanaudière — événements (ATR)",
261− "url": "https://lanaudiere.ca/fr/evenements-lanaudiere", 261+ "url": "https://lanaudiere.ca/fr/evenements-lanaudiere",
262− "type": "tourisme-regional", 262+ "type": "tourisme-regional",
263− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = CMS Umbraco, liste SSR limitée à ~10 cartes (44 résultats annoncés, reste en JS) → passage par le SITEMAP officiel (83 URLs de fiches fr mesurées) ; fiches structurées (member-title-1-1 : titre, plage de dates FR, municipalité) + og:image Tourinsoft + og:description ; robots.txt lu : Disallow /*? (aucune URL à paramètres requêtée) + Crawl-delay 2 s (respecté : GET séquentiels 2,1 s) ; effort ●●.", 263+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = CMS Umbraco, liste SSR limitée à ~10 cartes (44 résultats annoncés, reste en JS) → passage par le SITEMAP officiel (83 URLs de fiches fr mesurées) ; fiches structurées (member-title-1-1 : titre, plage de dates FR, municipalité) + og:image Tourinsoft + og:description ; robots.txt lu : Disallow /*? (aucune URL à paramètres requêtée) + Crawl-delay 2 s (respecté : GET séquentiels 2,1 s) ; effort ●●.",
264− "extraction": "sitemap.xml (1 GET) → fiches /fr/evenements-lanaudiere/<slug>/ incrémentales (cache data/lanaudiere_cache.json, LAN_FICHE_MAX/sync, re-visite 7 j) : titre, plage de dates FR, municipalité, og:image/og:description ; médias Tourinsoft → recoupement SITQ géré par dedup_key", 264+ "extraction": "sitemap.xml (1 GET) → fiches /fr/evenements-lanaudiere/<slug>/ incrémentales (cache data/lanaudiere_cache.json, LAN_FICHE_MAX/sync, re-visite 7 j) : titre, plage de dates FR, municipalité, og:image/og:description ; médias Tourinsoft → recoupement SITQ géré par dedup_key",
265− "acces_legal": "robots.txt : Disallow /*? + Crawl-delay: 2 — respectés à la lettre (aucun paramètre d'URL, 2,1 s entre GET), identification honnête", 265+ "acces_legal": "robots.txt : Disallow /*? + Crawl-delay: 2 — respectés à la lettre (aucun paramètre d'URL, 2,1 s entre GET), identification honnête",
266− "couverture": "Festivals et événements, Lanaudière", 266+ "couverture": "Festivals et événements, Lanaudière",
267− "cadence": "horaire (watcher PM2, incrémental)", 267+ "cadence": "horaire (watcher PM2, incrémental)",
268− "statut": "actif" 268+ "statut": "actif"
269− }, 269+ },
270− { 270+ {
271− "id": "saguenaysorties", 271+ "id": "saguenaysorties",
272− "name": "Sorties Saguenay — portail événementiel de la Ville", 272+ "name": "Sorties Saguenay — portail événementiel de la Ville",
273− "url": "https://sorties.saguenay.ca/", 273+ "url": "https://sorties.saguenay.ca/",
274− "type": "municipal", 274+ "type": "municipal",
275− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = portail SSR de la Ville de Saguenay motorisé par les données La Vitrine (médias lvc-medias.lavitrine.com) ; pagination POST /ajax/plus (36 séances/lot, ~300-400 séances mesurées entre offset 0 et 500) ; détails POST /ajax/details (description + adresse) ; chaque carte = une séance horodatée (date + heure + ville + salle) ; robots.txt : non publié (page de maintenance) → volumes modestes et throttle 0,8 s ; effort ●●. Remplace le CSV Données Québec mort (2022-06).", 275+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = portail SSR de la Ville de Saguenay motorisé par les données La Vitrine (médias lvc-medias.lavitrine.com) ; pagination POST /ajax/plus (36 séances/lot, ~300-400 séances mesurées entre offset 0 et 500) ; détails POST /ajax/details (description + adresse) ; chaque carte = une séance horodatée (date + heure + ville + salle) ; robots.txt : non publié (page de maintenance) → volumes modestes et throttle 0,8 s ; effort ●●. Remplace le CSV Données Québec mort (2022-06).",
276− "extraction": "POST /ajax/plus paginé (SAG_BATCH_MAX lots) : discipline, date FR, heure, titre, « Ville, Salle », image, detail-id → une fiche PAR séance ; détails incrémentaux POST /ajax/details (cache data/saguenaysorties_cache.json, SAG_DETAIL_MAX/sync, re-visite 7 j) : description, adresse civique", 276+ "extraction": "POST /ajax/plus paginé (SAG_BATCH_MAX lots) : discipline, date FR, heure, titre, « Ville, Salle », image, detail-id → une fiche PAR séance ; détails incrémentaux POST /ajax/details (cache data/saguenaysorties_cache.json, SAG_DETAIL_MAX/sync, re-visite 7 j) : description, adresse civique",
277− "acces_legal": "portail public municipal — POST throttlés 0,8 s, identification honnête, lien fiche officielle /festivals?id=<id> ; recoupement lavitrine/lepointdevente géré par dedup_key", 277+ "acces_legal": "portail public municipal — POST throttlés 0,8 s, identification honnête, lien fiche officielle /festivals?id=<id> ; recoupement lavitrine/lepointdevente géré par dedup_key",
278− "couverture": "Spectacles, expositions, festivals — Saguenay et environs (Saguenay–Lac-Saint-Jean)", 278+ "couverture": "Spectacles, expositions, festivals — Saguenay et environs (Saguenay–Lac-Saint-Jean)",
279− "cadence": "horaire (watcher PM2, incrémental)", 279+ "cadence": "horaire (watcher PM2, incrémental)",
280− "statut": "actif" 280+ "statut": "actif"
281− }, 281+ },
282− { 282+ {
283− "id": "bassaintlaurent", 283+ "id": "bassaintlaurent",
284− "name": "Tourisme Bas-Saint-Laurent — événements (ATR)", 284+ "name": "Tourisme Bas-Saint-Laurent — événements (ATR)",
285− "url": "https://www.bassaintlaurent.ca/fr/quoi-faire/evenements/", 285+ "url": "https://www.bassaintlaurent.ca/fr/quoi-faire/evenements/",
286− "type": "tourisme-regional", 286+ "type": "tourisme-regional",
287− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = WordPress (Bedrock) rendu serveur, 27 cartes complètes sur la liste (titre, plage de dates FR, municipalité, image) ; fiches avec GPS exact embarqué + og:description ; robots.txt lu : rien d'interdit sur /fr/ ; volume mesuré 27 ; couverture = BSL (168 fiches seulement au baseline) ; effort ●.", 287+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = WordPress (Bedrock) rendu serveur, 27 cartes complètes sur la liste (titre, plage de dates FR, municipalité, image) ; fiches avec GPS exact embarqué + og:description ; robots.txt lu : rien d'interdit sur /fr/ ; volume mesuré 27 ; couverture = BSL (168 fiches seulement au baseline) ; effort ●.",
288− "extraction": "liste SSR (1 GET, cartes .card--type-event) + fiches incrémentales (cache data/bassaintlaurent_cache.json, BSL_FICHE_MAX/sync, re-visite 7 j) : og:description + GPS exact de la carte embarquée", 288+ "extraction": "liste SSR (1 GET, cartes .card--type-event) + fiches incrémentales (cache data/bassaintlaurent_cache.json, BSL_FICHE_MAX/sync, re-visite 7 j) : og:description + GPS exact de la carte embarquée",
289− "acces_legal": "pages publiques de l'ATR — GET throttlés 0,8 s, identification honnête, lien fiche originale", 289+ "acces_legal": "pages publiques de l'ATR — GET throttlés 0,8 s, identification honnête, lien fiche originale",
290− "couverture": "Festivals et événements, Bas-Saint-Laurent", 290+ "couverture": "Festivals et événements, Bas-Saint-Laurent",
291− "cadence": "horaire (watcher PM2, incrémental)", 291+ "cadence": "horaire (watcher PM2, incrémental)",
292− "statut": "actif" 292+ "statut": "actif"
293− }, 293+ },
294− { 294+ {
295− "id": "quebecanimee", 295+ "id": "quebecanimee",
296− "name": "Québec animée — Ville de Québec", 296+ "name": "Québec animée — Ville de Québec",
297− "url": "https://animee.ville.quebec.qc.ca/activites/", 297+ "url": "https://animee.ville.quebec.qc.ca/activites/",
298− "type": "municipal", 298+ "type": "municipal",
299− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = portail municipal SSR ; la liste /activites/ porte TOUT en attributs data- (date-debut/date-fin ISO, arrondissement, catégories, prix « Gratuit ») : 126 séances / 73 activités mesurées, 1 GET ; fiches pour description/lieu ; le calendrier général ville.quebec.qc.ca n'expose pas de flux structuré (vérifié) ; effort ●. Comble l'absence de source municipale/gratuite de la 2ᵉ ville (inventaire Capitale-Nationale ~100 % billetteries).", 299+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = portail municipal SSR ; la liste /activites/ porte TOUT en attributs data- (date-debut/date-fin ISO, arrondissement, catégories, prix « Gratuit ») : 126 séances / 73 activités mesurées, 1 GET ; fiches pour description/lieu ; le calendrier général ville.quebec.qc.ca n'expose pas de flux structuré (vérifié) ; effort ●. Comble l'absence de source municipale/gratuite de la 2ᵉ ville (inventaire Capitale-Nationale ~100 % billetteries).",
300− "extraction": "liste /activites/ (1 GET, attributs data-* : dates ISO, arrondissement, catégorie, prix) + fiches incrémentales (cache data/quebecanimee_cache.json, QA_FICHE_MAX/sync, re-visite 7 j) : og:description, lieu ; une carte par occurrence datée → une fiche par séance", 300+ "extraction": "liste /activites/ (1 GET, attributs data-* : dates ISO, arrondissement, catégorie, prix) + fiches incrémentales (cache data/quebecanimee_cache.json, QA_FICHE_MAX/sync, re-visite 7 j) : og:description, lieu ; une carte par occurrence datée → une fiche par séance",
301− "acces_legal": "site municipal public rendu serveur — GET throttlés 0,8 s, identification honnête, lien fiche officielle", 301+ "acces_legal": "site municipal public rendu serveur — GET throttlés 0,8 s, identification honnête, lien fiche officielle",
302− "couverture": "Activités gratuites/à faible coût, Ville de Québec (Capitale-Nationale)", 302+ "couverture": "Activités gratuites/à faible coût, Ville de Québec (Capitale-Nationale)",
303− "cadence": "horaire (watcher PM2, incrémental)", 303+ "cadence": "horaire (watcher PM2, incrémental)",
304− "statut": "actif" 304+ "statut": "actif"
305− }, 305+ },
306− { 306+ {
307− "id": "placedesarts", 307+ "id": "placedesarts",
308− "name": "Place des Arts — calendrier multi-salles", 308+ "name": "Place des Arts — calendrier multi-salles",
309− "url": "https://www.placedesarts.com/programmation", 309+ "url": "https://www.placedesarts.com/programmation",
310− "type": "salle-de-spectacle", 310+ "type": "salle-de-spectacle",
311− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = Craft CMS rendu serveur ; /programmation liste 97 spectacles (6 salles) ; chaque fiche embarque #eventbannerdata + #eventGTM (JSON : titre, salle, producteur, discipline, plage de dates) + barre latérale des représentations avec heure ET PRIX RÉELS (« 33 $ à 97,50 $ ») — 23 séances mesurées sur la fiche sonde ; robots.txt lu : Disallow /cpresources/ /vendor/ /cache/ seulement ; effort ●●. Meilleure candidate unitaire de la famille « salles » (audit §C).", 311+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = Craft CMS rendu serveur ; /programmation liste 97 spectacles (6 salles) ; chaque fiche embarque #eventbannerdata + #eventGTM (JSON : titre, salle, producteur, discipline, plage de dates) + barre latérale des représentations avec heure ET PRIX RÉELS (« 33 $ à 97,50 $ ») — 23 séances mesurées sur la fiche sonde ; robots.txt lu : Disallow /cpresources/ /vendor/ /cache/ seulement ; effort ●●. Meilleure candidate unitaire de la famille « salles » (audit §C).",
312− "extraction": "liste /programmation (1 GET) → fiches /evenement/<slug> incrémentales (cache data/placedesarts_cache.json, PDA_FICHE_MAX/sync, re-visite 7 j) : une fiche Sorti-Ka PAR représentation (date + heure + prix réels), salle précise, producteur → organisateur, discipline → catégories", 312+ "extraction": "liste /programmation (1 GET) → fiches /evenement/<slug> incrémentales (cache data/placedesarts_cache.json, PDA_FICHE_MAX/sync, re-visite 7 j) : une fiche Sorti-Ka PAR représentation (date + heure + prix réels), salle précise, producteur → organisateur, discipline → catégories",
313− "acces_legal": "robots.txt : Disallow /cpresources/ /vendor/ /cache/ seulement — GET throttlés 0,8 s, identification honnête, lien billetterie officielle ; recoupement lavitrine/evenko géré par dedup_key", 313+ "acces_legal": "robots.txt : Disallow /cpresources/ /vendor/ /cache/ seulement — GET throttlés 0,8 s, identification honnête, lien billetterie officielle ; recoupement lavitrine/evenko géré par dedup_key",
314− "couverture": "Spectacles des 6 salles de la Place des Arts, Montréal (~97 spectacles, plusieurs centaines de séances)", 314+ "couverture": "Spectacles des 6 salles de la Place des Arts, Montréal (~97 spectacles, plusieurs centaines de séances)",
315− "cadence": "horaire (watcher PM2, incrémental)", 315+ "cadence": "horaire (watcher PM2, incrémental)",
316− "statut": "actif" 316+ "statut": "actif"
317− }, 317+ },
318− { 318+ {
319− "id": "lhjmq", 319+ "id": "lhjmq",
320− "name": "LHJMQ — matchs des équipes québécoises", 320+ "name": "LHJMQ — matchs des équipes québécoises",
321− "url": "https://theqmjhl.ca/", 321+ "url": "https://theqmjhl.ca/",
322− "type": "sport", 322+ "type": "sport",
323− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = API HockeyTech « modulekit » (lscluster.hockeytech.com, JSON, clé publique de la ligue embarquée dans ses propres sites) — saison 2026-27 : 580 matchs mesurés dont ~384 à domicile dans 12 villes QC (Chicoutimi, Baie-Comeau, Rimouski, Rouyn-Noranda, Val-d'Or, Gatineau, Shawinigan, Drummondville, Victoriaville, Boisbriand, Sherbrooke, Québec) ; date + heure + aréna structurés ; 2 GET/sync ; effort ●. Fort levier d'équilibre régional (Côte-Nord, Abitibi, BSL…).", 323+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : accès constaté = API HockeyTech « modulekit » (lscluster.hockeytech.com, JSON, clé publique de la ligue embarquée dans ses propres sites) — saison 2026-27 : 580 matchs mesurés dont ~384 à domicile dans 12 villes QC (Chicoutimi, Baie-Comeau, Rimouski, Rouyn-Noranda, Val-d'Or, Gatineau, Shawinigan, Drummondville, Victoriaville, Boisbriand, Sherbrooke, Québec) ; date + heure + aréna structurés ; 2 GET/sync ; effort ●. Fort levier d'équilibre régional (Côte-Nord, Abitibi, BSL…).",
324− "extraction": "API modulekit (view=seasons puis view=schedule) : matchs à domicile au Québec seulement → titre « LHJMQ : Visiteur c. Receveur », date + heure locales, aréna, ville, statut annulé si publié ; prix non publié → jamais inventé", 324+ "extraction": "API modulekit (view=seasons puis view=schedule) : matchs à domicile au Québec seulement → titre « LHJMQ : Visiteur c. Receveur », date + heure locales, aréna, ville, statut annulé si publié ; prix non publié → jamais inventé",
325− "acces_legal": "flux JSON public qui motorise le site officiel de la ligue — usage index + lien fiche de match officielle (theqmjhl.ca/gamecentre/<id>), GET throttlés 1 s, identification honnête", 325+ "acces_legal": "flux JSON public qui motorise le site officiel de la ligue — usage index + lien fiche de match officielle (theqmjhl.ca/gamecentre/<id>), GET throttlés 1 s, identification honnête",
326− "couverture": "~384 matchs/saison à domicile au Québec, 12 villes dans 10 régions", 326+ "couverture": "~384 matchs/saison à domicile au Québec, 12 villes dans 10 régions",
327− "cadence": "horaire (watcher PM2)", 327+ "cadence": "horaire (watcher PM2)",
328− "statut": "actif" 328+ "statut": "actif"
329− }, 329+ },
330− { 330+ {
331− "id": "sallesjsonld", 331+ "id": "sallesjsonld",
332− "name": "Salles de spectacle — moteur générique JSON-LD Event", 332+ "name": "Salles de spectacle — moteur générique JSON-LD Event",
333− "url": "https://grandtheatre.qc.ca/programmation", 333+ "url": "https://grandtheatre.qc.ca/programmation",
334− "type": "salle-de-spectacle", 334+ "type": "salle-de-spectacle",
335− "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : moteur configurable (data/salles_jsonld.json, patron stores.json de fabri-ka) pour la longue traîne des salles qui publient schema.org/Event sur leurs fiches. Sondage 2026-08-19 : AVEC Event JSON-LD = Grand Théâtre de Québec (108 fiches listées), Théâtre du Trident, Théâtre Capitole (via gestev.com) ; SANS (écartées de la config, re-sonder plus tard) = Palais Montcalm, Le Diamant, Impérial Bell, MTelus/Corona/Club Soda (evenko, déjà couverts), Petit Champlain / Albert-Rousseau (plateforme JS « pages/collections ») ; robots.txt lu salle par salle avant ajout ; effort ●● (moteur) puis ● par salle.", 335+ "evaluation": "ÉVALUATION 2026-08-19 (avant connexion) : moteur configurable (data/salles_jsonld.json, patron stores.json de fabri-ka) pour la longue traîne des salles qui publient schema.org/Event sur leurs fiches. Sondage 2026-08-19 : AVEC Event JSON-LD = Grand Théâtre de Québec (108 fiches listées), Théâtre du Trident, Théâtre Capitole (via gestev.com) ; SANS (écartées de la config, re-sonder plus tard) = Palais Montcalm, Le Diamant, Impérial Bell, MTelus/Corona/Club Soda (evenko, déjà couverts), Petit Champlain / Albert-Rousseau (plateforme JS « pages/collections ») ; robots.txt lu salle par salle avant ajout ; effort ●● (moteur) puis ● par salle.",
336− "extraction": "par salle configurée : page(s) de programmation → liens de fiche (motif regex) → fiches incrémentales (cache data/sallesjsonld_cache.json, SALLES_FICHE_MAX/sync partagé, re-visite 7 j) → blocs JSON-LD @type Event (nom, dates horodatées, salle, adresse, offres → prix, statut, image) ; heure « T00:00:00 » traitée comme placeholder", 336+ "extraction": "par salle configurée : page(s) de programmation → liens de fiche (motif regex) → fiches incrémentales (cache data/sallesjsonld_cache.json, SALLES_FICHE_MAX/sync partagé, re-visite 7 j) → blocs JSON-LD @type Event (nom, dates horodatées, salle, adresse, offres → prix, statut, image) ; heure « T00:00:00 » traitée comme placeholder",
337− "acces_legal": "robots.txt vérifié PAR SALLE avant ajout à la config (consigné dans data/salles_jsonld.json) — GET throttlés 0,8 s, identification honnête, lien fiche originale", 337+ "acces_legal": "robots.txt vérifié PAR SALLE avant ajout à la config (consigné dans data/salles_jsonld.json) — GET throttlés 0,8 s, identification honnête, lien fiche originale",
338− "couverture": "Longue traîne des salles de spectacle QC (amorce : Grand Théâtre de Québec, Trident, Capitole — Capitale-Nationale)", 338+ "couverture": "Longue traîne des salles de spectacle QC (amorce : Grand Théâtre de Québec, Trident, Capitole — Capitale-Nationale)",
339− "cadence": "horaire (watcher PM2, incrémental)", 339+ "cadence": "horaire (watcher PM2, incrémental)",
340− "statut": "actif" 340+ "statut": "actif"
341− }, 341+ },
342− { 342+ {
343− "id": "mauricie", 343+ "id": "mauricie",
344− "name": "Tourisme Mauricie — événements (ATR)", 344+ "name": "Tourisme Mauricie — événements (ATR)",
345− "url": "https://tourismemauricie.com/evenements", 345+ "url": "https://tourismemauricie.com/evenements",
346− "type": "tourisme-regional", 346+ "type": "tourisme-regional",
347− "extraction": "n/d", 347+ "extraction": "n/d",
348− "acces_legal": "n/d", 348+ "acces_legal": "n/d",
349− "couverture": "Mauricie", 349+ "couverture": "Mauricie",
350− "cadence": "n/d", 350+ "cadence": "n/d",
351− "statut": "abandonnee", 351+ "statut": "abandonnee",
352− "note": "ÉCARTÉE 2026-08-19 (Phase 3) : liste /evenements rendue JS — 1 seule carte SSR par page (vérifié pages 1 et 2), cartes chargées par admin-ajax non documenté, API REST /wp-json verrouillée (401 rest_not_logged_in). À re-sonder (percer la facette admin-ajax) dans une vague ultérieure." 352+ "note": "ÉCARTÉE 2026-08-19 (Phase 3) : liste /evenements rendue JS — 1 seule carte SSR par page (vérifié pages 1 et 2), cartes chargées par admin-ajax non documenté, API REST /wp-json verrouillée (401 rest_not_logged_in). À re-sonder (percer la facette admin-ajax) dans une vague ultérieure."
353− }, 353+ },
354− { 354+ {
355− "id": "laurentides", 355+ "id": "laurentides",
356− "name": "Tourisme Laurentides — événements (ATR)", 356+ "name": "Tourisme Laurentides — événements (ATR)",
357− "url": "https://www.laurentides.com/fr/quoifaire/evenements", 357+ "url": "https://www.laurentides.com/fr/quoifaire/evenements",
358− "type": "tourisme-regional", 358+ "type": "tourisme-regional",
359− "extraction": "n/d", 359+ "extraction": "n/d",
360− "acces_legal": "n/d", 360+ "acces_legal": "n/d",
361− "couverture": "Laurentides", 361+ "couverture": "Laurentides",
362− "cadence": "n/d", 362+ "cadence": "n/d",
363− "statut": "abandonnee", 363+ "statut": "abandonnee",
364− "note": "ÉCARTÉE 2026-08-19 (Phase 3) : WAF — 403 sur GET identifié (UA honnête). Scrapfly possible mais non justifié (la région est déjà la 4ᵉ mieux couverte : 620 fiches au baseline). À re-sonder." 364+ "note": "ÉCARTÉE 2026-08-19 (Phase 3) : WAF — 403 sur GET identifié (UA honnête). Scrapfly possible mais non justifié (la région est déjà la 4ᵉ mieux couverte : 620 fiches au baseline). À re-sonder."
365− }, 365+ },
366− { 366+ {
367− "id": "gaspesie", 367+ "id": "gaspesie",
368− "name": "Tourisme Gaspésie — événements (ATR)", 368+ "name": "Tourisme Gaspésie — événements (ATR)",
369− "url": "https://www.tourisme-gaspesie.com/evenements-gaspesie.html", 369+ "url": "https://www.tourisme-gaspesie.com/fr/festival-et-evenements/",
370− "type": "tourisme-regional", 370+ "type": "tourisme-regional",
371− "extraction": "n/d", 371+ "extraction": "Scrapfly (asp, country=ca, sans render_js — HTML rendu serveur) : liste (1 crédit) + fiches incrémentales (cache, GASP_FICHE_MAX=8/sync, re-visite 14 j) — titre h1, plage de dates FR, adresse/ville/CP (bloc coordonnées), og:description/og:image. Fiches sans date écartées (festivals annuels non datés).",
372− "acces_legal": "n/d", 372+ "acces_legal": "Contenu public de l'ATR ; WAF contourné avec modération (budget ≤ 9 crédits Scrapfly/sync, consigné Phase 4), attribution + lien vers la fiche officielle",
373− "couverture": "Gaspésie–Îles-de-la-Madeleine", 373+ "couverture": "Gaspésie–Îles-de-la-Madeleine",
374− "cadence": "n/d", 374+ "cadence": "horaire (watcher PM2) — cache 14 j, ~2 fiches re-visitées/j",
375− "statut": "abandonnee", 375+ "statut": "actif",
376− "note": "ÉCARTÉE 2026-08-19 (Phase 3) : WAF — 403 sur GET identifié (UA honnête). Région faible (60 fiches au baseline) : candidate prioritaire pour une vague Scrapfly consignée (crédits) ou un partenariat. À re-sonder." 376+ "note": "RÉACTIVÉE 2026-08-21 (Phase 4) : la vague Scrapfly consignée annoncée en Phase 3. Ancienne URL /evenements-gaspesie.html morte (404) → /fr/festival-et-evenements/ (28 fiches, ~6 datées à l'amorce)."
377− }, 377+ },
378− { 378+ {
379− "id": "tuxedobillet", 379+ "id": "tuxedobillet",
380− "name": "Tuxedo Billet — billetterie Capitale-Nationale", 380+ "name": "Tuxedo Billet — billetterie québécoise multi-tenants",
381− "url": "https://www.tuxedobillet.com/", 381+ "url": "https://www.tuxedobillet.com/",
382− "type": "billetterie", 382+ "type": "billetterie",
383− "extraction": "n/d", 383+ "extraction": "Acteur Apify maison gorgeous_thistle/ka-tuxedo (Playwright, proxy résidentiel CA, code versionné dans apify/ka-tuxedo/) : les tenants <org>.tuxedobillet.com sont des SPA Angular sur Firebase (RTDB verrouillée, 401 même avec jeton anonyme) → rendu navigateur obligatoire. 1 run/TUX_TTL_HOURS (20 h), 29 tenants QC configurés dans data/tuxedo_tenants.json (ville vérifiée). Liste sans heure ni prix → jamais inventés.",
384− "acces_legal": "n/d", 384+ "acces_legal": "Billetteries publiques ; rendu navigateur modéré (1 page/tenant/run, ~1 run par jour), lien d'achat vers la fiche officielle du tenant",
385− "couverture": "Salles de Québec/Lévis (Grand Théâtre, Palais Montcalm…)", 385+ "couverture": "29 salles/diffuseurs QC : Théâtre Outremont, Le Gesù, Centre Pierre-Péladeau, FTA, FIMAV, Espace Théâtre (Mont-Laurier), L'Anglicane (Lévis), Chandler, Lac-Mégantic, Îles-de-la-Madeleine…",
386− "cadence": "n/d", 386+ "cadence": "quotidienne (TTL 20 h dans le watcher horaire)",
387− "statut": "abandonnee", 387+ "statut": "actif",
388− "note": "ÉCARTÉE 2026-08-19 (Phase 3) : site en PANNE aux sondes — www = page « failover site », apex = erreur TLS (curl 60). Le Grand Théâtre et le Capitole sont couverts via sallesjsonld en attendant. À re-sonder." 388+ "note": "RÉACTIVÉE 2026-08-21 (Phase 4) : l'apex reste vide mais les tenants vivent. Première source consommée via un acteur Apify (billetterie dure à crawler). Énumération des tenants non exhaustive — compléter via Serper/config."
389− }, 389+ },
390− { 390+ {
391− "id": "clubs-pros", 391+ "id": "clubs-pros",
392− "name": "Clubs professionnels (CF Montréal, Alouettes, Rocket, Victoire…)", 392+ "name": "Clubs professionnels (CF Montréal, Alouettes, Rocket, Victoire…)",
393− "url": "https://www.cfmontreal.com/", 393+ "url": "https://www.cfmontreal.com/",
394− "type": "sport", 394+ "type": "sport",
395− "extraction": "n/d", 395+ "extraction": "n/d",
396− "acces_legal": "n/d", 396+ "acces_legal": "n/d",
397− "couverture": "Montréal/Laval (MLS, LCF, AHL, LPHF)", 397+ "couverture": "Montréal/Laval (MLS, LCF, AHL, LPHF)",
398− "cadence": "n/d", 398+ "cadence": "n/d",
399− "statut": "abandonnee", 399+ "statut": "abandonnee",
400− "note": "ÉCARTÉE 2026-08-19 (Phase 3) : les matchs à domicile passent déjà par les billetteries connectées (evenko/ticketmaster : Canadiens 74 fiches, Remparts 31…) — des connecteurs de ligue dédiés (MLS/LCF/AHL) apporteraient surtout des doublons pour ~150 fiches nettes/an. La LHJMQ, elle, est connectée (vrai levier régional). À revisiter si un besoin statut/heure officiel apparaît." 400+ "note": "ÉCARTÉE 2026-08-19 (Phase 3) : les matchs à domicile passent déjà par les billetteries connectées (evenko/ticketmaster : Canadiens 74 fiches, Remparts 31…) — des connecteurs de ligue dédiés (MLS/LCF/AHL) apporteraient surtout des doublons pour ~150 fiches nettes/an. La LHJMQ, elle, est connectée (vrai levier régional). À revisiter si un besoin statut/heure officiel apparaît."
401− } 401+ },
402− ] 402+ {
403−} 403+ "id": "monteregie",
404+ "name": "Tourisme Montérégie — événements (ATR)",
405+ "url": "https://www.tourisme-monteregie.qc.ca/membre/categorie/quoi-faire/festivals-et-evenements/",
406+ "type": "tourisme-regional",
407+ "extraction": "API REST WordPress publique /wp-json/wp/v2/cpt_event (paginée per_page=100) — titre, description, plage de dates FR, lat/long, site web, image (gisement Tourinsoft, acf.syndic_object_id EVENMTOV… ; recoupement SITQ géré par dedup_key). Fiches détail incrémentales (MTG_FICHE_MAX=15/sync, re-visite 7 j) : JSON-LD Event → adresse civique, ville, code postal.",
408+ "acces_legal": "API REST WordPress publique (aucune auth), robots.txt sans interdiction sur /wp-json/ — GET throttlés 0,8 s, UA honnête",
409+ "couverture": "Montérégie (~78 fiches à venir, vérifié 2026-08-21)",
410+ "cadence": "horaire (watcher PM2)",
411+ "statut": "actif"
412+ },
413+ {
414+ "id": "centreduquebec",
415+ "name": "Tourisme Centre-du-Québec — événements (ATR)",
416+ "url": "https://tourismecentreduquebec.com/evenements/",
417+ "type": "tourisme-regional",
418+ "extraction": "Liste rendue serveur (1 GET) : blocs events_listing (plage de dates FR + titre + lien) ; fiches incrémentales (CDQ_FICHE_MAX=10/sync, re-visite 7 j) : bloc « Adresse », og:description, og:image. Ni ville structurée, ni heure, ni tarif → jamais inventés (région dérivée de l'ATR).",
419+ "acces_legal": "Site public de l'ATR, robots.txt sans interdiction — GET throttlés 0,8 s, UA honnête",
420+ "couverture": "Centre-du-Québec (première source de la région — 0 fiche avant connexion ; ~10 fiches)",
421+ "cadence": "horaire (watcher PM2)",
422+ "statut": "actif"
423+ },
424+ {
425+ "id": "chaudiereappalaches",
426+ "name": "Tourisme Chaudière-Appalaches — festivals et événements (ATR)",
427+ "url": "https://chaudiereappalaches.com/planifier-votre-sejour/ete-automne/festivals-et-evenements/",
428+ "type": "tourisme-regional",
429+ "extraction": "Liste rendue serveur paginée (?listpage=1..3, ~12 fiches/page) → fiches incrémentales (CHA_FICHE_MAX=12/sync, re-visite 7 j) : JSON-LD Event COMPLET (dates ISO, description, adresse, ville, CP, GPS, images) via le parseur générique ld_events (sallesjsonld).",
430+ "acces_legal": "Site public de l'ATR, robots.txt sans interdiction sur /planifier-votre-sejour/ — GET throttlés 0,8 s, UA honnête",
431+ "couverture": "Chaudière-Appalaches (~36 fiches à venir, vérifié 2026-08-21)",
432+ "cadence": "horaire (watcher PM2)",
433+ "statut": "actif"
434+ },
435+ {
436+ "id": "ticketacces",
437+ "name": "TicketAcces.net — billetterie régionale québécoise",
438+ "url": "https://www.ticketacces.net/fr/portail/index.cfm",
439+ "type": "billetterie",
440+ "extraction": "HTML ColdFusion (cp1252) : annuaire complet des organisations dans le portail (cartes data-nom/ville/région, filtre Québec — 12 orgs NB + 1 ON exclues) + calendrier AGRÉGÉ multi-organisations en 4 GET (catégories Spectacles/Cinéma/Sport/Autre) : 1 Event par représentation datée (titre, date+heure FR, salle, ville, image). Fiches incrémentales (TA_DETAIL_MAX=25/sync) : og:description, adresse, prix plancher.",
441+ "acces_legal": "Billetterie publique, robots.txt sans interdiction sur le portail (vérifié 2026-08-21) ; GET throttlés 1 s, UA honnête, cookie de détection ColdFusion géré par session, lien d'achat vers la fiche officielle",
442+ "couverture": "47 organisations QC — dont 14 en Abitibi-Témiscamingue (Agora des Arts, Théâtre du cuivre, culture Val-d'Or/Amos/La Sarre/Malartic, Théâtre du Rift…), Bas-Saint-Laurent (Océanic, 3L), Côte-Nord (Drakkar), Charlevoix (Domaine Forget), Nord-du-Québec (Lebel-sur-Quévillon)… ~1 300 séances (vérifié 2026-08-21)",
443+ "cadence": "horaire (watcher PM2)",
444+ "statut": "actif"
445+ },
446+ {
447+ "id": "ovation",
448+ "name": "Réseau Ovation — billetterie québécoise multi-salles",
449+ "url": "https://reseau.ovation.ca/",
450+ "type": "billetterie",
451+ "extraction": "Sous-site mobile m.ovation.ca (HTML rendu serveur, AUCUN anti-bot) : par organisation (codes base36 validés par balayage, config data/ovation_orgs.json), /fr/Search/AllEvents paginé (?pageNumber=N) → 1 eventId = 1 représentation ; fiches fragment EventDescription (≈5 Ko, OVA_FICHE_MAX=40/sync) : date pleine FR + heure, catégories, ARTISTES (liens EventsByPerformer), description, salle + adresse + ville + code postal. Prix non exposé → jamais inventé.",
452+ "acces_legal": "Billetterie publique sans auth ; GET throttlés 0,7 s, UA honnête, lien d'achat vers la fiche officielle",
453+ "couverture": "26 organisations 100 % QC : Salle Albert-Rousseau, Petit Champlain, Diffusion Saguenay, Gatineau (Odyssée, Jean-Despréz), Vieux Terrebonne, Palace de Granby, Vieux Clocher Magog/Waterloo, La Tuque, Festival Western de St-Tite, clubs LHJMQ/LNAH…",
454+ "cadence": "horaire (watcher PM2)",
455+ "statut": "actif"
456+ }
457+ ]
458+}
\ No newline at end of file
added data/tuxedo_tenants.json +33 −0
@@ -0,0 +1,33 @@
1+{
2+ "_comment": "Sorti-Ka — Tenants Tuxedo Billet (*.tuxedobillet.com) moissonnés par l'acteur Apify gorgeous_thistle/ka-tuxedo. Auteur : Simon-Pierre Boucher — contact@spboucher.ai. QUÉBEC SEULEMENT (sagouine = Nouveau-Brunswick, exclu). Découverts via Serper le 2026-08-21 (énumération non exhaustive — ajouter un tenant = un bloc ici, 0 code). Ville vérifiée avant ajout (espacetheatre = Mont-Laurier, PAS Saint-Hyacinthe). Les tenants à ville incertaine (lacaserne, legrandespace, salledesilets, arcf, billetterieacces) sont EXCLUS en attendant vérification.",
3+ "tenants": [
4+ {"domaine": "espacetheatre", "nom": "Espace Théâtre", "ville": "Mont-Laurier"},
5+ {"domaine": "theatreoutremont", "nom": "Théâtre Outremont", "ville": "Montréal"},
6+ {"domaine": "centreculturelbeloeil", "nom": "Centre culturel de Belœil", "ville": "Belœil"},
7+ {"domaine": "villedechandler", "nom": "Ville de Chandler — Sapinart", "ville": "Chandler"},
8+ {"domaine": "lacmegantic", "nom": "Ville de Lac-Mégantic", "ville": "Lac-Mégantic"},
9+ {"domaine": "spectaclesjoliette", "nom": "Spectacles Joliette", "ville": "Joliette"},
10+ {"domaine": "spectaclesnewrichmond", "nom": "Spectacles New Richmond", "ville": "New Richmond"},
11+ {"domaine": "stbruno", "nom": "Ville de Saint-Bruno-de-Montarville", "ville": "Saint-Bruno-de-Montarville"},
12+ {"domaine": "magogculture", "nom": "Magog Culture", "ville": "Magog"},
13+ {"domaine": "frontenac", "nom": "Maison de la culture Frontenac", "ville": "Montréal"},
14+ {"domaine": "auvieuxtreuil", "nom": "Au Vieux Treuil", "ville": "Les Îles-de-la-Madeleine"},
15+ {"domaine": "verdun", "nom": "Quai 5160 — Maison de la culture de Verdun", "ville": "Montréal"},
16+ {"domaine": "theatredelaville", "nom": "Théâtre de la Ville", "ville": "Longueuil"},
17+ {"domaine": "centredesarts", "nom": "Centre des arts Juliette-Lassonde", "ville": "Saint-Hyacinthe"},
18+ {"domaine": "langlicane", "nom": "L'Anglicane", "ville": "Lévis"},
19+ {"domaine": "espacelibre", "nom": "Théâtre Espace Libre", "ville": "Montréal"},
20+ {"domaine": "montrealbaroque", "nom": "Festival Montréal Baroque", "ville": "Montréal"},
21+ {"domaine": "rdppat", "nom": "Maisons de la culture RDP–PAT", "ville": "Montréal"},
22+ {"domaine": "conservatoire-montreal", "nom": "Conservatoire de musique de Montréal", "ville": "Montréal"},
23+ {"domaine": "fta", "nom": "Festival TransAmériques", "ville": "Montréal"},
24+ {"domaine": "fimav", "nom": "Festival international de musique actuelle de Victoriaville", "ville": "Victoriaville"},
25+ {"domaine": "lachine", "nom": "Maison de la culture de Lachine", "ville": "Montréal"},
26+ {"domaine": "st-laurent", "nom": "Arrondissement de Saint-Laurent — culture", "ville": "Montréal"},
27+ {"domaine": "legesu", "nom": "Le Gesù — Centre de créativité", "ville": "Montréal"},
28+ {"domaine": "centrepierrepeladeau", "nom": "Centre Pierre-Péladeau", "ville": "Montréal"},
29+ {"domaine": "latribu-lenational", "nom": "Le National (La Tribu)", "ville": "Montréal"},
30+ {"domaine": "cdn-ndg", "nom": "Maisons de la culture CDN–NDG", "ville": "Montréal"},
31+ {"domaine": "mcgillmusic", "nom": "École de musique Schulich — McGill", "ville": "Montréal"}
32+ ]
33+}
modified docs/CONFORMITE.md +10 −3
@@ -36,6 +36,13 @@
36 | **Place des Arts (`placedesarts`)** | robots.txt : Disallow /cpresources/ /vendor/ /cache/ seulement ; CGU d'achat non applicables à l'index | 2026-08-19 | Courtoisie : « Place des Arts » + lien billetterie officielle | horaire, 1 GET + 25 fiches/sync | **conforme (Phase 3)** | 36 | **Place des Arts (`placedesarts`)** | robots.txt : Disallow /cpresources/ /vendor/ /cache/ seulement ; CGU d'achat non applicables à l'index | 2026-08-19 | Courtoisie : « Place des Arts » + lien billetterie officielle | horaire, 1 GET + 25 fiches/sync | **conforme (Phase 3)** |
37 | **LHJMQ (`lhjmq`)** | flux JSON public HockeyTech qui motorise le site officiel de la ligue (clé publique de la ligue) | n/a (API) | Courtoisie : « LHJMQ » + lien fiche de match officielle | horaire, 2 GET | **conforme (Phase 3)** — à retirer sur simple demande de la ligue | 37 | **LHJMQ (`lhjmq`)** | flux JSON public HockeyTech qui motorise le site officiel de la ligue (clé publique de la ligue) | n/a (API) | Courtoisie : « LHJMQ » + lien fiche de match officielle | horaire, 2 GET | **conforme (Phase 3)** — à retirer sur simple demande de la ligue |
38 | **Salles JSON-LD (`sallesjsonld`)** | schema.org/Event publié PAR les salles pour l'indexation ; robots.txt vérifié PAR SALLE avant ajout (consigné dans data/salles_jsonld.json) | 2026-08-19 (Grand Théâtre : Allow / ; Trident : Disallow vide ; Capitole/Gestev : /cpresources/ /vendor/) | Courtoisie : nom de la salle + lien fiche | horaire, 3 GET listes + 40 fiches/sync partagées | **conforme (Phase 3)** | 38 | **Salles JSON-LD (`sallesjsonld`)** | schema.org/Event publié PAR les salles pour l'indexation ; robots.txt vérifié PAR SALLE avant ajout (consigné dans data/salles_jsonld.json) | 2026-08-19 (Grand Théâtre : Allow / ; Trident : Disallow vide ; Capitole/Gestev : /cpresources/ /vendor/) | Courtoisie : nom de la salle + lien fiche | horaire, 3 GET listes + 40 fiches/sync partagées | **conforme (Phase 3)** |
39+| **Tourisme Montérégie (`monteregie`)** | API REST WordPress publique sans auth ; robots.txt : Disallow /wp-admin/ /wp-includes/ seulement (wp-json non interdit) | 2026-08-21 | Courtoisie : « Tourisme Montérégie » | horaire, ≤ 2 GET API + 15 fiches/sync | **conforme (Phase 4)** |
40+| **Tourisme Centre-du-Québec (`centreduquebec`)** | robots.txt : User-agent * → `Content-Signal: search=yes, ai-train=no, use=reference` + Allow / (UA produit SortiKa ≠ bots IA listés) | 2026-08-21 | Courtoisie : « Tourisme Centre-du-Québec » — usage index/référence + lien fiche, conforme au Content-Signal | horaire, 1 GET + 10 fiches/sync | **conforme (Phase 4)** |
41+| **Tourisme Chaudière-Appalaches (`chaudiereappalaches`)** | robots.txt : Disallow /wp/ /r/ *.php$… (les pages publiques /planifier-votre-sejour/ ne sont pas visées) ; JSON-LD Event publié par l'ATR pour l'indexation | 2026-08-21 | Courtoisie : « Tourisme Chaudière-Appalaches » | horaire, ≤ 4 GET listes + 12 fiches/sync | **conforme (Phase 4)** |
42+| **Tourisme Gaspésie (`gaspesie`)** | WAF (403 sur GET identifié) contourné via **Scrapfly consigné** (asp, country=ca, sans render_js) — contenu public de l'ATR ; robots.txt : Disallow /umb* seulement (contenu public permis, ClaudeBot explicitement Allow) | 2026-08-21 (via Scrapfly) | Courtoisie : « Tourisme Gaspésie » | horaire, ≤ 9 crédits Scrapfly/sync, re-visite 14 j | **conforme (Phase 4)** — région faible, usage Scrapfly budgété comme annoncé Phase 3 |
43+| **TicketAcces (`ticketacces`)** | robots.txt (tous hôtes) : **Crawl-delay: 120** + Disallow /achat/ et representations/prix.cfm (jamais requêtés) | 2026-08-21 | Courtoisie : nom de l'organisation + lien d'achat officiel | passage complet toutes les 6 h (TTL) : 5 GET www espacés de 120 s + ≤ 25 fiches (≤ 1 par hôte/passage) ; réémission du cache entre passages | **conforme (Phase 4)** — Crawl-delay honoré PAR HÔTE |
44+| **Réseau Ovation (`ovation`)** | robots.txt m.ovation.ca : User-agent * → **Crawl-delay: 30** + Disallow /account/ /checkout/ /event/tickets (jamais requêtés) | 2026-08-21 | Courtoisie : nom de l'organisation + lien fiche officielle | passage complet 1×/20 h (TTL) : GET espacés de 30,5 s (hôte unique), ≤ 50 fiches/passage ; réémission du cache entre passages | **conforme (Phase 4)** — Crawl-delay honoré |
45+| **Tuxedo Billet (`tuxedobillet`)** | tenants : robots.txt `Disallow:` (vide = tout permis) ; SPA Angular/Firebase (RTDB verrouillée) → rendu navigateur via acteur Apify maison (proxy résidentiel CA) | 2026-08-21 (espacetheatre) | Courtoisie : nom de la salle + lien d'achat officiel | 1 run d'acteur / 20 h (TTL), 1 page par tenant par run | **conforme (Phase 4)** — rendu JS modéré, 29 tenants QC vérifiés |
39 46
40 ## Données transversales 47 ## Données transversales
41 48
@@ -51,12 +58,12 @@
51 |---|---|---| 58 |---|---|---|
52 | Tourisme Mauricie | liste rendue JS (1 carte SSR/page), wp-json verrouillé (401) | oui (percer la facette admin-ajax) | 59 | Tourisme Mauricie | liste rendue JS (1 carte SSR/page), wp-json verrouillé (401) | oui (percer la facette admin-ajax) |
53 | Tourisme Laurentides | WAF : 403 sur GET identifié | oui (région déjà bien couverte : 620 fiches — Scrapfly non justifié) | 60 | Tourisme Laurentides | WAF : 403 sur GET identifié | oui (région déjà bien couverte : 620 fiches — Scrapfly non justifié) |
54−| Tourisme Gaspésie | WAF : 403 sur GET identifié | oui — région faible (60 fiches), candidate Scrapfly consignée ou partenariat | 61+| Tourisme Gaspésie | ~~WAF : 403 sur GET identifié~~ **RÉACTIVÉE 2026-08-21 (Phase 4)** via Scrapfly consigné — voir Sources actives | n/a |
55−| Tuxedo Billet | site en panne aux sondes (www = « failover site », apex = erreur TLS) | oui | 62+| Tuxedo Billet | ~~site en panne aux sondes~~ **RÉACTIVÉE 2026-08-21 (Phase 4)** : les tenants vivent — acteur Apify ka-tuxedo, voir Sources actives | n/a |
56 | Clubs pros (CF MTL, Alouettes, Rocket…) | déjà couverts par evenko/ticketmaster ; ligues dédiées = surtout des doublons | si besoin de statuts officiels | 63 | Clubs pros (CF MTL, Alouettes, Rocket…) | déjà couverts par evenko/ticketmaster ; ligues dédiées = surtout des doublons | si besoin de statuts officiels |
57 | Palais Montcalm, Le Diamant, Impérial Bell | fiches SANS JSON-LD Event (sondées) | oui, après refonte de leurs sites | 64 | Palais Montcalm, Le Diamant, Impérial Bell | fiches SANS JSON-LD Event (sondées) | oui, après refonte de leurs sites |
58 | MTelus, Corona, Club Soda | salles evenko — déjà couvertes par le connecteur evenko | non (doublons garantis) | 65 | MTelus, Corona, Club Soda | salles evenko — déjà couvertes par le connecteur evenko | non (doublons garantis) |
59−| Petit Champlain, Salle Albert-Rousseau | plateforme JS (« pages/collections »), rien de SSR | oui | 66+| Petit Champlain, Salle Albert-Rousseau | ~~plateforme JS, rien de SSR~~ **COUVERTES 2026-08-21 (Phase 4)** par le connecteur Réseau Ovation (m.ovation.ca, HTML serveur) | n/a |
60 | Médias (La Presse, Le Devoir, JdQ/JdM) | éditorial non structuré + droits d'auteur | non | 67 | Médias (La Presse, Le Devoir, JdQ/JdM) | éditorial non structuré + droits d'auteur | non |
61 68
62 ## Règles d'affichage du crédit (vérifiées Phase 3) 69 ## Règles d'affichage du crédit (vérifiées Phase 3)
modified docs/connecteurs/INDEX.md +32 −27
@@ -1,8 +1,8 @@
1 # Sorti-Ka — Connecteurs de sources d'événements 1 # Sorti-Ka — Connecteurs de sources d'événements
2 2
3−> Index généré le 2026-08-19 02:34 EDT par `scripts/gen_connector_docs.py` (rejouable : `python3 scripts/gen_connector_docs.py`). Croise `data/sources.json`, l'introspection de `sortika/connectors/*.py` et la base live `data/sortika.db`. 3+> Index généré le 2026-08-21 21:47 EDT par `scripts/gen_connector_docs.py` (rejouable : `python3 scripts/gen_connector_docs.py`). Croise `data/sources.json`, l'introspection de `sortika/connectors/*.py` et la base live `data/sortika.db`.
4 4
5−**34 sources au registre** — 23 actives/prêtes, 11 abandonnées · **22105 événements en base** (dont 15449 actifs). 5+**39 sources au registre** — 30 actives/prêtes, 9 abandonnées · **24986 événements en base** (dont 17695 actifs).
6 6
7 ⚠️ **Attributions requises** : Ville de Montréal (CC BY 4.0) ; SIT Québec / Ministère du Tourisme et Ville de Laval (CC 4.0 — Données Québec). Détails dans chaque fiche, section « Licence / attribution ». 7 ⚠️ **Attributions requises** : Ville de Montréal (CC BY 4.0) ; SIT Québec / Ministère du Tourisme et Ville de Laval (CC 4.0 — Données Québec). Détails dans chaque fiche, section « Licence / attribution ».
8 8
@@ -10,29 +10,36 @@
10 10
11 | Source | Type | Statut | Actifs | GPS | Prix | Heure | Artistes | Image | Salle | Dernier sync | 11 | Source | Type | Statut | Actifs | GPS | Prix | Heure | Artistes | Image | Salle | Dernier sync |
12 |---|---|---|---|---|---|---|---|---|---|---| 12 |---|---|---|---|---|---|---|---|---|---|---|
13−| [SIT Québec — Ministère du Tourisme](sitq.md) | donnees-ouvertes | actif | 1013 | 97 % | 0 % | 0 % | 0 % | 0 % | 0 % | 63 % | 73 % | 2026-08-19 02:27 | 13+| [SIT Québec — Ministère du Tourisme](sitq.md) | donnees-ouvertes | actif | 1020 | 97 % | 0 % | 0 % | 0 % | 0 % | 0 % | 63 % | 74 % | 2026-08-21 20:55 |
14−| [Ville de Montréal — Événements publics](montreal.md) | donnees-ouvertes | actif | 3291 | 99 % | 100 % | 100 % | 18 % | 0 % | 0 % | 100 % | 5 % | 2026-08-19 01:33 | 14+| [Ville de Montréal — Événements publics](montreal.md) | donnees-ouvertes | actif | 3567 | 99 % | 100 % | 99 % | 99 % | 0 % | 0 % | 100 % | 4 % | 2026-08-21 20:55 |
15−| [Le point de vente — billetterie québécoise](lepointdevente.md) | billetterie | actif | 1786 | 31 % | 92 % | 94 % | 0 % | 0 % | 1 % | 100 % | 99 % | 2026-08-19 01:32 | 15+| [Le point de vente — billetterie québécoise](lepointdevente.md) | billetterie | actif | 1789 | 30 % | 93 % | 94 % | 0 % | 0 % | 1 % | 100 % | 99 % | 2026-08-21 20:54 |
16−| [Ville de Laval — Calendrier des activités](laval.md) | donnees-ouvertes | morte-a-la-source | 1 | 0 % | 0 % | 100 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-19 01:31 | 16+| [Ville de Laval — Calendrier des activités](laval.md) | donnees-ouvertes | morte-a-la-source | 1 | 0 % | 0 % | 100 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 20:50 |
17−| [Ville de Sherbrooke — Calendrier des événements](sherbrooke.md) | municipal | actif | 116 | 0 % | 100 % | 87 % | 92 % | 0 % | 0 % | 99 % | 0 % | 2026-08-19 01:33 | 17+| [Ville de Sherbrooke — Calendrier des événements](sherbrooke.md) | municipal | actif | 114 | 0 % | 100 % | 86 % | 92 % | 0 % | 0 % | 99 % | 0 % | 2026-08-21 20:55 |
18−| [Ville de Longueuil — Événements (nouveau portail)](longueuil.md) | municipal | actif | 4 | 75 % | 0 % | 100 % | 50 % | 0 % | 0 % | 100 % | 0 % | 2026-08-19 01:32 | 18+| [Ville de Longueuil — Événements (nouveau portail)](longueuil.md) | municipal | actif | 4 | 75 % | 0 % | 100 % | 50 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 20:54 |
19−| [Eventbrite — billetterie libre-service (Québec)](eventbrite.md) | billetterie | actif | 430 | 100 % | 87 % | 100 % | 100 % | 0 % | 0 % | 98 % | 100 % | 2026-08-19 01:31 | 19+| [Eventbrite — billetterie libre-service (Québec)](eventbrite.md) | billetterie | actif | 438 | 100 % | 89 % | 100 % | 100 % | 0 % | 0 % | 98 % | 100 % | 2026-08-21 20:50 |
20−| [Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie)](cantonsdelest.md) | tourisme-regional | actif | 11 | 91 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-19 01:30 | 20+| [Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie)](cantonsdelest.md) | tourisme-regional | actif | 11 | 91 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 20:49 |
21−| [evenko — grands concerts et festivals](evenko.md) | promoteur | actif | 421 | 97 % | 0 % | 99 % | 0 % | 0 % | 99 % | 100 % | 100 % | 2026-08-19 01:30 | 21+| [evenko — grands concerts et festivals](evenko.md) | promoteur | actif | 417 | 97 % | 0 % | 99 % | 0 % | 1 % | 99 % | 100 % | 100 % | 2026-08-21 20:49 |
22−| [Atuvu.ca — calendrier culturel](atuvu.md) | agregateur | actif | 152 | 70 % | 38 % | 9 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-19 02:33 | 22+| [Atuvu.ca — calendrier culturel](atuvu.md) | agregateur | actif | 224 | 82 % | 25 % | 46 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-21 20:49 |
23−| [La Vitrine culturelle](lavitrine.md) | billetterie | actif | 5086 | 69 % | 0 % | 71 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-19 01:31 | 23+| [La Vitrine culturelle](lavitrine.md) | billetterie | actif | 5069 | 69 % | 0 % | 100 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-21 20:53 |
24−| [Ville de Brossard — Calendrier des événements](brossard.md) | municipal | actif | 150 | 94 % | 0 % | 96 % | 0 % | 0 % | 0 % | 100 % | 94 % | 2026-08-19 01:30 | 24+| [Ville de Brossard — Calendrier des événements](brossard.md) | municipal | actif | 147 | 95 % | 0 % | 96 % | 0 % | 0 % | 0 % | 100 % | 95 % | 2026-08-21 20:49 |
25−| [Ticketmaster — Discovery API (Québec)](ticketmaster.md) | billetterie | actif | 357 | 100 % | 0 % | 96 % | 0 % | 4 % | 0 % | 91 % | 100 % | 2026-08-19 01:33 | 25+| [Ticketmaster — Discovery API (Québec)](ticketmaster.md) | billetterie | actif | 360 | 100 % | 0 % | 96 % | 0 % | 4 % | 0 % | 90 % | 100 % | 2026-08-21 20:56 |
26−| [Bandsintown — dates de concerts par artiste](bandsintown.md) | agregateur | actif | 452 | 100 % | 1 % | 100 % | 0 % | 0 % | 100 % | 9 % | 100 % | 2026-08-19 01:29 | 26+| [Bandsintown — dates de concerts par artiste](bandsintown.md) | agregateur | actif | 521 | 100 % | 1 % | 100 % | 0 % | 0 % | 100 % | 9 % | 100 % | 2026-08-21 20:49 |
27−| [Ville de Laval — calendrier vivant laval.ca](lavalweb.md) | municipal | actif | 470 | 74 % | 0 % | 98 % | 0 % | 0 % | 0 % | 0 % | 100 % | 2026-08-19 02:14 | 27+| [Ville de Laval — calendrier vivant laval.ca](lavalweb.md) | municipal | actif | 462 | 75 % | 0 % | 98 % | 0 % | 0 % | 0 % | 0 % | 100 % | 2026-08-21 20:53 |
28−| [Tourisme Outaouais — calendrier des événements (ATR)](outaouais.md) | tourisme-regional | actif | 27 | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 96 % | 0 % | 2026-08-19 02:19 | 28+| [Tourisme Outaouais — calendrier des événements (ATR)](outaouais.md) | tourisme-regional | actif | 24 | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 20:55 |
29−| [Tourisme Lanaudière — événements (ATR)](lanaudiere.md) | tourisme-regional | actif | 44 | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 95 % | 0 % | 2026-08-19 02:19 | 29+| [Tourisme Lanaudière — événements (ATR)](lanaudiere.md) | tourisme-regional | actif | 44 | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 93 % | 0 % | 2026-08-21 20:50 |
30−| [Sorties Saguenay — portail événementiel de la Ville](saguenaysorties.md) | municipal | actif | 445 | 33 % | 0 % | 100 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-19 02:19 | 30+| [Sorties Saguenay — portail événementiel de la Ville](saguenaysorties.md) | municipal | actif | 437 | 80 % | 0 % | 100 % | 0 % | 0 % | 0 % | 100 % | 86 % | 2026-08-21 20:55 |
31−| [Tourisme Bas-Saint-Laurent — événements (ATR)](bassaintlaurent.md) | tourisme-regional | actif | 20 | 100 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-19 02:10 | 31+| [Tourisme Bas-Saint-Laurent — événements (ATR)](bassaintlaurent.md) | tourisme-regional | actif | 20 | 100 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 20:49 |
32−| [Québec animée — Ville de Québec](quebecanimee.md) | municipal | actif | 126 | 54 % | 100 % | 0 % | 0 % | 0 % | 0 % | 100 % | 54 % | 2026-08-19 02:10 | 32+| [Québec animée — Ville de Québec](quebecanimee.md) | municipal | actif | 121 | 100 % | 100 % | 0 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-21 20:55 |
33−| [Place des Arts — calendrier multi-salles](placedesarts.md) | salle-de-spectacle | actif | 350 | 94 % | 72 % | 99 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-19 02:15 | 33+| [Place des Arts — calendrier multi-salles](placedesarts.md) | salle-de-spectacle | actif | 347 | 94 % | 73 % | 100 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-21 20:55 |
34−| [LHJMQ — matchs des équipes québécoises](lhjmq.md) | sport | actif | 421 | 99 % | 0 % | 100 % | 0 % | 0 % | 0 % | 0 % | 100 % | 2026-08-19 02:10 | 34+| [LHJMQ — matchs des équipes québécoises](lhjmq.md) | sport | actif | 421 | 99 % | 0 % | 100 % | 0 % | 0 % | 0 % | 0 % | 100 % | 2026-08-21 20:54 |
35−| [Salles de spectacle — moteur générique JSON-LD Event](sallesjsonld.md) | salle-de-spectacle | actif | 276 | 100 % | 97 % | 100 % | 47 % | 1 % | 0 % | 3 % | 100 % | 2026-08-19 02:19 | 35+| [Salles de spectacle — moteur générique JSON-LD Event](sallesjsonld.md) | salle-de-spectacle | actif | 278 | 100 % | 97 % | 100 % | 47 % | 1 % | 0 % | 3 % | 100 % | 2026-08-21 20:55 |
36+| [Tourisme Gaspésie — événements (ATR)](gaspesie.md) | tourisme-regional | actif | 10 | 90 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 21:08 |
37+| [Tuxedo Billet — billetterie québécoise multi-tenants](tuxedobillet.md) | billetterie | actif | 252 | 90 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-21 21:44 |
38+| [Tourisme Montérégie — événements (ATR)](monteregie.md) | tourisme-regional | actif | 28 | 100 % | 0 % | 0 % | 0 % | 0 % | 0 % | 96 % | 0 % | 2026-08-21 21:11 |
39+| [Tourisme Centre-du-Québec — événements (ATR)](centreduquebec.md) | tourisme-regional | actif | 9 | 0 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 21:09 |
40+| [Tourisme Chaudière-Appalaches — festivals et événements (ATR)](chaudiereappalaches.md) | tourisme-regional | actif | 28 | 100 % | 0 % | 0 % | 0 % | 0 % | 0 % | 100 % | 0 % | 2026-08-21 21:09 |
41+| [TicketAcces.net — billetterie régionale québécoise](ticketacces.md) | billetterie | actif | 1320 | 73 % | 6 % | 100 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-21 21:40 |
42+| [Réseau Ovation — billetterie québécoise multi-salles](ovation.md) | billetterie | actif | 212 | 100 % | 0 % | 100 % | 0 % | 0 % | 94 % | 100 % | 100 % | 2026-08-21 21:46 |
36 43
37 ## Sources abandonnées 44 ## Sources abandonnées
38 45
@@ -46,8 +53,6 @@
46 | [Ville de Terrebonne — Calendrier](terrebonne.md) | municipal | Cloudflare bloque tout GET non navigateur (403) et aucun jeu « événements » sur Données Québec (… | 53 | [Ville de Terrebonne — Calendrier](terrebonne.md) | municipal | Cloudflare bloque tout GET non navigateur (403) et aucun jeu « événements » sur Données Québec (… |
47 | [Tourisme Mauricie — événements (ATR)](mauricie.md) | tourisme-regional | ÉCARTÉE 2026-08-19 (Phase 3) : liste /evenements rendue JS — 1 seule carte SSR par page (vérifié… | 54 | [Tourisme Mauricie — événements (ATR)](mauricie.md) | tourisme-regional | ÉCARTÉE 2026-08-19 (Phase 3) : liste /evenements rendue JS — 1 seule carte SSR par page (vérifié… |
48 | [Tourisme Laurentides — événements (ATR)](laurentides.md) | tourisme-regional | ÉCARTÉE 2026-08-19 (Phase 3) : WAF — 403 sur GET identifié (UA honnête). Scrapfly possible mais … | 55 | [Tourisme Laurentides — événements (ATR)](laurentides.md) | tourisme-regional | ÉCARTÉE 2026-08-19 (Phase 3) : WAF — 403 sur GET identifié (UA honnête). Scrapfly possible mais … |
49−| [Tourisme Gaspésie — événements (ATR)](gaspesie.md) | tourisme-regional | ÉCARTÉE 2026-08-19 (Phase 3) : WAF — 403 sur GET identifié (UA honnête). Région faible (60 fiche… |
50−| [Tuxedo Billet — billetterie Capitale-Nationale](tuxedobillet.md) | billetterie | ÉCARTÉE 2026-08-19 (Phase 3) : site en PANNE aux sondes — www = page « failover site », apex = e… |
51 | [Clubs professionnels (CF Montréal, Alouettes, Rocket, Victoire…)](clubs-pros.md) | sport | ÉCARTÉE 2026-08-19 (Phase 3) : les matchs à domicile passent déjà par les billetteries connectée… | 56 | [Clubs professionnels (CF Montréal, Alouettes, Rocket, Victoire…)](clubs-pros.md) | sport | ÉCARTÉE 2026-08-19 (Phase 3) : les matchs à domicile passent déjà par les billetteries connectée… |
52 57
53 ## Régénérer cette documentation 58 ## Régénérer cette documentation
modified docs/connecteurs/atuvu.md +29 −29
@@ -1,6 +1,6 @@
1 # Atuvu.ca — calendrier culturel (`atuvu`) 1 # Atuvu.ca — calendrier culturel (`atuvu`)
2 2
3−> Fiche générée le 2026-08-19 02:34 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. 3+> Fiche générée le 2026-08-21 21:47 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script.
4 4
5 **Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/atuvu.py` 5 **Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/atuvu.py`
6 6
@@ -38,30 +38,30 @@
38 38
39 ## Champs récupérés → schéma 39 ## Champs récupérés → schéma
40 40
41−Complétude mesurée sur les **152 événements actifs** de la source ; exemples tirés d'un événement réel (`atuvu:belmar-cardinal-en-spectacle-2026-08-19`). 41+Complétude mesurée sur les **224 événements actifs** de la source ; exemples tirés d'un événement réel (`atuvu:une-femme-denfer-2026-08-21`).
42 42
43 | Champ (`events.*`) | Description | Complétude | Exemple réel | 43 | Champ (`events.*`) | Description | Complétude | Exemple réel |
44 |---|---|---|---| 44 |---|---|---|---|
45−| `title` — Titre | titre de l'événement | 100 % | Belmar Cardinal | 45+| `title` — Titre | titre de l'événement | 100 % | Une femme d'enfer |
46 | `description` — Description | texte descriptif (source ou fiche détail) | 0 % | ∅ | 46 | `description` — Description | texte descriptif (source ou fiche détail) | 0 % | ∅ |
47−| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://atuvu.ca/billets-spectacle/belmar-cardinal-en-spectacle | 47+| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://atuvu.ca/billets-spectacle/une-femme-denfer |
48−| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique"] | 48+| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique", "arts-scene"] |
49−| `venue` — Salle (venue) | nom du lieu | 100 % | Le Rendez-vous du thé | 49+| `venue` — Salle (venue) | nom du lieu | 100 % | La Comédie de Montréal |
50 | `address` — Adresse | adresse civique | 0 % | ∅ | 50 | `address` — Adresse | adresse civique | 0 % | ∅ |
51−| `city` — Ville | municipalité | 97 % | Montréal | 51+| `city` — Ville | municipalité | 98 % | Montréal |
52−| `region` — Région | région administrative | 94 % | Montréal | 52+| `region` — Région | région administrative | 96 % | Montréal |
53−| `lat` — GPS (lat/lng) | coordonnées géographiques | 70 % | 45.5602793, -73.6576904 | 53+| `lat` — GPS (lat/lng) | coordonnées géographiques | 82 % | 45.518607, -73.558419 |
54−| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-19 | 54+| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-21 |
55−| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-19 | 55+| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-21 |
56−| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 9 % | 18:00 | 56+| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 46 % | 20:00 |
57 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ | 57 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
58 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ | 58 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ |
59−| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 28 % | ∅ | 59+| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 19 % | 0 |
60−| `price_min` — Prix min | tarif minimal réel ($) | 38 % | 0.0 | 60+| `price_min` — Prix min | tarif minimal réel ($) | 25 % | 35.0 |
61−| `price_label` — Libellé prix | étiquette tarifaire affichable | 28 % | ∅ | 61+| `price_label` — Libellé prix | étiquette tarifaire affichable | 19 % | 35.00 $ (prix régulier atuvu.ca) |
62 | `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | 62 | `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] |
63 | `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ | 63 | `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ |
64−| `image` — Image | visuel (og:image ou média source) | 100 % | https://atuvu.ca/uploads/images/2024/07/belmar-cardinal-en-spectacle.jpg | 64+| `image` — Image | visuel (og:image ou média source) | 100 % | https://atuvu.ca/uploads/images/2026/06/femme-denfer.jpg |
65 | `website` — Site web | site officiel de l'événement | 0 % | ∅ | 65 | `website` — Site web | site officiel de l'événement | 0 % | ∅ |
66 66
67 ## Fréquence & budgets 67 ## Fréquence & budgets
@@ -76,19 +76,19 @@ Complétude mesurée sur les **152 événements actifs** de la source ; exemples
76 76
77 ## Volumétrie & complétude live 77 ## Volumétrie & complétude live
78 78
79−*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)* 79+*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
80− 80+
81−- **Événements en base** : 162 (dont **152 actifs**) 81+- **Événements en base** : 249 (dont **224 actifs**)
82−- **GPS** : 106/152 actifs (70 %) 82+- **GPS** : 183/224 actifs (82 %)
83−- **Prix** : 57/152 actifs (38 %) 83+- **Prix** : 55/224 actifs (25 %)
84−- **Heure (start_time)** : 14/152 actifs (9 %) 84+- **Heure (start_time)** : 103/224 actifs (46 %)
85−- **Heure de fin** : 0/152 actifs (0 %) 85+- **Heure de fin** : 0/224 actifs (0 %)
86−- **Statut (annulé/reporté/complet)** : 0/152 actifs (0 %) 86+- **Statut (annulé/reporté/complet)** : 0/224 actifs (0 %)
87−- **Artistes** : 0/152 actifs (0 %) 87+- **Artistes** : 0/224 actifs (0 %)
88−- **Image** : 152/152 actifs (100 %) 88+- **Image** : 224/224 actifs (100 %)
89−- **Salle (venue)** : 152/152 actifs (100 %) 89+- **Salle (venue)** : 224/224 actifs (100 %)
90−- **Dernier sync** : 2026-08-19 02:33 — fetched 170, +0 ajoutés, ~2 mis à jour, -0 retirés 90+- **Dernier sync** : 2026-08-21 20:49 — fetched 253, +0 ajoutés, ~2 mis à jour, -0 retirés
91−- **Syncs enregistrés** (sync_log) : 39 91+- **Syncs enregistrés** (sync_log) : 98
92 92
93 ## Erreurs & dépannage 93 ## Erreurs & dépannage
94 94
modified docs/connecteurs/bandsintown.md +28 −28
@@ -1,6 +1,6 @@
1 # Bandsintown — dates de concerts par artiste (`bandsintown`) 1 # Bandsintown — dates de concerts par artiste (`bandsintown`)
2 2
3−> Fiche générée le 2026-08-19 02:34 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. 3+> Fiche générée le 2026-08-21 21:47 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script.
4 4
5 **Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/bandsintown.py` 5 **Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/bandsintown.py`
6 6
@@ -43,30 +43,30 @@
43 43
44 ## Champs récupérés → schéma 44 ## Champs récupérés → schéma
45 45
46−Complétude mesurée sur les **452 événements actifs** de la source ; exemples tirés d'un événement réel (`bandsintown:108747079`). 46+Complétude mesurée sur les **521 événements actifs** de la source ; exemples tirés d'un événement réel (`bandsintown:108801594`).
47 47
48 | Champ (`events.*`) | Description | Complétude | Exemple réel | 48 | Champ (`events.*`) | Description | Complétude | Exemple réel |
49 |---|---|---|---| 49 |---|---|---|---|
50−| `title` — Titre | titre de l'événement | 100 % | Doug St-Louis & Dj Chuck / Ptit Gros Bison à Grenville en Fête | 50+| `title` — Titre | titre de l'événement | 100 % | St-Roch XP 2026 |
51−| `description` — Description | texte descriptif (source ou fiche détail) | 19 % | Au Parc Normand-Woodbury à Grenville. Spectacle Gratuit Ils seront en duo pour vous faire danser… | 51+| `description` — Description | texte descriptif (source ou fiche détail) | 19 % | Saturday August 29, 20262:00 PM La Place Boutique gourmande 699, rue St-Joseph Est Free Saturday… |
52−| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.bandsintown.com/e/108747079?app_id=js_www.sorti-ka.com&came_from=267&utm_medium=api&… | 52+| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.bandsintown.com/e/108801594?app_id=js_www.sorti-ka.com&came_from=267&utm_medium=api&… |
53 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique"] | 53 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique"] |
54−| `venue` — Salle (venue) | nom du lieu | 100 % | Doug St-Louis & Dj Chuck / Ptit Gros Bison à Grenville en Fête | 54+| `venue` — Salle (venue) | nom du lieu | 100 % | St-Roch XP 2026 |
55−| `address` — Adresse | adresse civique | 98 % | 21 Rue Tri Jean | 55+| `address` — Adresse | adresse civique | 99 % | 699 Rue Saint-Joseph E |
56−| `city` — Ville | municipalité | 100 % | Grenville | 56+| `city` — Ville | municipalité | 100 % | Québec |
57−| `region` — Région | région administrative | 99 % | Laurentides | 57+| `region` — Région | région administrative | 99 % | Capitale-Nationale |
58−| `lat` — GPS (lat/lng) | coordonnées géographiques | 100 % | 45.630063, -74.600568 | 58+| `lat` — GPS (lat/lng) | coordonnées géographiques | 100 % | 46.815349, -71.220885 |
59−| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-22 | 59+| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-28 |
60−| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-22 | 60+| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-28 |
61−| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 100 % | 20:30 | 61+| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 100 % | 19:00 |
62 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ | 62 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
63 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ | 63 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ |
64 | `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 1 % | 1 | 64 | `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 1 % | 1 |
65 | `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | 65 | `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ |
66 | `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | 66 | `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ |
67−| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 100 % | ["Doug St-Louis", "P'tit Gros Bison"] | 67+| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 100 % | ["Fine Food Market"] |
68 | `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ | 68 | `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ |
69−| `image` — Image | visuel (og:image ou média source) | 9 % | https://photos.bandsintown.com/large/25853181.jpeg | 69+| `image` — Image | visuel (og:image ou média source) | 9 % | https://photos.bandsintown.com/large/25970249.jpeg |
70 | `website` — Site web | site officiel de l'événement | 0 % | ∅ | 70 | `website` — Site web | site officiel de l'événement | 0 % | ∅ |
71 71
72 ## Fréquence & budgets 72 ## Fréquence & budgets
@@ -82,19 +82,19 @@ Complétude mesurée sur les **452 événements actifs** de la source ; exemples
82 82
83 ## Volumétrie & complétude live 83 ## Volumétrie & complétude live
84 84
85−*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)* 85+*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
86− 86+
87−- **Événements en base** : 454 (dont **452 actifs**) 87+- **Événements en base** : 529 (dont **521 actifs**)
88−- **GPS** : 452/452 actifs (100 %) 88+- **GPS** : 521/521 actifs (100 %)
89−- **Prix** : 4/452 actifs (1 %) 89+- **Prix** : 5/521 actifs (1 %)
90−- **Heure (start_time)** : 451/452 actifs (100 %) 90+- **Heure (start_time)** : 520/521 actifs (100 %)
91−- **Heure de fin** : 0/452 actifs (0 %) 91+- **Heure de fin** : 0/521 actifs (0 %)
92−- **Statut (annulé/reporté/complet)** : 0/452 actifs (0 %) 92+- **Statut (annulé/reporté/complet)** : 0/521 actifs (0 %)
93−- **Artistes** : 452/452 actifs (100 %) 93+- **Artistes** : 521/521 actifs (100 %)
94−- **Image** : 42/452 actifs (9 %) 94+- **Image** : 48/521 actifs (9 %)
95−- **Salle (venue)** : 452/452 actifs (100 %) 95+- **Salle (venue)** : 521/521 actifs (100 %)
96−- **Dernier sync** : 2026-08-19 01:29 — fetched 453, +82 ajoutés, ~0 mis à jour, -0 retirés 96+- **Dernier sync** : 2026-08-21 20:49 — fetched 521, +0 ajoutés, ~0 mis à jour, -0 retirés
97−- **Syncs enregistrés** (sync_log) : 24 97+- **Syncs enregistrés** (sync_log) : 83
98 98
99 ## Erreurs & dépannage 99 ## Erreurs & dépannage
100 100
modified docs/connecteurs/bassaintlaurent.md +8 −4
@@ -1,6 +1,6 @@
1 # Tourisme Bas-Saint-Laurent — événements (ATR) (`bassaintlaurent`) 1 # Tourisme Bas-Saint-Laurent — événements (ATR) (`bassaintlaurent`)
2 2
3−> Fiche générée le 2026-08-19 02:34 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. 3+> Fiche générée le 2026-08-21 21:47 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script.
4 4
5 **Statut : actif** · Type : `tourisme-regional` · Connecteur : `sortika/connectors/bassaintlaurent.py` 5 **Statut : actif** · Type : `tourisme-regional` · Connecteur : `sortika/connectors/bassaintlaurent.py`
6 6
@@ -78,7 +78,7 @@ Complétude mesurée sur les **20 événements actifs** de la source ; exemples
78 78
79 ## Volumétrie & complétude live 79 ## Volumétrie & complétude live
80 80
81−*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)* 81+*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
82 82
83 - **Événements en base** : 27 (dont **20 actifs**) 83 - **Événements en base** : 27 (dont **20 actifs**)
84 - **GPS** : 20/20 actifs (100 %) 84 - **GPS** : 20/20 actifs (100 %)
@@ -89,8 +89,8 @@ Complétude mesurée sur les **20 événements actifs** de la source ; exemples
89 - **Artistes** : 0/20 actifs (0 %) 89 - **Artistes** : 0/20 actifs (0 %)
90 - **Image** : 20/20 actifs (100 %) 90 - **Image** : 20/20 actifs (100 %)
91 - **Salle (venue)** : 0/20 actifs (0 %) 91 - **Salle (venue)** : 0/20 actifs (0 %)
92−- **Dernier sync** : 2026-08-19 02:10 — fetched 27, +27 ajoutés, ~0 mis à jour, -0 retirés 92+- **Dernier sync** : 2026-08-21 20:49 — fetched 27, +0 ajoutés, ~0 mis à jour, -0 retirés
93−- **Syncs enregistrés** (sync_log) : 1 93+- **Syncs enregistrés** (sync_log) : 60
94 94
95 ## Erreurs & dépannage 95 ## Erreurs & dépannage
96 96
@@ -107,3 +107,7 @@ Aucune erreur dans `sync_log` pour cette source. ✅
107 - **2026-08-18 — Vague 1 d'enrichissement** (commit `7d9d1b0`) : géocodage Nominatim des salles (`sortika/geocode.py`, cache disque, plafond `SORTIKA_GEOCODE_MAX`), fiches détail lepointdevente (description, heure, tarifs réels `/plugins/rates/<id>`), contacts Tourinsoft (SITQ), heure locale Montréal via JSON-LD. 107 - **2026-08-18 — Vague 1 d'enrichissement** (commit `7d9d1b0`) : géocodage Nominatim des salles (`sortika/geocode.py`, cache disque, plafond `SORTIKA_GEOCODE_MAX`), fiches détail lepointdevente (description, heure, tarifs réels `/plugins/rates/<id>`), contacts Tourinsoft (SITQ), heure locale Montréal via JSON-LD.
108 - **2026-08-18 — Vague 2 d'enrichissement** (commit `65d2d33`) : colonnes additives `events.start_time` (HH:MM locale QC) et `events.artists` (JSON) + migration auto ; heure captée partout où la source la publie (lepointdevente, evenko, Laval, Sherbrooke, Montréal, atuvu) ; artistes (headliners evenko, lineup Bandsintown, attractions Ticketmaster, patrons sûrs sur les titres) ; 3 nouveaux connecteurs (brossard, ticketmaster, bandsintown). 108 - **2026-08-18 — Vague 2 d'enrichissement** (commit `65d2d33`) : colonnes additives `events.start_time` (HH:MM locale QC) et `events.artists` (JSON) + migration auto ; heure captée partout où la source la publie (lepointdevente, evenko, Laval, Sherbrooke, Montréal, atuvu) ; artistes (headliners evenko, lineup Bandsintown, attractions Ticketmaster, patrons sûrs sur les titres) ; 3 nouveaux connecteurs (brossard, ticketmaster, bandsintown).
109 - **2026-08-19 — Phase 2 (travail de moine)** : colonnes additives `end_time`, `status` (annulé/reporté/complet) et `quarantine` (règles anti-aberrations, non publié mais réintégrable) ; règle d'ARCHIVAGE des événements terminés à chaque cycle (jamais supprimés) ; dedup_key inclut désormais l'heure (les séances multiples d'un même jour ne sont plus écrasées à l'affichage) ; alerte « 0 événement futur / chute > 80 % » par source (data/future_counts.json + /api/sources) ; heure et description La Vitrine ; end_time/organisateur/statut Eventbrite ; og:description Atuvu ; premières parties + portes + tournée evenko ; offres billets Bandsintown ; taxonomie type-event + description intégrale Brossard ; image Longueuil ; géocodage par ADRESSE CIVIQUE prioritaire ; villes normalisées au Répertoire MAMH (data/villes_canon.json) ; laval consignée « morte-a-la-source ». 109 - **2026-08-19 — Phase 2 (travail de moine)** : colonnes additives `end_time`, `status` (annulé/reporté/complet) et `quarantine` (règles anti-aberrations, non publié mais réintégrable) ; règle d'ARCHIVAGE des événements terminés à chaque cycle (jamais supprimés) ; dedup_key inclut désormais l'heure (les séances multiples d'un même jour ne sont plus écrasées à l'affichage) ; alerte « 0 événement futur / chute > 80 % » par source (data/future_counts.json + /api/sources) ; heure et description La Vitrine ; end_time/organisateur/statut Eventbrite ; og:description Atuvu ; premières parties + portes + tournée evenko ; offres billets Bandsintown ; taxonomie type-event + description intégrale Brossard ; image Longueuil ; géocodage par ADRESSE CIVIQUE prioritaire ; villes normalisées au Répertoire MAMH (data/villes_canon.json) ; laval consignée « morte-a-la-source ».
110+
111+Commits touchant `sortika/connectors/bassaintlaurent.py` :
112+
113+- `0b8a6f8` 2026-08-19 Phase 3 — 9 nouveaux connecteurs + déroulage des périodes SITQ (fiches d évaluation avant connexion)
modified docs/connecteurs/brossard.md +18 −18
@@ -1,6 +1,6 @@
1 # Ville de Brossard — Calendrier des événements (`brossard`) 1 # Ville de Brossard — Calendrier des événements (`brossard`)
2 2
3−> Fiche générée le 2026-08-19 02:34 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. 3+> Fiche générée le 2026-08-21 21:47 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script.
4 4
5 **Statut : actif** · Type : `municipal` · Connecteur : `sortika/connectors/brossard.py` 5 **Statut : actif** · Type : `municipal` · Connecteur : `sortika/connectors/brossard.py`
6 6
@@ -43,7 +43,7 @@
43 43
44 ## Champs récupérés → schéma 44 ## Champs récupérés → schéma
45 45
46−Complétude mesurée sur les **150 événements actifs** de la source ; exemples tirés d'un événement réel (`brossard:37838`). 46+Complétude mesurée sur les **147 événements actifs** de la source ; exemples tirés d'un événement réel (`brossard:37838`).
47 47
48 | Champ (`events.*`) | Description | Complétude | Exemple réel | 48 | Champ (`events.*`) | Description | Complétude | Exemple réel |
49 |---|---|---|---| 49 |---|---|---|---|
@@ -51,11 +51,11 @@ Complétude mesurée sur les **150 événements actifs** de la source ; exemples
51 | `description` — Description | texte descriptif (source ou fiche détail) | 100 % | Entrée libre. Les enfants âgés de moins de 8 ans doivent être accompagnés d’un adulte. Les enfan… | 51 | `description` — Description | texte descriptif (source ou fiche détail) | 100 % | Entrée libre. Les enfants âgés de moins de 8 ans doivent être accompagnés d’un adulte. Les enfan… |
52 | `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://brossard.ca/calendrier-evenements/atelier-jeux-de-societe-16-septembre-2026/ | 52 | `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://brossard.ca/calendrier-evenements/atelier-jeux-de-societe-16-septembre-2026/ |
53 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["famille"] | 53 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["famille"] |
54−| `venue` — Salle (venue) | nom du lieu | 94 % | Salle d'animation | 54+| `venue` — Salle (venue) | nom du lieu | 95 % | Salle d'animation |
55−| `address` — Adresse | adresse civique | 94 % | 7855, av San Francisco | 55+| `address` — Adresse | adresse civique | 95 % | 7855, av San Francisco |
56 | `city` — Ville | municipalité | 100 % | Brossard | 56 | `city` — Ville | municipalité | 100 % | Brossard |
57 | `region` — Région | région administrative | 100 % | Montérégie | 57 | `region` — Région | région administrative | 100 % | Montérégie |
58−| `lat` — GPS (lat/lng) | coordonnées géographiques | 94 % | 45.4551469, -73.4682277 | 58+| `lat` — GPS (lat/lng) | coordonnées géographiques | 95 % | 45.4551469, -73.4682277 |
59 | `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-09-16 | 59 | `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-09-16 |
60 | `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-09-16 | 60 | `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-09-16 |
61 | `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 96 % | 10:00 | 61 | `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 96 % | 10:00 |
@@ -81,19 +81,19 @@ Complétude mesurée sur les **150 événements actifs** de la source ; exemples
81 81
82 ## Volumétrie & complétude live 82 ## Volumétrie & complétude live
83 83
84−*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)* 84+*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
85− 85+
86−- **Événements en base** : 264 (dont **150 actifs**) 86+- **Événements en base** : 264 (dont **147 actifs**)
87−- **GPS** : 141/150 actifs (94 %) 87+- **GPS** : 139/147 actifs (95 %)
88−- **Prix** : 0/150 actifs (0 %) 88+- **Prix** : 0/147 actifs (0 %)
89−- **Heure (start_time)** : 144/150 actifs (96 %) 89+- **Heure (start_time)** : 141/147 actifs (96 %)
90−- **Heure de fin** : 0/150 actifs (0 %) 90+- **Heure de fin** : 0/147 actifs (0 %)
91−- **Statut (annulé/reporté/complet)** : 0/150 actifs (0 %) 91+- **Statut (annulé/reporté/complet)** : 0/147 actifs (0 %)
92−- **Artistes** : 0/150 actifs (0 %) 92+- **Artistes** : 0/147 actifs (0 %)
93−- **Image** : 150/150 actifs (100 %) 93+- **Image** : 147/147 actifs (100 %)
94−- **Salle (venue)** : 141/150 actifs (94 %) 94+- **Salle (venue)** : 139/147 actifs (95 %)
95−- **Dernier sync** : 2026-08-19 01:30 — fetched 264, +0 ajoutés, ~0 mis à jour, -0 retirés 95+- **Dernier sync** : 2026-08-21 20:49 — fetched 264, +0 ajoutés, ~0 mis à jour, -0 retirés
96−- **Syncs enregistrés** (sync_log) : 24 96+- **Syncs enregistrés** (sync_log) : 83
97 97
98 ## Erreurs & dépannage 98 ## Erreurs & dépannage
99 99
modified docs/connecteurs/cantonsdelest.md +15 −15
@@ -1,6 +1,6 @@
1 # Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie) (`cantonsdelest`) 1 # Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie) (`cantonsdelest`)
2 2
3−> Fiche générée le 2026-08-19 02:34 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. 3+> Fiche générée le 2026-08-21 21:47 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script.
4 4
5 **Statut : actif** · Type : `tourisme-regional` · Connecteur : `sortika/connectors/cantonsdelest.py` 5 **Statut : actif** · Type : `tourisme-regional` · Connecteur : `sortika/connectors/cantonsdelest.py`
6 6
@@ -41,21 +41,21 @@
41 41
42 ## Champs récupérés → schéma 42 ## Champs récupérés → schéma
43 43
44−Complétude mesurée sur les **11 événements actifs** de la source ; exemples tirés d'un événement réel (`cantonsdelest:10200-4714`). 44+Complétude mesurée sur les **11 événements actifs** de la source ; exemples tirés d'un événement réel (`cantonsdelest:7646-2584`).
45 45
46 | Champ (`events.*`) | Description | Complétude | Exemple réel | 46 | Champ (`events.*`) | Description | Complétude | Exemple réel |
47 |---|---|---|---| 47 |---|---|---|---|
48−| `title` — Titre | titre de l'événement | 100 % | Vieillir en santé | 48+| `title` — Titre | titre de l'événement | 100 % | NanoFest |
49−| `description` — Description | texte descriptif (source ou fiche détail) | 100 % | La troisième journée portera sur les différentes façons de maintenir une bonne santé lorsqu’on p… | 49+| `description` — Description | texte descriptif (source ou fiche détail) | 100 % | Le NanoFest présente de la musique, de la poésie, du conte, de la danse, du cirque et de l’art v… |
50−| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.cantonsdelest.com/evenements/10200/vieillir-en-sante/4714 | 50+| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.cantonsdelest.com/evenements/7646/nanofest/2584 |
51 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["autre"] | 51 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["autre"] |
52 | `venue` — Salle (venue) | nom du lieu | 0 % | ∅ | 52 | `venue` — Salle (venue) | nom du lieu | 0 % | ∅ |
53−| `address` — Adresse | adresse civique | 91 % | 225 Rue Frontenac | 53+| `address` — Adresse | adresse civique | 82 % | ∅ |
54−| `city` — Ville | municipalité | 100 % | Sherbrooke | 54+| `city` — Ville | municipalité | 100 % | Bury |
55 | `region` — Région | région administrative | 100 % | Estrie | 55 | `region` — Région | région administrative | 100 % | Estrie |
56−| `lat` — GPS (lat/lng) | coordonnées géographiques | 91 % | 45.403367, -71.895639 | 56+| `lat` — GPS (lat/lng) | coordonnées géographiques | 91 % | 45.510797, -71.442105 |
57−| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-19 | 57+| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-21 |
58−| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-19 | 58+| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-23 |
59 | `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 0 % | ∅ | 59 | `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
60 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ | 60 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
61 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ | 61 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ |
@@ -64,7 +64,7 @@ Complétude mesurée sur les **11 événements actifs** de la source ; exemples
64 | `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | 64 | `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ |
65 | `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | 65 | `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] |
66 | `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ | 66 | `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ |
67−| `image` — Image | visuel (og:image ou média source) | 100 % | https://lvc-medias.lavitrine.com/552bc497-70fc-5c58-840d-b83a1235a126.png | 67+| `image` — Image | visuel (og:image ou média source) | 100 % | https://mto.media.tourinsoft.eu/upload/IMG-0065.png?width=1191&height=670 |
68 | `website` — Site web | site officiel de l'événement | 0 % | ∅ | 68 | `website` — Site web | site officiel de l'événement | 0 % | ∅ |
69 69
70 ## Fréquence & budgets 70 ## Fréquence & budgets
@@ -79,9 +79,9 @@ Complétude mesurée sur les **11 événements actifs** de la source ; exemples
79 79
80 ## Volumétrie & complétude live 80 ## Volumétrie & complétude live
81 81
82−*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)* 82+*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
83 83
84−- **Événements en base** : 23 (dont **11 actifs**) 84+- **Événements en base** : 47 (dont **11 actifs**)
85 - **GPS** : 10/11 actifs (91 %) 85 - **GPS** : 10/11 actifs (91 %)
86 - **Prix** : 0/11 actifs (0 %) 86 - **Prix** : 0/11 actifs (0 %)
87 - **Heure (start_time)** : 0/11 actifs (0 %) 87 - **Heure (start_time)** : 0/11 actifs (0 %)
@@ -90,8 +90,8 @@ Complétude mesurée sur les **11 événements actifs** de la source ; exemples
90 - **Artistes** : 0/11 actifs (0 %) 90 - **Artistes** : 0/11 actifs (0 %)
91 - **Image** : 11/11 actifs (100 %) 91 - **Image** : 11/11 actifs (100 %)
92 - **Salle (venue)** : 0/11 actifs (0 %) 92 - **Salle (venue)** : 0/11 actifs (0 %)
93−- **Dernier sync** : 2026-08-19 01:30 — fetched 13, +0 ajoutés, ~0 mis à jour, -0 retirés 93+- **Dernier sync** : 2026-08-21 20:49 — fetched 13, +0 ajoutés, ~0 mis à jour, -0 retirés
94−- **Syncs enregistrés** (sync_log) : 21 94+- **Syncs enregistrés** (sync_log) : 80
95 95
96 ## Erreurs & dépannage 96 ## Erreurs & dépannage
97 97
added docs/connecteurs/centreduquebec.md +110 −0
Large diff (110 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/chaudiereappalaches.md +112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/clubs-pros.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/evenko.md +24 −24
Large diff (79 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/eventbrite.md +33 −33
Large diff (88 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/gaspesie.md +81 −13
Large diff (127 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/gatineau.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/lanaudiere.md +11 −7
Large diff (46 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/laurentides.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/laval.md +4 −4
Large diff (25 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/lavalweb.md +32 −24
Large diff (86 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/lavitrine.md +26 −26
Large diff (80 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/lepointdevente.md +19 −19
Large diff (66 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/levis.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/lhjmq.md +8 −4
Large diff (32 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/longueuil.md +4 −4
Large diff (25 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/mauricie.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/monteregie.md +112 −0
Large diff (112 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/montreal.md +27 −27
Large diff (81 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/outaouais.md +25 −21
Large diff (81 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/ovation.md +124 −0
Large diff (124 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/placedesarts.md +22 −18
Large diff (69 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/quebecanimee.md +27 −23
Large diff (83 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/repentigny.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/saguenay.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/saguenaysorties.md +30 −26
Large diff (87 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/sallesjsonld.md +30 −26
Large diff (89 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/sherbrooke.md +16 −16
Large diff (55 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/sitq.md +29 −28
Large diff (89 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/terrebonne.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
added docs/connecteurs/ticketacces.md +129 −0
Large diff (129 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/ticketmaster.md +26 −26
Large diff (80 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/trois-rivieres.md +1 −1
Large diff (7 lines) is not loaded by default to keep the page fast.Load diff
modified docs/connecteurs/tuxedobillet.md +88 −13
Large diff (134 lines) is not loaded by default to keep the page fast.Load diff
added sortika/connectors/centreduquebec.py +108 −0
Large diff (108 lines) is not loaded by default to keep the page fast.Load diff
added sortika/connectors/chaudiereappalaches.py +143 −0
Large diff (143 lines) is not loaded by default to keep the page fast.Load diff
added sortika/connectors/gaspesie.py +130 −0
Large diff (130 lines) is not loaded by default to keep the page fast.Load diff
added sortika/connectors/monteregie.py +139 −0
Large diff (139 lines) is not loaded by default to keep the page fast.Load diff
added sortika/connectors/ovation.py +189 −0
Large diff (189 lines) is not loaded by default to keep the page fast.Load diff
added sortika/connectors/ticketacces.py +234 −0
Large diff (234 lines) is not loaded by default to keep the page fast.Load diff
added sortika/connectors/tuxedobillet.py +141 −0
Large diff (141 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/centreduquebec_fiche.html +18 −0
Large diff (19 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/centreduquebec_liste.html +128 −0
Large diff (129 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/chaudiereappalaches_fiche.html +2 −0
Large diff (3 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/chaudiereappalaches_liste.html +14 −0
Large diff (15 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gaspesie_fiche.html +21 −0
Large diff (22 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gaspesie_liste.html +29 −0
Large diff (30 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/monteregie_fiche.html +33 −0
Large diff (34 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/monteregie_liste.json +83 −0
Large diff (84 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/ovation_allevents.html +37 −0
Large diff (38 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/ovation_fiche.html +157 −0
Large diff (157 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/ticketacces_calendrier.html +52 −0
Large diff (53 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/ticketacces_fiche.html +54 −0
Large diff (55 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/ticketacces_portail.html +5 −0
Large diff (6 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/tuxedobillet_items.json +29 −0
Large diff (30 lines) is not loaded by default to keep the page fast.Load diff
added tests/test_phase4.py +216 −0
Large diff (217 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme