spb/trouve-ka Public
Trouve-KA — moteur de recherche web indépendant, Québec-first. Crawler distribué, index OpenSearch, ranking bilingue, galerie d'images. En prod : www.trouve-ka.com
Python 76.8%
TypeScript 15.7%
SQL 3.9%
Shell 1.4%
CSS 1.3%
Dockerfile 0.7%
1/**2 * Trouve-KA — flux temps réel du bot (footer)3 * Author: Simon-Pierre Boucher4 * Contact: contact@spboucher.ai5 */67"use client";89import { useEffect, useState } from "react";1011type LiveEvent = {12 at: string;13 url: string;14 domain: string;15 outcome: string;16};1718/**19 * Affiche en temps réel le site que TrouveKABot est en train de scraper.20 * Poll /api/live toutes les 4 s; se cache silencieusement si l'API est injoignable.21 */22export function LiveCrawl() {23 const [event, setEvent] = useState<LiveEvent | null>(null);2425 useEffect(() => {26 let active = true;27 const tick = async () => {28 try {29 const res = await fetch("/api/live", { cache: "no-store" });30 if (!res.ok) return;31 const data = (await res.json()) as { event: LiveEvent | null };32 if (active && data.event) setEvent(data.event);33 } catch {34 // API injoignable : on garde le dernier événement affiché35 }36 };37 tick();38 const id = setInterval(tick, 4000);39 return () => {40 active = false;41 clearInterval(id);42 };43 }, []);4445 if (!event) return null;4647 const shortUrl = event.url.replace(/^https?:\/\/(www\.)?/, "").slice(0, 80);4849 return (50 <p className="gk-mono mt-2 flex flex-wrap items-center gap-x-2 gap-y-1 text-[11px] tracking-[0.04em] text-[rgba(245,243,238,0.6)]">51 <span className="pulse-dot" aria-hidden="true" />52 <span className="font-bold uppercase tracking-[0.12em] text-lime">53 En ce moment54 </span>55 <span>KA bot scrappe le site suivant :</span>56 <span className="break-all font-bold text-[rgba(245,243,238,0.85)]" title={event.url}>57 {shortUrl}58 </span>59 </p>60 );61}62