11 KiB
Sistema de Descubrimiento y Gestión de Feeds RSS
Este documento describe el sistema mejorado de descubrimiento automático y gestión de feeds RSS implementado en RSS2.
📋 Visión General
El sistema ahora incluye dos mecanismos para gestionar feeds RSS:
- Gestión Manual Mejorada: Interfaz web para descubrir y añadir feeds desde cualquier URL
- Worker Automático: Proceso en segundo plano que descubre feeds desde URLs almacenadas
🎯 Componentes del Sistema
1. Utilidad de Descubrimiento (utils/feed_discovery.py)
Módulo Python que proporciona funciones para:
discover_feeds(url): Descubre automáticamente todos los feeds RSS/Atom desde una URLvalidate_feed(feed_url): Valida un feed y extrae su información básicaget_feed_metadata(feed_url): Obtiene metadatos detallados de un feed
from utils.feed_discovery import discover_feeds
# Descubrir feeds desde una URL
feeds = discover_feeds('https://elpais.com')
# Retorna: [{'url': '...', 'title': '...', 'valid': True, ...}, ...]
2. Router de Feeds Mejorado (routers/feeds.py)
Nuevos endpoints añadidos:
Interfaz Web
-
GET/POST /feeds/discover: Interfaz para descubrir feeds desde una URL- Muestra todos los feeds encontrados
- Permite seleccionar cuáles añadir
- Aplica configuración global (categoría, país, idioma)
-
POST /feeds/discover_and_add: Añade múltiples feeds seleccionados- Extrae automáticamente título y descripción
- Evita duplicados
- Muestra estadísticas de feeds añadidos
API JSON
-
POST /feeds/api/discover: API para descubrir feeds{ "url": "https://example.com" }Retorna:
{ "feeds": [...], "count": 5 } -
POST /feeds/api/validate: API para validar un feed específico{ "url": "https://example.com/rss" }
3. Worker de Descubrimiento (workers/url_discovery_worker.py)
Worker automático que:
-
Procesa URLs de la tabla
fuentes_url- Prioriza URLs nunca procesadas
- Reintenta URLs con errores
- Actualiza URLs antiguas
-
Descubre y Crea Feeds Automáticamente
- Encuentra todos los feeds RSS en cada URL
- Valida cada feed encontrado
- Crea entradas en la tabla
feeds - Evita duplicados
-
Gestión de Estado
- Actualiza
last_check,last_status,status_message - Maneja errores gracefully
- Registra estadísticas detalladas
- Actualiza
Configuración del Worker
Variables de entorno:
# Intervalo de ejecución (minutos)
URL_DISCOVERY_INTERVAL_MIN=15
# Número de URLs a procesar por ciclo
URL_DISCOVERY_BATCH_SIZE=10
# Máximo de feeds a crear por URL
MAX_FEEDS_PER_URL=5
Estados de URLs en fuentes_url
| Estado | Descripción |
|---|---|
success |
Feeds creados exitosamente |
existing |
Feeds encontrados pero ya existían |
no_feeds |
No se encontraron feeds RSS |
no_valid_feeds |
Se encontraron feeds pero ninguno válido |
error |
Error al procesar la URL |
🚀 Uso del Sistema
Método 1: Interfaz Web Manual
- Navega a
/feeds/discover - Ingresa una URL (ej:
https://elpais.com) - Haz clic en "Buscar Feeds"
- El sistema mostrará todos los feeds encontrados con:
- Estado de validación
- Título y descripción
- Número de entradas
- Tipo de feed (RSS/Atom)
- Configura opciones globales:
- Categoría
- País
- Idioma
- Selecciona los feeds deseados y haz clic en "Añadir Feeds Seleccionados"
Método 2: Worker Automático
-
Añade URLs a la tabla
fuentes_url:INSERT INTO fuentes_url (nombre, url, categoria_id, pais_id, idioma, active) VALUES ('El País', 'https://elpais.com', 1, 1, 'es', TRUE); -
El worker procesará automáticamente:
- Cada 15 minutos (configurable)
- Descubrirá todos los feeds
- Creará entradas en
feeds - Actualizará el estado
-
Monitorea el progreso:
SELECT nombre, url, last_check, last_status, status_message FROM fuentes_url ORDER BY last_check DESC;
Método 3: Interfaz de URLs (Existente)
Usa la interfaz web existente en /urls/add_source para añadir URLs que serán procesadas por el worker.
🔄 Flujo de Trabajo Completo
┌─────────────────┐
│ Usuario añade │
│ URL del sitio │
└────────┬────────┘
│
v
┌─────────────────────────┐
│ URL guardada en │
│ tabla fuentes_url │
└────────┬────────────────┘
│
v
┌─────────────────────────┐
│ Worker ejecuta cada │
│ 15 minutos │
└────────┬────────────────┘
│
v
┌─────────────────────────┐
│ Descubre feeds RSS │
│ usando feedfinder2 │
└────────┬────────────────┘
│
v
┌─────────────────────────┐
│ Valida cada feed │
│ encontrado │
└────────┬────────────────┘
│
v
┌─────────────────────────┐
│ Crea entradas en │
│ tabla feeds │
└────────┬────────────────┘
│
v
┌─────────────────────────┐
│ Ingestor Go procesa │
│ feeds cada 15 minutos │
└────────┬────────────────┘
│
v
┌─────────────────────────┐
│ Noticias descargadas │
│ y procesadas │
└─────────────────────────┘
📊 Tablas de Base de Datos
fuentes_url
Almacena URLs de sitios web para descubrimiento automático:
CREATE TABLE fuentes_url (
id SERIAL PRIMARY KEY,
nombre VARCHAR(255) NOT NULL,
url TEXT NOT NULL UNIQUE,
categoria_id INTEGER REFERENCES categorias(id),
pais_id INTEGER REFERENCES paises(id),
idioma CHAR(2) DEFAULT 'es',
last_check TIMESTAMP,
last_status VARCHAR(50),
status_message TEXT,
last_http_code INTEGER,
active BOOLEAN DEFAULT TRUE
);
feeds
Almacena feeds RSS descubiertos y validados:
CREATE TABLE feeds (
id SERIAL PRIMARY KEY,
nombre VARCHAR(255),
descripcion TEXT,
url TEXT NOT NULL UNIQUE,
categoria_id INTEGER REFERENCES categorias(id),
pais_id INTEGER REFERENCES paises(id),
idioma CHAR(2),
activo BOOLEAN DEFAULT TRUE,
fallos INTEGER DEFAULT 0,
last_etag TEXT,
last_modified TEXT,
last_error TEXT
);
⚙️ Configuración del Sistema
Variables de Entorno
Añade al archivo .env:
# RSS Ingestor
RSS_POKE_INTERVAL_MIN=15 # Intervalo de ingesta (minutos)
RSS_MAX_FAILURES=10 # Fallos máximos antes de desactivar feed
RSS_FEED_TIMEOUT=60 # Timeout para descargar feeds (segundos)
# URL Discovery Worker
URL_DISCOVERY_INTERVAL_MIN=15 # Intervalo de descubrimiento (minutos)
URL_DISCOVERY_BATCH_SIZE=10 # URLs a procesar por ciclo
MAX_FEEDS_PER_URL=5 # Máximo de feeds por URL
Docker Compose
El worker ya está configurado en docker-compose.yml:
url-discovery-worker:
build: .
container_name: rss2_url_discovery
command: bash -lc "python -m workers.url_discovery_worker"
environment:
DB_HOST: db
URL_DISCOVERY_INTERVAL_MIN: 15
URL_DISCOVERY_BATCH_SIZE: 10
MAX_FEEDS_PER_URL: 5
depends_on:
db:
condition: service_healthy
restart: unless-stopped
🔧 Comandos Útiles
Ver logs del worker de descubrimiento
docker logs -f rss2_url_discovery
Reiniciar el worker
docker restart rss2_url_discovery
Ejecutar manualmente el worker (testing)
docker exec -it rss2_url_discovery python -m workers.url_discovery_worker
Ver estadísticas de descubrimiento
-- URLs procesadas recientemente
SELECT nombre, url, last_check, last_status, status_message
FROM fuentes_url
WHERE last_check > NOW() - INTERVAL '1 day'
ORDER BY last_check DESC;
-- Feeds creados recientemente
SELECT nombre, url, fecha_creacion
FROM feeds
WHERE fecha_creacion > NOW() - INTERVAL '1 day'
ORDER BY fecha_creacion DESC;
🛠️ Troubleshooting
El worker no encuentra feeds
-
Verifica que la URL sea accesible:
curl -I https://example.com -
Verifica los logs del worker:
docker logs rss2_url_discovery -
Prueba manualmente el descubrimiento:
from utils.feed_discovery import discover_feeds feeds = discover_feeds('https://example.com') print(feeds)
Feeds duplicados
El sistema previene duplicados usando ON CONFLICT (url) DO NOTHING. Si un feed ya existe, simplemente se omite.
Worker consume muchos recursos
Ajusta las configuraciones:
# Reduce el batch size
URL_DISCOVERY_BATCH_SIZE=5
# Aumenta el intervalo
URL_DISCOVERY_INTERVAL_MIN=30
# Reduce feeds por URL
MAX_FEEDS_PER_URL=3
📝 Mejores Prácticas
-
Añade URLs de sitios, no feeds directos
- ✅
https://elpais.com - ❌
https://elpais.com/rss/feed.xml
- ✅
-
Configura categoría y país correctamente
- Facilita la organización
- Mejora la experiencia del usuario
-
Monitorea el estado de las URLs
- Revisa periódicamente
fuentes_url - Desactiva URLs que fallan consistentemente
- Revisa periódicamente
-
Limita el número de feeds por URL
- Evita sobrecarga de feeds similares
- Mantén
MAX_FEEDS_PER_URLentre 3-5
🎉 Ventajas del Sistema
✅ Automatización completa: Solo añade URLs, el sistema hace el resto ✅ Descubrimiento inteligente: Encuentra todos los feeds disponibles ✅ Validación automática: Solo crea feeds válidos y funcionales ✅ Sin duplicados: Gestión inteligente de feeds existentes ✅ Escalable: Procesa múltiples URLs en lotes ✅ Resiliente: Manejo robusto de errores y reintentos ✅ Monitoreable: Logs detallados y estados claros
📚 Referencias
- feedfinder2: https://github.com/dfm/feedfinder2
- feedparser: https://feedparser.readthedocs.io/
- Tabla fuentes_url:
/init-db/01.schema.sql - Worker:
/workers/url_discovery_worker.py - Utilidades:
/utils/feed_discovery.py