SPB Git forge

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

232commits 1branches 0releases
172.9 MBsize
maindefault branch
2 days agolast push
HTML 98.9% Python 0.6%
2.6 KB · 63 lines python
Raw Blame History
1# -----------------------------------------------------------------------------2# Lou-Ka — Agrégateur de logements à louer (province de Québec)3# Auteur : Simon-Pierre Boucher — contact@spboucher.ai4# connectors/marquise_8.py : connecteur Marquise 8 (marquise8.com — Devmet/5#   Marquise Condominiums). Tour de 137 condos locatifs tout inclus au6#   3641, avenue Jean-Béraud à Laval (Chomedey, centre-ville). Le site7#   Webflow affiche ses unités via le widget Planpoint : on interroge l'API8#   JSON publique (app.planpoint.io/api/projects/find, 1 requête/sync,9#   voir _planpoint.py). Granularité UNITÉ (numéro de porte, pi², plan,10#   étage) mais AUCUN prix publié (« unitPriceTBD ») ni typologie ; seules11#   les unités « Available » sont retenues. deliveryDate au format12#   JJ-MM-AAAA (contrairement aux autres comptes Planpoint) — converti ici.13# -----------------------------------------------------------------------------14from __future__ import annotations1516import re1718from ..schema import Listing19from ._planpoint import planpoint_projects, unit_listing20from .base import BaseConnector2122PAGE_URL = "https://marquise8.com/#unite"23NAMESPACE = "marquise-8"24HOST_NAME = "marquise-8"2526DEFAULT_CITY = "Laval"27SECTOR = "Chomedey"2829EXTRA_AMENITIES = ["Formule tout inclus"]3031# « 01-07-2026 » (JJ-MM-AAAA, spécifique à ce compte) -> ISO « 2026-07-01 »32_DMY_RE = re.compile(r"^(\d{2})-(\d{2})-(\d{4})$")333435class Marquise8Connector(BaseConnector):36    source_id = "marquise_8"37    request_delay = 0.83839    def fetch(self) -> list[Listing]:40        try:41            projects = planpoint_projects(self, "projects", NAMESPACE, HOST_NAME)42        except Exception:43            return []44        listings: list[Listing] = []45        for project in projects:46            for floor in project.get("floors") or []:47                for unit in floor.get("units") or []:48                    lst = unit_listing(self.source_id, project, floor, unit,49                                       page_url=PAGE_URL,50                                       default_city=DEFAULT_CITY,51                                       extra_amenities=EXTRA_AMENITIES)52                    if lst is None:53                        continue54                    lst.sector = SECTOR55                    # date de livraison JJ-MM-AAAA -> ISO56                    m = _DMY_RE.match(lst.availability_date or "")57                    if m:58                        iso = f"{m.group(3)}-{m.group(2)}-{m.group(1)}"59                        lst.availability_date = iso60                        lst.availability = f"Disponible le {iso}"61                    listings.append(lst)62        return listings63