Este sistema se encuentra en fase beta.
Los datos mostrados provienen de fuentes de terceros (medios de comunicación, redes sociales y organismos públicos).
Las previsiones, análisis de tendencias y clasificaciones se generan mediante modelos estadísticos e inteligencia artificial,
y no constituyen información oficial ni garantizada. Utilice esta herramienta como referencia complementaria.
Changelog
v1.98.0
[1.98.0] – 20-02-2026 16:44hs
Agregado — Mapa interactivo de seguridad e incidentes
Endpoint /api/mapa-seguridad: retorna GeoJSON con noticias geolocalizadas filtradas por período (7/30/90 días). Clasifica automáticamente cada incidente en: muerte, robo, accidente, herido, detención, policial u otro según palabras clave en título y resumen
Página /mapa-seguridad: mapa Leaflet interactivo con marcadores circulares de color por tipo de incidente (negro=muerte, rojo=robo, naranja=accidente, amarillo=herido, azul=detención, violeta=policial)
Filtros interactivos: por período (7/30/90 días) y por tipo de incidente
Panel de estadísticas: contadores por categoría actualizados dinámicamente
Tabla de incidentes: listado scrollable debajo del mapa con título, fuente, fecha y ubicación — links directos a las noticias originales
Nav "Mapa Seguridad" en barra lateral con ícono bi-shield-exclamation
[1.97.0] – 20-02-2026 16:01hs
Agregado — Sistema de referencias legales en noticias
Modulo legal_refs.py: detecta automaticamente referencias a leyes, decretos, ordenanzas y resoluciones en el texto de las noticias mediante expresiones regulares (Ley N° XXXXX, Decreto N° XXX/YYYY, Ordenanza N° XXXXX, Resolucion N° XXX/YYYY, Decreto-Ley N° XXXXX)
Tabla referencias_legales en SQLite: almacena tipo, numero, texto de display, URL SAIJ (saij.gob.ar) y URL InfoLEG (infoleg.gob.ar) por noticia — con indices en noticia_id y (tipo, numero)
Hook en insertar_noticia(): detecta referencias al insertar cada noticia nueva
Hook en actualizar_noticia_ia(): detecta referencias usando el resumen generado por IA (mas rico en contexto)
Endpoint /api/noticia//legal: retorna JSON con todas las referencias legales de una noticia
Icono ⚖️ en el feed (dashboard.html): cada noticia con referencias legales muestra badges morados con link directo al texto oficial en SAIJ — carga lazy via IntersectionObserver para no impactar performance del feed
Script backfill_legal.py: procesa todas las noticias existentes y detecta referencias legales historicas (soporta --limit N para pruebas)
[1.97.0] – 20-02-2026 15:59hs
Agregado — Íconos de mapa geo en noticia-cards + geolocalización automática al insertar
Ícono de mapa en dashboard.html (templates/dashboard.html): en el área de metadatos de cada noticia-card (sección text-end ms-2), se muestra un ícono bi-geo-alt-fill rojo si la noticia tiene latitud/longitud — enlaza directo a Google Maps con las coordenadas y muestra ubicacion_texto como tooltip
Ícono de mapa en noticias.html (templates/noticias.html): mismo ícono y comportamiento en la vista de bandeja de noticias, debajo de las horas de publicación/detección
Geolocalización automática al insertar (db.py → insertar_noticia): cada nueva noticia lanza un hilo daemon (threading.Thread) que llama a geolocalizar_noticia_hibrido() de geo.py — si detecta ubicación, actualiza latitud, longitud, ubicacion_texto y certeza_geo en la DB sin bloquear el scraping principal
[1.96.0] – 20-02-2026 15:44hs
Mejorado — Sistema de diseño UX/UI (ideas alta prioridad)
Score bar visual en noticia-card (base.html, dashboard.html, noticias.html): reemplaza el badge numérico de relevancia con una barra de color progresiva (score-bar + score-bar-fill) al pie de cada card — score 5 = rojo 100%, score 4 = naranja 80%, score 3 = amarillo 60%, etc. El badge "BREAKING" se conserva solo para score 5
Skeleton loaders (base.html, dashboard.html): placeholders animados con shimmer que aparecen durante los 2 segundos antes del auto-reload al llegar nuevas noticias via WebSocket — evita el salto visual brusco; skeletonFeed se activa con el evento nuevas_noticias del socket
Migración de categorias a .cat-chip y .cat-border-* (noticias.html, categorias.html, comparador.html): eliminados estilos bg-info text-dark y border-left: 4px solid {{ color }} inline — ahora usan las clases globales del sistema de diseño para consistencia en todos los templates
Clases .noticia-titulo y .noticia-meta aplicadas en dashboard.html, buscar.html, noticias.html, comparador.html: jerarquía tipográfica uniforme en todos los templates que muestran noticias (tamaño, peso, color, line-height consistentes via variables CSS)
[1.95.0] – 20-02-2026 15:30hs
Mejorado — Sistema de diseño UX/UI (base.html)
Variables CSS: sistema de tokens completo con jerarquía de textos Apple-style (--c-text, --c-text-2, --c-text-3, --c-text-4), superficies (--c-surface-2), bordes (--c-border, --c-separator), radius (--radius-sm/md/lg/xl/pill), sombras (--shadow-sm/md/lg) y animaciones (--transition-fast/base)
Fondo: cambiado de #f8fafc a #F2F2F7 (Apple grouped background) — más suave y menos saturado para lectura prolongada
Chips de categoria: refactorizados a inline-flex con colores semánticos (fondo claro + borde coloreado + texto oscuro) para cada categoría — mejor legibilidad y scanability en F-pattern
Fuente chips: ahora usan --c-primary-tint y --c-primary-light para consistencia visual con el color de marca
Stat chip (.stat-chip): nuevo componente para métricas con valor destacado, icono y sombra sutil
Noticia cards: hover con transform: translateY(-1px) y shadow-md, padding refinado (12px 16px), border-radius aumentado a --radius-lg
Breaking news: badge con animación pulse mejorada, degradado desde #fef2f2 a surface
Ticker: refactorizado con display: flex, label con fondo --c-primary y estilos de legibilidad (color #93c5fd para links, #e2e8f0 para texto)
Card headers: fondo --c-surface-2 para diferenciar del body — jerarquía visual clara
Section labels (.section-label): nuevo componente tipográfico uppercase 0.7rem para títulos de sección
Tabla de noticias (.noticias-table): headers con uppercase, --c-text-3, hover con --c-primary-tint
Empty state (.empty-state): componente centrado con icono grande y opacidad 0.4
Accesibilidad: *:focus-visible con outline 2px en --c-primary, soporte pointer: coarse para touch targets de 44px
Dark mode: mejorado con variables de opacidad para chips de categoria, .fuente-chip con tinte azul consistente, .stat-chip adaptado
Mejorado — Dashboard (dashboard.html)
Titulo principal usa .section-title para jerarquía tipográfica
Header del card de feed usa .section-label
Empty state migrado al componente .empty-state
CSS de breaking-news movido a base.html (evita duplicación)
[1.94.6] – 20-02-2026 14:49hs
Agregado
Filtro de publicidad: lista FUENTES_COMERCIALES en scraper.py — bloquea automáticamente contenido de marcas comerciales (Movistar, Samsung, Mercado Libre, bancos, etc.) que publican noticias publicitarias disfrazadas de contenido informativo
Función es_fuente_comercial(): detecta si la fuente de una noticia es una empresa/marca vs un medio periodístico
El filtro se aplica en todos los procesadores RSS antes de insertar en DB
Corregido
Eliminadas 5 noticias de Movistar ya existentes en la base de datos
[1.94.5] – 20-02-2026 13:57hs
Corregido
/previsiones/precision: error 500 por campo confianza con valores mixtos (texto "alta"/float) — ahora se normaliza a float antes del template
[1.94.4] – 20-02-2026 13:52hs
Corregido
Imagen RRSS: ahora filtra también por fecha_publicacion >= hoy — elimina artículos de seguimiento de eventos pasados (terremotos, paros, etc.) que se siguen publicando al día siguiente
[1.94.3] – 20-02-2026 13:49hs
Cambiado
Branding: título principal cambiado a "Monitor de Medios – Mar del Plata"
Nav: quitado el ítem "Grupo La Capital" del menú lateral
Dashboard: quitado el botón de filtro "La Capital" del panel de noticias
[1.94.2] – 20-02-2026 13:46hs
Cambiado
Intervalo scraping social aumentado de 15 a 30 minutos — Playwright/Chromium headless es muy pesado en CPU, esta reducción baja la carga sostenida del servidor
[1.94.1] – 20-02-2026 13:40hs
Eliminado
Sección siniestros viales del dashboard — Quitada la alerta destacada de siniestros fatales, el chip de estadísticas en la barra de contexto, el panel colapsable de siniestros recientes y la función JS toggleSiniestrosPanel()
[1.94.0] – 20-02-2026 08:34hs
Agregado
Mantenimiento nocturno — VACUUM + ANALYZE automático en noticias.db a las 02:00 AM GMT-3, una vez por noche, en thread aislado con timeout
Técnico
ciclo_mantenimiento_nocturno() con guard por fecha para no repetir en la misma noche
[1.93.0] – 20-02-2026 02:05hs
Mejorado
Georeferenciación: filtro de ciudades externas (URGENTE) — Lista de 31 ciudades argentinas excluidas (Puerto Madryn, Buenos Aires, Córdoba, Rosario, etc.) para evitar falsos positivos. Si el texto contiene una ciudad externa Y el match es genérico (centro, puerto, terminal, comisaría, etc.), se descarta el match. Eliminó 100% de falsos positivos por "Puerto Madryn" (8 noticias) y similares
Georeferenciación: detección semántica de "centro" (URGENTE) — Nuevos filtros de contexto no geográfico para la palabra "centro". Expresiones como "centro de la polémica", "centro de salud", "centro médico", "centro cultural", "centro nacional" ya no matchean como barrio Centro de MdP. Eliminó 5 noticias nacionales mal georeferenciadas
Georeferenciación: Nominatim como fallback para direcciones — Integración con OpenStreetMap Nominatim para geocodificar direcciones con número (ej: "Luro 3500"). Usa viewbox acotado a MdP con bounded=1. Rate limit 1 req/seg, cache de resultados, timeout 10s. Mejora certeza de 85 a 92 cuando Nominatim confirma la dirección
Georeferenciación: limpieza de BD — 13 noticias mal georeferenciadas corregidas (8 de Puerto Madryn + 5 nacionales con "centro"). Coordenadas, certeza y ubicación nullificadas
Técnico
geo.py refactorizado — Nuevas constantes: _CIUDADES_EXCLUIDAS (31 ciudades), _MATCHES_GENERICOS_AMBIGUOS (20 términos), _CONTEXTOS_NO_GEOGRAFICOS (4 regex). Nuevas funciones: _texto_contiene_ciudad_externa(), _centro_es_contexto_no_geografico(), _geocodificar_nominatim(). 14 tests inline que verifican todos los escenarios
[1.92.0] – 20-02-2026 04:30hs
Agregado
Resumen cada 30 minutos al grupo de Telegram con PDF (#153) — Scheduler automatico cada 30 minutos que genera resumen de noticias nuevas y lo envia al grupo de noticias (chat_id del grupo, NO al personal). Incluye: cantidad de noticias, top categorias, analisis breve con IA (Groq), top 5 noticias mas relevantes. Genera PDF con fpdf2 y lo envia como documento adjunto. Si no hay noticias nuevas, no envia nada
Reportes por Telegram en PDF (#153) — Los resumenes enviados por Telegram ahora incluyen un PDF como documento adjunto generado con fpdf2. El PDF incluye: logo del proyecto, fecha y hora, estadisticas generales, analisis editorial con IA, listado completo de noticias con score, categoria y URL. Aplica al resumen de 30 min (grupo) y al resumen diario de las 21hs (chat personal)
Nuevo modulo pdf_reportes.py — Generador de PDFs con fpdf2 para resumenes de noticias. Clase ResumenPDF personalizada con header (logo + titulo), footer (paginado), secciones coloreadas, items de noticia formateados. Funciones: generar_pdf_resumen_30min(), generar_pdf_resumen_dia(), enviar_pdf_telegram()
Comando /resumen_30min — Nuevo comando del bot para forzar manualmente el envio del resumen de 30 min al grupo con PDF. Disponible en menu inline
2 nuevas funciones DB — obtener_noticias_ultimos_minutos() y stats_ultimos_minutos() en db.py para consultar noticias de los ultimos N minutos agrupadas por grupo_id
Mejorado
enviar_resumen_dia() (#151) — Ahora tambien genera y envia PDF del resumen del dia al chat personal despues del mensaje de texto
Menu bot Telegram — Ampliado con boton "Resumen 30min" y nuevo comando /resumen_30min (19 comandos total)
[1.91.0] – 20-02-2026 03:15hs
Agregado
Content Tracker: diff de contenido editado (#124) — Cuando se detecta una edicion, se guarda el texto anterior y el nuevo en tabla content_diffs. En el dashboard de Integridad, boton "Ver diff" muestra comparativa visual lado a lado con texto agregado (verde) y eliminado (rojo tachado). Nuevo endpoint /api/content-tracker/diff/. Texto inicial se guarda como referencia en la primera verificacion
Content Tracker: alertas configurables por fuente (#125) — Nueva tabla content_tracker_config para configurar intervalo de verificacion por fuente (minimo 30 min, maximo 168h) y desactivar fuentes individualmente. Tab "Configuracion por fuente" en dashboard de Integridad con controles de intervalo y toggle activo/inactivo. Endpoint POST /api/content-tracker/config
Content Tracker: reporte semanal de integridad (#126) — Scheduler automatico los lunes a las 9:00 GMT-3. Envia reporte por Telegram con: total ediciones/borrados, diffs guardados, top 3 fuentes que mas editan, top 3 que mas borran, tendencia vs semana anterior, nivel de integridad (excelente/buena/moderada/baja). Boton "Reporte" en dashboard para forzar envio manual. Endpoint POST /api/content-tracker/reporte-semanal
Content Tracker: screenshot antes del borrado (#127) — Cuando se detecta un 404, toma screenshot de la URL con Playwright headless (sync_api) y guarda en data/screenshots/. Screenshot accesible desde dashboard via boton camara y modal de preview. Nueva columna screenshot_path en content_tracking. Endpoint /api/content-tracker/screenshot/
Mejorado
Dashboard Integridad ampliado — Reorganizado con tabs (Cambios detectados / Configuracion por fuente), botones de accion por fila (ver diff, ver screenshot, abrir URL), modales para visualizacion de diffs y screenshots, KPI de ultimo reporte semanal
Content Tracker con intervalos inteligentes — La verificacion ahora respeta el intervalo personalizado de cada fuente en vez de usar 6h fijo para todas. Fuentes desactivadas se saltan automaticamente
[1.90.0] – 20-02-2026 00:21hs
Agregado
Widget integridad: sparkline 7 dias (#142) — Mini-grafico SVG inline en el widget de integridad del dashboard. Muestra tendencia de editadas+borradas de los ultimos 7 dias. Color verde si todo OK, naranja si hay detecciones. Nuevo endpoint /api/integridad-historico?dias=7 y funcion obtener_integridad_historico() en db.py
Clustering automatico de markers en mapa (#141) — Implementado leaflet.markercluster en la pagina de mapa de noticias geolocalizadas. Markers cercanos se agrupan en clusters con numero, al hacer zoom se desagrupan. Boton toggle Cluster/Individual. Compatible con filtro de categoria y heatmap. Eliminado offset manual de coordenadas (spiderfy nativo del plugin)
Historial de rendimiento del scraper (#121) — Nueva tabla scraper_metrics (fecha, fuente_tipo, noticias_procesadas, errores, duracion_segundos). Metricas registradas automaticamente al finalizar cada ciclo RSS, social y web_empresas (exito y error). Nuevo endpoint /api/scraper-metrics?dias=7 con datos por_dia, por_tipo, por_hora. Graficos SVG (barras y lineas) en la pagina /scraper-status: noticias/dia, errores/dia, noticias/hora, resumen por tipo. Sparkline de noticias/dia en el dashboard
Imagen RRSS automatica a las 22:00 (#118) — Scheduler de imagen resumen diaria adelantado de 23:00 a 22:00 GMT-3. Genera automaticamente la imagen editorial con Pillow y la envia por Telegram al chat personal
Mejorado
Mapa de noticias — Coordenadas ahora exactas sin offset artificial, MarkerCluster maneja superposicion nativa con spiderfy
Scraper status — Nueva seccion de historial de rendimiento con graficos interactivos SVG
[1.89.0] – 20-02-2026 00:19hs
Agregado
Notificacion automatica noticias score alto (#150) — Scheduler cada 5 minutos revisa noticias nuevas con score >= 8 no notificadas. Envia alerta al chat personal con titulo, fuente, categoria, score y link al dashboard. Tabla notificaciones_score_alto para tracking de envios por grupo_id
Auto-desactivar fuentes RSS caidas (#143) — Si una fuente acumula 50+ errores consecutivos sin exito, se desactiva automaticamente (activa=0). Envia alerta por Telegram al desactivar. El contador de errores se resetea cuando la fuente vuelve a funcionar
Separador visual entre categorias en resumen Telegram (#144) — Linea separadora Unicode (────────────────────) entre bloques de categoria en el resumen periodico para mejorar legibilidad
Resumen del dia automatico a las 21hs (#151) — Scheduler que envia resumen completo a las 21:00 GMT-3 con top 5 noticias, stats generales y comparacion vs dia anterior. Tambien disponible como comando manual /resumen_dia en el bot
Comando /trending (#152) — Nuevo comando que muestra tendencias por categoria en las ultimas 3 horas vs promedio 24h. Detecta spikes con flechas arriba/abajo y porcentaje de cambio por categoria
2 nuevos comandos bot Telegram — /resumen_dia y /trending agregados al menu inline, /start y lista de comandos (18 comandos total)
3 nuevas funciones DB — stats_trending_categorias(), stats_resumen_dia(), obtener_noticias_score_alto_sin_notificar() + registrar_notificacion_score_alto() en db.py
Mejorado
actualizar_fuente_check() — Ahora verifica umbral de 50 errores y desactiva fuente automaticamente con alerta Telegram
Menu principal bot — Ampliado con botones Resumen dia y Trending
formatear_resumen_html() — Separadores visuales Unicode entre categorias para mejor legibilidad
[1.88.0] – 20-02-2026 02:30hs
Agregado
7 nuevos comandos en bot Telegram — Funcionalidad ampliada de 10 a 16 comandos:
/buscar — Busqueda de noticias por texto en titulos y resumenes (ultimas 24h, max 10 resultados)
/fuentes — Estado de fuentes de noticias: RSS activas, RRSS activas, ultimo scraping por tipo, fuentes con errores consecutivos
/categoria — Ultimas 5 noticias filtradas por categoria con botones inline de navegacion rapida entre categorias
/dolar — Cotizacion del dolar via DataHub MdP (oficial, referencia, euro)
/alertas_ciudad — Alertas meteorologicas + cortes de calles activos via DataHub MdP
/siniestros — Resumen siniestros viales ultimos 3 dias + estadisticas 7 dias via DataHub MdP
/fuentes — Dashboard de salud de fuentes RSS y RRSS con detalle de errores
3 nuevas funciones DB para bot — buscar_noticias_texto(), stats_comparacion_ayer(), stats_fuentes_resumen() en db.py
Mejorado
/start mejorado — Bienvenida ahora incluye lista de comandos principales + menu inline completo con todos los botones
/stats mejorado — Estadisticas ahora incluyen comparacion vs ayer (porcentaje arriba/abajo), distribucion por tipo de fuente (primaria/derivada), y distribucion por categoria
Menu principal ampliado — Agregados botones de Fuentes, Dolar, Alertas ciudad, Siniestros al menu inline (de 3 filas a 6 filas)
Helper _enviar_texto() — Funcion DRY para enviar/editar mensajes HTML, eliminando duplicacion en todas las funciones auxiliares
Helper _datahub_get() en bot — GET generico a DataHub con API key, independiente de web_app.py (no requiere Flask)
Noticias Playwright sin fecha_publicacion — Las noticias de fuentes Playwright (Ahora MdP, Que Digital) se insertaban sin fecha_publicacion, causando que no aparecieran en el mapa de calor por fecha. Corregido pasando fecha_pub=ahora() en scrape_cloudflare(). 48 noticias existentes corregidas retroactivamente en la DB
Playwright SSL tolerante — Contexto Playwright ahora usa ignore_https_errors=True para sitios con certificados inválidos (ej: La Tecla MdP)
Mejorado
web_empresas.py robustecido — Parseo de JSON de respuestas IA más robusto con regex fallback (_extraer_json_de_texto). Prompt mejorado para forzar respuesta JSON pura. Fuentes web ahora usan nombre legible (ej: "EDEA (web)") en vez de "WEB:edeaweb.com.ar". Priorización: entidades de alta prioridad (medios, servicios públicos, universidades) se procesan siempre; baja prioridad (bancos, telecos) solo cada 2h. Playwright fallback solo para entidades de alta prioridad (evita cuelgues)
3 nuevas fuentes Playwright — Canal 2 MdP, LU9 Radio MdP y La Tecla MdP agregados como fuentes Playwright directas (5 fuentes web total). LU9: 5 noticias en primer scan, Canal 2: 1 noticia
[1.85.0] – 20-02-2026 00:15hs
Rebranding
Proyecto renombrado a "Monitor de Noticias MdP" — Todas las referencias visibles al usuario cambiadas de "Noticias Lucia" a "Monitor de Noticias MdP"
Dashboard y templates — Titulo, footer y sidebar actualizados con nuevo nombre
Security module — Alertas de seguridad y logs ahora dicen "Monitor de Noticias MdP"
User-Agent HTTP — Cambiado de NoticiasLucia/1.0 a MonitorNoticiasMdP/1.0 en requests a DataHub
Mensajes Telegram — Notificacion de ideas ahora usa nuevo nombre
README.md — Reescrito con nombre "Monitor de Noticias MdP" y seccion de creditos a Lucia Castorina
Sin cambios en: carpeta (sigue noticias-lucia/), servicios systemd (noticias-lucia-web/scraper), rutas de backup, funciones internas de DB referidas a la persona Lucia Castorina, copyright legal
[1.84.0] – 19-02-2026 19:53hs
Mejorado
Heatmap con totales reales — El mapa de calor ahora incluye columna "Total" por fuente y fila "TOTAL" por hora. Los conteos por celda son los reales (noticias por fuente por hora); los totales permiten ver el volumen completo por fuente y por franja horaria
API /api/heatmap formato enriquecido — Respuesta ahora incluye filas (con total por fuente), totales_hora (suma por hora de todas las fuentes) y gran_total. Compatible con frontend de heatmap y comparador
[1.83.0] – 19-02-2026 23:30hs
Corregido
Scraping RRSS se colgaba con 132+ perfiles Twitter — El ciclo social intentaba scrapear TODOS los perfiles de Twitter en un solo ciclo (~132 cuentas), excediendo el timeout de 600s. Ahora usa batching de 25 perfiles por ciclo (igual que TikTok e Instagram)
Sin timeout por perfil individual — Si un perfil de X tardaba mucho (sitio lento, login wall), bloqueaba todo el ciclo. Ahora cada perfil tiene timeout individual de 45s via asyncio.wait_for
Browser Playwright acumulaba memoria — Twitter y TikTok compartían el mismo browser context, acumulando procesos chromium. Ahora se cierra y recrea el browser entre Twitter y TikTok
Mejorado
Batching Twitter — 25 perfiles por ciclo con rotación automática (lote 1/6, 2/6, etc.). Los 132 perfiles se cubren en ~6 ciclos de 15 min = ~90 min para un scan completo
Timeout global por plataforma — Twitter 300s, TikTok 180s, creación de browser 30s
Circuit breaker — Si 5 perfiles consecutivos fallan, corta el lote (posible problema de red/browser)
Logging detallado — Progreso por perfil (TW [3/25]: @usuario -> 2 tweets nuevos), duración del ciclo, conteo OK/error/timeout
Creación de browser con timeout — _crear_browser_con_timeout() evita que Playwright se cuelgue al iniciar
Duración de ciclos registrada — last_scan_social_duration y last_scan_web_empresas_duration en config_runtime
Reducción de wait times — page.goto timeout de 20s→15s, wait_for_timeout de 4s→3s para Twitter
[1.82.0] – 19-02-2026 19:35hs
Infraestructura
Migración de rutas a /home/carlosmdq/proyectos/noticias-lucia/
Hora en resumen Telegram (#122) — Cada noticia del resumen periódico ahora muestra la hora de detección (ej: "18:30 - Título de la noticia")
Logo en imagen RRSS (#117) — Badge "Monitor Noticias MdP" en la esquina superior derecha de la imagen resumen diaria generada con Pillow
Widget integridad en dashboard (#135) — Indicador compacto en la barra superior del dashboard que muestra noticias editadas/borradas hoy. Si no hay cambios muestra "integridad OK" con escudo verde; si hay, muestra conteo con colores de alerta. Link a /content-tracking
Alertas fuentes caídas (#119) — Cuando una fuente RSS tiene 5+ errores consecutivos, se envía alerta por Telegram (bot de proyectos, no el de noticias). Solo alerta 1 vez por fuente (guarda estado en config_runtime). Ciclo cada 1 hora. Niveles de severidad: MEDIO (5+), ALTO (10+), CRITICO (20+)
[1.80.0] – 19-02-2026 18:52hs
Agregado
Aislamiento de scrapers — Los ciclos pesados (RSS, RRSS, Web) ahora corren en threads independientes con timeout. Si uno se traba (ej: Instagram 429, sitio caído), NO bloquea a los demás
ejecutar_aislado(): wrapper que lanza cada ciclo en thread, espera timeout, y continúa si excede
Timeouts configurados: RSS 5min, RRSS 10min, Web 10min
Protección anti-duplicados: si un thread anterior sigue corriendo, no lanza otro
Estado visible en panel: badges "Corriendo", "OK", "Timeout", "Trabado" para cada ciclo
Panel Estado del Scraper mejorado — Indicadores en tiempo real del estado de cada ciclo aislado con alertas de timeout
[1.79.0] – 19-02-2026 18:43hs
Mejorado
Red de medios completamente rediseñada — Variantes del mismo medio (Twitter + RSS + web) agrupadas en un solo nodo. De 147 nodos fragmentados a 39 nodos consolidados con MEDIA_GROUPS mapping
Colores específicos por medio — Cada medio tiene color propio (MEDIA_COLORS), ya no genérico por tipo de fuente. Colores para 30+ medios locales y nacionales
Highlight de conexiones — Al hacer click en un nodo se atenúan los no conectados, se resaltan enlaces con color del medio, y se muestra lista de conexiones con badges
Badge de velocidad — Indicador visual (⚡) para medios que frecuentemente publican primero
Panel de info mejorado — Muestra conexiones del medio seleccionado con colores y conteo de co-ocurrencias
Performance — Una sola query SQL en vez de JOIN pesado; normalización y cálculo de co-ocurrencias en Python con sets
[1.78.0] – 19-02-2026 18:10hs
Corregido
Red de menciones no mostraba datos — D3 forceLink espera propiedades source/target pero el API devolvía f1/f2. Agregado mapeo en el frontend
Cobertura nacional pobre (57 → 82 noticias) — JOIN entre noticias.fuente y fuentes.nombre fallaba por nombres distintos (ej: "Clarin.com" vs "Clarin", "Página|12" vs "Pagina 12"). Normalización de 23 registros en DB
Agregado
Normalización de fuentes en scraper — Diccionario FUENTE_NORMALIZE en scraper.py que mapea variantes de Google News (Clarin.com, Página|12, etc.) a los nombres canónicos de la tabla fuentes. Previene futuros mismatches
[1.77.1] – 19-02-2026 16:52hs
Corregido
Popover salud del header transparente — Variable CSS --c-card no existía, cambiada a --c-surface. Ahora el popover muestra fondo blanco/oscuro correcto
Variables CSS indefinidas — --c-muted reemplazada por --c-text-light en labels del popover de salud
[1.77.0] – 19-02-2026 16:51hs
Mejorado
Geolocalización híbrida (regex + LLM) — Reescritura completa de geo.py con sistema de 3 capas:
1. Detección de direcciones: patrones "calle al NNNN", "esquina de X y Y", "X entre Y y Z" con 70 calles de MdP
2. Regex con word boundaries: \blugar\b en vez de substring, elimina falsos positivos (ej: "provincia" ya no matchea "provincial")
3. LLM fallback (Groq): para noticias sin ubicación específica, Groq extrae el lugar y se mapea contra el diccionario
Eliminación de geolocalización genérica — Las noticias que solo mencionan "Mar del Plata" genéricamente ahora retornan None en vez de coordenadas del centro. Solo se geolocalizan noticias con ubicación específica real
Pre-compilación de regex — 278 patrones de ubicación pre-compilados al iniciar el módulo para mayor performance
Cache LLM en memoria — Cache thread-safe con máximo 2000 entradas para evitar llamadas repetidas a Groq
Pipeline IA integrado — ai_filter.py ahora usa geolocalizar_noticia_hibrido() que incluye texto completo (raw_text) para mejor detección
Agregado
Script reprocess_geo.py — Re-procesa noticias existentes con el nuevo sistema. Opciones: --no-llm, --limit N, --dry-run. Muestra estadísticas antes/después
Diccionario de calles _CALLES_MDP — 70 calles principales de MdP con coordenadas para detección de direcciones
Función geolocalizar_con_llm() — Fallback inteligente que extrae ubicación via Groq y la mapea contra el diccionario local
Función geolocalizar_noticia_hibrido() — Orquesta regex + LLM con firma simplificada (texto original, no requiere lower)
Datos
Resultado del reprocesamiento: 1166 noticias con falsa geolocalización genérica limpiadas
305 noticias conservan geolocalización específica real (barrios, calles, instituciones, playas)
Reducción de "Mar Del Plata" genérico: de 1243 a 0 (100% eliminado)
[1.76.0] – 19-02-2026 16:40hs
Corregido
Mapa: Leaflet bloqueado por CSP — Scripts de Leaflet y leaflet-heat se cargaban desde unpkg.com, bloqueado por Content-Security-Policy. Migrado a copias locales en /static/vendor/ (leaflet.js, leaflet.css, leaflet-heat.js + imágenes de markers)
[1.75.0] – 19-02-2026 16:08hs
Corregido
Hora clima DataHub — Fix parseo hora_obs que mostraba "1.460hs" en vez de "16:00hs" cuando el timestamp incluía microsegundos. Cambiado de [-8:-3] a [11:16]
Mejorado
Scraping Instagram anti-bloqueo — Rate controller personalizado que no reintenta en 429 (antes esperaba 30min). Timeout de 45s por perfil via concurrent.futures. Batch size aumentado a 5, delays reducidos (10s base + 0-8s random)
Kiosko: badge de ubicación — Muestra la ubicación georreferenciada de cada noticia con ícono geo y atributos data-lat/data-lon para futura integración con mapa
[1.74.0] – 19-02-2026 15:48hs
Agregado
Geolocalización persistente en DB -- Nuevas columnas latitud, longitud, ubicacion_texto, certeza_geo en tabla noticias. La geolocalización se calcula una vez al procesar la noticia con IA y se almacena permanentemente
Módulo geo.py independiente -- Diccionario de 278 ubicaciones de MdP y función geolocalizar_noticia() extraídos a módulo propio para evitar imports circulares. Usado por ai_filter.py, web_app.py y backfill_geo.py
Backfill script backfill_geo.py -- Script standalone que geolocaliza noticias existentes sin latitud. Primera ejecución: 1423/1786 noticias geolocalizadas (79%)
Heatmap layer en mapa -- Nueva capa de calor (Leaflet.heat) con toggle en controles del mapa. Intensidad basada en densidad de noticias por zona. Gradiente de verde (baja) a rojo (alta densidad)
Función actualizar_geolocalizacion() en db.py -- Permite guardar coordenadas y certeza de geolocalización por noticia
Mejorado
Mapa optimizado -- Ahora usa datos geo persistidos de la DB (instantáneo) con fallback a cálculo en tiempo real para noticias sin geo
Pipeline IA integrado -- La geolocalización se ejecuta automáticamente al procesar cada noticia con IA (ai_filter.py), eliminando la necesidad de recalcular
[1.73.0] – 19-02-2026 15:37hs
Mejorado
Imagen RRSS rediseñada — estilo editorial claro — Rediseño completo abandonando estilo oscuro/glassmorphism:
Fondo blanco limpio, tipografía oscura legible
Barra de progreso del día (0-24hs) con marcador de hora actual y porcentaje
Noticia destacada prominente con título grande (44px), badge de categoría
Resumen IA con bullets limpios y puntos de color
Chips de categorías con fondo pastel sobre blanco
Estadísticas (noticias/fuentes/temas) movidas al final en sección gris claro
Footer minimalista con indicador "en vivo"
Eliminado URL falso "noticias.castorina.net"
Corregido
Kiosko: función serverNow() faltante — El kiosko era un HTML standalone que usaba serverNow() sin definirla. Agregada la función con sincronización de hora del servidor via /api/server-status
[1.72.0] – 19-02-2026 14:21hs
Agregado
Panel de Integridad de Contenido — Nueva seccion /content-tracking con KPIs (rastreadas, ok, editadas, borradas), barra de integridad visual, tabla de cambios detectados con estado, fuente y link a URL original. Accesible desde sidebar como "Integridad"
API /api/content-tracking — Endpoint REST que expone estadisticas del Content Tracker (editadas, borradas, errores, recientes). Desbloquea ideas #123 y #126
Scheduler automatico imagen RRSS — Envia automaticamente la imagen resumen del dia por Telegram a las 23:00hs (idea #128). Usa el mismo endpoint /api/resumen-telegram. Control de duplicados por clave diaria en runtime config
[1.71.0] – 19-02-2026 17:15hs
Mejorado
Imagen RRSS rediseñada profesionalmente — Rediseno completo del resumen visual diario con tendencias 2026:
Gradientes mesh de fondo (3 colores con transiciones suaves)
Circulos decorativos con blur gaussiano (efecto mesh gradient)
Tarjetas glassmorphism con sombras, bordes sutiles y highlight superior
Hero stat gigante centrado con efecto glow cyan (numero de noticias del dia)
3 mini stats en tarjetas individuales (fuentes, temas, categorias)
Chips de categorias rediseñados con puntos indicadores de color
Noticia destacada en card con badge de categoria
Resumen IA con indicadores de color alternados por bullet
Footer con gradiente, CTA centrado y barra inferior decorativa
Separadores con gradientes horizontales (cyan a teal)
Paleta moderna: azul profundo, cyan, teal, dorado con fondo oscuro
Cache de fuentes para mejor rendimiento
Soporte para fuente Inter (con fallback a DejaVu)
Refactorizacion: Logica de generacion extraida a _generar_imagen_resumen() reutilizable que retorna (bytes, total, fuentes)
Agregado
Envio de resumen por Telegram — Nuevo endpoint GET /api/resumen-telegram que genera la imagen y la envia automaticamente al chat personal via bot de noticias. Responde JSON con confirmacion. Timeout 30s, manejo de errores con logging
[1.70.0] – 19-02-2026 16:45hs
Agregado
Módulo de seguridad completo (security.py) — Sistema integral de protección para el dashboard web
Logging de acceso — Tabla access_log en SQLite registra cada request: IP, endpoint, método, status, user agent, referer, tiempo de respuesta, flag admin/config
Rate limiting por IP — Máximo 60 requests/minuto para rutas normales, 10/minuto para admin/config. Respuesta 429 al exceder
Bloqueo automático de IPs — Más de 5 intentos fallidos de acceso a rutas admin/config en 10 minutos bloquea la IP por 1 hora
Alertas Telegram — Notificación automática al chat personal cuando una IP es bloqueada por intentos sospechosos
Headers de seguridad — X-Content-Type-Options, X-Frame-Options, X-XSS-Protection, CSP (compatible con SocketIO/CDNs), Referrer-Policy
Dashboard de seguridad — Endpoint GET /api/security-stats con: requests hoy/semana, top IPs, intentos fallidos, IPs bloqueadas, distribución por hora
Integración Flask — Via before_request / after_request hooks, sin modificar lógica de negocio existente
[1.69.0] – 19-02-2026 14:30hs
Nuevo
Content Tracker: deteccion de ediciones y borrado — Nuevo modulo content_tracker.py que cada 6 horas verifica las URLs de noticias de las ultimas 72h. Detecta notas borradas (404/contenido vacio) y editadas (hash SHA-256 cambio). Tabla content_tracking en DB con estado, hashes y fechas. Alertas automaticas por Telegram al chat personal. Rate limit 1 req/2s, max 50 noticias/ciclo. Excluye URLs de RRSS y web_empresas (#web-). API obtener_stats_tracking() para dashboard
[1.68.0] – 19-02-2026 13:36hs
Mejorado
Imagen RRSS rediseñada — Resumen del día generado por IA (Groq) con 4-6 bullets agrupados. Deduplicación por grupo_id. Stats en 3 columnas. Categorías como chips de colores. Noticia destacada prominente. Altura dinámica sin espacio vacío. Guiones en lugar de emojis (compatibilidad PIL)
[1.67.1] – 19-02-2026 13:25hs
Corregido
Fix scraper web_empresas — Variable dominio no definida en _procesar_entidad() causaba error NameError en todas las fuentes web de empresas. Corregido a fuente_id. El scraper web no se ejecutaba desde las 08:07hs
[1.67.0] – 19-02-2026 13:20hs
Mejorado
Búsqueda mejorada — /api/search y /buscar ahora usan UNACCENT (buscar "politica" encuentra "política"), LOWER para case-insensitive, buscan en título + resumen + texto completo, y devuelven hasta 100 resultados (antes 25)
[1.66.0] – 19-02-2026 12:39hs
Corregido
Fix critico: import datetime faltante en db.py — La validacion de fecha futura en insertar_noticia() usaba datetime.fromisoformat() sin tener datetime importado, causando NameError que impedia insertar noticias de multiples feeds RSS (Google News, La Capital, TN, La Nacion, Infobrisas, Mi8, etc.)
Agregado
Popover de salud del sistema — Al hacer click en el indicador de estado (punto verde/amarillo/rojo) se despliega un panel con info detallada: tiempo desde ultimo scan RSS/Social/Web, cantidad de noticias encontradas, intervalo configurado, errores recientes, y hora de inicio del scraper. Colores semanticos (verde/amarillo/rojo) por cada scanner
Datos ampliados en health API — /api/server-status ahora retorna: minutos desde cada scan, conteos de noticias, intervalo RSS, errores recientes, y estado de web empresas
[1.65.0] – 19-02-2026 20:00hs
Cambiado (Migracion a DataHub MdP)
Clima desde DataHub — _get_weather_openmeteo ahora consulta localhost:5501/api/clima/actual como fuente primaria. Fallback: Open-Meteo directo. Mapea datos de DataHub al formato esperado por el template (temperatura, condicion, icono WMO, viento, presion, sensacion termica)
Alertas SMN desde DataHub — _get_smn_alerts ahora consulta localhost:5501/api/alertas/resumen como fuente primaria. Formato compatible (tipo, nivel, icono, color, resumen). Fallback: API JSON del SMN directa (ws1.smn.gob.ar con JWT)
NO se migra el scraper de noticias — El scraper RSS/social/web es el core del producto y tiene logica propia compleja (Playwright, AI categorization, merge). Solo se migran datos comunes compartibles
[1.64.0] – 19-02-2026 11:59hs
Agregado
Fuentes institucionales/ciencia — 6 nuevas fuentes RSS agregadas a DEFAULT_FEEDS en config.py:
INIDEP Prensa (RSS directo, Joomla) — noticias de pesca, oceanografia, temperatura del mar
CONICET MdP (RSS WordPress) — noticias del CCT Mar del Plata (IIMyC, INTEMA, IIB, etc.)
CONICET Nacional (RSS WordPress) — noticias generales de CONICET
INIDEP Google News — agregador de menciones del INIDEP en medios
CONICET MdP Google News — agregador de menciones de CONICET en MdP
argentina.gob.ar MdP (Google News) — noticias del portal del gobierno nacional sobre MdP
[1.63.0] – 19-02-2026 15:00hs
Agregado
Exportar ideas a PDF (#92) — Nuevo boton "PDF" en la pagina /ideas que genera un documento PDF con reportlab. Incluye ideas separadas por estado (pendientes, completadas, descartadas) con titulo, descripcion, autor y fechas. Endpoint: GET /ideas/exportar-pdf
Resumen diario como imagen para RRSS (#106) — Endpoint GET /api/resumen-imagen que genera imagen PNG 1080x1920 (Instagram Stories) con fondo oscuro, top 5 noticias del dia, estadisticas y categorias. Boton "Imagen RRSS" en el dashboard
Panel estado del scraper (#116) — Nueva pagina /scraper-status con estado detallado del sistema de recoleccion: estado activo/inactivo, uptime, ultimo scan RSS/RRSS/Web con cantidad de noticias obtenidas, fuentes con errores consecutivos, fuentes inactivas (24h+), grafico de noticias por hora, y eventos recientes. Link en sidebar "Estado Scraper"
Tracking de errores y conteos del scraper — main.py ahora registra en config_runtime la cantidad de noticias de cada ciclo (last_scan_rss_count, last_scan_social_count) y los errores (last_scan_rss_error, last_scan_social_error)
Verificado
Timezone GMT-3 (#114) — Auditoria completa de todos los archivos .py: no hay ninguna ocurrencia de datetime.now() o datetime.utcnow() sin timezone. Todo el codigo usa ahora() de config.py que retorna GMT-3 Argentina correctamente
[1.62.0] – 19-02-2026 11:35hs
Mejorado
Fuentes compactas — Cards rediseñadas con grid responsivo (2-5 columnas), padding reducido, textos más densos. Mucha más información visible sin scroll
Búsqueda de fuentes en tiempo real — Input con filtrado instantáneo por nombre en las 3 secciones (Unificada, RSS, RRSS) con contador de resultados
Filtro múltiple por tipo — Chips toggle para tipos RSS, plataformas RRSS y categorías RRSS. Selección múltiple combinada con búsqueda de texto
Toggle de secciones — Botones para mostrar/ocultar secciones independientemente
Botones agregar reorganizados — "+ RSS" y "+ RRSS" movidos al header de la página
Corregido
Heatmap "Hoy" mostraba datos de ayer — El filtro enviaba horas=24 (últimas 24h deslizantes), ahora envía dia=DD-MM-YYYY para mostrar solo datos del día actual desde medianoche
[1.61.0] – 19-02-2026 15:30hs
Agregado
Buscador contextual en mapa — Input de texto arriba del mapa que permite buscar noticias por contenido (ej: sismo, accidente, robo). Filtra por título y resumen en el servidor, compatible con todos los filtros de fecha
Filtros rápidos de fecha — Botones "Hoy", "Ayer", "Semana" y "Mes" para filtrar noticias geolocalizadas sin tener que elegir periodos manualmente
Filtro por categoría en JS — Dropdown que filtra markers visibles en el mapa por categoría (policial, deportes, etc.) sin recargar la página. Muestra contador de markers visibles
Mejorado
Georeferenciación ampliada — El diccionario de ubicaciones pasó de ~50 a ~250 lugares de Mar del Plata. Incluye: 40+ barrios, 15+ playas, 10+ plazas, 30+ calles/avenidas, 15+ intersecciones, 20+ instituciones, 15+ clubes deportivos, comercios, universidades, centros culturales y localidades aledañas
Algoritmo de geolocalización mejorado — Nueva función _geolocalizar_noticia() con scoring inteligente: prioriza nombres largos (más específicos) sobre cortos (genéricos), penaliza lugares ambiguos ("centro", "puerto"), bonus por palabras de ubicación cercanas ("calle", "esquina", "barrio"), y dispersión mejorada de markers para evitar superposición
Búsqueda baja umbral score — Al buscar por texto, el score mínimo baja de 3 a 2 para encontrar más resultados relevantes
[1.60.2] – 19-02-2026 10:20hs
Agregado
Disclaimer beta en todas las páginas — Banner dismissible que indica que el sistema está en fase beta, los datos provienen de fuentes de terceros (medios, RRSS, organismos públicos) y las previsiones se generan con modelos estadísticos e IA. Se guarda en localStorage al cerrar para no volver a mostrarse
[1.60.1] – 19-02-2026 10:20hs
Mejorado
Agrupación de noticias en Telegram — Los resúmenes ahora agrupan noticias por categoría temática en lugar de listarlas sueltas. Cada bloque muestra: emoji + categoría + estrellas (score) + cantidad de fuentes, resumen principal, y links de TODAS las fuentes que cubren el tema
[1.60.0] – 19-02-2026 10:00hs
Corregido
Fix definitivo de timezone en fechas de publicación — 93 artículos con fechas UTC sin convertir corregidos en la DB (62 con sufijo Z de Twitter + 31 de RSS/WP API). WP API ahora usa date_gmt (siempre UTC) en lugar de date (timezone local de WordPress). Validación preventiva en insertar_noticia(): si la fecha de publicación es futura, se corrige automáticamente a la hora actual
Heatmap: filtros ignorados (idea #112) — Los parámetros tipo_fuente, categoria y limit que el frontend enviaba al endpoint /api/heatmap no se procesaban. Ahora filtra correctamente por RSS/RRSS/Web, categoría, y permite hasta 50 fuentes (default 25)
Agregado
Comparador sentimiento por medio (idea #105) — Nuevo endpoint /api/sentimiento-medios con gráfico de barras apiladas (positivo/neutro/negativo) por fuente en la página de Tendencias. Muestra los top 15 medios con al menos 3 noticias
[1.59.0] – 19-02-2026 09:22hs
Agregado
Sindicatos y gremios como fuentes — 31 cuentas nuevas (20 entidades) de sindicatos y gremios de MdP: CGT, CTA, SOMU, STM, SUTEBA, ATE, UTHGRA, SECZA, SMATA, UOM, UOCRA, UTA, Camioneros, Bancaria, Luz y Fuerza, SADOP, STIA, UPCN, AJB, Sindicato de Prensa. Incluye cuentas de Instagram y Twitter
Nuevo tipo de entidad sindicato — Categoría dedicada con ícono megáfono en la sección Empresas del dashboard. Permite filtrar noticias de gremios por separado
[1.58.1] – 19-02-2026 09:15hs
Agregado
Click en notas del Kiosco (idea #111) — Al hacer click en una noticia del modo kiosco se abre la URL original en pestaña nueva
[1.58.0] – 19-02-2026 08:55hs
Corregido
Normalización completa GMT-3 (idea #114) — Todas las horas ahora usan GMT-3 Argentina consistentemente
ai_filter.py — time.strftime() (UTC) reemplazado por ahora() (GMT-3) para stats de IA
backup.py — datetime.now() (ambiguo) reemplazado por ahora() (GMT-3) para timestamps de backups
web_empresas.py — time.strftime() (UTC) reemplazado por ahora() (GMT-3) para queries de empresas
scraper.py — Fechas de WordPress API ahora se convierten con utc_a_ar() (antes se guardaban en UTC)
7 templates JS — new Date() (hora del navegador) reemplazado por serverNow() (hora del servidor GMT-3). Afecta: base.html (reloj topbar), kiosko.html (reloj, fechas relativas), previsiones.html (timestamp actualización), en_vivo.html/tendencias.html (heatmap calendario), heatmap.html/comparador.html (selector de días)
Agregado
serverNow() — Función JS global inyectada desde Flask via server_time que calcula hora del servidor + tiempo transcurrido, evitando depender del timezone del navegador
[1.57.2] – 19-02-2026 08:48hs
Corregido
Database locked persistente — La DB de SQLite se bloqueaba por transacciones de lectura abiertas del proceso web que impedían WAL checkpoint. Causó 82 errores y ~8hs sin actualización de noticias
busy_timeout aumentado de 5s a 30s para tolerar escrituras concurrentes
retry_on_locked aumentado de 3 a 5 reintentos con backoff exponencial
wal_autocheckpoint configurado a 100 páginas (~400KB) para evitar crecimiento descontrolado del WAL
teardown_request en Flask — nuevo hook que hace rollback() al final de cada request HTTP, liberando transacciones implícitas que bloqueaban el checkpoint
[1.57.1] – 18-02-2026 20:55hs
Corregido
Sección Empresas/Noticias — _fuentes_empresas(), _mapa_fuente_entidad() y _nombres_entidades() ya excluyen medio y periodista del modo por defecto (vista "propias"). Las 65 cuentas de medios y 13 de periodistas ya no aparecen mezcladas con noticias de empresas/instituciones. Al filtrar explícitamente por ?tipo=medio sigue funcionando normalmente.
[1.57.0] – 18-02-2026 20:48hs
Corregido
Bug scheduler previsiones — ciclo_previsiones() usaba if now.hour == hora_prevision (exacto); cambiado a >= hora_prevision para que si el proceso no corrió exactamente en ese minuto, igualmente ejecute durante el resto del día (guard de 1 vez por día con clave en runtime_config lo sigue protegiendo de duplicados)
Agregado
% de acierto en tiempo real — panel "Tendencia de acierto hoy" hace polling a /api/previsiones/tendencia cada 1 hora; muestra % actualizado sin recargar página; timestamp de última actualización visible; colores verde/amarillo/rojo según umbral
Endpoint /api/previsiones/tendencia — devuelve datos frescos de obtener_tendencia_acierto_intraday() en tiempo real
Noticias similares por previsión — acordeón bajo cada previsión de mañana con botón "Ver noticias que la respaldan"; endpoint /api/previsiones//similares busca noticias de los últimos 7 días usando Jaccard sobre palabras clave; implementado con DOM APIs (sin innerHTML) para seguridad
Función buscar_noticias_similares_prevision() en db.py — Jaccard sobre palabras normalizadas, umbral mínimo 15% similitud, top 3 por similitud, filtra por categoría y score ≥ 4
7 previsiones generadas manualmente para hoy 18-02-2026 (ejecutadas one-shot para recuperar el día perdido)
[1.56.0] – 18-02-2026 20:10hs
Corregido
Fix hora incorrecta en noticias — utc_a_ar() en config.py ahora retorna None en lugar del string crudo cuando no puede parsear la fecha (fallback a fecha_detectada que siempre es correcta); agrega log de warning para detectar formatos no soportados
Mejorado
Normalización de texto — _normalizar_texto() usa NFKD en lugar de NFD para descomponer también caracteres de compatibilidad Unicode más robustamente
Deduplicación más agresiva — umbral Jaccard bajado a 0.40 (antes 0.45), umbral coseno a 0.75 (antes 0.80); ventana reducida a 48h (antes 72h) para compensar el menor umbral y reducir falsos positivos de noticias antiguas
Log de merges — buscar_noticia_similar() e insertar_noticia() ahora loguean INFO cuando se detecta y aplica un agrupamiento entre medios (para auditoría)
Agregado
Tipo de entidad influencer — nuevo tipo en TIPO_ENTIDAD_LABELS con label "Influencers y Creadores" e ícono bi-person-video3; aparece en filtros de /empresas
@gabyrufener (Instagram) — cuenta de Gaby Rufener agregada con tipo influencer
[1.55.0] – 18-02-2026 19:42hs
Mejorado
Scraping distribuido Server 2 — feeds RSS (42 de 49 fuentes) ahora se descargan y parsean en Server 2 (192.168.1.45:5002) liberando CPU/RAM de Server 1; fallback local automático si worker no responde en 3s; Twitter/Instagram (Playwright) sigue en Server 1
[1.54.0] – 18-02-2026 19:34hs
Agregado
Empresas: filtro de origen — toggle "Propias" / "De medios" en /empresas/noticias; "Propias" muestra contenido publicado por las propias cuentas de las entidades; "De medios" muestra noticias de fuentes externas (RSS/medios) que mencionan a las entidades seleccionadas; requiere seleccionar tipo de entidad o buscar para "De medios"
Mejorado
Performance: cache get_runtime_config — de 55 conexiones SQLite por request a 0 con cache TTL 30s; invalidación automática al escribir con set_runtime_config
Performance: fix N+1 embeddings — query buscar_noticia_similar() ahora incluye n.titulo en el JOIN inicial; eliminada la query separada por cada candidato (potencialmente miles de queries/hora eliminadas)
[1.53.0] – 18-02-2026 19:55hs
Agregado
[#111] Kiosko clickeable — cada noticia en el kiosko ahora abre el artículo original en nueva pestaña al hacer click; cursor pointer con transición visual
[#101] Cuentas RRSS oficiales — nueva columna oficial en cuentas_rrss; badge verde "✓ oficial" en /fuentes; botón toggle para marcar/desmarcar cuentas oficiales
Corregido
Bug #96 confirmado resuelto — el horario de previsión se muestra correctamente desde DB sin caché
[1.52.0] – 18-02-2026 19:03hs
Agregado
[#89] Dashboard de precisión de previsiones IA (/previsiones/precision) — métricas globales (acertadas/parciales/fallidas), desglose por categoría con barras de precisión, gráfico Chart.js histórico por día, tabla de previsiones evaluadas y contador de pendientes
[#95] Historial de cambios de configuración (/config/historial) — tabla paginada (50/página) con todos los cambios de config, filtrado por campo, tooltip con valor completo al pasar el cursor
Corregido
CSRF error en ideas — @csrf.exempt en rutas ideas_agregar, ideas_actualizar, ideas_eliminar que fallaban con "The CSRF session token is missing"
Agrupación de medios en /estadisticas — normalización mejorada: resuelve handles @username de Twitter/Instagram/TikTok/Bluesky contra tabla cuentas_rrss, elimina sufijo (web) antes de normalizar, 30+ aliases nuevos (AhoraMdP, 0223, Canal 8, LoQuePasa, El Marplatense, etc.)
Resumen editorial mostraba noticias de ayer — cambiado criterio de ayer 20hs a hoy medianoche (con fallback a últimas 12hs si no hay noticias del día)
[1.51.0] – 18-02-2026 18:35hs
Agregado
[#102] Dashboard de archivos Telegram (/archivos) — galería paginada de fotos, videos, audio y documentos recibidos por Telegram con filtros por tipo, preview de imágenes y descarga directa
[#98] Vista unificada por medio en /fuentes — sección que agrupa RSS + cuentas RRSS (Twitter/Instagram) de cada medio en una sola card
Keywords [#99] revisados — keywords en DB ya correctos y completos: mar del plata, mardel, mdp, mdq, la feliz, gral.pueyrredon, general pueyrredon
Mejorado
[#109] Previsión intraday — búsqueda ahora abarca 2 días (ayer + hoy), incluye campo resumen, umbral adaptativo y cálculo de w_prev fuera del loop
[1.50.2] – 18-02-2026 17:45hs
Corregido
Bug #100: ideas sin título causan error en la página
Template ideas.html: muestra (Sin título) en lugar de renderizar None o vacío
ideas_exportar: corregido crash TypeError al hacer None[:10] en fecha_creacion o fecha_solucion nulos (usar (valor or '')[:10])
agregar_idea en db.py: validación a nivel de función — lanza ValueError si titulo está vacío o es None, previniendo inserción de ideas sin nombre desde cualquier código path
[1.50.1] – 18-02-2026 23:45hs
Nuevo
Comando /idea en bot Telegram: permite guardar ideas directamente desde Telegram
Formato: /idea titulo - descripcion opcional
Si no hay " - ", el texto completo se usa como titulo
Inserta en tabla ideas con autor=username de Telegram, estado='pendiente'
Soporte de mensajes sin comando: enviar idea: titulo - descripcion tambien funciona
Nuevo handler handle_idea_text con regex para capturar mensajes "idea:"
Comando registrado en menu del bot
[1.50.0] – 18-02-2026 22:30hs
Nuevo
Recepcion de archivos por Telegram (PRIORIDAD MAXIMA): handler completo para documentos, fotos, videos, audio, notas de voz y video-notas
Archivos guardados en /uploads/ organizados por tipo (documentos/, fotos/, videos/, audio/)
Nueva tabla archivos_telegram en DB: usuario, nombre, ruta, tamanio, tipo_mime, fecha, descripcion
Solo usuarios autorizados pueden enviar archivos
Respuesta con confirmacion de recepcion (nombre, carpeta, tamanio, usuario)
Manejo de duplicados con timestamp en nombre de archivo
Alertas por degradacion de scraping (#90): nuevo ciclo ciclo_alertas_degradacion() cada 6 horas
Revisa fuentes activas que no trajeron noticias en 24h (con >5 noticias historicas)
Envia alerta por Telegram con detalle de fuentes caidas
Funcion obtener_fuentes_sin_actividad(horas=24) en db.py
Dedup por dia para no repetir alertas
Historial de cambios de configuracion (#95): nueva tabla log_config en DB
Registra usuario, campo, valor anterior, valor nuevo, fecha para cada cambio
Seccion colapsable al final de /config con los ultimos 20 cambios en tabla
Exportar ideas a Markdown (#92): endpoint /ideas/exportar genera archivo .md descargable
Formato con titulo, estado, autor, fecha y descripcion
Separado en secciones: Pendientes/En progreso y Completadas
Boton "Exportar" en la pagina de ideas
5 nuevas ideas para el monitor: ideas de mejora generadas automaticamente
Corregido
Bug: error si idea no tiene nombre (#100): validacion de titulo vacio tanto al agregar como al actualizar ideas; antes podia quedar titulo vacio al editar
Fix: mensaje previsiones con hora hardcodeada (#96): los textos "Se generan automaticamente a las 23:00hs" ahora usan la variable hora_prevision configurada (3 instancias corregidas en previsiones.html)
[1.49.0] – 18-02-2026 14:08hs
Nuevo
Politicos de Mar del Plata como fuentes RRSS (#88): 14 cuentas nuevas de politicos locales en Twitter e Instagram
Nuevo tipo_entidad "politica" para clasificar cuentas de gobierno/politicos
4 empresas locales de MdP agregadas (#88): Authogar, Grupo Fava, Astillero Contessi, SPI Astilleros
Authogar: Twitter @authogar, Instagram @authogarok, web authogar.com
Grupo Fava: Instagram @fava_ok, web fava.com.ar
Astillero Contessi: Instagram @astillerocontessi, web astillerocontessi.com.ar
SPI Astilleros: Twitter @astillerospi, Instagram @astillerospi, web astillerospi.com
Mejorado
URLs de scraping web apuntan a secciones de prensa: EDEA (edeaweb.com.ar/category/noticias/), OSSE (osmgp.gov.ar/osse/noticias/), UCIP (ucip.org.ar/noticias/)
Corregido
BGH eliminado de empresas locales: BGH tiene sede en CABA, no es empresa de MdP; cuentas desactivadas y tipo_entidad removido
[1.48.1] – 18-02-2026 13:43hs
Nuevo
Selector de hora de prevision en /config: dropdown para elegir la hora de generacion automatica de previsiones (0-23hs)
Aviso de horario temprano: si se configura antes de las 06:00hs, muestra warning en /config y /previsiones
Calendario con dias sombreados: el selector de fecha en /previsiones usa flatpickr con dias resaltados (azul) que tienen previsiones generadas, y dias sin datos atenuados
Badge BETA: indicador visual en topbar y titulo de la app
Idea de dominio: investigacion completa de dominios web guardada en ideas
[1.48.0] – 18-02-2026 13:13hs
Nuevo
Fecha/hora de solucion en ideas (#81): nueva columna fecha_solucion en tabla ideas, se registra automaticamente al marcar como completada y se muestra en el listado
Refresh automatico de CSRF token (#85): endpoint GET /api/csrf-token que renueva token via AJAX cada 30 minutos, actualizando meta tag y todos los hidden inputs
Retry inteligente global SQLite (#86): decorador @retry_on_locked() en db.py con backoff exponencial (3 intentos, 0.5s base) aplicado a todas las funciones de escritura (28 funciones); simplificadas rutas de ideas en web_app.py eliminando retry manual
Timestamp en noticias Telegram (#82): cada noticia enviada al bot incluye la hora de publicacion/deteccion junto a la categoria
Merge mejorado de noticias similares (#82): bonus por siglas/acronimos compartidos (OSSE, EDEA, etc.) y por titulos cortos con alta proporcion de coincidencia
Fuentes Emsur y Vialidad Nacional (#82): 2 nuevos feeds RSS via Google News para monitorear noticias de Emsur MdP y Vialidad Nacional (Ruta 2/Autovia 2); Emsur agregado como entidad de servicio publico
Prevision mejorada con selector de horario (#83): selector de rango horario (3/6/12/24h) en pagina de previsiones con estimacion de noticias esperadas basada en historico de 14 dias
Estimacion de noticias por hora (#83): grafico de barras con estimacion por hora para las proximas horas, basado en patron historico del mismo dia de semana
Tendencia de acierto intraday (#83): panel que muestra el progreso de acierto de previsiones del dia actual con detalle por prevision
Selector de fecha para previsiones (#83): permite consultar previsiones de cualquier fecha historica
Precision de previsiones en PDF (#83): seccion de precision IA agregada al reporte PDF con porcentajes, totales y desglose por categoria
Monitoreo de salud de la DB (#87): nueva seccion en /config que muestra tamano de DB/WAL, cantidad de tablas, registros por tabla principal, integridad y fragmentacion
Rutas de ideas simplificadas (retry ahora es global via decorador en db.py)
28 funciones de escritura en db.py protegidas con retry automatico ante "database is locked"
[1.47.1] – 18-02-2026 12:49hs
Corregido
Fix CSRF en Ideas: Aumentado WTF_CSRF_TIME_LIMIT a 24 horas para evitar expiración de token en páginas abiertas por largo tiempo
Fix "database is locked" en Ideas: Consolidada función actualizar_idea() en un solo UPDATE en lugar de múltiples queries separadas
Retry con backoff en Ideas: Agregado reintentos automáticos (3 intentos con backoff exponencial) en rutas agregar, actualizar y eliminar ideas para manejar contención de SQLite
[1.47.0] – 18-02-2026 09:00hs
Nuevo
Clasificacion por alcance geografico (#78): la IA clasifica cada noticia como local (MdP), zonal, provincial o nacional
Nueva columna alcance en la DB con indice dedicado
Prompt IA actualizado para generar campo alcance automaticamente
Filtro dropdown "Alcance" en /noticias para filtrar por alcance geografico
Badge de alcance con colores diferenciados en tarjetas de noticias (zonal=info, provincial=warning, nacional=danger)
Cobertura Internacional (#79): seccion dedicada para noticias de MdP en medios internacionales
7 feeds RSS internacionales: Google News Internacional, BBC Mundo, Reuters, AP, EFE, AFP (France24), DW
Pagina /cobertura-internacional con stats por agencia y categoria, listado con paginacion
Correccion ortografica de ideas: boton IA en /ideas que corrige titulo y descripcion via Groq
Deteccion de publicaciones tardias: identifica medios que publican >24h despues del primero en cubrir una noticia
Investigacion VPS guardada como idea: comparativa Hetzner, Contabo, ArgHosted
Mejorado
Deteccion de noticias similares: ventana ampliada de 48h a 72h, umbral Jaccard 0.55→0.45, coseno 0.85→0.80
Mas stop words en normalizacion para mejor matching de titulos reformulados
Manejo de errores en Ideas: try/except con flash descriptivo en todas las rutas
Fix bug guardar ideas: patron sentinel para distinguir descripcion vacia de no-enviada
[1.45.0] – 18-02-2026 01:07hs
Nuevo
Scraping de páginas web de empresas e instituciones: nuevo módulo web_empresas.py que scrapea sitios web oficiales para capturar novedades/noticias/comunicados
Extracción de texto con trafilatura (fallback httpx y Playwright para sitios con JS)
Hash SHA256 del contenido para detectar cambios entre scans (evita gastar tokens Groq)
Groq LLM analiza solo páginas que cambiaron y extrae noticias individuales (máx 5 por sitio)
Fuente en DB: WEB:dominio (consistente con @user, IG:user, TT:user)
Ciclo cada 45 minutos en scheduler (configurable vía scan_interval_web)
Columna url_web en tabla cuentas_rrss: migración automática + 41 URLs iniciales de entidades existentes
Icono de sitio web (globe verde) en cards de /empresas para entidades con web configurada
Feed /empresas/noticias ahora incluye noticias de scraping web junto a las de RRSS
[1.44.0] – 18-02-2026 00:51hs
Nuevo
Feed de Noticias de Empresas (/empresas/noticias): pagina de feed con noticias capturadas de cuentas empresariales e institucionales
Filtro por tipo de entidad (10 categorias), busqueda en titulos, orden por fecha o score
Cards de noticias con badge de plataforma (Twitter/IG/TikTok), nombre de entidad, engagement inline (likes, retweets, views, comments)
Paginacion, boton enviar a Telegram, estado vacio
Boton "Ver noticias" en /empresas para acceder al feed desde el directorio
[1.43.0] – 18-02-2026 00:34hs
Nuevo
Seccion "Empresas e Instituciones" (/empresas): nueva pagina dedicada para visualizar las 48 entidades (84 cuentas RRSS) agrupadas por tipo
Previsiones en editorial: el resumen ejecutivo (/editorial) ahora incluye las previsiones IA pendientes (con categoría, confianza y razonamiento) y los resultados evaluados recientes
[1.40.2] – 17-02-2026 22:26hs
Corregido
"Quiosco" → "Kiosko": revertido a nombre preferido del usuario en sidebar, título y ayuda
Config .env override: load_dotenv(override=True) para que .env prevalezca sobre variables de entorno del shell
Ideas pendientes: marcadas como completadas #55 (Newsletter), #57 (Fuentes primarias), #63 (Red menciones); eliminadas ideas de prueba #66-69
Primera previsión generada: 7 predicciones para 18-02-2026 (policial, turismo, política, deportes, clima, economía, sociedad)
Fuentes: Dron Mar del Plata (@dronmardelplata): Pablo Funes, primer piloto de drones habilitado en MdP, cobertura periodística aérea — Twitter e Instagram @dronmardelplata
Corregido
Terminología periodística: revisión exhaustiva de 35 templates con correcciones:
"Engagement"/"Eng/Post" → "Interacción"/"Int/Post" en headers y títulos
"Error agrupación" → "Posible error de agrupación" en divergencias
Fix CSRF en Ideas: token CSRF faltante en formularios dentro de modales — agregado csrf_token() explícito en los 3 forms de ideas.html (agregar, editar, eliminar)
[1.40.0] – 17-02-2026 21:51hs
Nuevo
Previsiones de noticias con IA: nueva sección que analiza tendencias del día y registros históricos para predecir las noticias más probables del día siguiente
Motor IA (prevision.py) con Groq: genera 5-8 predicciones diarias a las 23:00hs
Evaluación automática: compara predicciones vs noticias reales con scoring multicriteria (categoría, similitud textual, nombres propios)
Feedback loop: la precisión histórica se incluye en el prompt para autocalibrarse
Tabla previsiones en DB con campos resultado (acertada/parcial/fallida), confianza y match
Página /previsiones con secciones: predicciones para mañana, resultados de hoy/ayer, precisión histórica
Gráfico Chart.js de evolución de precisión y tabla por categoría
API /api/previsiones?fecha= para consulta JSON
Scheduler: ciclo_previsiones() cada 1h (genera a las 23:00, evalúa 1 vez/día)
Desagrupación de noticias: botón "Separar grupo" en divergencias para corregir agrupaciones erróneas (POST /api/desagrupar/)
Corregido
Fix falsos positivos en divergencias: noticias sin palabras en común (Jaccard = 0) ya no se reportan como "divergencia narrativa" — ahora se marcan como "Error agrupación" con badge visual
Fix agrupación por embeddings: buscar_noticia_similar ahora verifica Jaccard mínimo (>= 0.15) antes de aceptar match semántico, evitando que noticias de temas distintos (ej: "Copa Matilde" vs "Chano en Twitter") se agrupen solo porque ambas mencionan MdP
[1.39.2] – 17-02-2026 21:34hs
Nuevo
Newsletter automático en scheduler: ciclo ciclo_newsletter() integrado al scheduler loop — envía newsletter diario a las 8:30 y semanal domingos a las 10:30, sin intervención manual
Reclasificación de fuentes primarias: nueva función reclasificar_sin_clasificar() en ai_filter.py que usa prompt ligero de IA para reclasificar noticias históricas sin tipo_fuente. Endpoint POST /api/reclasificar-fuentes disponible
Widget fuentes primarias en dashboard: chip con ratio primarias/total en la barra de stats del dashboard, con link a la página de detalle /primarias
Selector de co-ocurrencias en red de menciones: dropdown para ajustar el mínimo de co-ocurrencias (1-8) sin recargar la página, recarga el grafo dinámicamente
Cache en API red de menciones: cache de 5 minutos por combinación (días, min_co) para evitar queries pesadas repetidas
Mejorado
Ideas #55 (Newsletter), #57 (Fuentes primarias), #63 (Red de menciones) completadas al 100%
[1.39.1] – 17-02-2026 21:19hs
Seguridad
CSRF protection: Flask-WTF CSRFProtect activado en todos los formularios POST. Token CSRF inyectado automáticamente en forms HTML y headers fetch/AJAX via script global en base.html
API keys a .env: TELEGRAM_TOKEN, GROQ_API_KEY, GEMINI_API_KEY y FLASK_SECRET_KEY movidos a archivo .env con python-dotenv. Eliminadas keys hardcodeadas de config.py
.env en .gitignore: archivo de secretos excluido del repositorio
Mejorado
Índices DB nuevos: idx_noticias_sentimiento e idx_noticias_tipo_fuente para acelerar queries de filtrado
requirements.txt: agregados flask-wtf>=1.2 y python-dotenv>=1.0
[1.39.0] – 17-02-2026 21:09hs
Nuevo
7 fuentes RSS nuevas de medios MdP: Bacap Noticias, Diario El Atlantico, NoticiasMDQ, Noticias MdP (NMDP), NoticiasMDP, Compacto Diario, Radio 10 MdP
22 cuentas RRSS nuevas:
Twitter: Bacap, El Atlantico, NMDP, Region MdP, Radio 10 MdP, Radio Mitre MdP, Radio Rivadavia MdP, La Red MdP + periodistas Ruben Ferrari, Martin Arevalo, Jose Luis Jacobo
Instagram: Bacap, El Atlantico, NoticiasMDQ, NMDP, NoticiasMDP, Region MdP, Radio 10 MdP, Radio Mitre MdP, Radio Rivadavia MdP, La Red MdP
TikTok: Bacap, El Atlantico
Vinculación a grupos mediáticos:
Radio Mitre MdP → Grupo Clarin (con cuentas @mitremdq, IG:mitremdp)
Radio 10 MdP → Grupo Indalo (con cuentas @radio10mdq, IG:radio10mdq)
Canal 2, LU6, Lucia Castorina → Multimedios La Capital (Aldrey)
Radio Mitre movido de WAM Entertainment a Grupo Clarin
LU9 Radio MdP y Radio Brisas vinculados en grupo Radio Brisas
Aliases de medios nuevos: 11 nuevos medios con sus variantes de nombre
[1.38.5] – 17-02-2026 20:34hs
Nuevo
Perfiles de fuentes clickeables: nombres de medios ahora son links al perfil /fuente/ en:
Rankings del comparador (tabla de velocidad)
Rankings de RRSS (fuentes.html)
Badges de fuente en el feed de noticias
Badges de fuente en el dashboard (badge dividido: nombre→perfil, icono→artículo)
Últimas noticias en perfil de fuente: sección con las 10 noticias más recientes del período, con categoría, score y fecha
Link externo en perfil de fuente: botón para visitar el sitio/red social del medio directamente desde el perfil
Normalización de fuentes en el feed: variantes del mismo medio se agrupan correctamente (ej: "Punto Noticias Mar del Plata." → "Punto Noticias"), deduplicando en fuentes_merge
Corregido
Hora en modo kiosco: forzado formato 24 horas (hour12: false) para evitar "08:16 p. m.hs" en algunos navegadores
Mejorado
_normalizar_fuente_alias() ahora recorta puntos finales y espacios para mejor matching
Redirect automático en perfil de fuente cuando se accede por alias (ej: /fuente/Punto Noticias MdP redirige a /fuente/Punto Noticias)
[1.38.4] – 17-02-2026 20:17hs
Nuevo
Fuentes de seguridad y emergencias: agregadas cuentas de Prefectura Naval Argentina, Policía de la Prov. de Buenos Aires, Min. Seguridad PBA, Defensa Civil MdP, Guardia Urbana MdP, Prefectura MdP, Armada Argentina, y SMN Meteorología
Twitter: 6 nuevas cuentas (nacionales/provinciales con filtro de keywords MdP)
TikTok: 3 nuevas cuentas (Prefectura, Bomberos, Defensa Civil)
Facebook: 4 nuevas páginas (Prefectura, Policía PBA, Bomberos, Defensa Civil)
Scraping histórico completado: 229 noticias nuevas incorporadas desde 01/01/2026
Corregido
Orden cronológico del feed: todas las queries principales ahora usan COALESCE(fecha_publicacion, fecha_detectada) en lugar de solo fecha_detectada para ordenar y filtrar. Noticias scrapeadas históricamente aparecen en su fecha real de publicación, no en la fecha de detección
Modo kiosko v2: pantalla completa con Fullscreen API, auto-scroll de noticias, ticker inferior, ocultamiento de cursor, atajos de teclado (F/Escape)
Bypass de keywords para cuentas locales IG/TT: cuentas de MdP pasan sin filtro de keywords
Filtro de días en Grupo La Capital: botones 3d/7d/14d/30d/90d/Todo en menciones y cross-menciones
Cuentas locales de emergencia: agregados patrones "defcivil", "guardiaurbana", "pabordo", "prefecturamardel" al bypass de keywords
[1.38.3] – 17-02-2026 19:54hs
Corregido
Menciones externas: eliminados falsos positivos: keywords genéricos como "la capital", "canal 2", "teatro auditorium" reemplazados por específicos ("aldrey", "hotel hermitage", "paseo aldrey", "diario la capital", etc.)
Cross-menciones: filtrado de auto-referencias: ahora detecta a qué entidad pertenece cada fuente y solo muestra menciones a OTRA entidad del grupo (ej: La Capital sobre Hermitage, Castorina sobre Paseo Aldrey). Se eliminaron auto-referencias donde "La Capital" matcheaba "la capital" en su propio nombre
Entidades del grupo definidas: la_capital, canal_2, lu6_radio, pasetti, castorina, hermitage, paseo_aldrey, aldrey_negocios - cada una con sus keywords y patrones de fuente
[1.38.2] – 17-02-2026 19:47hs
Corregido
Mapa de noticias: fechas corregidas: ahora usa fecha_publicacion en vez de fecha_detectada para mostrar y filtrar
Los popups muestran la fecha de publicacion real de la nota (formato dd-mm-yyyy HH:MMhs)
El filtro por dia y periodo usa la fecha de publicacion (con fallback a fecha_detectada)
Mapa: filtro por dias: botones cambiados de horas (24h/48h/72h/7d) a dias (1d/3d/7d/14d/30d)
Selector de dia especifico ampliado a 30 dias disponibles
Filtro por dia exacto corregido para incluir todo el dia completo
[1.38.1] – 17-02-2026 19:43hs
Mejorado
Grupo Aldrey renombrado a Grupo La Capital: toda la UI, sidebar, dashboard y ayuda usan "Grupo La Capital"
Cross-menciones internas: la tab "Publicaciones del grupo" ahora muestra solo notas de medios del grupo que mencionan a OTRA empresa del grupo (ej: La Capital sobre Hotel Hermitage, Canal 2 sobre Paseo Aldrey)
Lucia Castorina reconocida como fuente del grupo: las notas de Lucia Castorina (LC) ya no aparecen como menciones externas
Keywords de mención ampliados: agregados "la capital", "canal 2", "hotel provincial", "teatro auditorium" para mejor detección de menciones
Grupos mediáticos: "Multimedios La Capital (Aldrey)" renombrado a "Grupo La Capital" con listado completo de empresas
[1.38.0] – 17-02-2026 19:35hs
Nuevo (3 funcionalidades finales implementadas)
Newsletter automático por email (/newsletter): envío de resúmenes por email
Configuración SMTP (Gmail con contraseña de app)
Gestión de suscriptores con activar/desactivar
Frecuencia diaria o semanal por suscriptor
Preview del newsletter antes de enviar
Historial de envíos
Email HTML profesional con stats, top noticias y categorías
Detección de fuentes primarias (/primarias): clasifica noticias como primaria/derivada
Clasificación automática por IA al analizar cada noticia
Prompt actualizado con criterio de tipo_fuente (primaria/derivada)
Stats: primarias, derivadas, sin clasificar, ratio
Ventana configurable (12h, 24h, 48h, 7d)
Badge de fuente primaria en dashboard y noticias
Red de menciones entre medios (/red): grafo interactivo D3.js
Nodos por fuente, tamaño según cantidad de noticias
Enlaces por co-ocurrencia (misma historia cubierta por múltiples medios)
Colores por plataforma (RSS, Twitter, Instagram, TikTok)
Click en nodo muestra stats y links al perfil
Drag interactivo, highlight de conexiones
Período configurable (3, 7, 14, 30 días)
Mejorado
Sidebar: agregados Primarias y Red medios en sección Análisis, Newsletter en Sistema
Dashboard y Noticias: badge de fuente primaria junto al score
[1.37.0] – 17-02-2026 19:23hs
Nuevo (7 nuevas funcionalidades implementadas)
Alertas de cobertura insuficiente (/cobertura): detecta temas populares en RRSS sin cobertura de medios RSS
Ventana configurable (3h, 6h, 12h, 24h)
Muestra score, engagement, y fuente original
Botón "Buscar en RSS" para verificar
Perfil de fuente (/fuente/): página dedicada con métricas históricas por fuente
Gráfico de actividad por hora del día
Gráfico de publicaciones por día con score promedio
Categorías más cubiertas, exclusivas, stats generales
Links desde tabla de fuentes RRSS y cards de medios RSS
Generador de copetes IA (/api/copete/): genera copetes periodísticos con IA antes de enviar a Telegram
Botón de varita mágica en cada noticia no enviada
Modal con preview editable del copete generado
Se envía como introducción antes del formato normal
Usa Groq Llama 3.3 con prompt de redactor periodístico
Análisis de audiencia por franja horaria (/audiencia): cuándo publicar según plataforma
Gráfico stacked por plataforma (RSS, Twitter, Instagram, TikTok, Facebook)
Gráfico de engagement por hora (likes, shares, comments)
Mapa de calor simplificado
Mejor hora por plataforma
Resumen ejecutivo editorial (/editorial): informe para reunión editorial
Stats generales 24h, trending ahora (6h)
Noticias de la noche/madrugada, temas sin cobertura RSS
Exclusivas de otros medios, categorías más activas
Timeline visual de historias (/timeline): evolución temporal de una historia
Lista de historias con 2+ medios, clickeables
Vista detallada con línea de tiempo cronológica
Marca "PRIMERO" en la primera fuente
Link al perfil de cada fuente participante
Modo emergencias (/emergencia): aumenta frecuencia de escaneo ante eventos críticos
Datos precargados para cuentas conocidas (67 cuentas)
10 nuevas ideas para medio de comunicación: newsletter por email, timeline visual, detección de fuentes primarias, alertas de cobertura insuficiente, perfil de fuente, copetes IA, modo emergencias, análisis de audiencia, red de menciones, resumen editorial
Mejorado
Ayuda: 6 nuevas secciones (Instagram hashtags, Facebook, Kiosko, Grupos mediáticos, Seguidores, y más)
Ortografía: corrección masiva de acentos en 20+ templates (Análisis, Categoría, Última, Métricas, etc.)
Dashboard: labels visibles en stat-chips (noticias, menciones, enviadas, fuentes)
Sidebar: agregado /buscar, renombrado Trending → En vivo, Kiosko sin target blank
Corregido
Bug comparador "exclusiva": noticias con 4+ medios clasificadas como exclusiva por incompatibilidad de fechas UTC/naive
Ranking comparador: unificación por grupo mediático
Eliminado
Sección "Grupos Mediáticos" de /fuentes (se ve en /grupos)
[1.35.0] – 17-02-2026 18:39hs
Nuevo
Búsqueda por hashtags en Instagram: descubre noticias de creadores independientes
Hashtags default: #mardelplata, #mdp, #mdpnoticias, #mardelplatahoy, etc.
Configurable vía config_runtime (ig_hashtags)
Rotación: 1 hashtag por ciclo, cada 3 horas
Auto-descubrimiento: cuentas que aparecen 3+ veces se agregan automáticamente
Facebook scraping: monitoreo de páginas públicas de medios de MdP
Usa facebook-scraper (sin API key), 1 página por ciclo cada 4 horas
Anti-bloqueo Instagram: cooldown de 2h tras 429, invalidación de sesión automática, delays de 30-45s entre perfiles, batches reducidos a 3
Kiosko: hora de cada noticia (absoluta + relativa), barra de estado inferior con última actualización, panel de estado del sistema (scraper, RSS, RRSS, total noticias)
[1.34.1] – 17-02-2026 18:09hs
Mejorado
Comparador: vista agrupada por medio con toggle (icono coleccion)
Muestra noticias organizadas bajo cada medio participante
Stats por medio: cantidad total, primero vs segundo, win rate
Secciones colapsables por medio, ordenadas por actividad
[1.34.0] – 17-02-2026 17:50hs
Nuevo
Tendencias emergentes (/trending): detecta temas cubiertos por 3+ medios distintos
Grupos mediaticos: reestructuracion completa con datos verificados (14 grupos, 81 medios)
Corregido: 0223 separado como medio independiente (NO pertenece al Grupo Aldrey)
Multimedios La Capital (Aldrey): Florencio Aldrey Iglesias. La Capital, Canal 2, LU6 AM760 (FM 93.3), LU9 AM670 (FM 103.3 Universo), AM 1620, La Capital Cable. Hotel Hermitage, Hotel Provincial, Teatro Auditorium, Paseo Aldrey
Nuevos grupos agregados:
- Neomedia (Canal 8 / Mi8): Maria Ximena Velazquez, afiliado Telefe
- Grupo Olmos (Canal 10): Raul Olmos / Grupo Cronica
- Grupo Indalo: Cristobal Lopez. Ambito, C5N, Radio 10 MdP FM 105.5
- CNA Multimedios (La Tecla): Mario Baudry
RRSS asociadas a grupos: Twitter, Instagram, TikTok, Bluesky de cada grupo
WAM Entertainment: relacion comercial con Grupo Clarin confirmada (Radio Mitre MdP FM 103.7, La 100 MdP FM 106.3, Boss FM 88.3)
Grupo Octubre (Pagina 12): Canal 9, AM 750, Continental, FM Aspen, UMET
[1.32.1] – 17-02-2026 16:36hs
Nuevo
PDF semanal con copyright (/resumen/pdf): generacion de PDF profesional con WeasyPrint
Resumen diario (1d), semanal (7d) o mensual (30d) descargable desde /resumen
Stats generales: total noticias, fuentes, enviadas, score promedio, categorias
Tabla de noticias principales (score >= 3) con categoria, fuente y fecha
Distribucion por categoria y top fuentes con colores de grupo mediatico
Tabla completa de grupos mediaticos monitoreados (propietario, medios, info)
Bloque de copyright: Carlos Jose Castorina, fecha, licencia uso privado
Aviso legal sobre propiedad intelectual y fuentes de datos
Paginacion automatica con numero de pagina en pie
Botones Hoy/Semanal/Mensual en pagina de Resumen Editorial
Mejorado
Colores de grupo mediatico aplicados en toda la web (dashboard, noticias, comparador, PDF)
Calendario heatmap: dias clickeables, filtra noticias del dia seleccionado
Estado del scraper: indicador de demora con minutos transcurridos
[1.32.0] – 17-02-2026 16:11hs
Nuevo
Pagina Grupos Mediaticos (/grupos): tab dedicada para gestionar grupos de medios
Crear, editar y eliminar grupos con nombre, color y descripcion
Soporte para logos de grupo (URL, con preview en modal)
Agregar/quitar medios (RSS y RRSS) a cada grupo via selectores
Opcion de nombre personalizado para medios no listados
Seccion de fuentes RSS sin grupo asignado
Datos guardados en config_runtime (editables sin reiniciar)
8 nuevas ideas agregadas a la DB (#42-49): engagement dashboard, push notifications, PDF semanal, tendencias emergentes, comparador historico, modo kiosko, buscador semantico, API REST
Mejorado
Mapa de noticias: mejoras significativas de UX
Click en noticia abre link a la fuente original
Boton "Ir a la noticia" en popup
Leyenda de colores por categoria debajo del mapa
Filtro por dia especifico (selector dropdown, ultimos 14 dias)
Score visible en popup de cada marcador
Markers mas grandes (14px) y con cursor pointer
Heatmap comparador: excluida Lucia Castorina (trabaja en La Capital, no es medio separado)
Arreglado
Bluesky scraping: corregidos handles incorrectos (usaban dominios web en vez de .bsky.social)
Handles verificados: 0223, Infobae, Clarin, TN, La Nacion, Pagina 12
Eliminados perfiles inexistentes (El Marplatense, Que Digital no tienen Bluesky)
[1.31.1] – 17-02-2026 15:51hs
Mejorado
Comparador UX overhaul: rediseño completo de la pagina comparador
Selector de periodo con btn-group de links directos (24h/48h/72h/7d)
Paneles (Ranking, Heatmap, Resumen, Exclusivas) unificados en Bootstrap tabs
Ranking visible por defecto con medallas para top 3
Stat-boxes responsivos: 2 columnas en mobile, 5 en desktop
Heatmap auto-carga cuando es tab activa por defecto
Headers de heatmap mejorados ("0h", "1h"... en vez de "0", "1"...)
Eliminado codigo muerto (cambiarPeriodo)
[1.31.0] – 17-02-2026 15:44hs
Nuevo
Scraping Bluesky (AT Protocol): scrapea perfiles publicos via API sin auth
6 perfiles iniciales: 0223, El Marplatense, Que Digital, Infobae, Clarin, TN
Lotes de 3 con delay de 5s, batch index tracking (bs_batch_index)
Integrado en el ciclo social junto a Twitter, Instagram y TikTok
Filtro "BS" en dashboard, gestion en /fuentes
Mapa interactivo de noticias (/mapa): mapa Leaflet.js con pins geolocalizados
40+ ubicaciones de MdP (barrios, lugares, rutas)
Geolocaliza noticias buscando menciones de lugares en titulos
Filtro por periodo (24h/48h/72h/7d), colores por categoria
Analisis de sesgo mediatico (/sesgo): compara cobertura de misma noticia entre medios
Detecta diferencias de sentimiento (positivo vs negativo) y score entre fuentes
Requiere 3+ medios cubriendo la misma noticia
Filtro por periodo (24h-7d)
Deteccion noticias recicladas: alerta cuando un medio publica como nueva una noticia vieja (>48h)
Busca similitud de titulos (>=65%) entre noticias recientes y anteriores
Integrado en la pagina de Divergencias (/fakenews)
Panel de metricas (/metricas): dashboard de rendimiento del sistema
CPU, RAM, disco, DB, uptime del scraper
Noticias por hora (grafico), errores de fuentes, stats AI
Noticias por dia (grafico linea)
Calendario heatmap: actividad de noticias estilo GitHub en /tendencias
Muestra ultimos 90 dias con intensidad de color por cantidad
Info propiedad medios: seccion de grupos mediaticos en /fuentes
Grupo Aldrey, Clarin, Infobae, La Nacion, Ambito, locales MdP
Badge en cada fuente indicando a que grupo pertenece
Scoring personalizado: config de pesos por categoria y fuentes favoritas
Sliders por categoria (0x a 3x) en /config
Campo de fuentes favoritas
Resumen semanal Telegram: resumen automatico los domingos a las 10hs
Top 10 noticias, stats semanales, categoria/fuente top, medio mas rapido
Mejorado
Health indicator: muestra noticias ultima hora en tooltip
API server-status: incluye batch status (IG/TT/BS) y noticias ultima hora
Formulario RRSS: incluye opciones TikTok y Bluesky
Sidebar: nuevos links a Mapa, Sesgo y Metricas
[1.30.0] – 17-02-2026 15:07hs
Corregido
Instagram: scraping por lotes anti-429: los 27 perfiles se dividen en lotes de 5, procesando 1 lote por ciclo (cada 5 min)
Delay entre perfiles subido de 3s a 12s
Cada perfil se scrapea aprox cada 25-30 min en vez de todos juntos
Deteccion de HTTP 429: si recibe rate limit, corta el lote inmediato y avanza al siguiente en el proximo ciclo
Tracking de batch index en config_runtime (ig_batch_index)
Log: "IG: lote 2/6 (5 perfiles: user1, user2...)"
Nuevo
TikTok via Playwright: reemplaza yt-dlp (roto desde 2026.02) por scraping con Playwright headless
7 perfiles iniciales: Muni MdP, Canal 8, 0223, Ahora MdP, Punto Noticias, Que Digital, El Marplatense
Scraping por lotes de 3 perfiles con delay de 15s (TikTok es agresivo con bots)
Reutiliza el browser context de Playwright creado para Twitter (cierre movido al final)
Deteccion de captcha/login wall: corta lote automaticamente
Tracking de batch index (tt_batch_index)
Cuentas TikTok gestionables desde /config y /fuentes (misma tabla cuentas_rrss)
Tabla cuentas TikTok en /config: agregar, activar/desactivar y eliminar cuentas TikTok desde la web
Seccion de temas/hashtags (yt-dlp) mantenida como referencia pero deshabilitada
Nivel alto: divergencia > 0.6 o 3+ pares divergentes
Nivel medio: al menos 1 par divergente
[1.27.0] – 17-02-2026 13:17hs
Nuevo
Alertas personalizadas por keyword: alerta inmediata cuando una noticia contiene un keyword configurado
Alertas Telegram: notificacion instantanea al grupo cuando matchea un keyword
Alertas push navegador: Notification API para alertas en el browser (polling 15s como fallback)
Modulo keyword_alerts.py: verificacion de keywords post-analisis IA
CRUD en /config: agregar, eliminar, activar/desactivar alertas por keyword
Comando /alertas en Telegram: ver y gestionar alertas keyword desde el bot
Ayuda actualizada: secciones de ayuda para alertas keyword, divergencias y WebSocket
Mejorado
ai_filter.py: hook en procesar_lote() para verificar alertas tras cada analisis exitoso
telegram_bot.py: nuevo comando y boton de menu para alertas
[1.26.1] – 17-02-2026 12:49hs
Cambios
Copyright: agregada Lucia Castorina como co-titular en todos los archivos y LICENSE
Header: nombre cambiado a "Monitor Noticias Mar del Plata"
Reloj en topbar: muestra fecha y hora actual (dd-mm-yyyy HH:MMhs) actualizandose cada 30s
[1.26.0] – 17-02-2026 12:44hs
Nuevo
Sidebar mejorada: secciones agrupadas (Principal, Analisis, Sistema) con headers sutiles y jerarquia visual
Fix Google News: extrae medio real del titulo (fastfeedparser no parsea ), corregidas 173 entradas existentes
Analisis de sentimiento IA: cada noticia recibe sentimiento positivo/negativo/neutro del LLM, indicador visual en dashboard
App movil PWA: manifest.json, service worker, iconos, meta tags - se puede instalar como app en celular
Pagina de tendencias: graficos Chart.js con noticias/dia, categorias (doughnut), sentimiento por dia, top fuentes
Resumen diario automatico Telegram: envia resumen editorial a las 8:00 y 20:00 con top noticias y sentimiento
Backup desde la web: boton en Config para ejecutar backup manual a Google Drive con feedback
[1.25.0] – 17-02-2026 12:15hs
Nuevo
Modo oscuro (dark mode): toggle en topbar, CSS variables, persiste en localStorage. Aplica a toda la interfaz
Feed RSS propio: endpoint /feed.xml con las ultimas 30 noticias en formato RSS estandar
Modo breaking news: noticias score 5 destacadas con borde rojo, fondo gradiente y badge BREAKING animado
Exportar comparador a CSV: boton de descarga CSV con todas las comparaciones y datos de primero/diferencia
Busqueda avanzada con operadores: soporte para fuente:, categoria:, score:, fecha:hoy/ayer/semana
Widget de clima expandido: panel colapsable con pronostico 12 horas, temperatura y probabilidad de lluvia
Vista comparador detallada: boton para ver como titulo cada medio la misma noticia (titulos lado a lado)
Deteccion de exclusivas reales: identifica noticias cubiertas por un solo medio durante 6+ horas (score >= 3)
Mapa de calor de cobertura: heatmap interactivo de publicaciones por hora y medio (top 10), cargado via AJAX
Notificaciones push en navegador: alerta Notification API para noticias score 5, toggle en topbar
Dashboard de engagement RRSS: nueva pagina /engagement con metricas agregadas por cuenta (likes, RT, comments)
Dashboard de categorias: nueva pagina /categorias con tendencias por tema, comparacion con periodo anterior, top noticias por categoria
Resumen editorial diario: nueva pagina /resumen con las noticias principales del dia, stats y distribucion. Boton imprimir/PDF
Backup automatico a Google Drive: script backup_gdrive.sh con rclone, cron cada 6h, rotacion 20 backups + bundles semanales
Codigo fuente en Google Drive: sincronizacion automatica del codigo (sin DB/git) a gdrive:Backups/noticias-lucia/codigo/
Mejorado
Sidebar: nuevos links a Categorias, Engagement y Resumen
Topbar: botones de notificaciones push y dark mode
Ayuda: seccion backup actualizada con info de rclone/GitHub
Todas las ideas completadas
20 ideas totales: 20 completadas, 0 pendientes
[1.24.0] – 17-02-2026 11:31hs
Nuevo
Toggle La Capital en dashboard: boton para ocultar/mostrar noticias de La Capital y Grupo Aldrey (Canal 2, LU6, Radio Atlantica, Pasetti)
Persiste entre recargas via localStorage
Funciona en combinacion con los filtros existentes (Todas/Medios/Twitter/IG/TikTok)
Deteccion mejorada: usa _es_fuente_lacapital() del backend para mayor precision
Clima Open-Meteo: migrado de SMN (ZIP+CSV poco confiable) a Open-Meteo API (JSON, gratis, sin API key)
Actualizacion cada 15 min (antes 30 min), datos siempre disponibles
Incluye sensacion termica confiable (SMN a veces devolvia "No se calcula")
Alertas SMN se mantienen sin cambios
Google News: medio original visible: cuando una noticia viene de Google News, se muestra el medio real que la genero (ej: "La Capital MdP" en vez de "Google News MdP")
Boton Escanear mejorado: ahora via AJAX con spinner animado, feedback visual del progreso y recarga automatica al completar
Mejorado
Estado del servidor compacto: movido de barra completa a icono colapsable en la linea del clima. Click para expandir detalles (CPU, RAM, disco, DB, usuarios)
Icono con color segun estado: verde (OK), amarillo (carga alta), gris (sin datos)
Stats del dashboard simplificados: de 4 cards separados a chips inline con iconos junto al titulo
Deteccion Grupo Aldrey mas robusta: el backend ahora marca es_lacapital en cada noticia usando la funcion centralizada de db.py (cubre variantes: lacapitalmdq, canal2mdp, lu6_atlantica, marcelopasetti, etc.)
Corregido
TikTok deshabilitado temporalmente: yt-dlp no puede acceder a TikTok (error "No working app info") por bloqueo anti-scraping. Topics limpiados para evitar errores innecesarios. Alternativa investigada: TikTokApi v7 (pendiente implementacion)
Diagnostico de fuentes
25 fuentes RSS: todas activas, 0 errores consecutivos, funcionando correctamente
66 cuentas RRSS: 39 Twitter + 27 Instagram, todas activas
La Tecla MdP: no tiene feed RSS publico, ya cubierta via Twitter @lateclamdq e Instagram lateclamdq
TikTok: 0 noticias, scraping bloqueado por TikTok
[1.23.2] – 17-02-2026 11:05hs
Corregido (CRITICO)
Fix reagrupamiento semantico que destruia el feed de noticias: el umbral de similitud coseno 0.70 era demasiado bajo para embeddings de noticias locales (todas comparten contexto "Mar del Plata"), causando que noticias completamente diferentes se fusionaran en mega-grupos
Umbral subido de 0.70 a 0.85 en reagrupar_por_embeddings() y buscar_noticia_similar()
Reset de todos los grupos y re-agrupamiento limpio con solo Jaccard (0.55)
Antes: 317 grupos (mega-grupos de 16+ noticias). Despues: 443 grupos (max 7, correctos)
[1.23.1] – 17-02-2026 10:54hs
Corregido
Fix error Telegram "unclosed start tag": el notifier truncaba mensajes largos cortando dentro de tags HTML abiertos
Nueva funcion _cerrar_tags_html() que detecta y cierra tags abiertos (, , )
Truncacion mejorada: busca ultimo bloque de noticia completo antes de cortar
Mejorado
Bot de Telegram renovado: nuevos comandos y mejor feedback
/top — Top 5 noticias mas relevantes (score 3+) con estrellas de score
/salud — Estado del scraper (activo/demorado/inactivo, ultimo scan RSS/RRSS, uptime)
Amarillo pulsante "Demorado": entre 2x y 3x el intervalo
Rojo pulsante "Inactivo": > 3x el intervalo o sin datos
Tooltip con detalle de ultimo scan RSS y Social
Auto-actualización via AJAX cada 30s en todas las paginas
Timestamps registrados en config_runtime (last_scan_rss, last_scan_social, scraper_started)
Scan manual también actualiza los timestamps
API /api/server-status extendida con datos de salud
[1.21.0] – 16-02-2026 23:19hs
Agregado
Tab Ideas: nueva pagina /ideas con CRUD completo para anotar ideas y mejoras
Crear, editar, eliminar ideas con titulo, descripcion y autor
Filtro por estado (pendiente, en progreso, completada, descartada)
Modales de edicion con cambio de estado
Nav item "Ideas" con icono de lamparita en sidebar
Aliases de medios: normalizacion automatica de nombres de fuentes en el comparador
Mapa configurable de aliases (ej: "AHORA MdP" → "AHORA Mar del Plata")
Aliases por defecto para medios de MdP conocidos
Editable desde Config como JSON
Ranking de velocidad: seccion colapsable en comparador con tabla de medios
Muestra veces primero/segundo, ventaja promedio y win rate por medio
Barra de progreso visual con colores segun rendimiento
Alertas Telegram de primicias perdidas: notificacion automatica cuando otro medio publica primero
Detecta noticias donde otro medio publico 30+ min antes con 2+ medios cubriendola
Ciclo cada 5 min con dedup por grupo_id
Toggle on/off desde Config, requiere medio de referencia configurado
Filtro por categoria en comparador: dropdown para filtrar noticias cruzadas por categoria
Combina con filtro de "primero" (stat-boxes clickeables)
Badge de categoria en cada card
Indicador de filtros activos con contador
Grafico de tendencia semanal: line chart Chart.js en resumen diario del comparador
2 lineas: ref primero (verde) vs otro primero (rojo)
Solo se muestra cuando hay datos de 2+ dias
CDN cargado solo en pagina de comparador
[1.20.0] – 16-02-2026 22:20hs
Mejorado
Comparador generalizado: ya no esta restringido a La Capital, muestra todos los grupos con 2+ fuentes distintas
Modo generico (sin medio configurado): muestra quien publico primero entre todas las fuentes
Modo filtrado (con medio de referencia): compara ese medio vs otros (ej: "La Capital" vs resto)
Nuevo campo "Medio de referencia" configurable desde /config
Stats y resumen diario adaptados al modo seleccionado
Labels y badges dinamicos en vez de "La Capital" hardcodeado
Dashboard: cruce entre fuentes ahora muestra nombres reales de primera y segunda fuente
Ayuda: seccion del comparador actualizada para reflejar el modo generico
Formato fechas: resumen diario del comparador usa formato dd-mm-yyyy
Matching inteligente de variantes: @lacapitalmdq, @marcelopasetti, Canal 2, LU6 y demas cuentas RRSS del Grupo Aldrey se reconocen como parte de La Capital via _fuente_matchea_medio()
Resolucion de fuente real en Google News: extrae el medio original del titulo (ej: "titulo - La Capital de MdP" → La Capital). Elimina falsos "otro primero" cuando Google News republicaba notas de La Capital. Normaliza variantes a "La Capital MdP"
Fix Canal26 falso positivo: _es_fuente_lacapital() ya no matchea "canal26" como Grupo Aldrey (antes "canal 2" era substring de "canal26"). Ahora usa coincidencia exacta + substring solo para nombres largos
Indicador "via Google News": cuando una noticia fue resuelta desde Google News, se muestra un badge "via Google News MdP" junto a la fuente real para transparentar el origen
Eliminado
Funciones obsoletas obtener_comparaciones_lacapital(), obtener_cruce_lacapital(), obtener_cruces_recientes() reemplazadas por obtener_comparaciones() y obtener_cruce() genericas
Referencias hardcodeadas a "La Capital" en comparador, dashboard y ayuda
[1.19.0] – 16-02-2026 21:58hs
Agregado
Similitud semantica para agrupamiento de noticias: fallback con embeddings cuando Jaccard no detecta match
Scheduler: RSS cada 10min, redes sociales cada 15min
Base de datos SQLite con WAL
Ayuda - Monitor Noticias Mar del Plata
El número que aparece junto a cada noticia es el score de relevancia IA, asignado automáticamente por el modelo de lenguaje (Groq/Llama 3.3).
5Muy relevante - Noticia importante para Mar del Plata, se envía inmediatamente a Telegram
4Relevante - Noticia significativa, se envía a Telegram
3Moderada - Relevancia media, se incluye en resumen periódico
2Baja - Poca relevancia local
1Mínima - Mención tangencial de MdP
Medios RSS/Web - Fuentes tradicionales (Clarin, Infobae, 0223, etc.)
@usuario - Posts de X/Twitter scrapeados con Playwright
IG:usuario - Posts de Instagram via Instaloader
TT:hashtag - TikToks virales scrapeados con yt-dlp (sin cuenta necesaria)
Medios de referencia - Se puede configurar un medio de referencia en Configuración para el comparador
Tilde verde - La noticia ya fue enviada al grupo de Telegram
Botón enviar - Envía manualmente la noticia al grupo de Telegram
Botón desmarcar - Quita la marca de "enviada" (no borra el mensaje del chat)
Botón eliminar - Elimina la noticia de la base de datos permanentemente
Las métricas de engagement se muestran junto a las noticias de redes sociales:
Reproducciones - Visualizaciones (TikTok)
Me gusta - Likes
Retweets/Shares - Compartidos
Replies/Comments - Comentarios
El badge viral aparece cuando el engagement supera los umbrales configurados en Configuración.
Las métricas se actualizan automáticamente en cada escaneo.
El comparador cruza noticias entre medios para determinar quien publicó primero. Muestra todos los grupos con 2+ fuentes distintas.
Ref primero - El medio de referencia (o primera fuente) publicó antes
Otro primero - Otro medio publicó primero
Simultáneo - Diferencia menor a 5 minutos
Exclusiva - Solo cubierta por una fuente del grupo
Se puede configurar un medio de referencia en Configuración para filtrar solo cruces de ese medio. Los stat-boxes son clickeables para filtrar y el resumen diario muestra tendencias por día y categoría.
TikTok se scrapea por hashtags usando yt-dlp, que funciona sin autenticación ni cuenta.
Solo se capturan posts virales que superen el umbral mínimo de likes configurado. Los temas/hashtags se configuran desde Configuración.
Configura palabras clave para recibir alertas inmediatas cuando una noticia las contiene.
Telegram - Alerta inmediata al grupo de Telegram
Push - Notificación del navegador (requiere permiso)
Configurar desde Configuración > Alertas por keyword
Comando Telegram: /alertas para ver las configuradas
El detector de divergencias analiza grupos de noticias para identificar cuando los títulos son semánticamente iguales pero léxicamente muy diferentes.
Alto Divergencia significativa (3+ pares o divergencia > 0.6)