feat(sources): ajoute ohmonbento.com comme source de recettes importable #53

Merged
kyuno merged 2 commits from feat/ohmonbento-recipe-source into main 2026-09-06 02:47:33 +02:00
Owner

Corrige l'issue #40 — 6e adaptateur, le plus simple des scrapés.

Conception

  • fetchDetail / parse délèguent tels quels à jsonLdRecipeAdapter — une page recette ohmonbento.com porte un Recipe WP Recipe Maker enveloppé dans un @graph Yoast, déjà géré nativement par findRecipeNode (récursion dans le tableau). recipeYield en tableau (["2", "2 portions"]) → extractPortions prend le 1er élément, regex \d+. rekeySourceError re-labellise jsonLdRecipe → ohMonBento (copie locale, comme les 4 autres scrapés).
  • list() : recherche WordPress GET https://ohmonbento.com/?s={query}&paged={N} — la même URL que query soit vide (tout le catalogue) ou non, aucun branchement (contrairement à 750g.ts qui a deux endpoints). ?s= toujours présent, &paged seulement à partir de la page 2. Scrape de cartes <div class="entry-thumb"><a href="/<slug>/"><img alt src> — image dans src (pas de lazy-load data-src ici), href relatif résolu contre l'origine, extraction agnostique à l'ordre des attributs.
  • Fin de liste = une vraie 404 au-delà de la dernière page (signal propre, comme marmiton.ts), gérée avant le contrôle !response.ok.

Enregistré dans registerAllRecipeSources().

Tests

apps/api/test/recipe-sources/ohmonbento.test.ts (stubFetchHtml, pas de base) :

  • scrape de plusieurs cartes entry-thumb → RecipeSourceListItems (URL absolue), nextCursor: "2" ;
  • 404 → { items: [], nextCursor: null } ;
  • URL /?s= identique pour une requête vide, pas de paged en page 1 ;
  • query + page → /?s={q}&paged={n} (URL capturée) ;
  • non-2xx non-404 → RecipeSourceFetchError keyed ohMonBento ;
  • parse sur un @graph Yoast + WPRM → portions/ingredients/steps corrects ;
  • erreurs fetchDetail/parse re-labellisées ohMonBento.

Vérifié localement : 9/9. + sources-index.test.ts : nouveau cas « registers Oh mon Bento ». build + lint verts.

Docs : section ohmonbento.ts dans backend-architecture.md.

🤖 Generated with Claude Code

Corrige l'[issue #40](https://git.dev.kyuno.fr/kyuno/batchCooking/issues/40) — 6e adaptateur, le plus simple des scrapés. ## Conception - `fetchDetail` / `parse` **délèguent tels quels** à `jsonLdRecipeAdapter` — une page recette ohmonbento.com porte un `Recipe` WP Recipe Maker enveloppé dans un `@graph` Yoast, déjà géré nativement par `findRecipeNode` (récursion dans le tableau). `recipeYield` en tableau (`["2", "2 portions"]`) → `extractPortions` prend le 1er élément, regex `\d+`. `rekeySourceError` re-labellise `jsonLdRecipe` → `ohMonBento` (copie locale, comme les 4 autres scrapés). - `list()` : recherche WordPress `GET https://ohmonbento.com/?s={query}&paged={N}` — **la même URL que `query` soit vide (tout le catalogue) ou non**, aucun branchement (contrairement à `750g.ts` qui a deux endpoints). `?s=` toujours présent, `&paged` seulement à partir de la page 2. Scrape de cartes `<div class="entry-thumb"><a href="/<slug>/"><img alt src>` — image dans `src` (pas de lazy-load `data-src` ici), `href` relatif résolu contre l'origine, extraction agnostique à l'ordre des attributs. - **Fin de liste = une vraie 404** au-delà de la dernière page (signal propre, comme `marmiton.ts`), gérée avant le contrôle `!response.ok`. Enregistré dans `registerAllRecipeSources()`. ## Tests `apps/api/test/recipe-sources/ohmonbento.test.ts` (`stubFetchHtml`, pas de base) : - scrape de plusieurs cartes `entry-thumb` → `RecipeSourceListItem`s (URL absolue), `nextCursor: "2"` ; - 404 → `{ items: [], nextCursor: null }` ; - URL `/?s=` identique pour une requête vide, pas de `paged` en page 1 ; - `query` + page → `/?s={q}&paged={n}` (URL capturée) ; - non-2xx non-404 → `RecipeSourceFetchError` keyed `ohMonBento` ; - `parse` sur un `@graph` Yoast + WPRM → `portions`/`ingredients`/`steps` corrects ; - erreurs `fetchDetail`/`parse` re-labellisées `ohMonBento`. **Vérifié localement : 9/9.** + `sources-index.test.ts` : nouveau cas « registers Oh mon Bento ». `build` + `lint` verts. Docs : section `ohmonbento.ts` dans `backend-architecture.md`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-06 01:31:09 +02:00
feat(sources): ajoute ohmonbento.com comme source de recettes importable
Some checks failed
CI / lint (push) Successful in 4m8s
CI / build (push) Successful in 3m5s
CI / intent-service-test (push) Successful in 6m16s
CI / e2e (push) Successful in 8m15s
CI / test (push) Failing after 15m27s
2251aa93d7
6e adaptateur, le plus simple des scrapés : `fetchDetail`/`parse`
délèguent tels quels à `jsonLdRecipeAdapter` — une page recette porte un
`Recipe` WP Recipe Maker dans un `@graph` Yoast, déjà géré nativement par
`findRecipeNode`. `list()` : recherche WordPress `GET /?s={query}&paged={N}`
— **même URL que la requête soit vide (tout le catalogue) ou non**, aucun
branchement (contrairement à `750g.ts`). Scrape de cartes
`<div class="entry-thumb"><a href="/<slug>/"><img alt src>` — image dans
`src` (pas de lazy-load `data-src` ici), `href` relatif résolu contre
l'origine. Une page au-delà de la dernière renvoie une vraie 404 → fin de
liste propre (comme `marmiton.ts`). `rekeySourceError` dupliqué localement.

Enregistré dans `registerAllRecipeSources()`.

Tests : `ohmonbento.test.ts` (`stubFetchHtml`, pas de base) — scrape des
cartes, 404 = fin de liste, URL `/?s=` identique pour requête vide, query
+ page dans `/?s={q}&paged={n}`, erreurs re-labellisées `ohMonBento`,
`parse` sur un `@graph` Yoast + WPRM (`recipeYield` en tableau géré).
Vérifié localement, 9/9. + `sources-index.test.ts` couvre
l'enregistrement.

Docs : section `ohmonbento.ts` dans `backend-architecture.md`.

Closes #40

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno added 1 commit 2026-09-06 02:32:16 +02:00
chore: relance la CI (job test de la run précédente bloqué par une course d'infra)
All checks were successful
CI / lint (push) Successful in 1m55s
CI / build (push) Successful in 1m51s
CI / intent-service-test (push) Successful in 3m52s
CI / e2e (push) Successful in 6m18s
CI / test (push) Successful in 14m43s
802f3d251b
Le job `test` de la run #101 a lu un état de base incohérent pendant que
le `seedReferenceData` d'une run `main` concurrente (run #100, restée
bloquée) tournait encore — décalage de +5 sur les ids `tech_step`. Le code
de cette branche est inchangé et vérifié localement (9/9 Mocha, sans DB).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit f8ec373691 into main 2026-09-06 02:47:33 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#53
No description provided.