SPB Git forge

spb/sorti-ka

Public

Toutes les sorties et tous les événements du Québec, un seul endroit — 7 connecteurs, fiches SSR, design Groupe KA.

58commits 1branches 0releases
13.7 MBsize
maindefault branch
17 days agolast push
HTML 82.9% Python 15.2% TypeScript 0.9% JavaScript 0.7%

page 1

  1. Mon, Sep 7, 2026 1

    1. feat(fiche): refonte premium mobile-first de la fiche événement (2026-09-07)
      Même socle que les fiches Lou-Ka v3 / Immo-Ka v3, porté en JS natif dans
      frontend/index.html (tokens --sk-*, classes sk-*, fond papier, cartes
      blanches bord 1 px, framboise réservée aux CTA/prix) : héro (catégorie ·
      source, prix « Dès X $ » / Gratuit / Billetterie, capsules date et statut,
      titre + lieu · ville · date, image, actions favoris ♥ / partage / Billets) ;
      « En bref » déterministe (aujourd'hui / demain / ce week-end / terminé,
      statut annulé-reporté-complet, prix, lieu, artistes, public) ; navigation
      sticky par sections (scroll-spy) ; « Quand et où » (faits, adresse,
      itinéraires, carte Leaflet sur tuiles OSM — CARTO exige désormais une clé) ;
      « Programme » (description tronquée, artistes, étiquettes) ; « Billets et
      prix » ; « À voir aussi » (cartes existantes) ; Dossier de la fiche ; Sources
      et méthodologie. CTA sticky après le héro, aside desktop sticky, « Demander à
      Ka » (bottom sheet → widget KA Agent). Header compact sur /evenement/
      (favoris + partage injectés, ticker/badge/tabbar masqués, nettoyage au retour
      sur les autres vues). Ids de sections préfixés sk- (collision avec #sources de
      l'accueil). Ancien lien « Toutes les sorties » remplacé par le fil d'Ariane.
      Aucun order CSS ; pas de scrollIntoView à l'ouverture. Dossier qa/ (ignoré par
      git) : serveur de prévisualisation + scripts Playwright (lien vers
      vrai-prix/node_modules).
      
      Validé sur M3U96a : check-order OK, interactions OK (accordéon, similaires,
      Ka, navigation SPA, 404), captures 6 largeurs ; index.html basculé (rendu SEO
      seo.py relit le fichier à chaque requête, aucun redémarrage).
      Simon-Pierre Boucher committed 17 days ago · 2 files +924 −83
  2. Sun, Aug 30, 2026 1

    1. analytics: passage au loader central ka-a.js (v2)
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 24 days ago · 1 file +1 −1
  3. Fri, Aug 28, 2026 1

    1. docs: README ultra détaillé + visite guidée en 10 captures
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 26 days ago · 11 files +116 −45
  4. Wed, Aug 26, 2026 4

    1. Simon-Pierre Boucher committed 28 days ago · 1 file +8 −2
    2. Simon-Pierre Boucher committed 28 days ago · 2 files +116 −3
    3. Simon-Pierre Boucher committed 28 days ago · 1 file +7 −2
  5. Tue, Aug 25, 2026 8

    1. Barre de navigation mobile commune Groupe KA (KA Tabbar v1)
      Pilule flottante fixe en bas (standard ka-ui/nav, version vanilla inline) :
      Découvrir · Recherche · Carte · Favoris, accent magenta signature, safe-area
      iOS, micro-interactions. Recherche = retour accueil + focus du champ central ;
      Carte = toutes les sorties sur la carte (drapeau state.mapAll one-shot dans
      isFiltering, remis à zéro à toute navigation hors tabbar).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 29 days ago · 1 file +102 −1
    2. Vague connecteurs 2026-08-25 : +26 sources actives (10 ATR, 15 municipales, 6 billetteries/agrégateurs), 20 connecteurs enrichis (prix/heures/adresses/images), +13 salles JSON-LD, +8 tenants — 61 sources actives, 22 310 événements actifs
      - ATR : cotenord, abitibi, ilesdelamadeleine, charlevoix, eeyouistchee, tourismelaval, quebeccite, mtlorg + réhabilitation mauricie (XHR acolyte) et laurentides (Scrapfly)
      - Municipal : gatineau, levis, terrebonne, troisrivieres, rimouski, victoriaville, drummondville, granby, saintjerome, sainthyacinthe, rouynnoranda, shawinigan, joliette, magog, soreltracy
      - Billetteries/agrégateurs : showpass (API publique), zeffy (pages orgs __NEXT_DATA__), signelaval, quoifaire, evenementsattractions, banq ; weezevent/accesculture écartés documentés (accesculture retiré : domaine squatté, contenu 2015)
      - Enrichis : ticketpro prix 0→93 %, ticketacces adresses+prix, tuxedobillet fiches Scrapfly (+71 evts janv-fév), lavitrine v3 (GPS/prix JSON-LD des représentations), lepointdevente adresses, quebecanimee heures/adresses, sitq og:image/description, montreal images 100 %, bandsintown images, atuvu heures/prix, cantonsdelest 25→596 (pagination AJAX CSRF), 7 autres ATR fiches détail
      - sallesjsonld : 17 salles (+13 : Denise-Pelletier, MBAM, MNBAQ, MCQ, Pointe-à-Callière, Cinémathèque, TOHU, Spect'Art, Hector-Charland, Cogeco, Premier Acte, Maison littérature, Chasse-galerie), Trident réparé
      - Registre sources.json : 68 entrées, docs/connecteurs régénérés, 131 tests verts
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 29 days ago · 189 files +48,958 −1,314
    3. Nav mobile v2 : hamburger + panneau plein écran fixed (standard KA 2026-08-25)
      Les liens de nav wrappaient dans le header sur mobile. Remplacés sous 760px
      par un hamburger 44px + panneau position:fixed inset:0 (z-modal) — visible
      peu importe la position de scroll, verrou de scroll, fermeture lien/✕/Escape.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +93 −3
  6. Mon, Aug 24, 2026 5

    1. Simon-Pierre Boucher committed 1 mo ago · 2 files +13
    2. Simon-Pierre Boucher committed 1 mo ago · 1 file +102 −42
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +105 −31
    4. Simon-Pierre Boucher committed 1 mo ago · 3 files +91 −99
  7. Sun, Aug 23, 2026 4

    1. favoris ♥ « Mon univers Ka » (KA ID) : hub groupe-ka.com magasin central
      - sortika/hubfav.py : client HMAC du hub (patron food-ka) — toggle synchrone,
        lecture avec cache mémoire 30 s invalidé au toggle, aucun stockage local
      - API : GET /api/favorites + POST /api/favorites/toggle (session KA ID, 401
        sinon ; 403 compte non relié ; 502 hub injoignable)
      - frontend : cœur ♥ sur les cartes et la fiche (non connecté -> connexion
        KA ID), page /favoris + entrée de nav, toggle optimiste avec rétablissement
      - SSR : route /favoris (noindex, hors sitemaps)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 4 files +334 −5
    2. stats v3 : rapports PDF personnalisés (catalogue de blocs, rendu au choix, constructeur + modèles)
      - kapdf.py v3 : catalog(dash), mode 'personnalise' (spec title+blocks,
        rendu par bloc avec conversions tableau, heatmap calendrier vectorielle)
      - web.py : GET /api/stats/catalog + POST /api/stats/report/custom
      - frontend : constructeur vanilla (modal 2 colonnes, ordre ↑↓, sélecteur
        de rendu, modèles localStorage, téléchargement blob)
      - SPEC.md v3 (§3bis)
      Simon-Pierre Boucher committed 1 mo ago · 4 files +732 −10
    3. SEO : pages programmatiques régions + catégories rendues en HTML
      - sortika/seo.py : /regions, /region/{slug}, /categories, /categorie/{cat}
        (SSR complet : ItemList + BreadcrumbList, 100 fiches liées par page),
        liens régions/catégories dans l'accueil SSR, sitemap-pages enrichi
      - frontend/index.html : routeur SPA étendu — /region/{slug} et
        /categorie/{cat} ouvrent la recherche filtrée correspondante (kaSlug
        miroir du slugify serveur)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +244 −4
  8. Sat, Aug 22, 2026 6

    1. Phase 5 (suite) — registre : 4 billetteries sondées et écartées avec preuves (Zeffy, Showpass, Weezevent, Accès culture)
      - zeffy : sitemap 547 834 URLs /ticketing/ sans lastmod/date/géo — découverte impraticable
      - showpass : aucun filtre géo serveur + inventaire 0,3 % QC (échantillon 1 000 évts) — ROI nul
      - weezevent : sitemap slugs relatifs sans lieu, quasi tout France
      - accesculture : billetterie déléguée à La Vitrine (déjà couverte) — doublons > gain
      - docs/connecteurs régénérés (44 sources)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 46 files +394 −158
    2. Phase 5 — billetterie Ticketpro (API JSON multi-tenants : St-Denis, Fun Nation, ExpoCité, PdC, SAG…) + salle Odyscène (Ste-Thérèse, Laurentides) via sallesjsonld
      - ticketpro.py : API /api/v1/pages publique par tenant (aucun anti-bot),
        1 Event par (spectacle, date à venir), lieu complet avec GPS, tags,
        cancelled/soldout, image ; 6 tenants QC (data/ticketpro_tenants.json),
        restauration/musée à créneaux exclus — 361 séances actives au 1er sync
      - salles_jsonld.json : + Odyscène (TheaterEvent JSON-LD, robots ouvert)
        → 33 événements Laurentides au 1er passage
      - docs/connecteurs régénérés (40 sources)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 45 files +841 −515
    3. connecteurs: chaine de fetch anti-bot resiliente (Oxylabs->Scrapfly->Bright Data)
      Auto-escalade de BaseConnector.get() sur blocage (403/429/503/challenge CF)
      ou coupure reseau, via connectors/_resilient.py. Cles lues de l env avec repli
      sur ~/.claude/.env (accepte SCRAPFLY_KEY et SCRAPFLY_API_KEY). Reponse
      compatible requests.Response; coupe-circuit par hote. Aucun connecteur modifie.
      
      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +386
  9. Fri, Aug 21, 2026 1

    1. Phase 4 — 7 nouveaux connecteurs : régions manquantes (Montérégie, Centre-du-Québec, Chaudière-Appalaches, Gaspésie via Scrapfly) + billetteries QC (TicketAcces, Réseau Ovation, Tuxedo via acteur Apify ka-tuxedo)
      - ATR : monteregie (WP REST cpt_event + JSON-LD fiche), centreduquebec (SSR),
        chaudiereappalaches (SSR paginé, JSON-LD Event complet), gaspesie (RÉACTIVÉE —
        WAF contourné via Scrapfly consigné et budgété)
      - Billetteries : ticketacces (calendrier agrégé, 47 orgs QC dont 14 en Abitibi,
        ~1 320 séances, Crawl-delay 120 honoré PAR HÔTE + TTL 6 h), ovation (26 orgs
        100 % QC, artistes/adresses/heures, Crawl-delay 30 honoré + TTL 20 h),
        tuxedobillet (RÉACTIVÉE — 29 tenants QC, SPA Firebase rendue par l'acteur
        Apify maison gorgeous_thistle/ka-tuxedo, code versionné dans apify/ka-tuxedo/)
      - Configs annuaires : data/ovation_orgs.json, data/tuxedo_tenants.json
      - Registre 39 sources, CONFORMITE.md (robots.txt lus, crawl-delays honorés),
        fiches docs régénérées, 10 nouveaux tests sur fixtures réelles (69 verts)
      - Couverture : +1 900 séances futures ; Abitibi +312, Gaspésie réamorcée,
        Centre-du-Québec première source
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 72 files +3,957 −917
  10. Wed, Aug 19, 2026 9

    1. Phase 3 — registre (34 sources), conformité et crédits
      - data/sources.json : 9 nouvelles sources actives avec fiche d évaluation
        datée (accès constaté, volume mesuré, robots.txt lu, effort) + 5 écartements
        consignés avec raison (mauricie JS, laurentides/gaspesie WAF, tuxedo en
        panne, clubs pros doublons)
      - docs/CONFORMITE.md : tableau licences/robots.txt/crédits/fréquences de
        TOUTES les sources + données transversales (MAMH, OSM/ODbL, Nominatim)
      - frontend + seo.py : étiquettes SRC_LABELS des 9 nouvelles sources (+ 3
        anciennes manquantes) ; pied de page d attribution enrichi, dont
        « lieux : © contributeurs OpenStreetMap (ODbL) » exigé par l annuaire
      - docs/connecteurs : fiches régénérées (34 sources, INDEX)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 39 files +1,719 −213
    2. Phase 3 — 9 nouveaux connecteurs + déroulage des périodes SITQ (fiches d évaluation avant connexion)
      - lavalweb : calendrier VIVANT laval.ca (SSR paginé, ~470 fiches — remplace le
        jeu Données Québec mort à la source, consigné Phase 2)
      - saguenaysorties : portail sorties.saguenay.ca (ajax/plus + ajax/details,
        445 séances horodatées — remplace le CSV mort de 2022)
      - lhjmq : API HockeyTech modulekit (matchs à domicile QC, 12 villes/10 régions)
      - placedesarts : fiches Craft (eventbannerdata/eventGTM + représentations) —
        une fiche PAR séance avec heure et PRIX RÉELS
      - sallesjsonld : moteur générique schema.org/Event configurable
        (data/salles_jsonld.json — amorce Grand Théâtre/Trident/Capitole ; heures
        UTC du Grand Théâtre converties en heure locale)
      - quebecanimee : activités gratuites Ville de Québec (attributs data-*)
      - lanaudiere : ATR via sitemap (Crawl-delay 2 s et Disallow /*? respectés)
      - outaouais : calendrier complet dans les props de l îlot Astro (1 GET)
      - bassaintlaurent : ATR SSR + GPS exact des fiches
      - sitq : PeriodeOuvertures[] déroulées en occurrences datées (cap 24,
        1re période = identifiant historique) — 1 599 → 1 803 fiches
      - tests : 46 → 59 verts (fixtures réelles pour chaque connecteur + annuaire)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 27 files +2,124 −22
    3. Phase 3 — annuaire de salles : table venues (appris/OSM/Nominatim), matching par alias, plages de dates FR
      - sortika/venues.py : annuaire de salles QC — auto-apprentissage des salles
        géocodées par les sources, extrait Overpass des lieux culturels (import par
        fichier si le nœud n atteint pas overpass-api.de, échec mémorisé 3 j),
        géocodage Nominatim des salles récurrentes (plafonné) ; matching nom
        normalisé + alias de segments + « Salle X » → « X » (ville obligatoire),
        match sans ville seulement si clé unique ≥ 8 car. — jamais de GPS inventé
      - scripts/build_venues.py : amorçage one-shot de l annuaire
      - ingest.py : venues.run à chaque cycle (après le géocodeur)
      - normalize.py : parse_date_range_fr (« Du 4 juin au 22 août 2026 »…)
      - GPS des « à venir » : 64,9 % → 76,4 % (+3 264 fiches localisées)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 5 files +448 −1
    4. docs: fiches connecteurs régénérées (Phase 2) + registre — laval morte-à-la-source
      - data/sources.json : laval passe à « morte-a-la-source » avec décision
        consignée (jeu ouvert figé, EventDate max 2025-12-09, 41 runs verts sans
        aucun futur) ; le connecteur reste branché (archivage naturel + réveil
        automatique si la Ville republie) ; remplacement prévu en Phase 3
        (calendrier vivant laval.ca / Tourisme Laval).
      - Générateur : end_time et statut ajoutés aux champs documentés et aux
        métriques clés ; note ticketmaster mise à jour (repli scraping sain,
        TICKETMASTER_API_KEY à fournir pour prix/statuts/visuels HD) ; historique
        Phase 2 consigné.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 23 files +457 −353
    5. Phase 2 — affichage & API : bandeaux statut, heures de fin, quarantaine, santé par source
      - Frontend : badge Annulé/Reporté/Complet sur les cartes, bandeau de statut
        sur la fiche, plage horaire « 19 h 30 – 21 h 30 » quand end_time est connue,
        heure 00:00 affichée « heure non confirmée » (jamais un minuit menteur).
      - SEO/SSR : eventStatus schema.org (EventCancelled/EventPostponed), offers
        availability SoldOut, endDate horodatée (endDate + end_time + fuseau),
        bandeau statut dans le HTML SSR ; sitemaps sans les événements en
        quarantaine.
      - API : /api/events, /api/stats et le tableau de bord excluent la
        quarantaine ; /api/stats expose « quarantined » ; /api/sources expose
        upcoming_events par source + future_alerts (canal de supervision — une
        source verte sans futur est morte en silence).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 4 files +83 −22
    6. Phase 2 — connecteurs : heure+description La Vitrine, statuts, end_time, offres, taxonomies
      - lavitrine (plus grosse source, 5 087 à venir) : capte l HEURE de la slide
        (« 15:00 HNE », start_time 0 % → 51 % dès le 1er lot de 1 100 fiches) et la
        DESCRIPTION (accroche courte + début du texte À propos, desc≥200 0 % → 50 %) ;
        re-visite versionnée v2 du cache (montée progressive, ~400 fiches/sync).
      - eventbrite : end_time (98,8 %), full_description>JSON-LD>summary,
        organisateur via le JSON-LD de la fiche déjà visitée pour le prix
        (0 % → 67 % et montant), statut is_cancelled CONSERVÉ (bandeau) +
        urgency_signals sold out → soldout. Les séries (series_id) ne sont PAS
        déroulées : 0 série observée sur les pages découverte sondées.
      - atuvu : og:description enfin affectée à l événement (payée en crédits
        Scrapfly, elle était jetée) — SAUF le gabarit marketing « trouvez des
        billets… » constaté sur fiche réelle, jamais publié ; backfill au fil des
        re-scrapes lastmod, aucun crédit supplémentaire.
      - evenko : supports (premières parties) ajoutés aux artistes, door_time et
        tour_name en description (« Tournée : … · Portes : … »),
        representation_status → statut (soldout/cancelled).
      - bandsintown : offers[] type Tickets → lien billets direct + « sold out »
        → statut soldout.
      - brossard : taxonomie type-event résolue (1 requête WP REST, vraies
        catégories) ; description INTÉGRALE (fin de la coupe à 600 caractères) ;
        heure de fin de la bannière « de 15 h 00 à 16 h 00 » et du JSON-LD biblio.
      - longueuil : image captée dans l état Nuxt (mediaImages front_*_16_9/21_9) ;
        heure de fin des cartes <time>.
      - laval : préfixe « ANNULÉ - » du titre → statut cancelled, titre nettoyé.
      - ticketmaster (repli sans clé) : les annulés sont conservés avec statut ;
        mode API (si TICKETMASTER_API_KEY fournie) : dates.status.code → statut,
        end localTime → end_time.
      - montreal : heure de FIN du JSON-LD des fiches (endDate), backfill
        progressif sous le même plafond MTL_IMG_MAX.
      - sherbrooke : heure de fin des périodes UTC → locale.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 12 files +354 −58
    7. Phase 2 — noyau : archivage des passés, statut, end_time, quarantaine, séances, villes MAMH
      - Règle d ARCHIVAGE temporel : un événement terminé passe active=0 à chaque
        cycle (jamais supprimé) ; un passé archivé n est plus réactivé par un sync
        « unchanged » (backfill immédiat : 3 745 passés actifs → 0).
      - Colonnes additives events.end_time (HH:MM), events.status
        (cancelled/postponed/soldout, NULL = prévu) et events.quarantine
        (raison, NULL = publiable) + migration auto à la connexion.
      - dedup_key inclut désormais l HEURE de début : même titre/ville/jour à des
        heures différentes = séances distinctes (661 groupes → 259 ; les 11 séances
        d un même parcours redeviennent visibles). Deux fiches sans heure fusionnent
        toujours ; une fiche avec heure ne fusionne qu à heure égale (règle consignée
        dans schema.py).
      - Quarantaine qualité : date passée aberrante (< 2000), début à plus de 2 ans,
        ville hors Québec — non publiée, comptée (/api/stats), réintégrable à chaque
        sync dès que la donnée redevient saine. L heure 00:00 est affichée « heure
        non confirmée » ; l image 404 n est pas vérifiée (coût réseau), le frontend
        retire les images cassées.
      - Alerte « source qui meurt en silence » : événements FUTURS par source à
        chaque cycle (data/future_counts.json) — alerte si 0 futur ou chute > 80 %
        (le cas Laval : 41 runs verts, max(date)=2025-12-09).
      - Géocodage par ADRESSE CIVIQUE prioritaire (Nominatim, même cache, 1 req/s) :
        Brossard 0,7 % → 94 % de GPS, Longueuil 0 % → 75 %.
      - Villes normalisées au Répertoire MAMH (data/villes_canon.json, généré de
        MUN.csv + ARR.csv) : « Montreal » 375, « Quebec » 166, 75 graphies, 804
        événements backfillés — facettes ville unifiées.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 9 files +406 −45
    8. Simon-Pierre Boucher committed 1 mo ago · 1 file +4 −1