Créa·Ka — annuaire public cross-plateforme des créateurs de contenu québécois (crea-ka.com)
Python 73.6%
HTML 13.2%
TypeScript 6%
JavaScript 4.5%
CSS 1.7%
Dockerfile 0.6%
1# ==============================================================================2# Author: Simon-Pierre Boucher <contact@spboucher.ai>3# File: creaka/connectors/tavily_seed.py4# Desc: Connecteur DÉCOUVERTE à grande échelle — graines de créateurs5# québécois moissonnées par le Tavily scout (outils/creator-harvest.py6# du dépôt groupe-ka-connecteurs) : handles sociaux extraits des pages7# d'annuaires/palmarès/agences QC. Dataset local (aucune requête ici) :8# data/seed/qc_creator_seeds.jsonl. L'enrichissement (Apify) vérifie9# ensuite l'existence et remplit nom/abonnés/contenu.10# ==============================================================================11"""Découverte massive par moisson web (Tavily).1213Chaque ligne du seed = `{"platform": "...", "handle": "..."}`. On crée une14fiche par handle avec un compte de plateforme (signal `listes_medias` 0.85 :15issu de listes publiques concordantes). Les handles qui n'existent pas seront16simplement non enrichis (found=false côté Apify) ; un balayage d'archivage17retire à terme les fiches jamais confirmées. But : élargir le bassin de18créateurs de plusieurs milliers par vague, sans requête réseau à ce stade.19"""20from __future__ import annotations2122import json23from pathlib import Path2425from ..identity import account26from ..normalize import canonical_url27from ..schema import Creator28from .base import BaseConnector2930SEED_PATH = (Path(__file__).resolve().parent.parent.parent31 / "data" / "seed" / "qc_creator_seeds.jsonl")323334class TavilySeedConnector(BaseConnector):35 source_id = "tavily-seed"36 kind = "discovery"3738 def fetch(self) -> list[Creator]:39 if not SEED_PATH.exists():40 return [] # pas encore de moisson : passage vide, pas d'erreur41 creators: list[Creator] = []42 seen: set[str] = set()43 for line in SEED_PATH.read_text(encoding="utf-8").splitlines():44 line = line.strip()45 if not line:46 continue47 try:48 row = json.loads(line)49 except json.JSONDecodeError:50 continue51 platform = (row.get("platform") or "").strip().lower()52 handle = (row.get("handle") or "").strip().lstrip("@").lower()53 if not platform or not handle:54 continue55 key = f"{platform}:{handle}"56 if key in seen:57 continue58 seen.add(key)59 try:60 acc = account(platform, handle, "listes_medias",61 url=canonical_url(platform, handle)).finalize()62 except Exception:63 continue64 creators.append(Creator(65 source=self.source_id,66 external_id=key,67 display_name=handle, # nom réel rempli à l'enrichissement68 platforms=[acc],69 notes="découvert par moisson web Tavily (annuaires/palmarès QC)",70 ))71 return creators72