From 068b7feefa134d927242cc67b7930190c04cc6c9 Mon Sep 17 00:00:00 2001 From: ChemaVX Date: Wed, 2 Sep 2026 08:17:28 +0000 Subject: [PATCH] =?UTF-8?q?fix(youtube):=20el=20tema=20de=20investigaci?= =?UTF-8?q?=C3=B3n=20no=20es=20la=20descripci=C3=B3n=20del=20v=C3=ADdeo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `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 Claude-Session: https://claude.ai/code/session_01EHakatofHeJAzdXL26Q5bq --- src/generator/youtube.py | 13 ++++++++++++- tests/test_youtube.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/generator/youtube.py b/src/generator/youtube.py index fbc9029..27b5599 100644 --- a/src/generator/youtube.py +++ b/src/generator/youtube.py @@ -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 y las fuentes. Lo que falte se edita en Studio, que es donde va a estar de 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 {} 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: parts.append(f"Full investigation → {article_url}") diff --git a/tests/test_youtube.py b/tests/test_youtube.py index 056e5e9..5d56a1e 100644 --- a/tests/test_youtube.py +++ b/tests/test_youtube.py @@ -307,7 +307,34 @@ def test_metadata_carries_the_article_link_and_the_citations(): def test_metadata_without_article_url_still_builds(): description = build_metadata(SPEC, "JAL 1628")["snippet"]["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():