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