diff --git a/pkg/services/umind_ingest_service.go b/pkg/services/umind_ingest_service.go index 172629a..4d19f92 100644 --- a/pkg/services/umind_ingest_service.go +++ b/pkg/services/umind_ingest_service.go @@ -2,6 +2,7 @@ package services import ( "fmt" + "io" "log" "net/http" "net/url" @@ -45,8 +46,27 @@ func crawlearPagina(pageURL string) (*paginaCrawleada, error) { return nil, fmt.Errorf("%s respondió %d", pageURL, resp.StatusCode) } ct := resp.Header.Get("Content-Type") - if ct != "" && !strings.Contains(ct, "text/html") { - return nil, fmt.Errorf("%s no es HTML (%s)", pageURL, ct) + esHTML := ct == "" || strings.Contains(ct, "text/html") + // Además de HTML, se acepta texto plano/Markdown servido tal cual — es un + // patrón cada vez más común (ej. este mismo caso: un .md pensado para que + // lo consuma una IA, sin ruido de HTML que limpiar). + esTexto := strings.Contains(ct, "text/plain") || strings.Contains(ct, "text/markdown") || + strings.HasSuffix(strings.ToLower(strings.Split(pageURL, "?")[0]), ".md") + if !esHTML && !esTexto { + return nil, fmt.Errorf("%s no es HTML ni texto plano (%s)", pageURL, ct) + } + + if !esHTML { + body, err := io.ReadAll(io.LimitReader(resp.Body, 2*1024*1024)) + if err != nil { + return nil, fmt.Errorf("no se pudo leer %s: %w", pageURL, err) + } + pagina := &paginaCrawleada{URL: pageURL, Texto: normalizarEspacios(string(body))} + primeraLinea := strings.TrimSpace(strings.SplitN(string(body), "\n", 2)[0]) + if strings.HasPrefix(primeraLinea, "#") { + pagina.Titulo = strings.TrimSpace(strings.TrimLeft(primeraLinea, "# ")) + } + return pagina, nil } base, err := url.Parse(pageURL)