# ----------------------------------------------------------------------------- # Lou-Ka — Location court terme # connectors/base.py : classe de base des connecteurs court terme. # Hérite des backends de fetch de BaseConnector (get direct + escalade # anti-bot Oxylabs→Scrapfly→Bright Data, get_rendered, scrapfly) mais son # cache détail vit dans la base court terme (louka_ct.db) et son contrat # retourne des StListing. # ----------------------------------------------------------------------------- from __future__ import annotations from ...connectors.base import BaseConnector from ..schema import StListing class StConnector(BaseConnector): """Un connecteur court terme = un adaptateur propre à une plateforme d'hébergement (chalets, séjours, gîtes…). Sous-classes : définir `source_id` et implémenter `fetch()` qui retourne la liste des hébergements actuellement affichés. Le pipeline (shortterm/ingest.py) s'occupe du diff avec la base court terme. """ source_id: str = "" def detail(self, external_id: str, key: str, fetch_fn) -> dict: """Cache détail dans louka_ct.db (jamais dans la base long terme).""" if not self.use_detail_cache: return fetch_fn() or {} from .. import db if self._detail_con is None: self._detail_con = db.connect() cached = db.get_cached_detail(self._detail_con, self.source_id, str(external_id), key) if cached is not None: return cached payload = fetch_fn() or {} db.put_cached_detail(self._detail_con, self.source_id, str(external_id), key, payload) return payload # -- contrat -------------------------------------------------------------- def fetch(self) -> list[StListing]: raise NotImplementedError