Initial clean commit
This commit is contained in:
commit
6784d81c2c
141 changed files with 25219 additions and 0 deletions
426
docs/PROCESO_COMPLETO_FEEDS.md
Normal file
426
docs/PROCESO_COMPLETO_FEEDS.md
Normal file
|
|
@ -0,0 +1,426 @@
|
|||
# 📖 PROCESO COMPLETO: Descubrimiento y Gestión de Feeds RSS
|
||||
|
||||
## 🎯 Problema Resuelto
|
||||
|
||||
**Pregunta:** ¿Cómo asigno país y categoría a los feeds descubiertos automáticamente?
|
||||
|
||||
**Respuesta:** El sistema ahora usa un flujo inteligente de 3 niveles:
|
||||
|
||||
1. **Auto-aprobación** (feeds con categoría/país)
|
||||
2. **Revisión manual** (feeds sin metadata completa)
|
||||
3. **Análisis automático** (sugerencias inteligentes)
|
||||
|
||||
---
|
||||
|
||||
## 🔄 FLUJO COMPLETO DEL SISTEMA
|
||||
|
||||
### Paso 1: Añadir URL Fuente
|
||||
|
||||
Tienes 2 opciones para añadir URLs:
|
||||
|
||||
#### Opción A: Con Categoría y País (AUTO-APROBACIÓN)
|
||||
```sql
|
||||
INSERT INTO fuentes_url (nombre, url, categoria_id, pais_id, idioma, active)
|
||||
VALUES ('El País', 'https://elpais.com', 1, 44, 'es', TRUE);
|
||||
-- ^ ^
|
||||
-- categoria_id pais_id
|
||||
```
|
||||
|
||||
✅ **Resultado**: Feeds se crean **AUTOMÁTICAMENTE** y se activan
|
||||
- Worker descubre feeds
|
||||
- Hereda categoría (1) y país (44) del padre
|
||||
- Crea feeds en tabla `feeds` directam ente
|
||||
- Ingestor empieza a descargar noticias
|
||||
|
||||
#### Opción B: Sin Categoría o País (REQUIERE REVISIÓN)
|
||||
```sql
|
||||
INSERT INTO fuentes_url (nombre, url, active)
|
||||
VALUES ('BBC News', 'https://www.bbc.com/news', TRUE);
|
||||
-- Sin categoria_id ni pais_id
|
||||
```
|
||||
|
||||
⚠️ **Resultado**: Feeds van a **REVISIÓN MANUAL**
|
||||
- Worker descubre feeds
|
||||
- Analiza automáticamente:
|
||||
- Detecta país desde dominio (.com → Reino Unido)
|
||||
- Detecta idioma (en)
|
||||
- Sugiere categoría ("Internacional")
|
||||
- Crea feeds en tabla `feeds_pending`
|
||||
- **ESPERA APROBACIÓN MANUAL** antes de activar
|
||||
|
||||
---
|
||||
|
||||
### Paso 2: Worker Descubre Feeds (cada 15 min)
|
||||
|
||||
El worker `url_discovery_worker` ejecuta automaticamente:
|
||||
|
||||
```
|
||||
1. Lee fuentes_url activas
|
||||
2. Para cada URL:
|
||||
a. Descubre todos los feeds RSS
|
||||
b. Valida cada feed
|
||||
c. Analiza metadata:
|
||||
- Idioma del feed
|
||||
- País (desde dominio: .es, .uk, .fr, etc.)
|
||||
- Categoría sugerida (keywords en título/descripción)
|
||||
|
||||
d. DECIDE EL FLUJO:
|
||||
|
||||
┌─────────────────────────────────────┐
|
||||
│ ¿Parent tiene categoria_id Y pais_id? │
|
||||
└──────────┬──────────────────────────┘
|
||||
│
|
||||
┌────────┴────────┐
|
||||
│ SÍ │ NO
|
||||
▼ ▼
|
||||
┌──────────────┐ ┌─────────────────┐
|
||||
│ AUTO-APROBAR │ │ REQUIERE REVISIÓN│
|
||||
└───────┬──────┘ └─────────┬───────┘
|
||||
│ │
|
||||
▼ ▼
|
||||
tabla: feeds tabla: feeds_pending
|
||||
activo: TRUE reviewed: FALSE
|
||||
✅ Listo para ⏳ Espera aprobación
|
||||
ingestor
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Paso 3A: Feeds AUTO-APROBADOS
|
||||
|
||||
Si la URL padre tiene `categoria_id` y `pais_id`:
|
||||
|
||||
```sql
|
||||
-- Ejemplo: URL con metadata completa
|
||||
fuentes_url:
|
||||
id=1, url='https://elpais.com',
|
||||
categoria_id=1 (Noticias),
|
||||
pais_id=44 (España)
|
||||
|
||||
↓ Worker descubre 3 feeds:
|
||||
- https://elpais.com/rss/portada.xml
|
||||
- https://elpais.com/rss/internacional.xml
|
||||
- https://elpais.com/rss/deportes.xml
|
||||
|
||||
↓ Se crean DIRECTAMENTE en tabla feeds:
|
||||
INSERT INTO feeds (nombre, url, categoria_id, pais_id, activo)
|
||||
VALUES
|
||||
('El País - Portada', 'https://elpais.com/rss/portada.xml', 1, 44, TRUE),
|
||||
('El País - Internacional', 'https://elpais.com/rss/internacional.xml', 1, 44, TRUE),
|
||||
('El País - Deportes', 'https://elpais.com/rss/deportes.xml', 1, 44, TRUE);
|
||||
|
||||
✅ Feeds están ACTIVOS inmediatamente
|
||||
✅ Ingestor Go los procesa en siguiente ciclo (15 min)
|
||||
✅ Noticias empiezan a llegar
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Paso 3B: Feeds PENDIENTES (requieren revisión)
|
||||
|
||||
Si la URL padre NO tiene `categoria_id` o `pais_id`:
|
||||
|
||||
```sql
|
||||
-- Ejemplo: URL sin metadata
|
||||
fuentes_url:
|
||||
id=2, url='https://www.bbc.com/news',
|
||||
categoria_id=NULL,
|
||||
pais_id=NULL
|
||||
|
||||
↓ Worker descubre 2 feeds y ANALIZA automáticamente:
|
||||
|
||||
Feed 1: https://www.bbc.com/news/world/rss.xml
|
||||
- Título: "BBC News - World"
|
||||
- Idioma detectado: 'en'
|
||||
- País detectado: 'Reino Unido' (desde .com + idioma inglés)
|
||||
- Categoría sugerida: 'Internacional' (keyword "world")
|
||||
|
||||
Feed 2: https://www.bbc.com/sport/rss.xml
|
||||
- Título: "BBC Sport"
|
||||
- Idioma detectado: 'en'
|
||||
- País detectado: 'Reino Unido'
|
||||
- Categoría sugerida: 'Deportes' (keyword "sport")
|
||||
|
||||
↓ Se crean en tabla feeds_pending:
|
||||
INSERT INTO feeds_pending (
|
||||
fuente_url_id, feed_url, feed_title,
|
||||
feed_language, detected_country_id, suggested_categoria_id,
|
||||
reviewed, approved, notes
|
||||
) VALUES (
|
||||
2,
|
||||
'https://www.bbc.com/news/world/rss.xml',
|
||||
'BBC News - World',
|
||||
'en',
|
||||
74, -- Reino Unido (ID detectado)
|
||||
2, -- Internacional (ID sugerido)
|
||||
FALSE, FALSE,
|
||||
'Country from domain: Reino Un ido | Suggested category: Internacional (confidence: 85%)'
|
||||
);
|
||||
|
||||
⏳ Feeds están PENDIENTES
|
||||
⏳ NO están activos aún
|
||||
⏳ Requieren revisión manual en /feeds/pending
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Tabla Comparativa
|
||||
|
||||
| Aspecto | Auto-Aprobación | Revisión Manual |
|
||||
|---------|----------------|-----------------|
|
||||
| **Requisito** | URL padre con `categoria_id` Y `pais_id` | URL padre sin uno o ambos |
|
||||
| **Tabla destino** | `feeds` (directa) | `feeds_pending` (temporal) |
|
||||
| **Estado inicial** | `activo = TRUE` | `reviewed = FALSE, approved = FALSE` |
|
||||
| **Análisis automático** | Hereda valores del padre | Detecta país, sugiere categoría |
|
||||
| **Intervención manual** | ❌ No necesaria | ✅ Requerida |
|
||||
| **Tiempo hasta activación** | Inmediato | Después de aprobación |
|
||||
| **Ingestor procesa** | Sí (próximo ciclo) | No (hasta aprobar) |
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Interfaces de Gestión
|
||||
|
||||
### 1. Añadir URL con Metadata (Auto-aprobación)
|
||||
|
||||
**Ruta:** `/urls/add_source`
|
||||
|
||||
```
|
||||
Formulario:
|
||||
┌─────────────────────────────────────┐
|
||||
│ Nombre: El País │
|
||||
│ URL: https://elpais.com │
|
||||
│ Categoría: [Noticias ▼] ← IMPORTANTE
|
||||
│ País: [España ▼] ← IMPORTANTE
|
||||
│ Idioma: es │
|
||||
│ │
|
||||
│ [Añadir Fuente] │
|
||||
└─────────────────────────────────────┘
|
||||
|
||||
Resultado: Feeds se crearán AUTOMÁTICAMENTE
|
||||
```
|
||||
|
||||
### 2. Revisar Feeds Pendientes (Nueva interfaz)
|
||||
|
||||
**Ruta:** `/feeds/pending` (próximamente)
|
||||
|
||||
```
|
||||
Feeds Pendientes de Revisión
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Feed: BBC News - World
|
||||
URL: https://www.bbc.com/news/world/rss.xml
|
||||
Fuente: BBC News (https://www.bbc.com/news)
|
||||
|
||||
Análisis Automático:
|
||||
├─ Idioma: English (en)
|
||||
├─ País detectado: Reino Unido (.com domain + language)
|
||||
└─ Categoría sugerida: Internacional (85% confianza)
|
||||
Keywords: "world", "international", "global"
|
||||
|
||||
┌─────────────────────────────────────┐
|
||||
│ Categoría: [Internacional ▼] │ ← Pre-seleccionada
|
||||
│ País: [Reino Unido ▼] │ ← Pre-seleccionado
|
||||
│ Idioma: [en] │ ← Auto-detectado
|
||||
│ │
|
||||
│ [✓ Aprobar Feed] [✗ Rechazar] │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 3. Descubrir Feeds Manualmente
|
||||
|
||||
**Ruta:** `/feeds/discover`
|
||||
|
||||
```
|
||||
Perfecto para cuando quieres control total:
|
||||
1. Ingresar URL
|
||||
2. Ver todos los feeds encontrados
|
||||
3. Seleccionar cuáles añadir
|
||||
4. Asignar categoría/país globalmente
|
||||
5. Feeds se crean directamente (no van a pending)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 RECOMENDACIONES DE USO
|
||||
|
||||
### Estrategia 1: Auto-aprobación Total
|
||||
**Para fuentes conocidas y confiables:**
|
||||
|
||||
```sql
|
||||
-- Añadir fuentes con metadata completa
|
||||
INSERT INTO fuentes_url (nombre, url, categoria_id, pais_id, idioma) VALUES
|
||||
('El País', 'https://elpais.com', 1, 44, 'es'),
|
||||
('Le Monde', 'https://lemonde.fr', 1, 60, 'fr'),
|
||||
('The Guardian', 'https://theguardian.com', 1, 74, 'en');
|
||||
|
||||
-- Worker creará feeds automáticamente
|
||||
-- Sin intervención manual necesaria
|
||||
```
|
||||
|
||||
### Estrategia 2: Revisión Manual
|
||||
**Para fuentes nuevas o desconocidas:**
|
||||
|
||||
```sql
|
||||
-- Añadir sin metadata
|
||||
INSERT INTO fuentes_url (nombre, url) VALUES
|
||||
('Sitio Desconocido', 'https://ejemplo.com');
|
||||
|
||||
-- Worker crea feeds en feeds_pending
|
||||
-- Revisar en /feeds/pending
|
||||
-- Aprobar/rechazar manualmente
|
||||
```
|
||||
|
||||
### Estrategia 3: Híbrida (Recomendada)
|
||||
**Combinar ambas:**
|
||||
|
||||
- URLs conocidas → Con categoría/país
|
||||
- URLs nuevas → Sin metadata (revisión)
|
||||
- Usar análisis automático como guía
|
||||
- Ajustar manualmente si es necesario
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Análisis Automático Explicado
|
||||
|
||||
### Detección de País
|
||||
|
||||
```python
|
||||
# 1. Desde dominio (TLD)
|
||||
.es → España
|
||||
.uk, .co.uk → Reino Unido
|
||||
.fr → Francia
|
||||
.de → Alemania
|
||||
.mx → México
|
||||
.ar → Argentina
|
||||
|
||||
# 2. Desde idioma (si no hay dominio claro)
|
||||
es → España (país principal)
|
||||
en → Reino Unido
|
||||
fr → Francia
|
||||
pt → Portugal
|
||||
|
||||
# 3. Desde subdominios
|
||||
es.example.com → España
|
||||
uk.example.com → Reino Unido
|
||||
```
|
||||
|
||||
### Sugerencia de Categoría
|
||||
|
||||
```python
|
||||
# Análisis de keywords en título + descripción
|
||||
|
||||
Keywords encontrados → Categoría sugerida (% confianza)
|
||||
|
||||
"política", "gobierno", "elecciones" → Política (75%)
|
||||
"economía", "bolsa", "mercado" → Economía (82%)
|
||||
"tecnología", "software", "digital" → Tecnología (90%)
|
||||
"deportes", "fútbol", "liga" → Deportes (95%)
|
||||
"internacional", "mundo", "global" → Internacional (70%)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📝 Ejemplos Completos
|
||||
|
||||
### Ejemplo 1: Periódico Español (Auto-aprobación)
|
||||
|
||||
```sql
|
||||
-- 1. Añadir fuente con metadata
|
||||
INSERT INTO fuentes_url (nombre, url, categoria_id, pais_id, idioma)
|
||||
VALUES ('El Mundo', 'https://elmundo.es', 1, 44, 'es');
|
||||
|
||||
-- 2. Worker ejecuta (15 min después):
|
||||
-- - Descubre: elmundo.es/rss/portada.xml
|
||||
-- - Descubre: elmundo.es/rss/deportes.xml
|
||||
-- - Hereda: categoria_id=1, pais_id=44
|
||||
-- - Crea en feeds directamente
|
||||
|
||||
-- 3. Resultado en tabla feeds:
|
||||
SELECT id, nombre, url, categoria_id, pais_id, activo
|
||||
FROM feeds
|
||||
WHERE fuente_nombre LIKE '%El Mundo%';
|
||||
|
||||
-- id | nombre | url | cat | pais | activo
|
||||
-- 1 | El Mundo - Portada | elmundo.es/rss/portada.xml | 1 | 44 | TRUE
|
||||
-- 2 | El Mundo - Deportes | elmundo.es/rss/deportes.xml | 1 | 44 | TRUE
|
||||
|
||||
-- ✅ Feeds activos, ingestor procesando
|
||||
```
|
||||
|
||||
### Ejemplo 2: Sitio Internacional (Revisión Manual)
|
||||
|
||||
```sql
|
||||
-- 1. Añadir fuente SIN metadata
|
||||
INSERT INTO fuentes_url (nombre, url)
|
||||
VALUES ('Reuters', 'https://www.reuters.com');
|
||||
|
||||
-- 2. Worker ejecuta (15 min después):
|
||||
-- - Descubre: reuters.com/rssfeed/worldNews
|
||||
-- - Analiza: idioma=en, país=Reino Unido (dominio+idioma)
|
||||
-- - Sugiere: categoría=Internacional (keyword "world")
|
||||
-- - Crea en feeds_pending
|
||||
|
||||
-- 3. Resultado en tabla feeds_pending:
|
||||
SELECT feed_title, detected_country_id, suggested_categoria_id, notes
|
||||
FROM feeds_pending
|
||||
WHERE fuente_url_id = 3;
|
||||
|
||||
-- feed_title | detected_country_id | suggested_cat | notes
|
||||
-- Reuters World News | 74 (Reino Unido) | 2 (Int.) | "Country from domain..."
|
||||
|
||||
-- ⏳ Requiere aprobación en /feeds/pending
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ CHECKLIST: Añadir Nueva Fuente
|
||||
|
||||
**Para auto-aprobación (recomendado si sabes país/categoría):**
|
||||
|
||||
- [ ] Ir a `/urls/add_source`
|
||||
- [ ] Ingresar nombre descriptivo
|
||||
- [ ] Ingresar URL del sitio (NO del feed RSS)
|
||||
- [ ] **IMPORTANTE:** Seleccionar categoría
|
||||
- [ ] **IMPORTANTE:** Seleccionar país
|
||||
- [ ] Ingresar idioma (opcional, se detecta)
|
||||
- [ ] Guardar
|
||||
- [ ] Esperar 15 minutos (máximo)
|
||||
- [ ] Ver feeds en `/feeds/` (activos automáticamente)
|
||||
|
||||
**Para revisión manual (si no estás seguro):**
|
||||
|
||||
- [ ] Ir a `/urls/add_source`
|
||||
- [ ] Ingresar nombre y URL
|
||||
- [ ] Dejar categoría/país vacíos
|
||||
- [ ] Guardar
|
||||
- [ ] Esperar 15 minutos
|
||||
- [ ] Ir a `/feeds/pending`
|
||||
- [ ] Revisar sugerencias automáticas
|
||||
- [ ] Ajustar categoría/país si necesario
|
||||
- [ ] Aprobar feeds
|
||||
- [ ] Feeds se activan inmediatamente
|
||||
|
||||
---
|
||||
|
||||
## 🎓 Resumen Ejecutivo
|
||||
|
||||
**3 Niveles de Automatización:**
|
||||
|
||||
| Nivel | Descripción | Cuándo Usar |
|
||||
|-------|-------------|-------------|
|
||||
| **Nivel 1: Totalmente Manual** | Descubrir en `/feeds/discover` | Control total, pocas URLs |
|
||||
| **Nivel 2: Auto-aprobación** | URL con cat/país → feeds activos | URLs confiables, muchas fuentes |
|
||||
| **Nivel 3: Revisión Asistida** | URL sin cat/país → análisis → aprobar | URLs nuevas, verificación |
|
||||
|
||||
**Flujo Recomendado:**
|
||||
1. Añade URL con categoría/país si la conoces
|
||||
2. Si no, déjalo vacío y revisa sugerencias automáticas
|
||||
3. Worker descubre y analiza todo automáticamente
|
||||
4. Tú solo apruebas/ajustas lo necesario
|
||||
|
||||
**Resultado:** Gestión eficiente de cientos de fuentes RSS con mínima intervención manual.
|
||||
|
||||
---
|
||||
|
||||
**📅 Fecha de última actualización:** 2026-01-07
|
||||
**📌 Versión del sistema:** 2.0 - Análisis Inteligente de Feeds
|
||||
Loading…
Add table
Add a link
Reference in a new issue