# mellem — Mellem (Groupe Mach) — Gatineau + Montréal - site: https://www.mellem.ca/projets/manoir-des-trembles (+ /grace-dart, /ville-marie) - méthode: html (Nuxt SSR) → module « plans » Livya/Realvuu (`app.livya.com`, Next.js SSR) dont le payload embarque l'inventaire JSON complet - annonces: 84 unités disponibles — **Gatineau 26** (Manoir-des-Trembles, 189 unités) + Montréal 58 (Grace Dart 25, Ville-Marie 33) - couverture (sur 84 annonces): prix 100 %, superficie 100 %, adresse 100 %, **lat/lng 100 %**, dispo 100 %, commodités 100 %, images 100 %, type d'unité 96 % - fixture: ok (7 requêtes) · test: ok (2 verts) ## Champs extraits - **Découverte** : `sitemap.xml` → pages `/projets/` (aucune liste codée en dur) ; chaque page porte `
` → URL du module `https://app.livya.com/fr/maitre-carre/projects//plans/?noLayout=1`. Seul `maitre-carre` (compte Livya du groupe, publié dans le bundle du site) est une constante de routage. - Le module Next.js diffuse son payload en flux RSC (guillemets échappés) : le tableau `units` est repéré, dé-échappé puis décodé. Attention, la clé `units` sert **aussi** au dictionnaire des libellés d'interface → seul le tableau dont le 1er élément porte `unitId` est retenu. - Par unité : `number` (→ `external_id` = `manoir-des-trembles-812`), `availability` (**AVAILABLE** seulement ; RESERVED/NOT_AVAILABLE exclues), `rental` (les unités en vente sont écartées), `rentalPrice` (loyer **exact**, pas « à partir de »), `unitSize` (pi²), `balconySize`, `rooms` (4.5 → 4½), `roomsBed`/`roomsBath`, `typeName`, `floorDisplayName` + `floorNumber` (→ `details.floor`), `address` + `city` + `postalCode` (adresse complète reconstruite), **`latitude`/`longitude`**, `typeImages` (plan/rendu de la typologie). - Ville prise **dans la donnée de l'unité** (Gatineau / Montréal) : le connecteur ne suppose rien à partir du projet. - Commodités : liste « Plus de commodités pour mieux vivre » de la page projet (`section.ui-sections-projects-list-inclusion`) — Internet, électricité et eau chaude, 5 électroménagers, air climatisé et thermopompe, habillage des fenêtres, chute à déchet/compost, application mobile, caméras, équipe sur place, salle de colis. Les autres listes de la page (commerces du quartier) sont **exclues**. ## Champs indisponibles à la source - **Secteur** : non publié par unité (l'adresse et les coordonnées permettent l'enrichissement quartier en aval) → `sector` vide, pas de secteur déduit d'un code postal. - Date de libération : `futureAvailability` est `null` partout (les unités disponibles le sont immédiatement) → `availability = "Disponible"`. - Animaux/meublé : non exposés (les inclusions viennent de la liste de commodités). - 3 unités sur 84 sans type d'unité : leur champ `rooms` vaut 0.5 (incohérence de la source) et leur code de type ne porte pas de typologie ; quand le code l'indique (« A-2.5 »), la typologie est relue dedans (4 unités → 2½), sinon le champ reste vide. ## Fragilités - Deux dépendances en série (mellem.ca puis app.livya.com) : un changement de l'intégration Livya casse la sync (0 annonce, autres sources intactes). - Le payload RSC est du JSON échappé dans du HTML : le décodage est borné par `raw_decode` et protégé par try/except ; toute évolution du format se verra immédiatement dans la fixture. - Le même connecteur alimente 2 immeubles montréalais : un ajout de projet au sitemap est capté automatiquement (`max_projects = 8`). ## Échantillon - `mellem:manoir-des-trembles-812 | Manoir-des-Trembles — Unité 812 | 256 Boulevard Saint-Raymond, Gatineau, J9A 3G7 | 3½ | 2 299 $ par mois | 674 pi² | balcon 72 pi² | étage 8 | 45.4278/-75.7624 | 11 commodités` - `mellem:manoir-des-trembles-206 | 2½ (relu dans le code de type « A-2.5 ») | 1 557 $ | 499 pi²` - `mellem:grace-dart-605 | Grace Dart — Unité 605 | 6085 Rue Sherbrooke Est, Montréal, H1N 1C2 | 3½ | 2 196 $ | 648 pi²`