Food-Ka — agrégateur de produits d'épicerie du Québec — www.food-ka.com
Python 53.9%
TypeScript 24%
CSS 14.9%
JavaScript 5.8%
HTML 1.4%
-
Tue, Aug 18, 2026 3
-
Vague 3 : SAQ (API GraphQL directe) + 6 circulaires Flipp (4 pharmacies, Adonis, Avril) + Metro 4 pages allees prioritaires
…
- saq : connecteur Adobe Live Search (catalog-service.adobe.io, cle publique du storefront) — 3 282 produits prioritaires/sync (vin/spiritueux/mousseux plafonnes, petites categories entieres), prix final+regulier, format ml, pays, cepages, pastille de gout, code SAQ, dispo en ligne, images ; 22 requetes directes, zero Scrapfly. Categorie canonique « Alcool » (ajoutee a normalize.CATEGORIES), exclue du matching inter-bannieres (matching.EXCLUDED_SOURCES — banniere unique, prix provinciaux uniformes). - Flipp : pharmaprix (2170), jean_coutu (2521), brunet (3753), uniprix (3467) — keep_categories=GROCERY_CATEGORIES ne garde que les rayons alimentaires des cahiers de pharmacie (filtre AVANT la fiche item : zero requete pour les items ecartes) ; adonis_flyer (3384) et avril_flyer (3940) completent les catalogues adonis/avril. Testes : 127/44/65/25/389/87 produits. - _flipp : desambiguisation « eau de parfum/toilette/javel », « creme adhesive/corps » (les cahiers pharmacie exposaient ces faux Boissons / Produits laitiers). - metro : pages_override — 4 pages (au lieu de 2) sur fruits-et-legumes, viandes-et-volailles, produits-laitiers-et-oeufs ; 664 -> 1 005 produits. Cout mesure 40-80 credits Scrapfly/page (ASP sans render_js). - Sondes documentees : Costco (recherche montee cote client, API Lucidworks 403 sans cle JS — render_js reste la seule voie) ; Dollarama absent de Flipp. sources.json : 54 -> 61 entrees ; docs regeneres. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
Vague 2 : circulaires grandes bannières + comparateur inter-bannières + nutrition OFF
…
1. Connecteurs Flipp des grandes bannières (API backflipp publique, 0 crédit Scrapfly) : iga_flyer (merchant 4592), metro_flyer (2269, filtre Quebec), superc_flyer (2585), maxi_flyer (2349), provigo_flyer (2338), walmart_flyer (234, filtre Circulaire), costco_flyer (2596, Grocery). Flyers provinciaux verifies sur H2X 1Y4 et G1R 4P5 (memes flyer_id). _flipp : tri des flyers par valid_from (la semaine courante gagne sur les slugs dupliques semaine courante/a venir). 2. foodka/matching.py : rapprochement inter-bannieres — table product_links (group_id, uid) reconstruite apres chaque cycle. Cle marque+nom nettoye+ format, matching conservateur (marque obligatoire, similarite nom >= 0,86 avec format identique / 0,95 sans format, jetons numeriques strictement egaux — lait 2 % jamais fusionne avec 3,25 %). Une source *_flyer = meme banniere que son catalogue. Endpoint GET /api/products/{uid}/compare + compteurs matching/nutrition dans /api/stats. 3. foodka/nutrition.py : enrichissement Open Food Facts (voila.ca PDP derriere Incapsula et Shopify sans code-barres public -> croisement OFF par marque+nom+format, conservateur). search.openfoodfacts.org (le vieux cgi/search.pl repond 503) + /api/v2/product/{code} pour les ingredients. Nutriscore/NOVA/ecoscore/allergenes/nutriments dans details.off, budget 100 recherches/cycle, throttle 6 s, cache off_cache (jamais re-cherche). db.py : tables product_links + off_cache. ingest.py : hooks post-cycle matching + nutrition (jamais bloquants). sources.json : 54 sources. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> -
Enrichissement connecteurs + robustesse DB (audit 2026-08-18)
…
- pa_nature : merchant Flipp 3343 disparu -> merchant 3287 (Supermarche PA) + filtre flyer_name_filter sur le « Nature Flyer » (60 produits retrouvés) - Flipp : fiche /flipp/items/{id} via le cache détail (1 appel/item/semaine) -> details.fine_print (description, +tx, disclaimer), discount_pct généralisé (percent_off), dollars_off, regular_price depuis original_price - Shopify : details.variants (<=15, multi-formats), created_at/updated_at, body_html tronqué à 1500 car., unit_price via grams de variante, max_pages 8 -> 24 (pa/nuvo/epipresto/boite_a_grains étaient tronqués à 2000) - WooCommerce Store API : brand depuis la taxonomie brands, details (average_rating, review_count, weight, dimensions, attributes, low_stock_remaining, variation_count), unit_price via formatted_weight, max_pages 8 -> 32 (aliments_merci tronqué à 800 ; catalogue réel 2765) ; akhavan : mêmes details + plafond 4 -> 12 (688 produits) - db.connect() : WAL + busy_timeout 15 s ; base.get() : retry x3 sur ConnectionError/ChunkedEncodingError (parité auto-ka) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-
-
Sun, Aug 16, 2026 1
-
Connecteurs Flipp : socle + 19 bannières de circulaires (~2 760 produits)
…
Socle _flipp.py : API publique backflipp.wishabi.com (résolution hebdo du flyer_id, filtrage merchant_id côté client, catégorisation par mots du nom, external_id stable marque+nom+format pour l'historique price_log). Vague 1 — bannières sans e-commerce (Metro/Sobeys affiliés) : richelieu, marche_ami, bonichoix, tradition, rachelle_bery (réactivée, 2 flyers). Vague 2 — balayage de l'index Flipp (12 codes postaux, 156 marchands) : inter_marche (+intl), axep, pasquier, kim_phat (réactivé), marche_ct, fu_tai, aures, euro_marche, val_mont, bonanza, marche_vegetarien, pa_nature, aliments_mm. postal_code par connecteur (visibilité régionale). Tests : fixtures calquées des vraies réponses API (mapping, dédup, garde-fous prix, frontières de mots du classifieur). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
-