---
name: epub_to_markdown
kind: function
lang: py
domain: core
version: "1.0.0"
purity: impure
signature: "def epub_to_markdown(epub_path: str) -> str"
description: "Convierte un ebook EPUB a markdown. Intenta ebooklib primero para extraccion estructurada (titulo, autor, documentos); fallback a extraccion manual con zipfile si ebooklib no esta instalado."
tags: [epub, markdown, ebook, parsing, conversion, html, text-extraction]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [zipfile, html, re, ebooklib]
params:
  - name: epub_path
    desc: "ruta al archivo EPUB"
output: "string markdown con titulo, autor (si esta disponible) y contenido del ebook"
tested: true
tests:
  - "conversion de headings h1-h3"
  - "conversion de bold e italic"
  - "script y style se eliminan del output"
  - "HTML entities se convierten a caracteres"
  - "epub sin ebooklib extrae texto de archivos html"
  - "epub con ebooklib incluye titulo y autor en el output"
  - "epub corrupto lanza excepcion"
test_file_path: "python/functions/core/epub_to_markdown_test.py"
file_path: "python/functions/core/epub_to_markdown.py"
---

## Ejemplo

```python
md = epub_to_markdown("/path/to/book.epub")
print(md[:500])
# # Mi Libro
# **Author:** Ana Perez
#
# # Introduccion
# Primer parrafo...
```

## Notas

Conversion HTML a markdown cubre: headings h1-h6, bold (`<strong>`/`<b>`), italic (`<em>`/`<i>`), paragraphs, line breaks. Elimina `<script>` y `<style>`. Desescapa entidades HTML y normaliza whitespace.

Con ebooklib: extrae metadata DC (titulo, autor) del OPF y procesa solo los ITEM_DOCUMENT del spine.

Sin ebooklib (fallback ZIP): lista archivos `.html`/`.xhtml`/`.htm` en orden alfabetico y extrae su contenido. No hay metadata de titulo/autor en este modo.

Dependencia opcional: `pip install ebooklib`. Si no esta instalada la funcion sigue funcionando via zipfile.

Reimplementacion conceptual desde OpenViking `openviking/parse/parsers/epub.py` (AGPL-3.0). El codigo es original.
