Aperçu
Surveiller une chaîne YouTube pour les nouvelles publications, récupérer les métadonnées et les sous-titres automatiques via le point de terminaison YouTube de Scavio, résumer avec GPT/Claude, publier dans un canal Slack selon un planning quotidien.
Déclencheur
Cron quotidien (p. ex. 08:00 UTC)
Planification
Cron quotidien
Étapes du workflow
Interroger le point de terminaison YouTube de Scavio pour une chaîne
POST /api/v1/search avec platform=youtube et le nom de la chaîne ou la requête de sujet.
Filtrer les nouvelles vidéos depuis la dernière exécution
Comparer les dates de publication avec un horodatage last_seen stocké dans SQLite ou Redis.
Extraire la transcription de chaque nouvelle vidéo
Utiliser le point de terminaison d'extraction de Scavio ou le champ de sous-titres automatiques YouTube du résultat de recherche.
Résumer avec un LLM
Envoyer la transcription à Claude ou GPT avec une invite système : 'Résumé en 3 points, points clés, éléments d'action éventuels.'
Publier sur Slack via un webhook
Formater en message Slack Block Kit avec le titre de la vidéo, l'URL de la vignette et les points du résumé.
Mettre à jour l'horodatage last_seen
Conserver la dernière date de publication pour que la prochaine exécution ignore les vidéos déjà traitées.
Implémentation Python
import requests, os, json
key = os.environ["SCAVIO_API_KEY"]
resp = requests.post("https://api.scavio.dev/api/v1/search",
headers={"x-api-key": key},
json={"query": "channel:@3blue1brown", "platform": "youtube", "limit": 5})
videos = resp.json().get("results", [])
for v in videos:
summary = call_llm(v.get("transcript", v["snippet"]))
requests.post(os.environ["SLACK_WEBHOOK"],
json={"text": f"*{v['title']}*\n{summary}\n{v['url']}"})Implémentation JavaScript
const resp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json" },
body: JSON.stringify({ query: "channel:@3blue1brown", platform: "youtube", limit: 5 })
});
const { results } = await resp.json();
for (const v of results) {
const summary = await callLLM(v.transcript ?? v.snippet);
await fetch(process.env.SLACK_WEBHOOK, {
method: "POST", body: JSON.stringify({ text: `*${v.title}*\n${summary}\n${v.url}` })
});
}Plateformes utilisées
YouTube
Recherche de vidéos avec transcriptions et métadonnées