---
name: detect_url_type
kind: function
lang: py
domain: core
version: "1.0.0"
purity: impure
signature: "detect_url_type(url: str, timeout: float = 10.0) -> tuple[str, dict]"
description: "Detecta el tipo de contenido de una URL. Retorna tipo ('webpage', 'pdf', 'markdown', 'text', 'code_repository') y metadata. Hace HTTP HEAD request solo si no puede determinarse por patron o extension."
tags: [url, content-type, http, detect, classification, head-request]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: ["urllib.parse", "httpx"]
params:
  - name: url
    desc: "URL a clasificar"
  - name: timeout
    desc: "timeout en segundos para HTTP HEAD request si es necesario"
output: "tupla (tipo, metadata_dict) donde tipo es string como 'pdf', 'webpage', 'code_repository' etc."
tested: true
tests:
  - "URL .pdf por extension"
  - "URL github repo"
  - "URL markdown por extension"
  - "URL SSH git"
  - "URL .html por extension"
test_file_path: "python/functions/core/detect_url_type_test.py"
file_path: "python/functions/core/detect_url_type.py"
---

## Ejemplo

```python
from core.detect_url_type import detect_url_type

# Por patron URL (sin HTTP request)
url_type, meta = detect_url_type("https://github.com/openai/whisper")
# url_type = "code_repository", meta = {"detection": "url_pattern", ...}

# Por extension (sin HTTP request)
url_type, meta = detect_url_type("https://example.com/doc.pdf")
# url_type = "pdf", meta = {"detection": "extension", ...}

# Por HTTP HEAD request (cuando no se puede determinar sin red)
url_type, meta = detect_url_type("https://example.com/page")
# url_type = "webpage", meta = {"detection": "content_type_header", "content_type": "text/html", ...}
```

## Notas

Algoritmo en orden de prioridad:
1. SSH git shorthand (`git@host:path`) → `code_repository` inmediatamente.
2. Patron URL de repos conocidos (github.com/org/repo, gitlab.com/org/repo) → `code_repository`.
3. Extension del path de la URL (.pdf, .md, .txt, .html, .git) → tipo correspondiente.
4. HTTP HEAD request → leer `Content-Type` header.
5. Default: `"webpage"`.

Hosts reconocidos como repos de codigo: github.com, gitlab.com, bitbucket.org, codeberg.org.

Sub-recursos (issues, pulls, blob, tree, etc.) NO se clasifican como `code_repository`.

Lanza `Exception` con mensaje descriptivo si el HEAD request falla (timeout, DNS, red).
