fix: Ghost 5.x — usar mobiledoc+HTML card en lugar del campo html
Build & Deploy ResearchOwl / build-and-push (push) Successful in 6s

El campo "html" en Ghost Admin API v5 (Lexical editor) es de solo
lectura. El contenido se debe enviar via mobiledoc con HTML card,
que Ghost acepta en todas las versiones de v5 y renderiza sin
conversión. Añadidos logs de diagnóstico y validación de HTML vacío.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ChemaVX
2026-05-08 10:44:38 +00:00
parent 83eb2359be
commit 36984657a8
+20 -1
View File
@@ -260,13 +260,32 @@ class GhostPublisher:
tags: list[str] | None = None) -> dict:
import aiohttp as _aio
import markdown as _md
clean = _strip_researchowl_header(markdown_content)
html = _md.markdown(clean, extensions=["extra"])
logger.info("Ghost publish_draft", html_length=len(html),
html_preview=html[:200])
if not html.strip():
raise ValueError("Ghost: HTML vacío tras conversión markdown — contenido no enviado")
# Ghost 5.x (Lexical editor): el campo "html" es solo de lectura en la API.
# La forma fiable de enviar HTML arbitrario es via mobiledoc con HTML card,
# que Ghost acepta en todas las versiones de v5 y renderiza sin conversión.
mobiledoc = json.dumps({
"version": "0.3.1",
"atoms": [],
"cards": [["html", {"html": html}]],
"markups": [],
"sections": [[10, 0]],
})
token = self._make_token()
body = {
"posts": [{
"title": title,
"html": html,
"mobiledoc": mobiledoc,
"status": "draft",
"tags": [{"name": t} for t in (tags or ["investigacion"])],
}]