Surtidito — enlace de anonimización de video + diagnóstico de envío (2026-08-11)

Síntoma

“No me llegó el correo de Surtidito y revisando el sitio no se hizo el retreival.”

Diagnóstico (verificado con datos reales)

  1. El correo: el cron SÍ corrió (feed regenerado 11 ago 08:31 UTC, visible en Supabase artefactos + /feed). La edición #1 (9 ago) SÍ se envió por broadcast (bfb4506e, status “sent”, entregada a [usuario]@pm.me el 10 ago 20:14 UTC). NO se envió nada más porque no existe edición nueva desde el 9 de agosto: _enviar_edicion_diaria() devuelve “ya enviada” cuando envio_ultimo.edicion == edición más reciente. El cron NO genera ediciones: solo portada, feed, nube, análisis y envío. Ingest → reporte es manual/local.
  2. El retreival del sitio: el feed se regeneró, pero con 0 items X y 0 items YouTube (solo fallback “SITIO”): las 3 instancias de Invidious están muertas (yewtu.be 403 anti-bot, inv.riverside.rocks redirige a un blog personal, invidious.materialio.us sin respuesta) y xcancel/nitter bloquean.
  3. Causa raíz del email: no hay edición del 10 ni 11 de agosto. candidatas/ 2026-08-10.json existe pero nunca se convirtió en reporte/2026-08-10.json.

Decisión

  • Enlace de anonimización /v/{video_id}: mide la incidencia del clic en Tinybird (datasource video_clics, pipe video_incidencia) ANTES de redirigir. Destino: primera instancia Invidious viva (probe con detección anti-bot y verificación de host + reproductor), si ninguna → YouTube directo. Antes moría en instancias muertas (caía al primer inviduous aunque estuviera en 403 anti-bot o secuestrado).
  • Feed de YouTube con fallback al RSS oficial (_fetch_yt_rss): si las 3 instancias de Invidious fallan, usa https://www.youtube.com/feeds/videos.xml (misma cadena que ingest.py). Las URLs del feed y del email (mailing.py _anon()) ahora son /v/{id} anonimizadas.
  • Correo: los enlaces de video en el HTML del email pasan por WEB_URL/v/{id}.

Cómo verificar en el futuro

  • Feed actualizado: https://surtido-alpha.vercel.app/feed (pie: “generado … UTC”).
  • Incidencia: curl "$TINYBIRD_API_URL/v0/pipes/video_incidencia.json?token=$TINYBIRD_TOKEN&limit=10"
  • Envíos: .venv/bin/python mailing.py list / status <id>
  • Estado del cron: no hay log; se infiere del timestamp de feed en Supabase.

Pendiente editorial (para que llegue el correo)

  • Generar edición nueva: .venv/bin/python ingest.py → triage/edición → .venv/bin/python reporte.py reporte/2026-08-XX.json → commit/push (Vercel auto-deploy, ver nota de deploy manual abajo).

Nota operativa: deploy

  • El push a GitHub a veces deja el deploy de Vercel en UNKNOWN/colgado (sin logs). Remedio: vercel link --project surtido --yes && vercel --prod --yes y si hace falta vercel alias <deploy-url> surtido-alpha.vercel.app. OJO: el directorio estaba linkeado al proyecto “surtidito” (proyecto equivocado); el correcto es “surtido” (team nef-projects).