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 & 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:
@@ -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
@@ -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():
|
||||||
|
|||||||
Reference in New Issue
Block a user