---
name: extract_obsidian_embeds
kind: function
lang: py
domain: obsidian
version: "1.0.0"
purity: pure
signature: "def extract_obsidian_embeds(body: str) -> list"
description: "Extrae SOLO los embeds ![[...]] (attachments incrustados: imagenes, pdf, otras notas) del cuerpo de una nota de Obsidian, ignorando los wikilinks normales [[...]]. Para cada embed devuelve el target tal cual (nombre de archivo), quitando alias (|...) y anclas (#...). Deduplica preservando orden de aparicion. Pura, sin I/O. Util para detectar que attachments arrastra una nota al migrar un subgrafo."
tags: [obsidian, embed, attachment, image, markdown, extract, migrate]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: ["re"]
params:
  - name: body
    desc: "Cuerpo Markdown de una nota de Obsidian (idealmente sin frontmatter). Puede mezclar wikilinks [[...]] y embeds ![[...]] con alias (|) o ancla (#)."
output: "Lista de strings con los nombres de los attachments embebidos (el target de cada ![[...]]), unicos y en orden de aparicion. Solo embeds: los wikilinks normales [[...]] se ignoran. Lista vacia si no hay embeds."
tested: true
tests:
  - "solo embeds ignora wikilinks"
  - "varios embeds orden y dedup"
  - "quita alias y ancla"
  - "nombre con espacios y parentesis"
  - "sin embeds solo wikilinks"
  - "body vacio"
test_file_path: "python/functions/obsidian/extract_obsidian_embeds_test.py"
file_path: "python/functions/obsidian/extract_obsidian_embeds.py"
---

## Ejemplo

```python
body = (
    "Texto con [[Nota normal]] y un embed ![[imagen.jpg]]. "
    "Luego ![[doc.pdf]] y otra vez ![[imagen.jpg]]."
)
extract_obsidian_embeds(body)
# ["imagen.jpg", "doc.pdf"]

extract_obsidian_embeds("![[dni enmanuel (2).jpg]]")
# ["dni enmanuel (2).jpg"]
```

## Cuando usarla

Usala cuando migres o extraigas un subgrafo de notas y necesites saber QUE
attachments hay que copiar junto a cada nota. A diferencia de
`extract_obsidian_wikilinks` (que devuelve todos los enlaces, incluidos los
embeds), esta funcion aisla solo los `![[...]]`, que son los archivos fisicos
incrustados. Combinala con `resolve_obsidian_embed` para localizar el path real
de cada attachment dentro del vault.

## Gotchas

- Devuelve el nombre del attachment tal cual aparece en el embed (p.ej.
  `dni enmanuel (2).jpg`), NO un path. Obsidian resuelve embeds por nombre de
  archivo unico; para obtener la ruta real usa `resolve_obsidian_embed`.
- Quita deliberadamente el alias (`|300`, util para dimensionar imagenes) y el
  ancla (`#Seccion`, util para embeber un trozo de otra nota). Si necesitas esos
  modificadores, parsea el body tu mismo.
- Solo reconoce embeds con doble corchete `![[...]]`. Los embeds Markdown
  estandar de imagen `![alt](ruta)` NO se detectan.
