fix(youtube): el tema de investigación no es la descripción del vídeo
Build & Deploy ResearchOwl / build-and-push (push) Successful in 8s

`build_metadata` encabezaba la descripción con el `topic` de la sesión, que no
es prosa: es la consulta con la que se investigó, sopa de palabras clave, y en
la mitad de las sesiones en español. El Short de Trans-en-Provence subió al
canal en INGLÉS con la descripción empezando por "Trans-en-Provence Francia 1981
GEPAN CNES análisis suelo evidencia física".

Quien describe el vídeo es el título, y ése ya sale de `meta.title`, que el
modelo escribe en inglés. El tema sigue alimentando las etiquetas, donde una
frase de búsqueda sí es lo que se quiere.

Dos tests: el caso real clavado, y el borde que abre el arreglo — un spec sin
nada que citar no puede quedarse con la descripción vacía.

No arregla el vídeo ya subido: el token tiene sólo scope `youtube.upload` y
`videos.update` pide `youtube` o `youtube.force-ssl`. Ese scope mínimo es
deliberado (el bot no puede leer ni borrar nada del canal) y ampliarlo para
editar una descripción sale caro; se edita en Studio, que es donde hay que
entrar a publicar de todas formas.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EHakatofHeJAzdXL26Q5bq
This commit is contained in:
ChemaVX
2026-09-02 08:17:28 +00:00
co-authored by Claude Opus 5
parent 7b79e14fdc
commit 068b7feefa
2 changed files with 40 additions and 2 deletions
+12 -1
View File
@@ -211,11 +211,22 @@ def build_metadata(spec: dict, topic: str, article_url: Optional[str] = None,
hace el título — sino ahorrarle a quien revisa teclear el enlace al artículo hace el título — sino ahorrarle a quien revisa teclear el enlace al artículo
y las fuentes. Lo que falte se edita en Studio, que es donde va a estar de y las fuentes. Lo que falte se edita en Studio, que es donde va a estar de
todas formas. todas formas.
`topic` entra por el título (sólo como respaldo) y por las etiquetas, nunca
por la descripción: es la consulta de investigación, y en la mitad de las
sesiones está en español.
""" """
meta = spec.get("meta") or {} meta = spec.get("meta") or {}
title = _clean(meta.get("title") or topic)[:MAX_TITLE] title = _clean(meta.get("title") or topic)[:MAX_TITLE]
parts: list[str] = [_clean(topic)] # El `topic` NO va en la descripción, y no es un olvido. Es la consulta de
# investigación, no prosa: sopa de palabras clave y, en la mitad de las
# sesiones, en español — "Trans-en-Provence Francia 1981 GEPAN CNES análisis
# suelo evidencia física" encabezó la descripción de un vídeo en inglés del
# canal en inglés. Lo que describe el vídeo es el título, que sale de
# `meta.title` y lo escribe el modelo en inglés. El tema sigue alimentando
# las etiquetas, donde una frase de búsqueda sí es lo que se quiere.
parts: list[str] = []
if article_url: if article_url:
parts.append(f"Full investigation → {article_url}") parts.append(f"Full investigation → {article_url}")
+28 -1
View File
@@ -307,7 +307,34 @@ def test_metadata_carries_the_article_link_and_the_citations():
def test_metadata_without_article_url_still_builds(): def test_metadata_without_article_url_still_builds():
description = build_metadata(SPEC, "JAL 1628")["snippet"]["description"] description = build_metadata(SPEC, "JAL 1628")["snippet"]["description"]
assert "Full investigation" not in description assert "Full investigation" not in description
assert "JAL 1628" in description # Sigue habiendo descripción: las fuentes y los hashtags.
assert "FAA · 5 MARCH 1987" in description
assert "#Shorts" in description
def test_the_research_topic_never_reaches_the_description():
"""El `topic` es la consulta de investigación, no prosa que describa el vídeo.
Ocurrió: el Short de Trans-en-Provence subió al canal en INGLÉS con la
descripción encabezada por "Trans-en-Provence Francia 1981 GEPAN CNES
análisis suelo evidencia física" — la consulta tal cual, en español y en
sopa de palabras clave. El título ya describe el vídeo y ése sí lo escribe
el modelo en inglés (`meta.title`).
"""
topic = "Trans-en-Provence Francia 1981 GEPAN CNES análisis suelo evidencia física"
meta = build_metadata(SPEC, topic)
assert topic not in meta["snippet"]["description"]
for palabra in ("análisis", "suelo", "evidencia"):
assert palabra not in meta["snippet"]["description"]
# Pero sigue alimentando las etiquetas, donde una frase de búsqueda sí vale.
assert any(topic.startswith(tag[:20]) for tag in meta["snippet"]["tags"])
def test_the_description_survives_a_spec_with_nothing_to_cite():
"""Sin tema y sin citas queda el mínimo, no una cadena vacía."""
description = build_metadata({"meta": {"title": "T"}, "shots": []},
"cualquier tema")["snippet"]["description"]
assert description.strip() == "#Shorts #UAP #UFO"
def test_title_comes_from_the_spec_and_is_truncated(): def test_title_comes_from_the_spec_and_is_truncated():