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.1 KB · 46 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/m3_laval.py : connecteur M3 Condos locatifs (m3mirabel.com —5#   Cité Mirabel, boul. de Versailles ; 2 groupes d'immeubles : Bâtiments 1 à 36#   et 4 à 7, ~325 unités). NB : slug historique « m3_laval » de la campagne7#   Laval/Rive-Nord, mais le projet est bien à MIRABEL (Laurentides).8#   La page /plans/ affiche ses unités via le widget Planpoint : on interroge9#   l'API JSON publique (app.planpoint.io/api/projects/find, 2 requêtes/sync,10#   voir _planpoint.py). Granularité UNITÉ : type (« 4 1/2 »), pi², chambres,11#   plans par unité, adresse + lat/lng par immeuble ; la source ne publie12#   AUCUN prix (price null/0 chez Planpoint, pas de prix sur le site non13#   plus) — rien d'inventé. Seules les unités « Available » sont retenues.14# -----------------------------------------------------------------------------15from __future__ import annotations1617from ..schema import Listing18from ._planpoint import planpoint_projects, unit_listing19from .base import BaseConnector2021PAGE_URL = "https://www.m3mirabel.com/plans/"22NAMESPACE = "M3MIRABEL"23HOST_NAMES = ("Batiment1a3", "Batiments4a7")242526class M3LavalConnector(BaseConnector):27    source_id = "m3_laval"28    request_delay = 0.82930    def fetch(self) -> list[Listing]:31        listings: list[Listing] = []32        for host in HOST_NAMES:33            try:34                projects = planpoint_projects(self, "projects", NAMESPACE, host)35            except Exception:36                continue37            for project in projects:38                for floor in project.get("floors") or []:39                    for unit in floor.get("units") or []:40                        lst = unit_listing(self.source_id, project, floor, unit,41                                           page_url=PAGE_URL,42                                           default_city="Mirabel")43                        if lst is not None:44                            listings.append(lst)45        return listings46