docs: documentation standardisée des connecteurs (générateur rejouable)
- scripts/gen_connector_docs.py : générateur rejouable qui croise data/sources.json, l introspection des connecteurs (endpoints, pagination, backend, plafonds env, en-têtes) et la BD live (volumétrie, complétude GPS/prix/heure/artistes/image/salle, exemples réels, sync_log) - docs/connecteurs/ : INDEX.md + 18 fiches (sections fixes : Description, Accès, Champs récupérés → schéma, Fréquence & budgets, Volumétrie & complétude live, Erreurs & dépannage, Licence/attribution avec mentions requises CC BY Montréal / CC 4.0 SITQ & Laval, Historique incl. vagues d enrichissement 2026-08-18 7d9d1b0 et 65d2d33) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
20 changed files +2,093 −0
added
docs/connecteurs/INDEX.md
+41 −0
@@ -0,0 +1,41 @@ | ||
| 1 | +# Sorti-Ka — Connecteurs de sources d'événements | |
| 2 | + | |
| 3 | +> Index généré le 2026-08-18 03:22 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 | + | |
| 5 | +**18 sources au registre** — 11 actives/prêtes, 7 abandonnées · **18292 événements en base** (dont 15820 actifs). | |
| 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 ». | |
| 8 | + | |
| 9 | +## Sources actives / prêtes | |
| 10 | + | |
| 11 | +| Source | Type | Statut | Actifs | GPS | Prix | Heure | Artistes | Image | Salle | Dernier sync | | |
| 12 | +|---|---|---|---|---|---|---|---|---|---|---| | |
| 13 | +| [SIT Québec — Ministère du Tourisme](sitq.md) | donnees-ouvertes | actif | 1598 | 97 % | 0 % | 0 % | 0 % | 35 % | 66 % | 2026-08-18 02:41 | | |
| 14 | +| [Ville de Montréal — Événements publics](montreal.md) | donnees-ouvertes | actif | 5679 | 97 % | 100 % | 10 % | 0 % | 58 % | 4 % | 2026-08-18 02:41 | | |
| 15 | +| [Le point de vente — billetterie québécoise](lepointdevente.md) | billetterie | actif | 1787 | 27 % | 31 % | 94 % | 1 % | 100 % | 99 % | 2026-08-18 02:41 | | |
| 16 | +| [Ville de Laval — Calendrier des activités](laval.md) | donnees-ouvertes | actif | 277 | 51 % | 0 % | 95 % | 0 % | 98 % | 90 % | 2026-08-18 02:35 | | |
| 17 | +| [Ville de Sherbrooke — Calendrier des événements](sherbrooke.md) | municipal | actif | 271 | 0 % | 100 % | 88 % | 0 % | 100 % | 0 % | 2026-08-18 02:41 | | |
| 18 | +| [evenko — grands concerts et festivals](evenko.md) | promoteur | actif | 423 | 77 % | 0 % | 99 % | 99 % | 100 % | 100 % | 2026-08-18 02:35 | | |
| 19 | +| [Atuvu.ca — calendrier culturel](atuvu.md) | agregateur | actif | 145 | 62 % | 35 % | 0 % | 0 % | 100 % | 100 % | 2026-08-18 02:31 | | |
| 20 | +| [La Vitrine culturelle](lavitrine.md) | billetterie | actif | 5127 | 52 % | 0 % | 0 % | 0 % | 100 % | 100 % | 2026-08-18 02:35 | | |
| 21 | +| [Ville de Brossard — Calendrier des événements](brossard.md) | municipal | actif | 262 | 0 % | 0 % | 54 % | 0 % | 55 % | 53 % | 2026-08-18 02:35 | | |
| 22 | +| [Ticketmaster — Discovery API (Québec)](ticketmaster.md) | billetterie | prêt — clé requise | 0 | — | — | — | — | — | — | 2026-08-18 02:41 | | |
| 23 | +| [Bandsintown — dates de concerts par artiste](bandsintown.md) | agregateur | actif | 251 | 100 % | 1 % | 100 % | 100 % | 10 % | 100 % | 2026-08-18 02:32 | | |
| 24 | + | |
| 25 | +## Sources abandonnées | |
| 26 | + | |
| 27 | +| Source | Type | Raison | | |
| 28 | +|---|---|---| | |
| 29 | +| [Ville de Longueuil — Événements](longueuil.md) | donnees-ouvertes | Jeu de données périmé — dernière date d'événement : 2017-03 (vérifié 2026-08-17) | | |
| 30 | +| [Ville de Saguenay — Événements culturels](saguenay.md) | donnees-ouvertes | Jeu de données périmé — dernière date d'événement : 2022-06 (vérifié 2026-08-17) | | |
| 31 | +| [Ville de Repentigny — Événements](repentigny.md) | donnees-ouvertes | Jeu de données périmé — dernière date d'événement : 2021-09 (vérifié 2026-08-17) | | |
| 32 | +| [Ville de Gatineau — Événements](gatineau.md) | municipal | Aucun jeu de données « événements » sur Données Québec (portail Gatineau : géomatique seulement)… | | |
| 33 | +| [Ville de Trois-Rivières — Événements](trois-rivieres.md) | municipal | API REST WordPress verrouillée (401 rest_not_logged_in) et aucun jeu « événements » sur Données … | | |
| 34 | +| [Ville de Lévis — Calendrier](levis.md) | municipal | Site derrière un WAF (403 sur GET identifiés) et aucun jeu « événements » sur Données Québec (vé… | | |
| 35 | +| [Ville de Terrebonne — Calendrier](terrebonne.md) | municipal | Cloudflare bloque tout GET non navigateur (403) et aucun jeu « événements » sur Données Québec (… | | |
| 36 | + | |
| 37 | +## Régénérer cette documentation | |
| 38 | + | |
| 39 | +```bash | |
| 40 | +cd ~/apps/sorti-ka && python3 scripts/gen_connector_docs.py | |
| 41 | +``` | |
added
docs/connecteurs/atuvu.md
+108 −0
@@ -0,0 +1,108 @@ | ||
| 1 | +# Atuvu.ca — calendrier culturel (`atuvu`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/atuvu.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Atuvu.ca — calendrier culturel](https://atuvu.ca/) | |
| 10 | +- **Couverture** : Sorties culturelles, Grand Montréal | |
| 11 | +- **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 | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : agregateur | |
| 16 | +- **Endpoint** (`SITEMAP_INDEX`) : `https://atuvu.ca/atuvu_sitemap_index.xml` | |
| 17 | +- **Auth** : Aucune côté source ; `SCRAPFLY_API_KEY` requis pour le backend Scrapfly | |
| 18 | +- **Pagination** : parcours de sitemap XML | |
| 19 | +- **Backend** : Scrapfly (anti-bot / rendu JS) via `base.get_scrapfly()` | |
| 20 | +- **Throttle** : 1.0 s entre requêtes | |
| 21 | +- **Accès légal** : robots.txt : Allow / + sitemap public | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/atuvu.py : connecteur Atuvu.ca — calendrier culturel (Grand Montréal +) | |
| 26 | +> Source : atuvu.ca (théâtre, musique, humour, danse, expositions…) | |
| 27 | +> Extraction: SCRAPFLY obligatoire (Cloudflare) — sitemaps XML publics | |
| 28 | +> (evenements_N_2000.xml, lastmod par fiche) puis pages fiche | |
| 29 | +> (h1, blocs .event-play : date FR, salle, ville, prix). | |
| 30 | +> INCRÉMENTAL avec cache disque (data/atuvu_cache.json) : seules | |
| 31 | +> les fiches nouvelles ou modifiées sont re-scrapées, plafonné à | |
| 32 | +> ATUVU_MAX_FETCH pages/sync pour contenir le coût en crédits. | |
| 33 | +> Accès : robots.txt « User-Agent: * / Allow: / » + sitemap public. | |
| 34 | +> Prix : bloc .price-reg de la fiche (prix régulier) → price_min ; | |
| 35 | +> « Invitation gratuite » = offre membre, PAS gratuité → ignorée. | |
| 36 | + | |
| 37 | +</details> | |
| 38 | + | |
| 39 | +## Champs récupérés → schéma | |
| 40 | + | |
| 41 | +Complétude mesurée sur les **145 événements actifs** de la source ; exemples tirés d'un événement réel (`atuvu:requiem-de-mozart-2026-11-07`). | |
| 42 | + | |
| 43 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 44 | +|---|---|---|---| | |
| 45 | +| `title` — Titre | titre de l'événement | 100 % | Requiem de Mozart | | |
| 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/requiem-de-mozart | | |
| 48 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique"] | | |
| 49 | +| `venue` — Salle (venue) | nom du lieu | 100 % | Basilique Notre-Dame de Montréal | | |
| 50 | +| `address` — Adresse | adresse civique | 0 % | ∅ | | |
| 51 | +| `city` — Ville | municipalité | 97 % | Montréal | | |
| 52 | +| `region` — Région | région administrative | 93 % | Montréal | | |
| 53 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 62 % | 45.5044365, -73.5559901 | | |
| 54 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-11-07 | | |
| 55 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-11-07 | | |
| 56 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 0 % | ∅ | | |
| 57 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 29 % | 0 | | |
| 58 | +| `price_min` — Prix min | tarif minimal réel ($) | 35 % | 54.58 | | |
| 59 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 29 % | 54.58 $ (prix régulier atuvu.ca) | | |
| 60 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | | |
| 61 | +| `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ | | |
| 62 | +| `image` — Image | visuel (og:image ou média source) | 100 % | https://atuvu.ca/uploads/images/2026/08/requiem-mozart.jpg | | |
| 63 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 64 | + | |
| 65 | +## Fréquence & budgets | |
| 66 | + | |
| 67 | +- **Cadence** : horaire (watcher PM2, incrémental) | |
| 68 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 69 | + | |
| 70 | +| Variable | Défaut | Rôle | | |
| 71 | +|---|---|---| | |
| 72 | +| `ATUVU_MAX_FETCH` | `120` | fiches/sync (coût Scrapfly) | | |
| 73 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 74 | + | |
| 75 | +## Volumétrie & complétude live | |
| 76 | + | |
| 77 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 78 | + | |
| 79 | +- **Événements en base** : 145 (dont **145 actifs**) | |
| 80 | +- **GPS** : 90/145 actifs (62 %) | |
| 81 | +- **Prix** : 51/145 actifs (35 %) | |
| 82 | +- **Heure (start_time)** : 0/145 actifs (0 %) | |
| 83 | +- **Artistes** : 0/145 actifs (0 %) | |
| 84 | +- **Image** : 145/145 actifs (100 %) | |
| 85 | +- **Salle (venue)** : 145/145 actifs (100 %) | |
| 86 | +- **Dernier sync** : 2026-08-18 02:31 — fetched 156, +0 ajoutés, ~146 mis à jour, -0 retirés | |
| 87 | +- **Syncs enregistrés** (sync_log) : 16 | |
| 88 | + | |
| 89 | +## Erreurs & dépannage | |
| 90 | + | |
| 91 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 92 | + | |
| 93 | +- Source derrière anti-bot/JS lourd → backend **Scrapfly** requis : vérifier `SCRAPFLY_API_KEY` dans `.env` et le solde de crédits Scrapfly si le connecteur ne rapporte plus rien. | |
| 94 | +- Rejouer un sync isolé : `python3 run.py sync --source atuvu` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='atuvu' ORDER BY ts DESC LIMIT 5;"` | |
| 95 | + | |
| 96 | +## Licence / attribution | |
| 97 | + | |
| 98 | +- robots.txt : Allow / + sitemap public | |
| 99 | + | |
| 100 | +## Historique | |
| 101 | + | |
| 102 | +- **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. | |
| 103 | +- **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). | |
| 104 | + | |
| 105 | +Commits touchant `sortika/connectors/atuvu.py` : | |
| 106 | + | |
| 107 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
| 108 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/bandsintown.md
+113 −0
@@ -0,0 +1,113 @@ | ||
| 1 | +# Bandsintown — dates de concerts par artiste (`bandsintown`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `agregateur` · Connecteur : `sortika/connectors/bandsintown.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Bandsintown — dates de concerts par artiste](https://rest.bandsintown.com/) | |
| 10 | +- **Couverture** : Concerts au Québec des artistes en tournée connus de la base | |
| 11 | +- **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 | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : agregateur | |
| 16 | +- **Endpoint** (`API`) : `https://rest.bandsintown.com/artists/{artist}/events` | |
| 17 | +- **Auth** : `app_id` d'identification (`BANDSINTOWN_APP_ID`, format widget accepté) | |
| 18 | +- **Pagination** : aucune (flux unique) | |
| 19 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 20 | +- **Throttle** : 0.5 s entre requêtes | |
| 21 | +- **Accès légal** : API publique Bandsintown (app_id d'identification) — usage index + lien vers la fiche originale | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/bandsintown.py : connecteur Bandsintown (API publique par artiste) | |
| 26 | +> Source : rest.bandsintown.com/artists/{artiste}/events — API publique | |
| 27 | +> (app_id d'identification ; le format « js_<domaine> » des | |
| 28 | +> widgets officiels est accepté, testé 2026-08 — un app_id | |
| 29 | +> arbitraire simple est refusé « not authorized »). | |
| 30 | +> Approche : l'API ne permet pas de recherche géographique → on interroge | |
| 31 | +> les artistes déjà connus de la base (colonne `artists` extraite | |
| 32 | +> d'evenko / lepointdevente / ticketmaster, événements à venir) | |
| 33 | +> et on ne garde que leurs dates au QUÉBEC (venue.region = QC). | |
| 34 | +> Volume : plafond BIT_ARTIST_MAX artistes/sync (défaut 100), rotation par | |
| 35 | +> ancienneté via cache disque (data/bandsintown_cache.json) ; les | |
| 36 | +> événements des artistes déjà sondés sont ré-émis depuis le | |
| 37 | +> cache entre deux visites (re-visite après 3 jours). | |
| 38 | +> Champs : datetime local (date + heure), salle géolocalisée (lat/lng), | |
| 39 | +> lineup → artistes, `free` → is_free, offres/billets → url, | |
| 40 | +> image de l'artiste. | |
| 41 | + | |
| 42 | +</details> | |
| 43 | + | |
| 44 | +## Champs récupérés → schéma | |
| 45 | + | |
| 46 | +Complétude mesurée sur les **251 événements actifs** de la source ; exemples tirés d'un événement réel (`bandsintown:108747079`). | |
| 47 | + | |
| 48 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 49 | +|---|---|---|---| | |
| 50 | +| `title` — Titre | titre de l'événement | 100 % | Doug St-Louis & Dj Chuck / Ptit Gros Bison à Grenville en Fête | | |
| 51 | +| `description` — Description | texte descriptif (source ou fiche détail) | 18 % | Au Parc Normand-Woodbury à Grenville. Spectacle Gratuit Ils seront en duo pour vous faire danser… | | |
| 52 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.bandsintown.com/e/108747079?app_id=js_www.sorti-ka.com&came_from=267&utm_medium=api&… | | |
| 53 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique"] | | |
| 54 | +| `venue` — Salle (venue) | nom du lieu | 100 % | Doug St-Louis & Dj Chuck / Ptit Gros Bison à Grenville en Fête | | |
| 55 | +| `address` — Adresse | adresse civique | 98 % | 21 Rue Tri Jean | | |
| 56 | +| `city` — Ville | municipalité | 100 % | Grenville | | |
| 57 | +| `region` — Région | région administrative | 98 % | Laurentides | | |
| 58 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 100 % | 45.630063, -74.600568 | | |
| 59 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-22 | | |
| 60 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-22 | | |
| 61 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 100 % | 20:30 | | |
| 62 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 1 % | 1 | | |
| 63 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 64 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | | |
| 65 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 100 % | ["Doug St-Louis", "P'tit Gros Bison"] | | |
| 66 | +| `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ | | |
| 67 | +| `image` — Image | visuel (og:image ou média source) | 10 % | https://photos.bandsintown.com/large/25853181.jpeg | | |
| 68 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 69 | + | |
| 70 | +## Fréquence & budgets | |
| 71 | + | |
| 72 | +- **Cadence** : horaire (watcher PM2, rotation d'artistes) | |
| 73 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 74 | + | |
| 75 | +| Variable | Défaut | Rôle | | |
| 76 | +|---|---|---| | |
| 77 | +| `BANDSINTOWN_APP_ID` | `js_www.sorti-ka.com` | — | | |
| 78 | +| `BIT_ARTIST_MAX` | `100` | artistes/sync | | |
| 79 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 80 | + | |
| 81 | +## Volumétrie & complétude live | |
| 82 | + | |
| 83 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 84 | + | |
| 85 | +- **Événements en base** : 251 (dont **251 actifs**) | |
| 86 | +- **GPS** : 251/251 actifs (100 %) | |
| 87 | +- **Prix** : 2/251 actifs (1 %) | |
| 88 | +- **Heure (start_time)** : 250/251 actifs (100 %) | |
| 89 | +- **Artistes** : 251/251 actifs (100 %) | |
| 90 | +- **Image** : 24/251 actifs (10 %) | |
| 91 | +- **Salle (venue)** : 251/251 actifs (100 %) | |
| 92 | +- **Dernier sync** : 2026-08-18 02:32 — fetched 251, +143 ajoutés, ~0 mis à jour, -0 retirés | |
| 93 | +- **Syncs enregistrés** (sync_log) : 2 | |
| 94 | + | |
| 95 | +## Erreurs & dépannage | |
| 96 | + | |
| 97 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 98 | + | |
| 99 | +- L'API n'accepte que certains formats d'`app_id` : le format widget `js_www.sorti-ka.com` est testé accepté (2026-08) ; un app_id arbitraire simple est refusé. | |
| 100 | +- Rejouer un sync isolé : `python3 run.py sync --source bandsintown` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='bandsintown' ORDER BY ts DESC LIMIT 5;"` | |
| 101 | + | |
| 102 | +## Licence / attribution | |
| 103 | + | |
| 104 | +- API publique Bandsintown (app_id d'identification) — usage index + lien vers la fiche originale | |
| 105 | + | |
| 106 | +## Historique | |
| 107 | + | |
| 108 | +- **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. | |
| 109 | +- **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). | |
| 110 | + | |
| 111 | +Commits touchant `sortika/connectors/bandsintown.py` : | |
| 112 | + | |
| 113 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
added
docs/connecteurs/brossard.md
+111 −0
@@ -0,0 +1,111 @@ | ||
| 1 | +# Ville de Brossard — Calendrier des événements (`brossard`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `municipal` · Connecteur : `sortika/connectors/brossard.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Brossard — Calendrier des événements](https://brossard.ca/calendrier-des-evenements/) | |
| 10 | +- **Couverture** : Événements municipaux et de bibliothèque, Brossard (Montérégie) | |
| 11 | +- **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 | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : municipal | |
| 16 | +- **Endpoint** (`API`) : `https://brossard.ca/wp-json/wp/v2/city-event` | |
| 17 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 18 | +- **Pagination** : par numéro de page, per_page | |
| 19 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 20 | +- **Throttle** : 0.8 s entre requêtes | |
| 21 | +- **Accès légal** : API REST WordPress publique (aucune authentification) — GET throttlés 0,8 s, identification honnête | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/brossard.py : connecteur Ville de Brossard — calendrier des | |
| 26 | +> événements municipaux (brossard.ca, Montérégie) | |
| 27 | +> Source : API REST WordPress publique — type de contenu `city-event` | |
| 28 | +> (~400 événements : bibliothèque, conférences, ateliers, | |
| 29 | +> spectacles familiaux). Fraîcheur vérifiée 2026-08 (fiches | |
| 30 | +> publiées en août 2026 pour des dates jusqu'en décembre 2026). | |
| 31 | +> Extraction: 1) liste JSON /wp-json/wp/v2/city-event (paginée, champs | |
| 32 | +> title/link/content/modified) ; 2) dates + heures par fiche : | |
| 33 | +> bannière « Cet événement aura lieu le 6 décembre 2026, de | |
| 34 | +> 15 h 00 à 16 h 00 » (fiches ville) ou JSON-LD Event | |
| 35 | +> (fiches biblio.brossard.ca, redirection suivie) — cache disque | |
| 36 | +> incrémental data/brossard_cache.json, plafond | |
| 37 | +> BROSSARD_DETAIL_MAX fiches/sync, re-visite 7 jours. | |
| 38 | +> Accès : API REST WordPress publique (aucune authentification), GET | |
| 39 | +> throttlés, identification honnête. robots.txt : Allow. | |
| 40 | +> Prix : non publié par la source → jamais inventé. | |
| 41 | + | |
| 42 | +</details> | |
| 43 | + | |
| 44 | +## Champs récupérés → schéma | |
| 45 | + | |
| 46 | +Complétude mesurée sur les **262 événements actifs** de la source ; exemples tirés d'un événement réel (`brossard:37979`). | |
| 47 | + | |
| 48 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 49 | +|---|---|---|---| | |
| 50 | +| `title` — Titre | titre de l'événement | 100 % | Atelier libre : crée ton bracelet d’amitié (26 septembre 2026) | | |
| 51 | +| `description` — Description | texte descriptif (source ou fiche détail) | 100 % | Dans le cadre des Journées de la culture, viens créer ton propre bracelet d’amitié ! Choisis par… | | |
| 52 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://brossard.ca/calendrier-evenements/atelier-libre-cree-ton-bracelet-damitie-26-septembre-2… | | |
| 53 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["conference"] | | |
| 54 | +| `venue` — Salle (venue) | nom du lieu | 53 % | Bibliothèque de Brossard Georgette-Lepage | | |
| 55 | +| `address` — Adresse | adresse civique | 53 % | 7855, av San Francisco | | |
| 56 | +| `city` — Ville | municipalité | 100 % | Brossard | | |
| 57 | +| `region` — Région | région administrative | 100 % | Montérégie | | |
| 58 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 0 % | 45.4551469, -73.4682277 | | |
| 59 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-09-26 | | |
| 60 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-09-26 | | |
| 61 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 54 % | 13:00 | | |
| 62 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 0 % | ∅ | | |
| 63 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 64 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | | |
| 65 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | | |
| 66 | +| `organizer` — Organisateur | promoteur / organisme | 100 % | Ville de Brossard | | |
| 67 | +| `image` — Image | visuel (og:image ou média source) | 55 % | https://biblio.brossard.ca/wp-content/uploads/2026/07/bracelets_amitie.jpg | | |
| 68 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 69 | + | |
| 70 | +## Fréquence & budgets | |
| 71 | + | |
| 72 | +- **Cadence** : horaire (watcher PM2, incrémental) | |
| 73 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 74 | + | |
| 75 | +| Variable | Défaut | Rôle | | |
| 76 | +|---|---|---| | |
| 77 | +| `BROSSARD_DETAIL_MAX` | `80` | fiches/sync | | |
| 78 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 79 | + | |
| 80 | +## Volumétrie & complétude live | |
| 81 | + | |
| 82 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 83 | + | |
| 84 | +- **Événements en base** : 262 (dont **262 actifs**) | |
| 85 | +- **GPS** : 1/262 actifs (0 %) | |
| 86 | +- **Prix** : 0/262 actifs (0 %) | |
| 87 | +- **Heure (start_time)** : 141/262 actifs (54 %) | |
| 88 | +- **Artistes** : 0/262 actifs (0 %) | |
| 89 | +- **Image** : 145/262 actifs (55 %) | |
| 90 | +- **Salle (venue)** : 138/262 actifs (53 %) | |
| 91 | +- **Dernier sync** : 2026-08-18 02:35 — fetched 262, +11 ajoutés, ~56 mis à jour, -0 retirés | |
| 92 | +- **Syncs enregistrés** (sync_log) : 2 | |
| 93 | + | |
| 94 | +## Erreurs & dépannage | |
| 95 | + | |
| 96 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 97 | + | |
| 98 | +- Rejouer un sync isolé : `python3 run.py sync --source brossard` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='brossard' ORDER BY ts DESC LIMIT 5;"` | |
| 99 | + | |
| 100 | +## Licence / attribution | |
| 101 | + | |
| 102 | +- API REST WordPress publique (aucune authentification) — GET throttlés 0,8 s, identification honnête | |
| 103 | + | |
| 104 | +## Historique | |
| 105 | + | |
| 106 | +- **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 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 | + | |
| 109 | +Commits touchant `sortika/connectors/brossard.py` : | |
| 110 | + | |
| 111 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
added
docs/connecteurs/evenko.md
+105 −0
@@ -0,0 +1,105 @@ | ||
| 1 | +# evenko — grands concerts et festivals (`evenko`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `promoteur` · Connecteur : `sortika/connectors/evenko.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [evenko — grands concerts et festivals](https://evenko.ca/fr/evenements) | |
| 10 | +- **Couverture** : Grands concerts (Centre Bell, Place Bell, MTELUS…), festivals (Osheaga, ÎleSoniq…) | |
| 11 | +- **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 | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : promoteur | |
| 16 | +- **Endpoint** (`API`) : `https://evenko.ca/api/search` | |
| 17 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 18 | +- **Pagination** : par numéro de page | |
| 19 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 20 | +- **Accès légal** : robots.txt : Allow /api/search* (explicite) — lien billets = URL Ticketmaster officielle | |
| 21 | + | |
| 22 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 23 | + | |
| 24 | +> connectors/evenko.py : connecteur evenko — grands concerts & festivals | |
| 25 | +> Source : evenko.ca (promoteur : Centre Bell, Place Bell, MTELUS, Osheaga…) | |
| 26 | +> Extraction: endpoint /api/search (proxy Algolia interne) — EXPLICITEMENT | |
| 27 | +> permis par robots.txt (« Allow: /api/search* »). Format percé | |
| 28 | +> dans leur bundle JS : GET ?body=base64(JSON{params:[query, | |
| 29 | +> options], lang:"fr-CA"}). ~14 requêtes/sync (100 hits/page). | |
| 30 | +> Accès : robots.txt Allow /api/search* ; GET throttlés, identification | |
| 31 | +> honnête ; lien billets = URL Ticketmaster officielle du hit. | |
| 32 | +> Prix : champ `free` de la source → is_free, MAIS sondé null sur | |
| 33 | +> 100 % des hits (462/462, vérifié 2026-08) et l'index ne porte | |
| 34 | +> aucun montant (additional_information.regular_ticket = libellés | |
| 35 | +> + URLs Ticketmaster seulement, filtre free:true → 0 hit). | |
| 36 | +> Complément honnête : étiquettes explicites « gratuit » dans | |
| 37 | +> event_tag / promotional_tag → is_free=True. On n'invente rien. | |
| 38 | + | |
| 39 | +</details> | |
| 40 | + | |
| 41 | +## Champs récupérés → schéma | |
| 42 | + | |
| 43 | +Complétude mesurée sur les **423 événements actifs** de la source ; exemples tirés d'un événement réel (`evenko:e008791`). | |
| 44 | + | |
| 45 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 46 | +|---|---|---|---| | |
| 47 | +| `title` — Titre | titre de l'événement | 100 % | Disney Sur Glace présente La Magie en Famille | | |
| 48 | +| `description` — Description | texte descriptif (source ou fiche détail) | 18 % | ∅ | | |
| 49 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.ticketmaster.ca/event/310064E3C5686712?lang=fr-ca&brand=placebell | | |
| 50 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["autre"] | | |
| 51 | +| `venue` — Salle (venue) | nom du lieu | 100 % | Place Bell | | |
| 52 | +| `address` — Adresse | adresse civique | 0 % | ∅ | | |
| 53 | +| `city` — Ville | municipalité | 100 % | Laval | | |
| 54 | +| `region` — Région | région administrative | 100 % | Laval | | |
| 55 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 77 % | 45.5558423, -73.7216633 | | |
| 56 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-12-17 | | |
| 57 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-12-17 | | |
| 58 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 99 % | 19:00 | | |
| 59 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 0 % | ∅ | | |
| 60 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 61 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | | |
| 62 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 99 % | ["Disney Sur Glace présente La Magie en Famille"] | | |
| 63 | +| `organizer` — Organisateur | promoteur / organisme | 100 % | evenko | | |
| 64 | +| `image` — Image | visuel (og:image ou média source) | 100 % | https://images.ctfassets.net/3yxl57nu0yl4/3sI9AuDa7Ju1B2dtmFzVtY/a977ac5c95df131068a94762069db2f… | | |
| 65 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 66 | + | |
| 67 | +## Fréquence & budgets | |
| 68 | + | |
| 69 | +- **Cadence** : horaire (watcher PM2) | |
| 70 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 71 | + | |
| 72 | +## Volumétrie & complétude live | |
| 73 | + | |
| 74 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 75 | + | |
| 76 | +- **Événements en base** : 423 (dont **423 actifs**) | |
| 77 | +- **GPS** : 327/423 actifs (77 %) | |
| 78 | +- **Prix** : 0/423 actifs (0 %) | |
| 79 | +- **Heure (start_time)** : 420/423 actifs (99 %) | |
| 80 | +- **Artistes** : 420/423 actifs (99 %) | |
| 81 | +- **Image** : 423/423 actifs (100 %) | |
| 82 | +- **Salle (venue)** : 423/423 actifs (100 %) | |
| 83 | +- **Dernier sync** : 2026-08-18 02:35 — fetched 423, +0 ajoutés, ~9 mis à jour, -0 retirés | |
| 84 | +- **Syncs enregistrés** (sync_log) : 18 | |
| 85 | + | |
| 86 | +## Erreurs & dépannage | |
| 87 | + | |
| 88 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 89 | + | |
| 90 | +- Rejouer un sync isolé : `python3 run.py sync --source evenko` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='evenko' ORDER BY ts DESC LIMIT 5;"` | |
| 91 | + | |
| 92 | +## Licence / attribution | |
| 93 | + | |
| 94 | +- robots.txt : Allow /api/search* (explicite) — lien billets = URL Ticketmaster officielle | |
| 95 | + | |
| 96 | +## Historique | |
| 97 | + | |
| 98 | +- **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. | |
| 99 | +- **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). | |
| 100 | + | |
| 101 | +Commits touchant `sortika/connectors/evenko.py` : | |
| 102 | + | |
| 103 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
| 104 | +- `7d9d1b0` 2026-08-18 Enrichissement des connecteurs + géocodage des salles | |
| 105 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/gatineau.md
+45 −0
@@ -0,0 +1,45 @@ | ||
| 1 | +# Ville de Gatineau — Événements (`gatineau`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : abandonnee** · Type : `municipal` · Connecteur : *aucun (source sans connecteur runtime)* | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Gatineau — Événements](https://www.gatineau.ca/) | |
| 10 | +- **Couverture** : Gatineau (Outaouais) | |
| 11 | +- **Extraction** : n/d | |
| 12 | +- **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) | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : municipal | |
| 17 | +- **Endpoint** : voir URL source (https://www.gatineau.ca/) | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Accès légal** : n/d | |
| 20 | + | |
| 21 | +## Champs récupérés → schéma | |
| 22 | + | |
| 23 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 24 | + | |
| 25 | +## Fréquence & budgets | |
| 26 | + | |
| 27 | +- **Cadence** : n/d | |
| 28 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 29 | + | |
| 30 | +## Volumétrie & complétude live | |
| 31 | + | |
| 32 | +*Source sans connecteur runtime : aucune donnée en base.* | |
| 33 | + | |
| 34 | +## Erreurs & dépannage | |
| 35 | + | |
| 36 | + | |
| 37 | +## Licence / attribution | |
| 38 | + | |
| 39 | +- n/d | |
| 40 | + | |
| 41 | +## Historique | |
| 42 | + | |
| 43 | +- **Source abandonnée** — 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) | |
| 44 | +- **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. | |
| 45 | +- **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). | |
added
docs/connecteurs/laval.md
+99 −0
@@ -0,0 +1,99 @@ | ||
| 1 | +# Ville de Laval — Calendrier des activités (`laval`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `donnees-ouvertes` · Connecteur : `sortika/connectors/laval.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Laval — Calendrier des activités](https://www.donneesquebec.ca/recherche/dataset/calendrier-des-activites) | |
| 10 | +- **Couverture** : Activités municipales, Laval | |
| 11 | +- **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) | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : donnees-ouvertes | |
| 16 | +- **Endpoint** (`FEED`) : `https://www.donneesquebec.ca/recherche/dataset/df7add74-a741-4374-b3bd-22da8921c8b3/resource/b51a25de-bd06-4247-87ba-2b1ea8228005/download/calendrier-activites.json` | |
| 17 | +- **Endpoint** (`SITE`) : `https://www.laval.ca` | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Pagination** : par numéro de page | |
| 20 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 21 | +- **Accès légal** : Licence CC 4.0 (Données Québec) — Ville de Laval | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/laval.py : connecteur Ville de Laval — calendrier des activités | |
| 26 | +> Source : donneesquebec.ca, jeu « Calendrier des activités » (laval.ca) | |
| 27 | +> Extraction: fichier JSON officiel (données ouvertes, licence CC 4.0) | |
| 28 | +> Couverture: ~300 activités municipales (bibliothèques, culture, famille, | |
| 29 | +> plein air) avec dates, catégories, clientèles, lieux, images. | |
| 30 | +> https://www.donneesquebec.ca/recherche/dataset/calendrier-des-activites | |
| 31 | + | |
| 32 | +</details> | |
| 33 | + | |
| 34 | +## Champs récupérés → schéma | |
| 35 | + | |
| 36 | +Complétude mesurée sur les **277 événements actifs** de la source ; exemples tirés d'un événement réel (`laval:biblio-jeunesse-educazoo-saint-valentin-2025-02-15`). | |
| 37 | + | |
| 38 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 39 | +|---|---|---|---| | |
| 40 | +| `title` — Titre | titre de l'événement | 100 % | Éducazoo | | |
| 41 | +| `description` — Description | texte descriptif (source ou fiche détail) | 100 % | Cadeaux, parades, chants langoureux et techniques parfois étranges : les animaux déballent un ar… | | |
| 42 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.laval.ca/Pages/Fr/Calendrier/biblio-jeunesse-educazoo-saint-valentin.aspx | | |
| 43 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["conference", "musique", "famille"] | | |
| 44 | +| `venue` — Salle (venue) | nom du lieu | 90 % | Bibliothèque Émile-Nelligan | | |
| 45 | +| `address` — Adresse | adresse civique | 0 % | ∅ | | |
| 46 | +| `city` — Ville | municipalité | 100 % | Laval | | |
| 47 | +| `region` — Région | région administrative | 100 % | Laval | | |
| 48 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 51 % | 45.5521349, -73.7077536 | | |
| 49 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2025-02-15 | | |
| 50 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2025-02-15 | | |
| 51 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 95 % | 14:45 | | |
| 52 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 0 % | ∅ | | |
| 53 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 54 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | | |
| 55 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | | |
| 56 | +| `organizer` — Organisateur | promoteur / organisme | 100 % | Ville de Laval | | |
| 57 | +| `image` — Image | visuel (og:image ou média source) | 98 % | https://www.laval.ca/PublishingImages/Calendrier-des-activites/bibliotheque/jeunesse-educazoo-sa… | | |
| 58 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 59 | + | |
| 60 | +## Fréquence & budgets | |
| 61 | + | |
| 62 | +- **Cadence** : horaire (watcher PM2) | |
| 63 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 64 | + | |
| 65 | +## Volumétrie & complétude live | |
| 66 | + | |
| 67 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 68 | + | |
| 69 | +- **Événements en base** : 277 (dont **277 actifs**) | |
| 70 | +- **GPS** : 142/277 actifs (51 %) | |
| 71 | +- **Prix** : 0/277 actifs (0 %) | |
| 72 | +- **Heure (start_time)** : 264/277 actifs (95 %) | |
| 73 | +- **Artistes** : 0/277 actifs (0 %) | |
| 74 | +- **Image** : 271/277 actifs (98 %) | |
| 75 | +- **Salle (venue)** : 248/277 actifs (90 %) | |
| 76 | +- **Dernier sync** : 2026-08-18 02:35 — fetched 293, +0 ajoutés, ~32 mis à jour, -0 retirés | |
| 77 | +- **Syncs enregistrés** (sync_log) : 21 | |
| 78 | + | |
| 79 | +## Erreurs & dépannage | |
| 80 | + | |
| 81 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 82 | + | |
| 83 | +- Rejouer un sync isolé : `python3 run.py sync --source laval` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='laval' ORDER BY ts DESC LIMIT 5;"` | |
| 84 | + | |
| 85 | +## Licence / attribution | |
| 86 | + | |
| 87 | +- Licence CC 4.0 (Données Québec) — Ville de Laval | |
| 88 | + | |
| 89 | +**Mention requise (CC 4.0 — Données Québec)** : « Données de la **Ville de Laval** (Calendrier des activités), diffusées sous licence Creative Commons 4.0 via Données Québec. » L'attribution à la Ville de Laval est obligatoire. | |
| 90 | + | |
| 91 | +## Historique | |
| 92 | + | |
| 93 | +- **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. | |
| 94 | +- **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). | |
| 95 | + | |
| 96 | +Commits touchant `sortika/connectors/laval.py` : | |
| 97 | + | |
| 98 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
| 99 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/lavitrine.md
+110 −0
@@ -0,0 +1,110 @@ | ||
| 1 | +# La Vitrine culturelle (`lavitrine`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `billetterie` · Connecteur : `sortika/connectors/lavitrine.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [La Vitrine culturelle](https://www.lavitrine.com/) | |
| 10 | +- **Couverture** : Spectacles et sorties culturelles, Grand Montréal | |
| 11 | +- **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 | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : billetterie | |
| 16 | +- **Endpoint** (`SITEMAP`) : `https://www.lavitrine.com/sitemap.xml` | |
| 17 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 18 | +- **Pagination** : parcours de sitemap XML | |
| 19 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 20 | +- **Throttle** : 0.8 s entre requêtes | |
| 21 | +- **Accès légal** : robots.txt : Allow / + Content-Signal search=yes, use=reference — usage index + lien vers la fiche originale | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/lavitrine.py : connecteur La Vitrine culturelle (lavitrine.com) | |
| 26 | +> Source : billetterie/calendrier culturel — spectacles, expositions, | |
| 27 | +> concerts (Grand Montréal + Québec + tournées). | |
| 28 | +> Extraction: sitemap.xml public (~2 000 fiches /fr/evenement/ + 185 | |
| 29 | +> /fr/exposition/, lastmod par URL) puis pages fiche rendues | |
| 30 | +> serveur (h1, bloc .event_calendar : jour/mois/année, salle, | |
| 31 | +> ville ; og:image). GET directs — pas d'anti-bot. | |
| 32 | +> INCRÉMENTAL avec cache disque (data/lavitrine_cache.json) : | |
| 33 | +> nouvelles fiches d'abord, re-visite roulante après 7 jours, | |
| 34 | +> plafonné à LV_MAX_FETCH fiches/sync. | |
| 35 | +> Accès : robots.txt « User-Agent: * / Allow: / » + Content-Signal | |
| 36 | +> « search=yes, use=reference » → usage index + lien vers la | |
| 37 | +> fiche originale, conforme aux signaux publiés (CLAUDE.md §15). | |
| 38 | +> Prix : non exposés sur la fiche → is_free inconnu (jamais inventé). | |
| 39 | + | |
| 40 | +</details> | |
| 41 | + | |
| 42 | +## Champs récupérés → schéma | |
| 43 | + | |
| 44 | +Complétude mesurée sur les **5127 événements actifs** de la source ; exemples tirés d'un événement réel (`lavitrine:23777-2026-11-22`). | |
| 45 | + | |
| 46 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 47 | +|---|---|---|---| | |
| 48 | +| `title` — Titre | titre de l'événement | 100 % | 100 ans de chansons françaises avec Richard Charest | | |
| 49 | +| `description` — Description | texte descriptif (source ou fiche détail) | 0 % | ∅ | | |
| 50 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.lavitrine.com/fr/evenement/100-ans-de-chansons-francaises-avec-richard-charest/23777 | | |
| 51 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["musique"] | | |
| 52 | +| `venue` — Salle (venue) | nom du lieu | 100 % | Théâtre Petit Champlain | | |
| 53 | +| `address` — Adresse | adresse civique | 0 % | ∅ | | |
| 54 | +| `city` — Ville | municipalité | 100 % | Québec | | |
| 55 | +| `region` — Région | région administrative | 100 % | Capitale-Nationale | | |
| 56 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 52 % | 46.8115511, -71.203632 | | |
| 57 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-11-22 | | |
| 58 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-11-22 | | |
| 59 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 0 % | ∅ | | |
| 60 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 0 % | ∅ | | |
| 61 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 62 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | | |
| 63 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | | |
| 64 | +| `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ | | |
| 65 | +| `image` — Image | visuel (og:image ou média source) | 100 % | https://lvc-medias.lavitrine.com/acf4025b-3502-5217-b26d-f3bd5a35c6dc.webp | | |
| 66 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 67 | + | |
| 68 | +## Fréquence & budgets | |
| 69 | + | |
| 70 | +- **Cadence** : horaire (watcher PM2, incrémental) | |
| 71 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 72 | + | |
| 73 | +| Variable | Défaut | Rôle | | |
| 74 | +|---|---|---| | |
| 75 | +| `LV_MAX_FETCH` | `400` | fiches/sync (GET directs polis) | | |
| 76 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 77 | + | |
| 78 | +## Volumétrie & complétude live | |
| 79 | + | |
| 80 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 81 | + | |
| 82 | +- **Événements en base** : 5137 (dont **5127 actifs**) | |
| 83 | +- **GPS** : 2681/5127 actifs (52 %) | |
| 84 | +- **Prix** : 0/5127 actifs (0 %) | |
| 85 | +- **Heure (start_time)** : 0/5127 actifs (0 %) | |
| 86 | +- **Artistes** : 0/5127 actifs (0 %) | |
| 87 | +- **Image** : 5127/5127 actifs (100 %) | |
| 88 | +- **Salle (venue)** : 5125/5127 actifs (100 %) | |
| 89 | +- **Dernier sync** : 2026-08-18 02:35 — fetched 5127, +0 ajoutés, ~5127 mis à jour, -0 retirés | |
| 90 | +- **Syncs enregistrés** (sync_log) : 11 | |
| 91 | + | |
| 92 | +## Erreurs & dépannage | |
| 93 | + | |
| 94 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 95 | + | |
| 96 | +- Parcours par sitemap incrémental (`LV_MAX_FETCH` fiches/sync) : après un reset de cache, plusieurs cycles sont nécessaires pour recouvrir tout le catalogue. | |
| 97 | +- Rejouer un sync isolé : `python3 run.py sync --source lavitrine` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='lavitrine' ORDER BY ts DESC LIMIT 5;"` | |
| 98 | + | |
| 99 | +## Licence / attribution | |
| 100 | + | |
| 101 | +- robots.txt : Allow / + Content-Signal search=yes, use=reference — usage index + lien vers la fiche originale | |
| 102 | + | |
| 103 | +## Historique | |
| 104 | + | |
| 105 | +- **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. | |
| 106 | +- **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). | |
| 107 | + | |
| 108 | +Commits touchant `sortika/connectors/lavitrine.py` : | |
| 109 | + | |
| 110 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/lepointdevente.md
+115 −0
@@ -0,0 +1,115 @@ | ||
| 1 | +# Le point de vente — billetterie québécoise (`lepointdevente`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `billetterie` · Connecteur : `sortika/connectors/lepointdevente.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Le point de vente — billetterie québécoise](https://lepointdevente.com/billets) | |
| 10 | +- **Couverture** : Concerts, humour, théâtre, festivals — partout au Québec (~2 500 événements à venir) | |
| 11 | +- **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 ») | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : billetterie | |
| 16 | +- **Endpoint** (`BASE`) : `https://lepointdevente.com` | |
| 17 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 18 | +- **Pagination** : par numéro de page | |
| 19 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 20 | +- **Throttle** : 0.8 s entre requêtes | |
| 21 | +- **Accès légal** : robots.txt : « User-Agent: * / Allow: * » — GET throttlés, identification honnête, lien direct vers chaque billetterie | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/lepointdevente.py : connecteur Le point de vente (lepointdevente.com) | |
| 26 | +> Source : billetterie québécoise indépendante — concerts, humour, théâtre, | |
| 27 | +> festivals, partout au Québec (~1 500 événements à venir). | |
| 28 | +> Extraction: pages de liste HTML rendues serveur (/billets?page=N, paginé), | |
| 29 | +> parse regex des cartes (titre, date FR, salle + ville, image). | |
| 30 | +> Aucun rendu JS nécessaire. | |
| 31 | +> Accès : robots.txt = « User-Agent: * / Allow: * » (scraping permis) ; | |
| 32 | +> GET throttlés 0,6 s, identification honnête, ~65 requêtes/sync. | |
| 33 | +> Détail : enrichissement incrémental par fiches /billets/<id> (modèle | |
| 34 | +> lavitrine) — cache disque data/lepointdevente_cache.json, | |
| 35 | +> plafond LPDV_DETAIL_MAX fiches/sync (défaut 150), re-visite | |
| 36 | +> après 7 jours, throttle poli 0,8 s. Chaque fiche donne : | |
| 37 | +> description (og:description), heure précise (data-event-name) | |
| 38 | +> et l'id interne du widget billetterie (data-reference) → | |
| 39 | +> tarifs JSON réels via /plugins/rates/<id> (prix TTC affichés | |
| 40 | +> par la billetterie elle-même : price_min / price_label / | |
| 41 | +> is_free si tous les tarifs sont à 0 $). Jamais de prix inventé. | |
| 42 | + | |
| 43 | +</details> | |
| 44 | + | |
| 45 | +## Champs récupérés → schéma | |
| 46 | + | |
| 47 | +Complétude mesurée sur les **1787 événements actifs** de la source ; exemples tirés d'un événement réel (`lepointdevente:98a260908001`). | |
| 48 | + | |
| 49 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 50 | +|---|---|---|---| | |
| 51 | +| `title` — Titre | titre de l'événement | 100 % | GRANDE ALLÉE - Souper tardif festif | | |
| 52 | +| `description` — Description | texte descriptif (source ou fiche détail) | 31 % | Séance d'information des Missions commerciales de l'Université Laval!Le programme des Missions c… | | |
| 53 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://lepointdevente.com/billets/98a260908001 | | |
| 54 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["autre"] | | |
| 55 | +| `venue` — Salle (venue) | nom du lieu | 99 % | Grande-Allée | | |
| 56 | +| `address` — Adresse | adresse civique | 0 % | ∅ | | |
| 57 | +| `city` — Ville | municipalité | 100 % | Québec | | |
| 58 | +| `region` — Région | région administrative | 98 % | Capitale-Nationale | | |
| 59 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 27 % | 46.2897843, -72.6724193 | | |
| 60 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-09-08 | | |
| 61 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-09-08 | | |
| 62 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 94 % | 19:00 | | |
| 63 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 31 % | 1 | | |
| 64 | +| `price_min` — Prix min | tarif minimal réel ($) | 29 % | ∅ | | |
| 65 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 31 % | Admission générale 0 $ | | |
| 66 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 1 % | [] | | |
| 67 | +| `organizer` — Organisateur | promoteur / organisme | 0 % | ∅ | | |
| 68 | +| `image` — Image | visuel (og:image ou média source) | 100 % | https://tpos.s3.amazonaws.com/events/98A/26/09/03/001/98a260903001-1152x648-fr-6a677853.png | | |
| 69 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 70 | + | |
| 71 | +## Fréquence & budgets | |
| 72 | + | |
| 73 | +- **Cadence** : horaire (watcher PM2) | |
| 74 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 75 | + | |
| 76 | +| Variable | Défaut | Rôle | | |
| 77 | +|---|---|---| | |
| 78 | +| `LPDV_DETAIL_MAX` | `150` | fiches/sync | | |
| 79 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 80 | + | |
| 81 | +## Volumétrie & complétude live | |
| 82 | + | |
| 83 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 84 | + | |
| 85 | +- **Événements en base** : 4191 (dont **1787 actifs**) | |
| 86 | +- **GPS** : 476/1787 actifs (27 %) | |
| 87 | +- **Prix** : 547/1787 actifs (31 %) | |
| 88 | +- **Heure (start_time)** : 1673/1787 actifs (94 %) | |
| 89 | +- **Artistes** : 16/1787 actifs (1 %) | |
| 90 | +- **Image** : 1787/1787 actifs (100 %) | |
| 91 | +- **Salle (venue)** : 1777/1787 actifs (99 %) | |
| 92 | +- **Dernier sync** : 2026-08-18 02:41 — fetched 1787, +0 ajoutés, ~164 mis à jour, -0 retirés | |
| 93 | +- **Syncs enregistrés** (sync_log) : 22 | |
| 94 | + | |
| 95 | +## Erreurs & dépannage | |
| 96 | + | |
| 97 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 98 | + | |
| 99 | +- L'enrichissement par fiches détail est incrémental (cache `data/lepointdevente_cache.json`, plafond `LPDV_DETAIL_MAX`/sync, re-visite 7 j) : la complétude description/heure/prix monte au fil des cycles. | |
| 100 | +- Rejouer un sync isolé : `python3 run.py sync --source lepointdevente` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='lepointdevente' ORDER BY ts DESC LIMIT 5;"` | |
| 101 | + | |
| 102 | +## Licence / attribution | |
| 103 | + | |
| 104 | +- robots.txt : « User-Agent: * / Allow: * » — GET throttlés, identification honnête, lien direct vers chaque billetterie | |
| 105 | + | |
| 106 | +## Historique | |
| 107 | + | |
| 108 | +- **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. | |
| 109 | +- **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). | |
| 110 | + | |
| 111 | +Commits touchant `sortika/connectors/lepointdevente.py` : | |
| 112 | + | |
| 113 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
| 114 | +- `7d9d1b0` 2026-08-18 Enrichissement des connecteurs + géocodage des salles | |
| 115 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/levis.md
+45 −0
@@ -0,0 +1,45 @@ | ||
| 1 | +# Ville de Lévis — Calendrier (`levis`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : abandonnee** · Type : `municipal` · Connecteur : *aucun (source sans connecteur runtime)* | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Lévis — Calendrier](https://www.ville.levis.qc.ca/) | |
| 10 | +- **Couverture** : Lévis (Chaudière-Appalaches) | |
| 11 | +- **Extraction** : n/d | |
| 12 | +- **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) | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : municipal | |
| 17 | +- **Endpoint** : voir URL source (https://www.ville.levis.qc.ca/) | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Accès légal** : n/d | |
| 20 | + | |
| 21 | +## Champs récupérés → schéma | |
| 22 | + | |
| 23 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 24 | + | |
| 25 | +## Fréquence & budgets | |
| 26 | + | |
| 27 | +- **Cadence** : n/d | |
| 28 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 29 | + | |
| 30 | +## Volumétrie & complétude live | |
| 31 | + | |
| 32 | +*Source sans connecteur runtime : aucune donnée en base.* | |
| 33 | + | |
| 34 | +## Erreurs & dépannage | |
| 35 | + | |
| 36 | + | |
| 37 | +## Licence / attribution | |
| 38 | + | |
| 39 | +- n/d | |
| 40 | + | |
| 41 | +## Historique | |
| 42 | + | |
| 43 | +- **Source abandonnée** — 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) | |
| 44 | +- **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. | |
| 45 | +- **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). | |
added
docs/connecteurs/longueuil.md
+45 −0
@@ -0,0 +1,45 @@ | ||
| 1 | +# Ville de Longueuil — Événements (`longueuil`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : abandonnee** · Type : `donnees-ouvertes` · Connecteur : *aucun (source sans connecteur runtime)* | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Longueuil — Événements](https://www.donneesquebec.ca/recherche/dataset/evenements) | |
| 10 | +- **Couverture** : Longueuil (Montérégie) | |
| 11 | +- **Extraction** : CSV (Données Québec) | |
| 12 | +- **Note** : Jeu de données périmé — dernière date d'événement : 2017-03 (vérifié 2026-08-17) | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : donnees-ouvertes | |
| 17 | +- **Endpoint** : voir URL source (https://www.donneesquebec.ca/recherche/dataset/evenements) | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Accès légal** : Licence CC 4.0 (Données Québec) | |
| 20 | + | |
| 21 | +## Champs récupérés → schéma | |
| 22 | + | |
| 23 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 24 | + | |
| 25 | +## Fréquence & budgets | |
| 26 | + | |
| 27 | +- **Cadence** : n/d | |
| 28 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 29 | + | |
| 30 | +## Volumétrie & complétude live | |
| 31 | + | |
| 32 | +*Source sans connecteur runtime : aucune donnée en base.* | |
| 33 | + | |
| 34 | +## Erreurs & dépannage | |
| 35 | + | |
| 36 | + | |
| 37 | +## Licence / attribution | |
| 38 | + | |
| 39 | +- Licence CC 4.0 (Données Québec) | |
| 40 | + | |
| 41 | +## Historique | |
| 42 | + | |
| 43 | +- **Source abandonnée** — Jeu de données périmé — dernière date d'événement : 2017-03 (vérifié 2026-08-17) | |
| 44 | +- **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. | |
| 45 | +- **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). | |
added
docs/connecteurs/montreal.md
+114 −0
@@ -0,0 +1,114 @@ | ||
| 1 | +# Ville de Montréal — Événements publics (`montreal`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `donnees-ouvertes` · Connecteur : `sortika/connectors/montreal.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Montréal — Événements publics](https://donnees.montreal.ca/dataset/evenements-publics) | |
| 10 | +- **Couverture** : Événements municipaux, île de Montréal | |
| 11 | +- **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) | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : donnees-ouvertes | |
| 16 | +- **Endpoint** (`API`) : `https://donnees.montreal.ca/api/3/action/datastore_search` | |
| 17 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 18 | +- **Pagination** : offset/limit | |
| 19 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 20 | +- **Throttle** : 0.4 s entre requêtes | |
| 21 | +- **Accès légal** : Licence CC BY 4.0 (donnees.montreal.ca) — attribution : Ville de Montréal | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/montreal.py : connecteur Ville de Montréal — événements publics | |
| 26 | +> Source : donnees.montreal.ca, jeu « Événements publics » (montreal.ca) | |
| 27 | +> Extraction: API CKAN datastore_search (JSON, paginée) — données ouvertes, | |
| 28 | +> Licence CC BY 4.0. Aucune restriction de scraping. | |
| 29 | +> Couverture: ~5 600 événements municipaux (culture, conseils, famille, | |
| 30 | +> sport, marchés) avec dates, coût, arrondissement, lat/lng. | |
| 31 | +> Images : absentes du jeu de données → enrichissement incrémental par | |
| 32 | +> og:image des fiches montreal.ca (cache disque, plafonné par | |
| 33 | +> sync via MTL_IMG_MAX, défaut 300). | |
| 34 | +> https://donnees.montreal.ca/dataset/evenements-publics | |
| 35 | + | |
| 36 | +</details> | |
| 37 | + | |
| 38 | +## Champs récupérés → schéma | |
| 39 | + | |
| 40 | +Complétude mesurée sur les **5679 événements actifs** de la source ; exemples tirés d'un événement réel (`montreal:les-legendaires-cine-ete-111611`). | |
| 41 | + | |
| 42 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 43 | +|---|---|---|---| | |
| 44 | +| `title` — Titre | titre de l'événement | 100 % | Les Légendaires – Ciné-été | | |
| 45 | +| `description` — Description | texte descriptif (source ou fiche détail) | 100 % | Découvrez cette adaptation cinématographique des bandes dessinées de Patrick Sobral, réalisée pa… | | |
| 46 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://montreal.ca/evenements/les-legendaires-cine-ete-111611 | | |
| 47 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["cinema"] | | |
| 48 | +| `venue` — Salle (venue) | nom du lieu | 4 % | Cinéma Beaubien | | |
| 49 | +| `address` — Adresse | adresse civique | 4 % | 2396 Rue Beaubien E | | |
| 50 | +| `city` — Ville | municipalité | 100 % | Montréal | | |
| 51 | +| `region` — Région | région administrative | 100 % | Montréal | | |
| 52 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 97 % | 45.548115, -73.5921 | | |
| 53 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2026-08-22 | | |
| 54 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2026-08-22 | | |
| 55 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 10 % | 09:30 | | |
| 56 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 100 % | 1 | | |
| 57 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 58 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 100 % | Gratuit — Avec billet | | |
| 59 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | | |
| 60 | +| `organizer` — Organisateur | promoteur / organisme | 100 % | Ville de Montréal — Rosemont–La Petite-Patrie | | |
| 61 | +| `image` — Image | visuel (og:image ou média source) | 58 % | https://res.cloudinary.com/villemontreal/image/upload/w_1200,h_630,c_fill/f_auto,dpr_auto,q_auto… | | |
| 62 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 63 | + | |
| 64 | +## Fréquence & budgets | |
| 65 | + | |
| 66 | +- **Cadence** : horaire (watcher PM2) | |
| 67 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 68 | + | |
| 69 | +| Variable | Défaut | Rôle | | |
| 70 | +|---|---|---| | |
| 71 | +| `MTL_IMG_MAX` | `300` | — | | |
| 72 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 73 | + | |
| 74 | +## Volumétrie & complétude live | |
| 75 | + | |
| 76 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 77 | + | |
| 78 | +- **Événements en base** : 5729 (dont **5679 actifs**) | |
| 79 | +- **GPS** : 5530/5679 actifs (97 %) | |
| 80 | +- **Prix** : 5679/5679 actifs (100 %) | |
| 81 | +- **Heure (start_time)** : 588/5679 actifs (10 %) | |
| 82 | +- **Artistes** : 0/5679 actifs (0 %) | |
| 83 | +- **Image** : 3296/5679 actifs (58 %) | |
| 84 | +- **Salle (venue)** : 246/5679 actifs (4 %) | |
| 85 | +- **Dernier sync** : 2026-08-18 02:41 — fetched 5679, +0 ajoutés, ~300 mis à jour, -0 retirés | |
| 86 | +- **Syncs enregistrés** (sync_log) : 22 | |
| 87 | + | |
| 88 | +## Erreurs & dépannage | |
| 89 | + | |
| 90 | +Erreurs relevées dans `sync_log` : | |
| 91 | + | |
| 92 | +| Erreur | Occurrences | Dernière fois | | |
| 93 | +|---|---|---| | |
| 94 | +| 403 Client Error: Forbidden for url: https://donnees.montreal.ca/api/3/action/datastore_search?r… | 1 | 2026-08-17 15:45 | | |
| 95 | + | |
| 96 | +- Le WAF de donnees.montreal.ca renvoie **403** à tout User-Agent contenant « bot » — le UA `SortiKa/1.0 (+URL; courriel)` est volontairement sans ce mot. Un 403 ponctuel est en général transitoire (WAF) ; vérifier le UA avant tout. | |
| 97 | +- Rejouer un sync isolé : `python3 run.py sync --source montreal` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='montreal' ORDER BY ts DESC LIMIT 5;"` | |
| 98 | + | |
| 99 | +## Licence / attribution | |
| 100 | + | |
| 101 | +- Licence CC BY 4.0 (donnees.montreal.ca) — attribution : Ville de Montréal | |
| 102 | + | |
| 103 | +**Mention requise (CC BY 4.0)** : « Contient des données de la **Ville de Montréal**, sous licence CC BY 4.0 (donnees.montreal.ca). » L'attribution doit accompagner toute réutilisation publique des événements de cette source. | |
| 104 | + | |
| 105 | +## Historique | |
| 106 | + | |
| 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). | |
| 109 | + | |
| 110 | +Commits touchant `sortika/connectors/montreal.py` : | |
| 111 | + | |
| 112 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
| 113 | +- `7d9d1b0` 2026-08-18 Enrichissement des connecteurs + géocodage des salles | |
| 114 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/repentigny.md
+45 −0
@@ -0,0 +1,45 @@ | ||
| 1 | +# Ville de Repentigny — Événements (`repentigny`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : abandonnee** · Type : `donnees-ouvertes` · Connecteur : *aucun (source sans connecteur runtime)* | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Repentigny — Événements](https://www.donneesquebec.ca/recherche/dataset/evenement-sur-le-territoire-de-la-ville) | |
| 10 | +- **Couverture** : Repentigny (Lanaudière) | |
| 11 | +- **Extraction** : CSV (Données Québec) | |
| 12 | +- **Note** : Jeu de données périmé — dernière date d'événement : 2021-09 (vérifié 2026-08-17) | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : donnees-ouvertes | |
| 17 | +- **Endpoint** : voir URL source (https://www.donneesquebec.ca/recherche/dataset/evenement-sur-le-territoire-de-la-ville) | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Accès légal** : Licence CC 4.0 (Données Québec) | |
| 20 | + | |
| 21 | +## Champs récupérés → schéma | |
| 22 | + | |
| 23 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 24 | + | |
| 25 | +## Fréquence & budgets | |
| 26 | + | |
| 27 | +- **Cadence** : n/d | |
| 28 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 29 | + | |
| 30 | +## Volumétrie & complétude live | |
| 31 | + | |
| 32 | +*Source sans connecteur runtime : aucune donnée en base.* | |
| 33 | + | |
| 34 | +## Erreurs & dépannage | |
| 35 | + | |
| 36 | + | |
| 37 | +## Licence / attribution | |
| 38 | + | |
| 39 | +- Licence CC 4.0 (Données Québec) | |
| 40 | + | |
| 41 | +## Historique | |
| 42 | + | |
| 43 | +- **Source abandonnée** — Jeu de données périmé — dernière date d'événement : 2021-09 (vérifié 2026-08-17) | |
| 44 | +- **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. | |
| 45 | +- **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). | |
added
docs/connecteurs/saguenay.md
+45 −0
@@ -0,0 +1,45 @@ | ||
| 1 | +# Ville de Saguenay — Événements culturels (`saguenay`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : abandonnee** · Type : `donnees-ouvertes` · Connecteur : *aucun (source sans connecteur runtime)* | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Saguenay — Événements culturels](https://www.donneesquebec.ca/recherche/dataset/sag_evenements-culturels) | |
| 10 | +- **Couverture** : Saguenay | |
| 11 | +- **Extraction** : CSV (Données Québec) | |
| 12 | +- **Note** : Jeu de données périmé — dernière date d'événement : 2022-06 (vérifié 2026-08-17) | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : donnees-ouvertes | |
| 17 | +- **Endpoint** : voir URL source (https://www.donneesquebec.ca/recherche/dataset/sag_evenements-culturels) | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Accès légal** : Licence CC 4.0 (Données Québec) | |
| 20 | + | |
| 21 | +## Champs récupérés → schéma | |
| 22 | + | |
| 23 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 24 | + | |
| 25 | +## Fréquence & budgets | |
| 26 | + | |
| 27 | +- **Cadence** : n/d | |
| 28 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 29 | + | |
| 30 | +## Volumétrie & complétude live | |
| 31 | + | |
| 32 | +*Source sans connecteur runtime : aucune donnée en base.* | |
| 33 | + | |
| 34 | +## Erreurs & dépannage | |
| 35 | + | |
| 36 | + | |
| 37 | +## Licence / attribution | |
| 38 | + | |
| 39 | +- Licence CC 4.0 (Données Québec) | |
| 40 | + | |
| 41 | +## Historique | |
| 42 | + | |
| 43 | +- **Source abandonnée** — Jeu de données périmé — dernière date d'événement : 2022-06 (vérifié 2026-08-17) | |
| 44 | +- **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. | |
| 45 | +- **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). | |
added
docs/connecteurs/sherbrooke.md
+100 −0
@@ -0,0 +1,100 @@ | ||
| 1 | +# Ville de Sherbrooke — Calendrier des événements (`sherbrooke`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `municipal` · Connecteur : `sortika/connectors/sherbrooke.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Sherbrooke — Calendrier des événements](https://www.sherbrooke.ca/fr/culture-sports-et-loisirs/calendrier-des-activites) | |
| 10 | +- **Couverture** : Événements municipaux et culturels, Sherbrooke (Estrie) | |
| 11 | +- **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) | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : municipal | |
| 16 | +- **Endpoint** (`PAGE`) : `https://www.sherbrooke.ca/fr/culture-sports-et-loisirs/calendrier-des-activites` | |
| 17 | +- **Endpoint** (`SITE`) : `https://www.sherbrooke.ca` | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Pagination** : aucune (flux unique) | |
| 20 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 21 | +- **Accès légal** : page municipale publique (référencée sur Données Québec) — GET direct, identification honnête | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/sherbrooke.py : connecteur Ville de Sherbrooke — calendrier officiel | |
| 26 | +> Source : sherbrooke.ca, « Calendrier des événements en temps réel » | |
| 27 | +> (référencé sur Données Québec : calendrier-des-evenements-en-temps-reel) | |
| 28 | +> Extraction: la page rend TOUT le calendrier dans window['TRANSFER_CACHE'] | |
| 29 | +> (JSON embarqué, CMS Maruche) → 1 seule requête, ~270 événements | |
| 30 | +> (nom, périodes, gratuité `payant`, catégories, clientèles, | |
| 31 | +> images /Fichiers/<module>/Entities/<id>/<mainPicture>). | |
| 32 | +> Accès : page municipale publique, GET direct, identification honnête. | |
| 33 | +> Prix : booléen `payant` de la source → is_free (montants non exposés). | |
| 34 | + | |
| 35 | +</details> | |
| 36 | + | |
| 37 | +## Champs récupérés → schéma | |
| 38 | + | |
| 39 | +Complétude mesurée sur les **271 événements actifs** de la source ; exemples tirés d'un événement réel (`sherbrooke:499`). | |
| 40 | + | |
| 41 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 42 | +|---|---|---|---| | |
| 43 | +| `title` — Titre | titre de l'événement | 100 % | Séance d’échange et de discussion - relocalisation de la caserne d’incendie Hector-Olivier-Camir… | | |
| 44 | +| `description` — Description | texte descriptif (source ou fiche détail) | 96 % | La construction d’un nouveau poste incendie vise à bonifier le service et à réduire les délais d… | | |
| 45 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | https://www.sherbrooke.ca/fr/culture-sports-et-loisirs/calendrier-des-activites/499/seance-d-ech… | | |
| 46 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["autre"] | | |
| 47 | +| `venue` — Salle (venue) | nom du lieu | 0 % | ∅ | | |
| 48 | +| `address` — Adresse | adresse civique | 0 % | ∅ | | |
| 49 | +| `city` — Ville | municipalité | 100 % | Sherbrooke | | |
| 50 | +| `region` — Région | région administrative | 100 % | Estrie | | |
| 51 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 0 % | ∅ | | |
| 52 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 100 % | 2022-06-13 | | |
| 53 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 100 % | 2022-06-13 | | |
| 54 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 88 % | 18:30 | | |
| 55 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 100 % | 1 | | |
| 56 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 57 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | | |
| 58 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | | |
| 59 | +| `organizer` — Organisateur | promoteur / organisme | 100 % | Ville de Sherbrooke | | |
| 60 | +| `image` — Image | visuel (og:image ou média source) | 100 % | https://www.sherbrooke.ca/Fichiers/3337a882-4a53-e611-80ea-00155d09650f/Entities/49d0f046-294c-4… | | |
| 61 | +| `website` — Site web | site officiel de l'événement | 0 % | ∅ | | |
| 62 | + | |
| 63 | +## Fréquence & budgets | |
| 64 | + | |
| 65 | +- **Cadence** : horaire (watcher PM2) | |
| 66 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 67 | + | |
| 68 | +## Volumétrie & complétude live | |
| 69 | + | |
| 70 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 71 | + | |
| 72 | +- **Événements en base** : 271 (dont **271 actifs**) | |
| 73 | +- **GPS** : 0/271 actifs (0 %) | |
| 74 | +- **Prix** : 271/271 actifs (100 %) | |
| 75 | +- **Heure (start_time)** : 239/271 actifs (88 %) | |
| 76 | +- **Artistes** : 0/271 actifs (0 %) | |
| 77 | +- **Image** : 270/271 actifs (100 %) | |
| 78 | +- **Salle (venue)** : 0/271 actifs (0 %) | |
| 79 | +- **Dernier sync** : 2026-08-18 02:41 — fetched 271, +0 ajoutés, ~0 mis à jour, -0 retirés | |
| 80 | +- **Syncs enregistrés** (sync_log) : 14 | |
| 81 | + | |
| 82 | +## Erreurs & dépannage | |
| 83 | + | |
| 84 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 85 | + | |
| 86 | +- Rejouer un sync isolé : `python3 run.py sync --source sherbrooke` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='sherbrooke' ORDER BY ts DESC LIMIT 5;"` | |
| 87 | + | |
| 88 | +## Licence / attribution | |
| 89 | + | |
| 90 | +- page municipale publique (référencée sur Données Québec) — GET direct, identification honnête | |
| 91 | + | |
| 92 | +## Historique | |
| 93 | + | |
| 94 | +- **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. | |
| 95 | +- **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). | |
| 96 | + | |
| 97 | +Commits touchant `sortika/connectors/sherbrooke.py` : | |
| 98 | + | |
| 99 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
| 100 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/sitq.md
+112 −0
@@ -0,0 +1,112 @@ | ||
| 1 | +# SIT Québec — Ministère du Tourisme (`sitq`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : actif** · Type : `donnees-ouvertes` · Connecteur : `sortika/connectors/sitq.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [SIT Québec — Ministère du Tourisme](https://www.donneesquebec.ca/recherche/dataset/sit-quebec-evenements) | |
| 10 | +- **Couverture** : Événements touristiques, toutes les régions du Québec | |
| 11 | +- **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) | |
| 12 | + | |
| 13 | +## Accès | |
| 14 | + | |
| 15 | +- **Type** : donnees-ouvertes | |
| 16 | +- **Endpoint** (`FEED`) : `https://api-v3.tourinsoft.com/api/syndications/mto.tourinsoft.com/c6ab1c9e-f594-463e-b036-5a029197f3a9?format=json` | |
| 17 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 18 | +- **Pagination** : aucune (flux unique) | |
| 19 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 20 | +- **Throttle** : 0.3 s entre requêtes | |
| 21 | +- **Accès légal** : Licence Creative Commons 4.0 (Données Québec) — API officielle publiée par le Ministère du Tourisme | |
| 22 | + | |
| 23 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 24 | + | |
| 25 | +> connectors/sitq.py : connecteur SIT Québec — Ministère du Tourisme | |
| 26 | +> Source : Système d'information touristique Québec (Données Québec) | |
| 27 | +> Extraction: API JSON officielle Tourinsoft (syndication publique) | |
| 28 | +> Accès : données ouvertes — Licence CC 4.0 (Données Québec), API publiée | |
| 29 | +> par le Ministère du Tourisme. Aucune restriction de scraping. | |
| 30 | +> Couverture: ~1 600 événements touristiques, TOUTES les régions du Québec | |
| 31 | +> (festivals, salons, manifestations sportives et culturelles), | |
| 32 | +> avec région touristique, thèmes, dates, géolocalisation, site web. | |
| 33 | +> Contacts : TelephonePrincipals / Courriels (moyens de communication) → | |
| 34 | +> ligne « Renseignements : … » en description (le flux syndiqué | |
| 35 | +> ne publie AUCUN groupe Descriptions* ni bloc tarifs — vérifié | |
| 36 | +> sur l'union des clés des 1 598 fiches, 2026-08 ; is_free et | |
| 37 | +> price_* restent donc inconnus, jamais inventés). | |
| 38 | +> https://www.donneesquebec.ca/recherche/dataset/sit-quebec-evenements | |
| 39 | + | |
| 40 | +</details> | |
| 41 | + | |
| 42 | +## Champs récupérés → schéma | |
| 43 | + | |
| 44 | +Complétude mesurée sur les **1598 événements actifs** de la source ; exemples tirés d'un événement réel (`sitq:EVENMTOV500NIO`). | |
| 45 | + | |
| 46 | +| Champ (`events.*`) | Description | Complétude | Exemple réel | | |
| 47 | +|---|---|---|---| | |
| 48 | +| `title` — Titre | titre de l'événement | 100 % | JACKALOPE | | |
| 49 | +| `description` — Description | texte descriptif (source ou fiche détail) | 87 % | ∅ | | |
| 50 | +| `url` — URL | lien vers la fiche originale / billetterie | 100 % | http://jackalopefest.ca | | |
| 51 | +| `categories` — Catégories | taxonomie canonique Sorti-Ka (JSON) | 100 % | ["sport", "musique"] | | |
| 52 | +| `venue` — Salle (venue) | nom du lieu | 66 % | Quai Jacques-Cartier | | |
| 53 | +| `address` — Adresse | adresse civique | 84 % | Rue de la Commune Est | | |
| 54 | +| `city` — Ville | municipalité | 96 % | Montréal | | |
| 55 | +| `region` — Région | région administrative | 99 % | Montréal | | |
| 56 | +| `lat` — GPS (lat/lng) | coordonnées géographiques | 97 % | 45.507703, -73.552067 | | |
| 57 | +| `start_date` — Date début | date locale AAAA-MM-JJ | 99 % | 2026-09-11 | | |
| 58 | +| `end_date` — Date fin | date locale AAAA-MM-JJ | 99 % | 2026-09-13 | | |
| 59 | +| `start_time` — Heure (start_time) | heure locale HH:MM (Québec) | 0 % | ∅ | | |
| 60 | +| `is_free` — Gratuité (is_free) | 1 gratuit / 0 payant / NULL inconnu | 0 % | ∅ | | |
| 61 | +| `price_min` — Prix min | tarif minimal réel ($) | 0 % | ∅ | | |
| 62 | +| `price_label` — Libellé prix | étiquette tarifaire affichable | 0 % | ∅ | | |
| 63 | +| `artists` — Artistes | têtes d'affiche / lineup (JSON) | 0 % | [] | | |
| 64 | +| `organizer` — Organisateur | promoteur / organisme | 100 % | Tourisme Montréal | | |
| 65 | +| `image` — Image | visuel (og:image ou média source) | 35 % | http://jackalope.co/cdn/shop/files/jackalope_e0d516dd-87d0-4058-ad4d-153c59ef7f99.jpg?v=17736954… | | |
| 66 | +| `website` — Site web | site officiel de l'événement | 93 % | http://jackalopefest.ca | | |
| 67 | + | |
| 68 | +## Fréquence & budgets | |
| 69 | + | |
| 70 | +- **Cadence** : horaire (watcher PM2) | |
| 71 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 72 | + | |
| 73 | +| Variable | Défaut | Rôle | | |
| 74 | +|---|---|---| | |
| 75 | +| `SITQ_IMG_MAX` | `200` | — | | |
| 76 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 77 | + | |
| 78 | +## Volumétrie & complétude live | |
| 79 | + | |
| 80 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 81 | + | |
| 82 | +- **Événements en base** : 1606 (dont **1598 actifs**) | |
| 83 | +- **GPS** : 1548/1598 actifs (97 %) | |
| 84 | +- **Prix** : 0/1598 actifs (0 %) | |
| 85 | +- **Heure (start_time)** : 0/1598 actifs (0 %) | |
| 86 | +- **Artistes** : 0/1598 actifs (0 %) | |
| 87 | +- **Image** : 558/1598 actifs (35 %) | |
| 88 | +- **Salle (venue)** : 1050/1598 actifs (66 %) | |
| 89 | +- **Dernier sync** : 2026-08-18 02:41 — fetched 1598, +0 ajoutés, ~1598 mis à jour, -0 retirés | |
| 90 | +- **Syncs enregistrés** (sync_log) : 21 | |
| 91 | + | |
| 92 | +## Erreurs & dépannage | |
| 93 | + | |
| 94 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 95 | + | |
| 96 | +- Rejouer un sync isolé : `python3 run.py sync --source sitq` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='sitq' ORDER BY ts DESC LIMIT 5;"` | |
| 97 | + | |
| 98 | +## Licence / attribution | |
| 99 | + | |
| 100 | +- Licence Creative Commons 4.0 (Données Québec) — API officielle publiée par le Ministère du Tourisme | |
| 101 | + | |
| 102 | +**Mention requise (CC 4.0 — Données Québec)** : « Données du **SIT Québec — Ministère du Tourisme**, diffusées sous licence Creative Commons 4.0 via Données Québec. » L'attribution au Ministère du Tourisme est obligatoire. | |
| 103 | + | |
| 104 | +## Historique | |
| 105 | + | |
| 106 | +- **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 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 | + | |
| 109 | +Commits touchant `sortika/connectors/sitq.py` : | |
| 110 | + | |
| 111 | +- `7d9d1b0` 2026-08-18 Enrichissement des connecteurs + géocodage des salles | |
| 112 | +- `9164456` 2026-08-17 Sorti·Ka v1 — agrégateur de sorties & événements du Québec | |
added
docs/connecteurs/terrebonne.md
+45 −0
@@ -0,0 +1,45 @@ | ||
| 1 | +# Ville de Terrebonne — Calendrier (`terrebonne`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : abandonnee** · Type : `municipal` · Connecteur : *aucun (source sans connecteur runtime)* | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Terrebonne — Calendrier](https://terrebonne.ca/calendrier/) | |
| 10 | +- **Couverture** : Terrebonne (Lanaudière) | |
| 11 | +- **Extraction** : n/d | |
| 12 | +- **Note** : Cloudflare bloque tout GET non navigateur (403) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18) | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : municipal | |
| 17 | +- **Endpoint** : voir URL source (https://terrebonne.ca/calendrier/) | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Accès légal** : n/d | |
| 20 | + | |
| 21 | +## Champs récupérés → schéma | |
| 22 | + | |
| 23 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 24 | + | |
| 25 | +## Fréquence & budgets | |
| 26 | + | |
| 27 | +- **Cadence** : n/d | |
| 28 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 29 | + | |
| 30 | +## Volumétrie & complétude live | |
| 31 | + | |
| 32 | +*Source sans connecteur runtime : aucune donnée en base.* | |
| 33 | + | |
| 34 | +## Erreurs & dépannage | |
| 35 | + | |
| 36 | + | |
| 37 | +## Licence / attribution | |
| 38 | + | |
| 39 | +- n/d | |
| 40 | + | |
| 41 | +## Historique | |
| 42 | + | |
| 43 | +- **Source abandonnée** — Cloudflare bloque tout GET non navigateur (403) et aucun jeu « événements » sur Données Québec (vérifié 2026-08-18) | |
| 44 | +- **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. | |
| 45 | +- **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). | |
added
docs/connecteurs/ticketmaster.md
+89 −0
@@ -0,0 +1,89 @@ | ||
| 1 | +# Ticketmaster — Discovery API (Québec) (`ticketmaster`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : prêt — clé requise** · Type : `billetterie` · Connecteur : `sortika/connectors/ticketmaster.py` | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ticketmaster — Discovery API (Québec)](https://developer.ticketmaster.com/products-and-docs/apis/discovery-api/v2/) | |
| 10 | +- **Couverture** : Grands spectacles, sports et concerts — partout au Québec | |
| 11 | +- **Extraction** : API officielle Discovery v2 — GET JSON paginé (countryCode=CA & stateCode=QC, size=200, tri par date) : nom, dates + heure locale, salle géolocalisée (venues lat/lng), fourchette de prix (priceRanges min/max), images 16:9, classifications → catégories, attractions → artistes, URL de billetterie officielle ; throttle 0,25 s (quota 5 req/s) | |
| 12 | +- **Note** : Nécessite TICKETMASTER_API_KEY dans .env (clé gratuite). Sans clé, le connecteur s'annonce « clé manquante » et ne retourne rien. | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : billetterie | |
| 17 | +- **Endpoint** (`API`) : `https://app.ticketmaster.com/discovery/v2/events.json` | |
| 18 | +- **Auth** : Clé API gratuite `TICKETMASTER_API_KEY` (developer.ticketmaster.com) | |
| 19 | +- **Pagination** : par numéro de page | |
| 20 | +- **Backend** : GET direct `requests` (throttlé, UA `SortiKa/1.0` identifié) | |
| 21 | +- **Throttle** : 0.25 s entre requêtes | |
| 22 | +- **Accès légal** : API officielle publique avec clé gratuite (developer.ticketmaster.com) — conditions Ticketmaster Developer respectées | |
| 23 | + | |
| 24 | +<details><summary>En-tête documentaire du connecteur</summary> | |
| 25 | + | |
| 26 | +> connectors/ticketmaster.py : connecteur Ticketmaster Discovery API (Québec) | |
| 27 | +> Source : app.ticketmaster.com/discovery/v2/events — API officielle | |
| 28 | +> publique (clé gratuite sur developer.ticketmaster.com). | |
| 29 | +> Extraction: GET JSON paginé (countryCode=CA & stateCode=QC, size=200) — | |
| 30 | +> nom, dates + heure locale, salle géolocalisée (venues lat/lng), | |
| 31 | +> fourchette de prix (priceRanges min/max), images 16:9, | |
| 32 | +> classifications (segment/genre) → catégories, attractions → | |
| 33 | +> artistes, URL de billetterie officielle. | |
| 34 | +> Accès : API officielle avec clé — quota 5 req/s & 5 000 req/jour | |
| 35 | +> (throttle 0,25 s ; ~10 requêtes/sync, pagination plafonnée par | |
| 36 | +> l'API à 1 000 éléments par requête profonde). | |
| 37 | +> Clé : TICKETMASTER_API_KEY dans .env (voir .env.example). Sans clé, | |
| 38 | +> le connecteur s'annonce « clé manquante » et ne retourne rien — | |
| 39 | +> statut « prêt — clé requise » dans data/sources.json. | |
| 40 | + | |
| 41 | +</details> | |
| 42 | + | |
| 43 | +## Champs récupérés → schéma | |
| 44 | + | |
| 45 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 46 | + | |
| 47 | +## Fréquence & budgets | |
| 48 | + | |
| 49 | +- **Cadence** : horaire (watcher PM2) dès que la clé est fournie | |
| 50 | +- **Budgets / plafonds (variables d'environnement)** : | |
| 51 | + | |
| 52 | +| Variable | Défaut | Rôle | | |
| 53 | +|---|---|---| | |
| 54 | +| `TICKETMASTER_API_KEY` | `` | — | | |
| 55 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 56 | + | |
| 57 | +## Volumétrie & complétude live | |
| 58 | + | |
| 59 | +*(mesuré le 2026-08-18 03:22 EDT dans `data/sortika.db`)* | |
| 60 | + | |
| 61 | +- **Événements en base** : 0 (dont **0 actifs**) | |
| 62 | +- **GPS** : 0/0 actifs (—) | |
| 63 | +- **Prix** : 0/0 actifs (—) | |
| 64 | +- **Heure (start_time)** : 0/0 actifs (—) | |
| 65 | +- **Artistes** : 0/0 actifs (—) | |
| 66 | +- **Image** : 0/0 actifs (—) | |
| 67 | +- **Salle (venue)** : 0/0 actifs (—) | |
| 68 | +- **Dernier sync** : 2026-08-18 02:41 — fetched 0, +0 ajoutés, ~0 mis à jour, -0 retirés | |
| 69 | +- **Syncs enregistrés** (sync_log) : 2 | |
| 70 | + | |
| 71 | +## Erreurs & dépannage | |
| 72 | + | |
| 73 | +Aucune erreur dans `sync_log` pour cette source. ✅ | |
| 74 | + | |
| 75 | +- Sans `TICKETMASTER_API_KEY` dans `.env`, le connecteur s'annonce « clé manquante » et ne retourne rien (statut « prêt — clé requise »). Quota API : 5 req/s (throttle 0,25 s côté connecteur). | |
| 76 | +- Rejouer un sync isolé : `python3 run.py sync --source ticketmaster` (ou via le watcher PM2) ; inspecter ensuite `sync_log` : `sqlite3 data/sortika.db "SELECT * FROM sync_log WHERE source='ticketmaster' ORDER BY ts DESC LIMIT 5;"` | |
| 77 | + | |
| 78 | +## Licence / attribution | |
| 79 | + | |
| 80 | +- API officielle publique avec clé gratuite (developer.ticketmaster.com) — conditions Ticketmaster Developer respectées | |
| 81 | + | |
| 82 | +## Historique | |
| 83 | + | |
| 84 | +- **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. | |
| 85 | +- **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). | |
| 86 | + | |
| 87 | +Commits touchant `sortika/connectors/ticketmaster.py` : | |
| 88 | + | |
| 89 | +- `65d2d33` 2026-08-18 Vague 2 d'enrichissement : heure précise, artistes, 3 nouveaux connecteurs | |
added
docs/connecteurs/trois-rivieres.md
+45 −0
@@ -0,0 +1,45 @@ | ||
| 1 | +# Ville de Trois-Rivières — Événements (`trois-rivieres`) | |
| 2 | + | |
| 3 | +> Fiche générée le 2026-08-18 03:22 EDT par `scripts/gen_connector_docs.py` — ne pas éditer à la main, relancer le script. | |
| 4 | + | |
| 5 | +**Statut : abandonnee** · Type : `municipal` · Connecteur : *aucun (source sans connecteur runtime)* | |
| 6 | + | |
| 7 | +## Description | |
| 8 | + | |
| 9 | +- **Source** : [Ville de Trois-Rivières — Événements](https://www.v3r.net/) | |
| 10 | +- **Couverture** : Trois-Rivières (Mauricie) | |
| 11 | +- **Extraction** : n/d | |
| 12 | +- **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) | |
| 13 | + | |
| 14 | +## Accès | |
| 15 | + | |
| 16 | +- **Type** : municipal | |
| 17 | +- **Endpoint** : voir URL source (https://www.v3r.net/) | |
| 18 | +- **Auth** : Aucune (accès public, identification honnête par User-Agent) | |
| 19 | +- **Accès légal** : n/d | |
| 20 | + | |
| 21 | +## Champs récupérés → schéma | |
| 22 | + | |
| 23 | +*Aucun événement actif en base pour cette source — pas de schéma live à montrer.* | |
| 24 | + | |
| 25 | +## Fréquence & budgets | |
| 26 | + | |
| 27 | +- **Cadence** : n/d | |
| 28 | +- **Budget global** : géocodage Nominatim plafonné à `SORTIKA_GEOCODE_MAX` (défaut 120) requêtes réseau/cycle, toutes sources confondues (`sortika/geocode.py`, cache disque). | |
| 29 | + | |
| 30 | +## Volumétrie & complétude live | |
| 31 | + | |
| 32 | +*Source sans connecteur runtime : aucune donnée en base.* | |
| 33 | + | |
| 34 | +## Erreurs & dépannage | |
| 35 | + | |
| 36 | + | |
| 37 | +## Licence / attribution | |
| 38 | + | |
| 39 | +- n/d | |
| 40 | + | |
| 41 | +## Historique | |
| 42 | + | |
| 43 | +- **Source abandonnée** — 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) | |
| 44 | +- **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. | |
| 45 | +- **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). | |
added
scripts/gen_connector_docs.py
+561 −0
Large diff (562 lines) is not loaded by default to keep the page fast.Load diff