spb/fabri-ka Public
Agrégateur de produits québécois — www.fabri-ka.com
HTML 57.9%
Python 18.6%
TypeScript 15.6%
CSS 7.8%
1# -----------------------------------------------------------------------------2# Fabri-Ka — Agrégateur de produits québécois3# Auteur : Simon-Pierre Boucher — contact@spboucher.ai4# connectors/squarespace.py : connecteur générique Squarespace Commerce —5# pages collection en JSON natif (?format=json).6# -----------------------------------------------------------------------------7from __future__ import annotations89from ..schema import Product, parse_price10from .base import BaseConnector111213class SquarespaceConnector(BaseConnector):14 platform = "squarespace"1516 def fetch(self) -> list[Product]:17 endpoint = (self.store.get("catalog_endpoint") or "/shop?format=json").split("?")[0]18 out: list[Product] = []19 page_url = f"{self.base}{endpoint}?format=json"20 for _ in range(self.max_pages):21 data = self.get(page_url).json()22 items = data.get("items", [])23 for it in items:24 variants = it.get("variants") or []25 prices = [parse_price((v.get("priceMoney") or {}).get("value") or v.get("price"))26 for v in variants]27 prices = [p for p in prices if p]28 sd = it.get("structuredContent") or {}29 if not prices:30 prices = [parse_price((sd.get("priceMoney") or {}).get("value"))]31 prices = [p for p in prices if p]32 imgs = [it.get("assetUrl", "")]33 imgs += [im.get("assetUrl", "") for im in (it.get("items") or [])]34 out.append(Product(35 store_id=self.store_id,36 external_id=str(it.get("id", it.get("urlId", ""))),37 url=f"{self.base}{it.get('fullUrl', '')}",38 title=it.get("title", ""),39 description=it.get("excerpt", "") or "",40 price=min(prices) if prices else None,41 price_max=max(prices) if prices else None,42 images=[i for i in imgs if i],43 tags=list(it.get("tags") or []) + list(it.get("categories") or []),44 available=not (sd.get("isSoldOut") or False),45 ))46 pagination = data.get("pagination") or {}47 if not pagination.get("nextPage"):48 break49 page_url = f"{self.base}{endpoint}?format=json&offset={pagination.get('nextPageOffset','')}"50 if not pagination.get("nextPageOffset"):51 break52 return out53