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",
3 − "sources": [
4 − {
5 − "id": "sitq",
6 − "name": "SIT Québec — Ministère du Tourisme",
7 − "url": "https://www.donneesquebec.ca/recherche/dataset/sit-quebec-evenements",
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)",
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",
12 − "cadence": "horaire (watcher PM2)",
13 − "statut": "actif"
14 − },
15 − {
16 − "id": "montreal",
17 − "name": "Ville de Montréal — Événements publics",
18 − "url": "https://donnees.montreal.ca/dataset/evenements-publics",
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)",
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",
23 − "cadence": "horaire (watcher PM2)",
24 − "statut": "actif"
25 − },
26 − {
27 − "id": "lepointdevente",
28 − "name": "Le point de vente — billetterie québécoise",
29 − "url": "https://lepointdevente.com/billets",
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 »)",
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)",
34 − "cadence": "horaire (watcher PM2)",
35 − "statut": "actif"
36 − },
37 − {
38 − "id": "laval",
39 − "name": "Ville de Laval — Calendrier des activités",
40 − "url": "https://www.donneesquebec.ca/recherche/dataset/calendrier-des-activites",
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)",
43 − "acces_legal": "Licence CC 4.0 (Données Québec) — Ville de Laval",
44 − "couverture": "Activités municipales, Laval",
45 − "cadence": "horaire (watcher PM2)",
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).",
48 − "note": " REMPLACÉE 2026-08-19 (Phase 3) par la source « lavalweb » (calendrier vivant laval.ca)."
49 − },
50 − {
51 − "id": "sherbrooke",
52 − "name": "Ville de Sherbrooke — Calendrier des événements",
53 − "url": "https://www.sherbrooke.ca/fr/culture-sports-et-loisirs/calendrier-des-activites",
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)",
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)",
58 − "cadence": "horaire (watcher PM2)",
59 − "statut": "actif"
60 − },
61 − {
62 − "id": "longueuil",
63 − "name": "Ville de Longueuil — Événements (nouveau portail)",
64 − "url": "https://longueuil.quebec/fr/evenements",
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",
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)",
69 − "cadence": "horaire (watcher PM2, incrémental)",
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."
72 − },
73 − {
74 − "id": "eventbrite",
75 − "name": "Eventbrite — billetterie libre-service (Québec)",
76 − "url": "https://www.eventbrite.ca/d/canada--montreal/all-events/",
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",
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",
81 − "cadence": "horaire (watcher PM2, incrémental)",
82 − "statut": "actif"
83 − },
84 − {
85 − "id": "cantonsdelest",
86 − "name": "Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie)",
87 − "url": "https://www.cantonsdelest.com/evenements",
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",
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)",
92 − "cadence": "horaire (watcher PM2, incrémental)",
93 − "statut": "actif"
94 − },
95 − {
96 − "id": "saguenay",
97 − "name": "Ville de Saguenay — Événements culturels",
98 − "url": "https://www.donneesquebec.ca/recherche/dataset/sag_evenements-culturels",
99 − "type": "donnees-ouvertes",
100 − "extraction": "CSV (Données Québec)",
101 − "acces_legal": "Licence CC 4.0 (Données Québec)",
102 − "couverture": "Saguenay",
103 − "cadence": "n/d",
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)."
106 − },
107 − {
108 − "id": "repentigny",
109 − "name": "Ville de Repentigny — Événements",
110 − "url": "https://www.donneesquebec.ca/recherche/dataset/evenement-sur-le-territoire-de-la-ville",
111 − "type": "donnees-ouvertes",
112 − "extraction": "CSV (Données Québec)",
113 − "acces_legal": "Licence CC 4.0 (Données Québec)",
114 − "couverture": "Repentigny (Lanaudière)",
115 − "cadence": "n/d",
116 − "statut": "abandonnee",
117 − "note": "Jeu de données périmé — dernière date d'événement : 2021-09 (vérifié 2026-08-17)"
118 − },
119 − {
120 − "id": "evenko",
121 − "name": "evenko — grands concerts et festivals",
122 − "url": "https://evenko.ca/fr/evenements",
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",
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…)",
127 − "cadence": "horaire (watcher PM2)",
128 − "statut": "actif"
129 − },
130 − {
131 − "id": "atuvu",
132 − "name": "Atuvu.ca — calendrier culturel",
133 − "url": "https://atuvu.ca/",
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",
136 − "acces_legal": "robots.txt : Allow / + sitemap public",
137 − "couverture": "Sorties culturelles, Grand Montréal",
138 − "cadence": "horaire (watcher PM2, incrémental)",
139 − "statut": "actif"
140 − },
141 − {
142 − "id": "lavitrine",
143 − "name": "La Vitrine culturelle",
144 − "url": "https://www.lavitrine.com/",
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",
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",
149 − "cadence": "horaire (watcher PM2, incrémental)",
150 − "statut": "actif"
151 − },
152 − {
153 − "id": "brossard",
154 − "name": "Ville de Brossard — Calendrier des événements",
155 − "url": "https://brossard.ca/calendrier-des-evenements/",
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",
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)",
160 − "cadence": "horaire (watcher PM2, incrémental)",
161 − "statut": "actif"
162 − },
163 − {
164 − "id": "ticketmaster",
165 − "name": "Ticketmaster — Discovery API (Québec)",
166 − "url": "https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/",
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.",
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",
171 − "cadence": "horaire (watcher PM2)",
172 − "statut": "actif",
173 − "note": "Fonctionne sans clé (scraping découverte). TICKETMASTER_API_KEY optionnelle : active le mode API riche (prix, artistes, images)."
174 − },
175 − {
176 − "id": "bandsintown",
177 − "name": "Bandsintown — dates de concerts par artiste",
178 − "url": "https://rest.bandsintown.com/",
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",
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",
183 − "cadence": "horaire (watcher PM2, rotation d'artistes)",
184 − "statut": "actif"
185 − },
186 − {
187 − "id": "gatineau",
188 − "name": "Ville de Gatineau — Événements",
189 − "url": "https://www.gatineau.ca/",
190 − "type": "municipal",
191 − "extraction": "n/d",
192 − "acces_legal": "n/d",
193 − "couverture": "Gatineau (Outaouais)",
194 − "cadence": "n/d",
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)"
197 − },
198 − {
199 − "id": "trois-rivieres",
200 − "name": "Ville de Trois-Rivières — Événements",
201 − "url": "https://www.v3r.net/",
202 − "type": "municipal",
203 − "extraction": "n/d",
204 − "acces_legal": "n/d",
205 − "couverture": "Trois-Rivières (Mauricie)",
206 − "cadence": "n/d",
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)"
209 − },
210 − {
211 − "id": "levis",
212 − "name": "Ville de Lévis — Calendrier",
213 − "url": "https://www.ville.levis.qc.ca/",
214 − "type": "municipal",
215 − "extraction": "n/d",
216 − "acces_legal": "n/d",
217 − "couverture": "Lévis (Chaudière-Appalaches)",
218 − "cadence": "n/d",
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)"
221 − },
222 − {
223 − "id": "terrebonne",
224 − "name": "Ville de Terrebonne — Calendrier",
225 − "url": "https://terrebonne.ca/calendrier/",
226 − "type": "municipal",
227 − "extraction": "n/d",
228 − "acces_legal": "n/d",
229 − "couverture": "Terrebonne (Lanaudière)",
230 − "cadence": "n/d",
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)"
233 − },
234 − {
235 − "id": "lavalweb",
236 − "name": "Ville de Laval — calendrier vivant laval.ca",
237 − "url": "https://www.laval.ca/calendrier-activites/",
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 ●●.",
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",
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)",
244 − "statut": "actif"
245 − },
246 − {
247 − "id": "outaouais",
248 − "name": "Tourisme Outaouais — calendrier des événements (ATR)",
249 − "url": "https://tourismeoutaouais.com/calendrier-des-evenements",
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 ●.",
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",
254 − "couverture": "Festivals et événements, Outaouais (337 fiches seulement au baseline régional)",
255 − "cadence": "horaire (watcher PM2)",
256 − "statut": "actif"
257 − },
258 − {
259 − "id": "lanaudiere",
260 − "name": "Tourisme Lanaudière — événements (ATR)",
261 − "url": "https://lanaudiere.ca/fr/evenements-lanaudiere",
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 ●●.",
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",
266 − "couverture": "Festivals et événements, Lanaudière",
267 − "cadence": "horaire (watcher PM2, incrémental)",
268 − "statut": "actif"
269 − },
270 − {
271 − "id": "saguenaysorties",
272 − "name": "Sorties Saguenay — portail événementiel de la Ville",
273 − "url": "https://sorties.saguenay.ca/",
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).",
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",
278 − "couverture": "Spectacles, expositions, festivals — Saguenay et environs (Saguenay–Lac-Saint-Jean)",
279 − "cadence": "horaire (watcher PM2, incrémental)",
280 − "statut": "actif"
281 − },
282 − {
283 − "id": "bassaintlaurent",
284 − "name": "Tourisme Bas-Saint-Laurent — événements (ATR)",
285 − "url": "https://www.bassaintlaurent.ca/fr/quoi-faire/evenements/",
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 ●.",
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",
290 − "couverture": "Festivals et événements, Bas-Saint-Laurent",
291 − "cadence": "horaire (watcher PM2, incrémental)",
292 − "statut": "actif"
293 − },
294 − {
295 − "id": "quebecanimee",
296 − "name": "Québec animée — Ville de Québec",
297 − "url": "https://animee.ville.quebec.qc.ca/activites/",
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).",
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",
302 − "couverture": "Activités gratuites/à faible coût, Ville de Québec (Capitale-Nationale)",
303 − "cadence": "horaire (watcher PM2, incrémental)",
304 − "statut": "actif"
305 − },
306 − {
307 − "id": "placedesarts",
308 − "name": "Place des Arts — calendrier multi-salles",
309 − "url": "https://www.placedesarts.com/programmation",
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).",
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",
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)",
316 − "statut": "actif"
317 − },
318 − {
319 − "id": "lhjmq",
320 − "name": "LHJMQ — matchs des équipes québécoises",
321 − "url": "https://theqmjhl.ca/",
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…).",
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",
326 − "couverture": "~384 matchs/saison à domicile au Québec, 12 villes dans 10 régions",
327 − "cadence": "horaire (watcher PM2)",
328 − "statut": "actif"
329 − },
330 − {
331 − "id": "sallesjsonld",
332 − "name": "Salles de spectacle — moteur générique JSON-LD Event",
333 − "url": "https://grandtheatre.qc.ca/programmation",
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.",
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",
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)",
340 − "statut": "actif"
341 − },
342 − {
343 − "id": "mauricie",
344 − "name": "Tourisme Mauricie — événements (ATR)",
345 − "url": "https://tourismemauricie.com/evenements",
346 − "type": "tourisme-regional",
347 − "extraction": "n/d",
348 − "acces_legal": "n/d",
349 − "couverture": "Mauricie",
350 − "cadence": "n/d",
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."
353 − },
354 − {
355 − "id": "laurentides",
356 − "name": "Tourisme Laurentides — événements (ATR)",
357 − "url": "https://www.laurentides.com/fr/quoifaire/evenements",
358 − "type": "tourisme-regional",
359 − "extraction": "n/d",
360 − "acces_legal": "n/d",
361 − "couverture": "Laurentides",
362 − "cadence": "n/d",
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."
365 − },
366 − {
367 − "id": "gaspesie",
368 − "name": "Tourisme Gaspésie — événements (ATR)",
369 − "url": "https://www.tourisme-gaspesie.com/evenements-gaspesie.html",
370 − "type": "tourisme-regional",
371 − "extraction": "n/d",
372 − "acces_legal": "n/d",
373 − "couverture": "Gaspésie–Îles-de-la-Madeleine",
374 − "cadence": "n/d",
375 − "statut": "abandonnee",
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."
377 − },
378 − {
379 − "id": "tuxedobillet",
380 − "name": "Tuxedo Billet — billetterie Capitale-Nationale",
381 − "url": "https://www.tuxedobillet.com/",
382 − "type": "billetterie",
383 − "extraction": "n/d",
384 − "acces_legal": "n/d",
385 − "couverture": "Salles de Québec/Lévis (Grand Théâtre, Palais Montcalm…)",
386 − "cadence": "n/d",
387 − "statut": "abandonnee",
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."
389 − },
390 − {
391 − "id": "clubs-pros",
392 − "name": "Clubs professionnels (CF Montréal, Alouettes, Rocket, Victoire…)",
393 − "url": "https://www.cfmontreal.com/",
394 − "type": "sport",
395 − "extraction": "n/d",
396 − "acces_legal": "n/d",
397 − "couverture": "Montréal/Laval (MLS, LCF, AHL, LPHF)",
398 − "cadence": "n/d",
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."
401 − }
402 − ]
403 −}
2 + "_comment": "Sorti-Ka — Registre des sources d'événements (province de Québec). Auteur : Simon-Pierre Boucher — contact@spboucher.ai",
3 + "sources": [
4 + {
5 + "id": "sitq",
6 + "name": "SIT Québec — Ministère du Tourisme",
7 + "url": "https://www.donneesquebec.ca/recherche/dataset/sit-quebec-evenements",
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)",
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",
12 + "cadence": "horaire (watcher PM2)",
13 + "statut": "actif"
14 + },
15 + {
16 + "id": "montreal",
17 + "name": "Ville de Montréal — Événements publics",
18 + "url": "https://donnees.montreal.ca/dataset/evenements-publics",
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)",
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",
23 + "cadence": "horaire (watcher PM2)",
24 + "statut": "actif"
25 + },
26 + {
27 + "id": "lepointdevente",
28 + "name": "Le point de vente — billetterie québécoise",
29 + "url": "https://lepointdevente.com/billets",
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 »)",
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)",
34 + "cadence": "horaire (watcher PM2)",
35 + "statut": "actif"
36 + },
37 + {
38 + "id": "laval",
39 + "name": "Ville de Laval — Calendrier des activités",
40 + "url": "https://www.donneesquebec.ca/recherche/dataset/calendrier-des-activites",
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)",
43 + "acces_legal": "Licence CC 4.0 (Données Québec) — Ville de Laval",
44 + "couverture": "Activités municipales, Laval",
45 + "cadence": "horaire (watcher PM2)",
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).",
48 + "note": " REMPLACÉE 2026-08-19 (Phase 3) par la source « lavalweb » (calendrier vivant laval.ca)."
49 + },
50 + {
51 + "id": "sherbrooke",
52 + "name": "Ville de Sherbrooke — Calendrier des événements",
53 + "url": "https://www.sherbrooke.ca/fr/culture-sports-et-loisirs/calendrier-des-activites",
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)",
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)",
58 + "cadence": "horaire (watcher PM2)",
59 + "statut": "actif"
60 + },
61 + {
62 + "id": "longueuil",
63 + "name": "Ville de Longueuil — Événements (nouveau portail)",
64 + "url": "https://longueuil.quebec/fr/evenements",
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",
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)",
69 + "cadence": "horaire (watcher PM2, incrémental)",
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."
72 + },
73 + {
74 + "id": "eventbrite",
75 + "name": "Eventbrite — billetterie libre-service (Québec)",
76 + "url": "https://www.eventbrite.ca/d/canada--montreal/all-events/",
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",
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",
81 + "cadence": "horaire (watcher PM2, incrémental)",
82 + "statut": "actif"
83 + },
84 + {
85 + "id": "cantonsdelest",
86 + "name": "Tourisme Cantons-de-l'Est — calendrier officiel (ATR Estrie)",
87 + "url": "https://www.cantonsdelest.com/evenements",
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",
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)",
92 + "cadence": "horaire (watcher PM2, incrémental)",
93 + "statut": "actif"
94 + },
95 + {
96 + "id": "saguenay",
97 + "name": "Ville de Saguenay — Événements culturels",
98 + "url": "https://www.donneesquebec.ca/recherche/dataset/sag_evenements-culturels",
99 + "type": "donnees-ouvertes",
100 + "extraction": "CSV (Données Québec)",
101 + "acces_legal": "Licence CC 4.0 (Données Québec)",
102 + "couverture": "Saguenay",
103 + "cadence": "n/d",
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)."
106 + },
107 + {
108 + "id": "repentigny",
109 + "name": "Ville de Repentigny — Événements",
110 + "url": "https://www.donneesquebec.ca/recherche/dataset/evenement-sur-le-territoire-de-la-ville",
111 + "type": "donnees-ouvertes",
112 + "extraction": "CSV (Données Québec)",
113 + "acces_legal": "Licence CC 4.0 (Données Québec)",
114 + "couverture": "Repentigny (Lanaudière)",
115 + "cadence": "n/d",
116 + "statut": "abandonnee",
117 + "note": "Jeu de données périmé — dernière date d'événement : 2021-09 (vérifié 2026-08-17)"
118 + },
119 + {
120 + "id": "evenko",
121 + "name": "evenko — grands concerts et festivals",
122 + "url": "https://evenko.ca/fr/evenements",
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",
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…)",
127 + "cadence": "horaire (watcher PM2)",
128 + "statut": "actif"
129 + },
130 + {
131 + "id": "atuvu",
132 + "name": "Atuvu.ca — calendrier culturel",
133 + "url": "https://atuvu.ca/",
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",
136 + "acces_legal": "robots.txt : Allow / + sitemap public",
137 + "couverture": "Sorties culturelles, Grand Montréal",
138 + "cadence": "horaire (watcher PM2, incrémental)",
139 + "statut": "actif"
140 + },
141 + {
142 + "id": "lavitrine",
143 + "name": "La Vitrine culturelle",
144 + "url": "https://www.lavitrine.com/",
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",
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",
149 + "cadence": "horaire (watcher PM2, incrémental)",
150 + "statut": "actif"
151 + },
152 + {
153 + "id": "brossard",
154 + "name": "Ville de Brossard — Calendrier des événements",
155 + "url": "https://brossard.ca/calendrier-des-evenements/",
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",
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)",
160 + "cadence": "horaire (watcher PM2, incrémental)",
161 + "statut": "actif"
162 + },
163 + {
164 + "id": "ticketmaster",
165 + "name": "Ticketmaster — Discovery API (Québec)",
166 + "url": "https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/",
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.",
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",
171 + "cadence": "horaire (watcher PM2)",
172 + "statut": "actif",
173 + "note": "Fonctionne sans clé (scraping découverte). TICKETMASTER_API_KEY optionnelle : active le mode API riche (prix, artistes, images)."
174 + },
175 + {
176 + "id": "bandsintown",
177 + "name": "Bandsintown — dates de concerts par artiste",
178 + "url": "https://rest.bandsintown.com/",
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",
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",
183 + "cadence": "horaire (watcher PM2, rotation d'artistes)",
184 + "statut": "actif"
185 + },
186 + {
187 + "id": "gatineau",
188 + "name": "Ville de Gatineau — Événements",
189 + "url": "https://www.gatineau.ca/",
190 + "type": "municipal",
191 + "extraction": "n/d",
192 + "acces_legal": "n/d",
193 + "couverture": "Gatineau (Outaouais)",
194 + "cadence": "n/d",
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)"
197 + },
198 + {
199 + "id": "trois-rivieres",
200 + "name": "Ville de Trois-Rivières — Événements",
201 + "url": "https://www.v3r.net/",
202 + "type": "municipal",
203 + "extraction": "n/d",
204 + "acces_legal": "n/d",
205 + "couverture": "Trois-Rivières (Mauricie)",
206 + "cadence": "n/d",
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)"
209 + },
210 + {
211 + "id": "levis",
212 + "name": "Ville de Lévis — Calendrier",
213 + "url": "https://www.ville.levis.qc.ca/",
214 + "type": "municipal",
215 + "extraction": "n/d",
216 + "acces_legal": "n/d",
217 + "couverture": "Lévis (Chaudière-Appalaches)",
218 + "cadence": "n/d",
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)"
221 + },
222 + {
223 + "id": "terrebonne",
224 + "name": "Ville de Terrebonne — Calendrier",
225 + "url": "https://terrebonne.ca/calendrier/",
226 + "type": "municipal",
227 + "extraction": "n/d",
228 + "acces_legal": "n/d",
229 + "couverture": "Terrebonne (Lanaudière)",
230 + "cadence": "n/d",
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)"
233 + },
234 + {
235 + "id": "lavalweb",
236 + "name": "Ville de Laval — calendrier vivant laval.ca",
237 + "url": "https://www.laval.ca/calendrier-activites/",
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 ●●.",
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",
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)",
244 + "statut": "actif"
245 + },
246 + {
247 + "id": "outaouais",
248 + "name": "Tourisme Outaouais — calendrier des événements (ATR)",
249 + "url": "https://tourismeoutaouais.com/calendrier-des-evenements",
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 ●.",
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",
254 + "couverture": "Festivals et événements, Outaouais (337 fiches seulement au baseline régional)",
255 + "cadence": "horaire (watcher PM2)",
256 + "statut": "actif"
257 + },
258 + {
259 + "id": "lanaudiere",
260 + "name": "Tourisme Lanaudière — événements (ATR)",
261 + "url": "https://lanaudiere.ca/fr/evenements-lanaudiere",
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 ●●.",
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",
266 + "couverture": "Festivals et événements, Lanaudière",
267 + "cadence": "horaire (watcher PM2, incrémental)",
268 + "statut": "actif"
269 + },
270 + {
271 + "id": "saguenaysorties",
272 + "name": "Sorties Saguenay — portail événementiel de la Ville",
273 + "url": "https://sorties.saguenay.ca/",
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).",
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",
278 + "couverture": "Spectacles, expositions, festivals — Saguenay et environs (Saguenay–Lac-Saint-Jean)",
279 + "cadence": "horaire (watcher PM2, incrémental)",
280 + "statut": "actif"
281 + },
282 + {
283 + "id": "bassaintlaurent",
284 + "name": "Tourisme Bas-Saint-Laurent — événements (ATR)",
285 + "url": "https://www.bassaintlaurent.ca/fr/quoi-faire/evenements/",
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 ●.",
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",
290 + "couverture": "Festivals et événements, Bas-Saint-Laurent",
291 + "cadence": "horaire (watcher PM2, incrémental)",
292 + "statut": "actif"
293 + },
294 + {
295 + "id": "quebecanimee",
296 + "name": "Québec animée — Ville de Québec",
297 + "url": "https://animee.ville.quebec.qc.ca/activites/",
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).",
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",
302 + "couverture": "Activités gratuites/à faible coût, Ville de Québec (Capitale-Nationale)",
303 + "cadence": "horaire (watcher PM2, incrémental)",
304 + "statut": "actif"
305 + },
306 + {
307 + "id": "placedesarts",
308 + "name": "Place des Arts — calendrier multi-salles",
309 + "url": "https://www.placedesarts.com/programmation",
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).",
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",
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)",
316 + "statut": "actif"
317 + },
318 + {
319 + "id": "lhjmq",
320 + "name": "LHJMQ — matchs des équipes québécoises",
321 + "url": "https://theqmjhl.ca/",
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…).",
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",
326 + "couverture": "~384 matchs/saison à domicile au Québec, 12 villes dans 10 régions",
327 + "cadence": "horaire (watcher PM2)",
328 + "statut": "actif"
329 + },
330 + {
331 + "id": "sallesjsonld",
332 + "name": "Salles de spectacle — moteur générique JSON-LD Event",
333 + "url": "https://grandtheatre.qc.ca/programmation",
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.",
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",
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)",
340 + "statut": "actif"
341 + },
342 + {
343 + "id": "mauricie",
344 + "name": "Tourisme Mauricie — événements (ATR)",
345 + "url": "https://tourismemauricie.com/evenements",
346 + "type": "tourisme-regional",
347 + "extraction": "n/d",
348 + "acces_legal": "n/d",
349 + "couverture": "Mauricie",
350 + "cadence": "n/d",
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."
353 + },
354 + {
355 + "id": "laurentides",
356 + "name": "Tourisme Laurentides — événements (ATR)",
357 + "url": "https://www.laurentides.com/fr/quoifaire/evenements",
358 + "type": "tourisme-regional",
359 + "extraction": "n/d",
360 + "acces_legal": "n/d",
361 + "couverture": "Laurentides",
362 + "cadence": "n/d",
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."
365 + },
366 + {
367 + "id": "gaspesie",
368 + "name": "Tourisme Gaspésie — événements (ATR)",
369 + "url": "https://www.tourisme-gaspesie.com/fr/festival-et-evenements/",
370 + "type": "tourisme-regional",
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": "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",
374 + "cadence": "horaire (watcher PM2) — cache 14 j, ~2 fiches re-visitées/j",
375 + "statut": "actif",
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 + },
378 + {
379 + "id": "tuxedobillet",
380 + "name": "Tuxedo Billet — billetterie québécoise multi-tenants",
381 + "url": "https://www.tuxedobillet.com/",
382 + "type": "billetterie",
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": "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": "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": "quotidienne (TTL 20 h dans le watcher horaire)",
387 + "statut": "actif",
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 + },
390 + {
391 + "id": "clubs-pros",
392 + "name": "Clubs professionnels (CF Montréal, Alouettes, Rocket, Victoire…)",
393 + "url": "https://www.cfmontreal.com/",
394 + "type": "sport",
395 + "extraction": "n/d",
396 + "acces_legal": "n/d",
397 + "couverture": "Montréal/Laval (MLS, LCF, AHL, LPHF)",
398 + "cadence": "n/d",
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."
401 + },
402 + {
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 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 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 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 47 ## Données transversales
41 48
@@ -51,12 +58,12 @@
51 58 |---|---|---|
52 59 | Tourisme Mauricie | liste rendue JS (1 carte SSR/page), wp-json verrouillé (401) | oui (percer la facette admin-ajax) |
53 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 |
55 −| Tuxedo Billet | site en panne aux sondes (www = « failover site », apex = erreur TLS) | oui |
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 |
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 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 64 | Palais Montcalm, Le Diamant, Impérial Bell | fiches SANS JSON-LD Event (sondées) | oui, après refonte de leurs sites |
58 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 67 | Médias (La Presse, Le Devoir, JdQ/JdM) | éditorial non structuré + droits d'auteur | non |
61 68
62 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 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 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 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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
21 −| [evenko — grands concerts et festivals](evenko.md) | promoteur | actif | 421 | 97 % | 0 % | 99 % | 0 % | 0 % | 99 % | 100 % | 100 % | 2026-08-19 01:30 |
22 −| [Atuvu.ca — calendrier culturel](atuvu.md) | agregateur | actif | 152 | 70 % | 38 % | 9 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-19 02:33 |
23 −| [La Vitrine culturelle](lavitrine.md) | billetterie | actif | 5086 | 69 % | 0 % | 71 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-19 01:31 |
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 |
25 −| [Ticketmaster — Discovery API (Québec)](ticketmaster.md) | billetterie | actif | 357 | 100 % | 0 % | 96 % | 0 % | 4 % | 0 % | 91 % | 100 % | 2026-08-19 01:33 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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 | 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 | 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-21 20:50 |
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-21 20:54 |
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-21 20:49 |
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 | 224 | 82 % | 25 % | 46 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-21 20:49 |
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 | 147 | 95 % | 0 % | 96 % | 0 % | 0 % | 0 % | 100 % | 95 % | 2026-08-21 20:49 |
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 | 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 | 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 | 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 % | 93 % | 0 % | 2026-08-21 20:50 |
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-21 20:49 |
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 | 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-21 20:54 |
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 44 ## Sources abandonnées
38 45
@@ -46,8 +53,6 @@
46 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 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 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 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 58 ## Régénérer cette documentation
modified docs/connecteurs/atuvu.md +29 −29
@@ -1,6 +1,6 @@
1 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 5 **Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/atuvu.py`
6 6
@@ -38,30 +38,30 @@
38 38
39 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 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 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 |
48 −| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique"] |
49 −| `venue` — Salle (venue) | nom du lieu | 100 % | Le Rendez-vous du thé |
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", "arts-scene"] |
49 +| `venue` — Salle (venue) | nom du lieu | 100 % | La Comédie de Montréal |
50 50 | `address` — Adresse | adresse civique | 0 % | ∅ |
51 −| `city` — Ville | municipalité | 97 % | Montréal |
52 −| `region` — Région | région administrative | 94 % | Montréal |
53 −| `lat` — GPS (lat/lng) | coordonnées géographiques | 70 % | 45.5602793, -73.6576904 |
54 −| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-19 |
55 −| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-19 |
56 −| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 9 % | 18:00 |
51 +| `city` — Ville | municipalité | 98 % | Montréal |
52 +| `region` — Région | région administrative | 96 % | Montréal |
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-21 |
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) | 46 % | 20:00 |
57 57 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
58 58 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ |
59 −| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 28 % | ∅ |
60 −| `price_min` — Prix min | tarif minimal réel ($) | 38 % | 0.0 |
61 −| `price_label` — Libellé prix | étiquette tarifaire affichable | 28 % | ∅ |
59 +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 19 % | 0 |
60 +| `price_min` — Prix min | tarif minimal réel ($) | 25 % | 35.0 |
61 +| `price_label` — Libellé prix | étiquette tarifaire affichable | 19 % | 35.00 $ (prix régulier atuvu.ca) |
62 62 | `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] |
63 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 65 | `website` — Site web | site officiel de l'événement | 0 % | ∅ |
66 66
67 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 77 ## Volumétrie & complétude live
78 78
79 −*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)*
80 −
81 −- **Événements en base** : 162 (dont **152 actifs**)
82 −- **GPS** : 106/152 actifs (70 %)
83 −- **Prix** : 57/152 actifs (38 %)
84 −- **Heure (start_time)** : 14/152 actifs (9 %)
85 −- **Heure de fin** : 0/152 actifs (0 %)
86 −- **Statut (annulé/reporté/complet)** : 0/152 actifs (0 %)
87 −- **Artistes** : 0/152 actifs (0 %)
88 −- **Image** : 152/152 actifs (100 %)
89 −- **Salle (venue)** : 152/152 actifs (100 %)
90 −- **Dernier sync** : 2026-08-19 02:33 — fetched 170, +0 ajoutés, ~2 mis à jour, -0 retirés
91 −- **Syncs enregistrés** (sync_log) : 39
79 +*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
80 +
81 +- **Événements en base** : 249 (dont **224 actifs**)
82 +- **GPS** : 183/224 actifs (82 %)
83 +- **Prix** : 55/224 actifs (25 %)
84 +- **Heure (start_time)** : 103/224 actifs (46 %)
85 +- **Heure de fin** : 0/224 actifs (0 %)
86 +- **Statut (annulé/reporté/complet)** : 0/224 actifs (0 %)
87 +- **Artistes** : 0/224 actifs (0 %)
88 +- **Image** : 224/224 actifs (100 %)
89 +- **Salle (venue)** : 224/224 actifs (100 %)
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) : 98
92 92
93 93 ## Erreurs & dépannage
94 94
modified docs/connecteurs/bandsintown.md +28 −28
@@ -1,6 +1,6 @@
1 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 5 **Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/bandsintown.py`
6 6
@@ -43,30 +43,30 @@
43 43
44 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 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 |
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… |
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&… |
50 +| `title` — Titre | titre de l'événement | 100 % | St-Roch XP 2026 |
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/108801594?app_id=js_www.sorti-ka.com&came_from=267&utm_medium=api&… |
53 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 |
55 −| `address` — Adresse | adresse civique | 98 % | 21 Rue Tri Jean |
56 −| `city` — Ville | municipalité | 100 % | Grenville |
57 −| `region` — Région | région administrative | 99 % | Laurentides |
58 −| `lat` — GPS (lat/lng) | coordonnées géographiques | 100 % | 45.630063, -74.600568 |
59 −| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-22 |
60 −| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-22 |
61 −| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 100 % | 20:30 |
54 +| `venue` — Salle (venue) | nom du lieu | 100 % | St-Roch XP 2026 |
55 +| `address` — Adresse | adresse civique | 99 % | 699 Rue Saint-Joseph E |
56 +| `city` — Ville | municipalité | 100 % | Québec |
57 +| `region` — Région | région administrative | 99 % | Capitale-Nationale |
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-28 |
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 % | 19:00 |
62 62 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
63 63 | `status` — Statut | cancelled / postponed / soldout (NULL = prévu) | 0 % | ∅ |
64 64 | `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 1 % | 1 |
65 65 | `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ |
66 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 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 70 | `website` — Site web | site officiel de l'événement | 0 % | ∅ |
71 71
72 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 83 ## Volumétrie & complétude live
84 84
85 −*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)*
86 −
87 −- **Événements en base** : 454 (dont **452 actifs**)
88 −- **GPS** : 452/452 actifs (100 %)
89 −- **Prix** : 4/452 actifs (1 %)
90 −- **Heure (start_time)** : 451/452 actifs (100 %)
91 −- **Heure de fin** : 0/452 actifs (0 %)
92 −- **Statut (annulé/reporté/complet)** : 0/452 actifs (0 %)
93 −- **Artistes** : 452/452 actifs (100 %)
94 −- **Image** : 42/452 actifs (9 %)
95 −- **Salle (venue)** : 452/452 actifs (100 %)
96 −- **Dernier sync** : 2026-08-19 01:29 — fetched 453, +82 ajoutés, ~0 mis à jour, -0 retirés
97 −- **Syncs enregistrés** (sync_log) : 24
85 +*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
86 +
87 +- **Événements en base** : 529 (dont **521 actifs**)
88 +- **GPS** : 521/521 actifs (100 %)
89 +- **Prix** : 5/521 actifs (1 %)
90 +- **Heure (start_time)** : 520/521 actifs (100 %)
91 +- **Heure de fin** : 0/521 actifs (0 %)
92 +- **Statut (annulé/reporté/complet)** : 0/521 actifs (0 %)
93 +- **Artistes** : 521/521 actifs (100 %)
94 +- **Image** : 48/521 actifs (9 %)
95 +- **Salle (venue)** : 521/521 actifs (100 %)
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) : 83
98 98
99 99 ## Erreurs & dépannage
100 100
modified docs/connecteurs/bassaintlaurent.md +8 −4
@@ -1,6 +1,6 @@
1 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 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 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 83 - **Événements en base** : 27 (dont **20 actifs**)
84 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 89 - **Artistes** : 0/20 actifs (0 %)
90 90 - **Image** : 20/20 actifs (100 %)
91 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
93 −- **Syncs enregistrés** (sync_log) : 1
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) : 60
94 94
95 95 ## Erreurs & dépannage
96 96
@@ -107,3 +107,7 @@ Aucune erreur dans `sync_log` pour cette source. ✅
107 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 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 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 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 5 **Statut : actif** · Type : `municipal` · Connecteur : `sortika/connectors/brossard.py`
6 6
@@ -43,7 +43,7 @@
43 43
44 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 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 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 52 | `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://brossard.ca/calendrier-evenements/atelier-jeux-de-societe-16-septembre-2026/ |
53 53 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["famille"] |
54 −| `venue` — Salle (venue) | nom du lieu | 94 % | Salle d'animation |
55 −| `address` — Adresse | adresse civique | 94 % | 7855, av San Francisco |
54 +| `venue` — Salle (venue) | nom du lieu | 95 % | Salle d'animation |
55 +| `address` — Adresse | adresse civique | 95 % | 7855, av San Francisco |
56 56 | `city` — Ville | municipalité | 100 % | Brossard |
57 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 59 | `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-09-16 |
60 60 | `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-09-16 |
61 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 82 ## Volumétrie & complétude live
83 83
84 −*(mesuré le 2026-08-19 02:34 EDT dans `data/sortika.db`)*
85 −
86 −- **Événements en base** : 264 (dont **150 actifs**)
87 −- **GPS** : 141/150 actifs (94 %)
88 −- **Prix** : 0/150 actifs (0 %)
89 −- **Heure (start_time)** : 144/150 actifs (96 %)
90 −- **Heure de fin** : 0/150 actifs (0 %)
91 −- **Statut (annulé/reporté/complet)** : 0/150 actifs (0 %)
92 −- **Artistes** : 0/150 actifs (0 %)
93 −- **Image** : 150/150 actifs (100 %)
94 −- **Salle (venue)** : 141/150 actifs (94 %)
95 −- **Dernier sync** : 2026-08-19 01:30 — fetched 264, +0 ajoutés, ~0 mis à jour, -0 retirés
96 −- **Syncs enregistrés** (sync_log) : 24
84 +*(mesuré le 2026-08-21 21:47 EDT dans `data/sortika.db`)*
85 +
86 +- **Événements en base** : 264 (dont **147 actifs**)
87 +- **GPS** : 139/147 actifs (95 %)
88 +- **Prix** : 0/147 actifs (0 %)
89 +- **Heure (start_time)** : 141/147 actifs (96 %)
90 +- **Heure de fin** : 0/147 actifs (0 %)
91 +- **Statut (annulé/reporté/complet)** : 0/147 actifs (0 %)
92 +- **Artistes** : 0/147 actifs (0 %)
93 +- **Image** : 147/147 actifs (100 %)
94 +- **Salle (venue)** : 139/147 actifs (95 %)
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) : 83
97 97
98 98 ## Erreurs & dépannage
99 99
modified docs/connecteurs/cantonsdelest.md +15 −15
@@ -1,6 +1,6 @@
1 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 5 **Statut : actif** · Type : `tourisme-regional` · Connecteur : `sortika/connectors/cantonsdelest.py`
6 6
@@ -41,21 +41,21 @@
41 41
42 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 46 | Champ (`events.*`) | Description | Complétude | Exemple réel |
47 47 |---|---|---|---|
48 −| `title` — Titre | titre de l'événement | 100 % | Vieillir en santé |
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… |
50 −| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.cantonsdelest.com/evenements/10200/vieillir-en-sante/4714 |
48 +| `title` — Titre | titre de l'événement | 100 % | NanoFest |
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/7646/nanofest/2584 |
51 51 | `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["autre"] |
52 52 | `venue` — Salle (venue) | nom du lieu | 0 % | ∅ |
53 −| `address` — Adresse | adresse civique | 91 % | 225 Rue Frontenac |
54 −| `city` — Ville | municipalité | 100 % | Sherbrooke |
53 +| `address` — Adresse | adresse civique | 82 % | ∅ |
54 +| `city` — Ville | municipalité | 100 % | Bury |
55 55 | `region` — Région | région administrative | 100 % | Estrie |
56 −| `lat` — GPS (lat/lng) | coordonnées géographiques | 91 % | 45.403367, -71.895639 |
57 −| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-19 |
58 −| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-19 |
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-21 |
58 +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-23 |
59 59 | `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
60 60 | `end_time` — Heure de fin (end_time) | heure locale HH:MM (Québec) | 0 % | ∅ |
61 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 64 | `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ |
65 65 | `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] |
66 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 68 | `website` — Site web | site officiel de l'événement | 0 % | ∅ |
69 69
70 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 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 85 - **GPS** : 10/11 actifs (91 %)
86 86 - **Prix** : 0/11 actifs (0 %)
87 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 90 - **Artistes** : 0/11 actifs (0 %)
91 91 - **Image** : 11/11 actifs (100 %)
92 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
94 −- **Syncs enregistrés** (sync_log) : 21
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) : 80
95 95
96 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