# ----------------------------------------------------------------------------- # Fabri-Ka — Agrégateur de produits québécois # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # connectors/squarespace.py : connecteur générique Squarespace Commerce — # pages collection en JSON natif (?format=json). # ----------------------------------------------------------------------------- from __future__ import annotations from ..schema import Product, parse_price from .base import BaseConnector class SquarespaceConnector(BaseConnector): platform = "squarespace" def fetch(self) -> list[Product]: endpoint = (self.store.get("catalog_endpoint") or "/shop?format=json").split("?")[0] out: list[Product] = [] page_url = f"{self.base}{endpoint}?format=json" for _ in range(self.max_pages): data = self.get(page_url).json() items = data.get("items", []) for it in items: variants = it.get("variants") or [] prices = [parse_price((v.get("priceMoney") or {}).get("value") or v.get("price")) for v in variants] prices = [p for p in prices if p] sd = it.get("structuredContent") or {} if not prices: prices = [parse_price((sd.get("priceMoney") or {}).get("value"))] prices = [p for p in prices if p] imgs = [it.get("assetUrl", "")] imgs += [im.get("assetUrl", "") for im in (it.get("items") or [])] out.append(Product( store_id=self.store_id, external_id=str(it.get("id", it.get("urlId", ""))), url=f"{self.base}{it.get('fullUrl', '')}", title=it.get("title", ""), description=it.get("excerpt", "") or "", price=min(prices) if prices else None, price_max=max(prices) if prices else None, images=[i for i in imgs if i], tags=list(it.get("tags") or []) + list(it.get("categories") or []), available=not (sd.get("isSoldOut") or False), )) pagination = data.get("pagination") or {} if not pagination.get("nextPage"): break page_url = f"{self.base}{endpoint}?format=json&offset={pagination.get('nextPageOffset','')}" if not pagination.get("nextPageOffset"): break return out