SPB Git

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%
2.5 KB · 53 lines python
Raw Blame History
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