# ============================================================================== # Author: Simon-Pierre Boucher # File: creaka/connectors/tavily_seed.py # Desc: Connecteur DÉCOUVERTE à grande échelle — graines de créateurs # québécois moissonnées par le Tavily scout (outils/creator-harvest.py # du dépôt groupe-ka-connecteurs) : handles sociaux extraits des pages # d'annuaires/palmarès/agences QC. Dataset local (aucune requête ici) : # data/seed/qc_creator_seeds.jsonl. L'enrichissement (Apify) vérifie # ensuite l'existence et remplit nom/abonnés/contenu. # ============================================================================== """Découverte massive par moisson web (Tavily). Chaque ligne du seed = `{"platform": "...", "handle": "..."}`. On crée une fiche par handle avec un compte de plateforme (signal `listes_medias` 0.85 : issu de listes publiques concordantes). Les handles qui n'existent pas seront simplement non enrichis (found=false côté Apify) ; un balayage d'archivage retire à terme les fiches jamais confirmées. But : élargir le bassin de créateurs de plusieurs milliers par vague, sans requête réseau à ce stade. """ from __future__ import annotations import json from pathlib import Path from ..identity import account from ..normalize import canonical_url from ..schema import Creator from .base import BaseConnector SEED_PATH = (Path(__file__).resolve().parent.parent.parent / "data" / "seed" / "qc_creator_seeds.jsonl") class TavilySeedConnector(BaseConnector): source_id = "tavily-seed" kind = "discovery" def fetch(self) -> list[Creator]: if not SEED_PATH.exists(): return [] # pas encore de moisson : passage vide, pas d'erreur creators: list[Creator] = [] seen: set[str] = set() for line in SEED_PATH.read_text(encoding="utf-8").splitlines(): line = line.strip() if not line: continue try: row = json.loads(line) except json.JSONDecodeError: continue platform = (row.get("platform") or "").strip().lower() handle = (row.get("handle") or "").strip().lstrip("@").lower() if not platform or not handle: continue key = f"{platform}:{handle}" if key in seen: continue seen.add(key) try: acc = account(platform, handle, "listes_medias", url=canonical_url(platform, handle)).finalize() except Exception: continue creators.append(Creator( source=self.source_id, external_id=key, display_name=handle, # nom réel rempli à l'enrichissement platforms=[acc], notes="découvert par moisson web Tavily (annuaires/palmarès QC)", )) return creators