SPB Git forge

spb/fabri-ka

Public

Agrégateur de produits québécois — www.fabri-ka.com

217commits 1branches 0releases
66.1 MBsize
maindefault branch
7 h agolast push
Python 38.4% HTML 30.3% TypeScript 17.2% CSS 11% JavaScript 3.2%

page 5

  1. Sun, Aug 23, 2026 15

    1. connecteur WooCommerce : sitemaps Yoast/AIOSEO et permaliens personnalisés
      …
      - locs() : ne garder que les <loc> du namespace sitemap (les sitemaps
        Yoast/AIOSEO embarquent des <image:loc> wp-content qui polluaient la liste),
        avec repli filtré pour les sitemaps sans namespace
      - inventaire : accepter les bases de permalien personnalisées
        (ex. /project/ sur mobilierurbain.ca) en plus de /produit|/product
      - sync : si la route liste est cassée (500 fatal) mais les fiches unitaires
        répondent, repli sitemap + fiches par slug (_sitemap_slug_fallback)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +19 −3
    2. [ka6] nouveau connecteur Votresite.ca (plateforme e-commerce québécoise) — 45 boutiques débloquées, +3 190 produits: le pool de 1 045 boutiques du registre sans plateforme cachait 61 sites Votresite.ca (vitrine Drupal 8 gérée, thème owebo-votresite, boutique OpenCart montée en sous-répertoire /boutique|/produits|/shop). VotresiteConnector: montage détecté (registre → page d'accueil → chemins usuels), inventaire par <mount>/sitemap.xml (extension OpenCart pas toujours activée) sinon crawl des catégories <mount>/fr avec ?limit=100&page=N, puis fiche par fiche …/<slug>-p<ID>/ (rendu 100 % serveur, aucune API). Pièges gérés: prix courant = <h2>…$</h2> et barré = span line-through (twitter:data1 affiche le prix RÉGULIER même en solde, gardé en secours), titre = dernier <h1> sans ancre (le 1er h1 est le logo-lien, og:title parfois bourré de mots-clés), dédup par ID produit (même p<ID> sous plusieurs chemins -p361c37c45c44), images OpenCart aux espaces bruts encodées. Registre: 45/61 boutiques confirmées live → platform=votresite + endpoint, les 16 autres sans boutique réelle (archivées/fermées) restent inertes. Sync réel: 45 ok / 0 erreur, 3 190 produits (bijouteriesimard 488, zylvery 312, alpagadore 238, monastère 174, vivelesepices 166…), 4 fiches vérifiées à la main contre la source (titre/prix/solde/modèle/dispo). Docs régénérées (fiche votresite.md), README 8→9 connecteurs.
      …
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 17 files +671 −272
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +16 −2
    4. [ka6] fix connecteur origin-north.ai: site SaaS B2B sans boutique Wix — catalog_endpoint null, ecommerce=false
      …
      origin-north.ai (Cédric Millar Integrated Solutions Inc / AFMQ) est un site
      SaaS supply chain sans app Wix Stores (app 1380b703 absente, has_cart=false).
      Corrige catalog_endpoint (était /_api/wix-ecommerce-storefront-web/api, maintenant
      null pour cohérence avec verify_cache) et ecommerce=false. Store déjà disabled=false.
      Double filtre ingest (enabled=false + catalog_endpoint=null) garantit l'exclusion.
      
      Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +2 −2
    5. Simon-Pierre Boucher committed 1 mo ago · 1 file +2
    6. build_registry: préservation des overrides manuels d un rebuild à l autre
      …
      Un rebuild régénérait enabled=true pour les 91 boutiques Wix désactivées à
      l audit du 2026-08-23 et écrasait les réparations faites au registre.
      Désormais préservés depuis le stores.json précédent : disabled_reason
      (l entrée reste désactivée), timeout par boutique (canadel.com), et
      plateforme/endpoint/url des entrées marquées manual_platform (rose.ca,
      migrée Woo -> Shopify boutique.rose.ca).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +29 −1
    7. Supervision & réparation boutiques : fenêtre sync_log paramétrable, canadel/rose réparées, 91 Wix sans app Boutique désactivées
      …
      - /api/stats : nouveau paramètre optionnel syncs_since_h (heures) — retourne
        toutes les entrées du sync_log depuis now-h (ORDER BY ts DESC LIMIT 4000),
        minimum les 20 dernières ; sans paramètre, comportement inchangé (30
        entrées). Corrige l artefact du moniteur central qui voyait « 1723 produits
        vs médiane 8469 » : fenêtre de 30 syncs sur ~1 700 boutiques/cycle, le
        volume réel (355 k produits publiés) n a jamais chuté.
      - connecteurs : dépassement de délai par boutique via la clé timeout du
        registre (base.py) — canadel.com (Store API ~50 s/page de 100) passait en
        timeout 30 s puis Scrapfly 422 ; timeout 90 -> 517 produits synchronisés.
      - rose.ca : boutique migrée de WooCommerce (Store API vide sur www.rose.ca)
        vers Shopify boutique.rose.ca -> registre mis à jour (url/platform/
        endpoint), 6 produits récupérés (anti-bot Shopify géré par le repli
        Scrapfly existant).
      - registre : 91 boutiques Wix désactivées (enabled=false + disabled_reason)
        après audit live des 170 Wix à 0 produit — 90 sans app Wix Stores (jamais
        de catalogue accessible ; build_registry assigne l endpoint Wix par défaut
        dès que la plateforme est wix) + drasca.ca (n est plus un site Wix). Les
        79 autres : app présente mais catalogue réellement vide ou entièrement
        masqué (fermes/CSA saisonnières — vérifié par rendu JS et catalog-reader,
        totalResults=0) -> laissées actives, le 0 est exact.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +299 −183
  2. Sat, Aug 22, 2026 4

    1. Simon-Pierre Boucher committed 1 mo ago · 3 files +9 −13
    2. Simon-Pierre Boucher committed 1 mo ago · 1 file +1 −1
    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
  3. Fri, Aug 21, 2026 1

  4. Wed, Aug 19, 2026 16

    1. Simon-Pierre Boucher committed 1 mo ago · 3 files +51 −31
    2. Simon-Pierre Boucher committed 1 mo ago · 7 files +136 −19
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +4 −1
    4. Mobile : dvh sur la colonne filtres, anti-zoom iOS 16 px, cible tactile du logo, grain reconcilie avec tokens
      …
      - styles.css : doublet 100vh/100dvh sur .filters (barre URL iOS) ; regles
        explicites >=16 px pour #header-search-input, .searchbar input et selects
        en contexte tactile ; extension tactile ::after du logo (98x29) ;
        suppression de la redefinition locale du grain body::before (z-index 0)
        au profit de celle du design system (ka/tokens.css, z-index 9999).
      - ka/tokens.css : section SOCLE MOBILE OBLIGATOIRE (echelle --z-*, --vh100,
        .ka-bottombar, verrou ka-scroll-lock, filet anti-zoom iOS).
      - public/ka-agent.js : agent KA corrige (safe-area, textarea 16 px, plein
        ecran auto <=640 px + verrou scroll).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +137 −13
  5. Tue, Aug 18, 2026 4

    1. Vague 3 : 4 annuaires frais (Pages Vertes, MIAM Mauricie, Garde-Manger MTG, Terroir et Saveurs) — +283 boutiques, +99 connectables, +6 004 produits
      …
      - scripts/wave3_discovery.py : moisson sitemap/fiches des 4 annuaires (sans clé
        API, throttle poli, filtre des domaines partenaires) + intégration additive
        (aggregate -> verify -> registre + DB, mêmes garde-fous que build_registry).
      - build_registry.py : priors des 5 nouvelles sources (gardemangerduquebec
        scindé producteurs A / détaillants C via portfolio_category), régions
        Mauricie/Montérégie, rebuild rejouable.
      - reprobe_stores.py : --skip / --skip-stamped / --only-file + horodatage
        last_reprobe sur chaque cible sondée.
      - Re-sondage : 500 boutiques du stock restant (0 réactivable — vitrines sans
        endpoint) + 187 nouvelles vague 3 (4 Square réactivées).
      - Écartés après reconnaissance : Etsy (403), Ma Zone Québec (coquille vide),
        Goûtez Lanaudière (CRM Eudonet injoignable) ; CMAQ/économusées/Créateurs de
        saveurs/Signé Local déjà couverts.
      - provancher.org désactivée (billets de visites, pas des produits) et purgée.
      - Registre 3 507 (+283) | connectables 1 568 (+99) | productives 1 377 (+78)
        | produits 301 534 (+6 004). README + docs/connecteurs régénérés.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 26 files +13,801 −775
    2. Docs connecteurs : générateur rejouable + 11 fiches standardisées (6 plateformes, Scrapfly, verdict Ecwid, découverte-registre, enrichissement, INDEX)
      …
      Croise data/stores.json (3 224 boutiques) + introspection des connecteurs +
      BD live (volumétrie/complétude produits, top boutiques, gotchas).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 12 files +965
    3. Vague 2 : connecteur Square Online, re-sondage des boutiques, livraison, catégories
      …
      - connectors/square.py : API storefront publique Square Online
        (/app/store/api/v13, IDs user/site extraits du HTML) — 32 boutiques
        Square réactivées, ~2 700 produits gagnés. Ecwid documenté non
        couvert (client-only, API v3 = token secret).
      - scripts/reprobe_stores.py : re-sondage des boutiques enabled=0 /
        sans plateforme (Shopify/Woo/Wix/Squarespace/Square), MAJ
        stores.json + verify_cache + verified.jsonl + BD. 33 réactivées
        sur 400 sondées (32 square, 1 woocommerce).
      - scripts/enrich_shipping.py : colonne stores.shipping_info —
        politique de livraison (≤400 c.) extraite des pages usuelles,
        cache disque, throttle Shopify global 0,7 s. 271 boutiques.
      - schema.py : le classifieur exploite les options Shopify et
        attributs WooCommerce (details) + matériaux bijoux ;
        scripts/recategorize.py (backfill, 1 665 produits recatégorisés,
        jamais de rétrogradation vers autre) ; enrich_products.py aligné.
      - db.py : connect() tolérant aux verrous (retry), migration
        shipping_info, passage en WAL ; suppressions FTS par lots
        (uid UNINDEXED -> 1 balayage/lot de 500 au lieu de 1/produit,
        débloque les re-syncs massives).
      - README : 8 connecteurs, 294 266 produits, 1 298 boutiques.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 377 files +1,211 −134
    4. Colonne details (avis/dimensions/variantes) + repli Scrapfly robuste (large_object, sticky)
      …
      - schema.py : champ Product.details (dict JSON) inclus dans le content_hash
      - db.py : colonne products.details (migration additive) + insert/update
      - shopify.py : details (variantes, options, dates) ; Scrapfly collant par
        boutique bloquée + retry — répare ici-la.co (20 077 produits)
      - scrapfly.py : suivi des liens large_object (pages >5 Mo, ex. ici-la p.68)
      - woocommerce.py : details (avis, sku, poids, dimensions, attributs,
        low_stock, backorder, variations) + vendor depuis la taxonomie brands
      - wix.py : GraphQL enrichi (sku, brand, discount) -> details + vendor
      - web.py : details décodé en JSON dans les réponses produit
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 7 files +108 −7