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():