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.pyinsertar_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 DBobtener_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 DBstats_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 botbuscar_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)
  • Refactor callbacks — Agregados handlers para nuevos botones: fuentes, dolar, alertas_ciudad, siniestros, cat_* (categorias)

[1.87.0] – 19-02-2026 20:12hs



Agregado

  • 5 nuevos widgets DataHub MdP en dashboard — Consumo centralizado de datos desde DataHub con API key autenticada:
  • Dolar BCRA: Cotizaciones oficial, referencia y euro en barra de contexto (cache 1h)
  • Siniestros viales: Panel colapsable con ultimos 7 dias + estadisticas 30 dias. Alerta destacada si hay siniestro fatal reciente
  • Fuentes institucionales: Panel con publicaciones de INIDEP, CONICET, argentina.gob.ar (ultimas 48h, cache 30min)
  • Reportes ciudadanos: Panel con reportes activos, estadisticas por tipo (cache 15min)
  • Transporte: Panel con proximos servicios (trenes, aviones, micros) desde/hacia MdP + estadisticas (cache 10min)
  • 5 nuevos endpoints API proxy/api/dolar-local, /api/siniestros-local, /api/institucional-local, /api/reportes-local, /api/transporte-local para consumo AJAX
  • Helper genérico _datahub_get() — Funcion reutilizable para requests a DataHub con API key, User-Agent y timeout
  • Configuracion DataHub centralizadaDATAHUB_URL y DATAHUB_API_KEY en config.py (API key: Noticias-Lucia plan internal)

Mejorado

  • DataHub con autenticacion — Todas las llamadas a DataHub (clima, alertas SMN, y los 5 nuevos) ahora incluyen header X-API-Key para tracking de consumo
  • Refactor DataHub helpers — Funciones existentes (_get_weather_datahub, _get_smn_alerts_datahub) migradas a usar _datahub_get() genérico

[1.86.0] – 19-02-2026 20:05hs



Corregido

  • 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 registradalast_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/
  • Actualizado sys.path, backup_gdrive.sh, telegram_bot.py uploads path, web_app.py backup path

[1.81.0] – 19-02-2026 19:02hs



Agregado

  • 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
  • Rate limiting Groq geo — Máximo 30 llamadas/minuto para geolocalización LLM
  • Pipeline IA integradoai_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)
  • Tipografia jerarquizada (56px marca, 140px hero, 36px titulo, 28px cuerpo)
  • 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.pytime.strftime() (UTC) reemplazado por ahora() (GMT-3) para stats de IA
  • backup.pydatetime.now() (ambiguo) reemplazado por ahora() (GMT-3) para timestamps de backups
  • web_empresas.pytime.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 JSnew 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 previsionesciclo_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 noticiasutc_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
  • Stopwords ampliadas — nuevos verbos de atribución periodística: confirmo, anuncio, afirmo, revelo, aseguro, explico, senalo, manifesto, advirtio, remarco, recalco
  • Log de mergesbuscar_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
  • Se registran cambios en: keywords, excluded_domains, intervalos, telegram, viral, scoring, prevision_hora, alertas_primicias
  • 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
  • Agustin Neme (intendente interino): Twitter @agustin_neme, Instagram @agus.neme
  • Guillermo Montenegro (senador/ex-intendente): Twitter @gmontenegro_ok, Instagram @gmontenegro_ok
  • Municipalidad MGP: Twitter @munimardelplata, Instagram @munimardelplata
  • Concejo Deliberante MdP: Instagram @concejomdp
  • Marina Sanchez Herrero (concejal): Twitter @MSanchezHerrero, Instagram @msanchezherrero
  • Gustavo Pulti (concejal): Twitter @GustavoPulti, Instagram @gustavo.pulti
  • Alejandro Rabinovich (senador provincial): Twitter @arabinovich_ok, Instagram @arabinovich_ok
  • Fernanda Raverta (senadora provincial): Twitter @FerRaverta
  • 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
  • Funcion obtener_salud_db() (#87): recolecta metricas de SQLite (page_size, page_count, freelist_count, integrity_check)

Mejorado

  • 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
  • 3 funciones DB: obtener_noticias_internacionales, contar_noticias_internacionales, stats_cobertura_internacional
  • Link en sidebar seccion Analisis con icono bi-globe

[1.46.0] – 18-02-2026 08:38hs



Nuevo

  • Nuevos feeds RSS nacionales: Cronica, C5N, El Destape, Diario Popular, El Cronista
  • Google News ampliado: queries adicionales "marplatense", "costa atlantica", "La Feliz"
  • Cobertura Nacional (/cobertura-nacional): pagina dedicada con noticias de MdP en medios nacionales, stats por medio y tema
  • Paginas fusionadas para simplificar navegacion:
  • /en-vivo — Tendencias + Trending en vivo (2 tabs)
  • /resumen-editorial — Resumen del dia + Editorial (2 tabs)
  • /narrativo — Sesgo mediatico + Divergencias narrativas (2 tabs)
  • /analisis-fuentes — Cobertura insuficiente + Fuentes primarias (2 tabs)
  • Heatmap independiente (/heatmap): mapa de calor con filtros por tipo fuente (RSS/RRSS/Web), categoria y dia
  • Sidebar reestructurado: secciones colapsables (Principal, Analisis, Previsiones & IA, Sistema) con estado persistente en localStorage
  • Nuevos tipos de entidad en Empresas: "medio", "periodista", "banco" con iconos dedicados
  • 9 bancos agregados: Nacion, Provincia, Galicia, Santander, BBVA, Macro, Credicoop, Ciudad, BCRA con cuentas Twitter
  • Perfil individual de empresa (/empresas/perfil/): info, cuentas RRSS, feed de noticias, stats y grafico de actividad con Chart.js
  • Accordion de empresas colapsado por defecto para mejor UX
  • Previsiones mejoradas:
  • Horario de generacion configurable via config_runtime
  • Actualizaciones intraday cada 30 min (compara predicciones con noticias reales)
  • Campo historial_confianza para tracking de cambios de confianza
  • Estadisticas por segmento horario: funciones para analizar madrugada/manana/tarde/noche y dia habil vs finde
  • Resumen IA a demanda: boton en resumen editorial para generar parrafo narrativo con Groq
  • Resumen diario Telegram mejorado: parrafo editorial IA, metricas, noticias agrupadas por categoria
  • 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
  • 10 categorias: Camaras y Asociaciones, Empresas, Salud, Universidades, Deportes, Cultura, Transporte, Servicios Publicos, Telecomunicaciones, Reguladores
  • Tarjetas por entidad con iconos de plataformas (Twitter/Instagram/TikTok) y links directos
  • Badge de seguidores (maximo entre plataformas) y stats de noticias capturadas
  • Agrupacion accordion colapsable por tipo de entidad
  • Soporte dark mode y responsive mobile
  • Columna tipo_entidad en tabla cuentas_rrss: migracion automatica que clasifica cuentas existentes
  • Link "Empresas" en sidebar (seccion Principal, despues de Grupos)



[1.42.0] – 18-02-2026 00:13hs



Nuevo

  • 59 cuentas RRSS de empresas, instituciones y organizaciones de MdP:
  • Camaras empresariales: UCIP, CAME, AEHG, Camara Textil, Parque Industrial, Centro Constructores
  • Empresas emblematicas: Havanna, Cafe Martinez, BGH, Grupo Newsan, Shopping Los Gallegos, Casino Central
  • Consorcio Portuario: Puerto MdP (Twitter + Instagram)
  • Salud: Clinica 25 de Mayo, Clinica Colon, HIGA, Hospital Materno Infantil, Clinica Pueyrredon, Clinica del Nino, INAREPS, Sanatorio Belgrano
  • Universidades: UNMdP, UTN MdP, FASTA, CAECE MdP, CONICET MdP
  • Deportes/Cultura: Aldosivi, Alvarado, EMDER, Teatro Auditorium, Museo MAR
  • Transporte: Aeropuertos Argentina (AA2000)
  • Total cuentas RRSS: 193 (antes 134)



[1.41.0] – 18-02-2026 00:01hs



Nuevo

  • 28 cuentas RRSS de servicios publicos y gobierno: monitoreo de empresas de servicios de MdP
  • EDEA (electricidad): Twitter @prensaedea, Instagram @prensaedea
  • OSSE Prensa: Twitter @PRENSAOSSE (complementa @ossemgp existente)
  • Camuzzi Gas: Instagram @camuzzigas
  • Telecomunicaciones: Claro, Personal y Movistar (Twitter + Instagram)
  • EMTUR MdP (turismo): Twitter @mardelplata, Instagram @turismomardelplata, TikTok @turismomardelplataok
  • EMSUR MdP (servicios urbanos): Twitter + Instagram @emsurmgp
  • Dependencias municipales: Seguridad, Salud, Cultura, Movilidad Urbana, COM, EMVIAL
  • Reguladores nacionales: ENACOM (telecom), ENARGAS (gas)
  • Total cuentas RRSS: 134 (antes 106)



[1.40.3] – 17-02-2026 23:00hs



Nuevo

  • 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)



[1.40.1] – 17-02-2026 22:05hs



Nuevo

  • Fuentes: Juanchi Ugalde (@juanchii): fotógrafo/filmmaker aéreo de MdP, proyecto #DesdeElAire — Twitter @juanchi_ugalde, Instagram @juanchii
  • 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:
  • Tildes: "mediático", "simultáneo", "térmica", "únicas" (faltaban acentos)
  • "Win rate" → "% primicias" (jerga gaming → periodismo)
  • "Heatmap" → "Mapa de calor" (unificado con audiencia)
  • "Jaccard"/"Coseno" → "Similitud textual"/"Similitud semántica" (comprensible para periodistas)
  • "Noticias recicladas" → "Notas recalentadas" (jerga periodística argentina)
  • "Kiosko" mantenido como nombre de sección (preferencia editorial)
  • "Comments"/"Shares"/"Views" → "Comentarios"/"Compartidos"/"Reproducciones" (español)
  • "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)
  • Instagram: 6 nuevas cuentas (nacionales + locales)
  • 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
  • Afecta: obtener_noticias(), obtener_noticias_mergeadas(), contar_noticias(), contar_grupos()

Mejorado

  • 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
  • Toggle on/off con motivo obligatorio
  • RSS pasa de 10min a 2min, RRSS de 15min a 3min
  • Indicador visual en sidebar cuando está activo
  • Panel de cuentas oficiales monitoreadas

Mejorado

  • Sidebar: agregados Timeline, Editorial, Cobertura, Audiencia, Emergencia
  • Fuentes: nombre de medio y cuentas RRSS son links al perfil de fuente

[1.36.0] – 17-02-2026 19:09hs



Nuevo

  • Seguidores en fuentes RRSS: columna de seguidores con sistema de colores por rango
  • Verde: 100K+, Celeste: 10K+, Amarillo: 1K+, Gris: <1K
  • Botón para editar seguidores por cuenta
  • Campo seguidores en modal de agregar cuenta
  • 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
  • 10 páginas default de medios locales
  • Nuevas cuentas monitoreadas:
  • IG: @infomardel (57K), @mardelplataarg (150K), @mardelplataweb_ (338K), @mardelplata24 (103K), @holamardelplata, @fedecermelo (periodista)
  • TW: @infomardel, @mardelplata24, @MardelplataARG

Mejorado

  • 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
  • Clasificacion: Viral (5+ medios), Trending (4+), Emergente (3+)
  • Filtro por periodo (6h/12h/24h/48h/7d)
  • API endpoint: /api/trending?horas=N
  • Busqueda semantica (/buscar): busca noticias por significado usando embeddings IA
  • Combina busqueda por texto (SQL) + busqueda semantica (coseno)
  • Resultados marcados como "Texto" o "Semantico" segun tipo de match
  • Soporta operadores: fuente:xxx categoria:xxx score:N fecha:hoy
  • Comparador historico (/api/historico): datos de largo plazo por medio y categoria
  • Noticias por dia por fuente (top 10) y por categoria
  • Periodo configurable (default 30 dias)
  • Modo kiosko (/kiosko): vista pantalla completa para TV/monitor
  • Fondo oscuro, reloj en tiempo real, noticias rotando cada 30s
  • Panel lateral con estadisticas y tendencias
  • Auto-refresh automatico sin interaccion
  • API REST publica (/api/docs): documentacion interactiva con botones "Probar"
  • Endpoints: /api/v1/noticias, /api/v1/fuentes, /api/v1/stats, /api/v1/trending
  • Rate limiting: 60 req/min por IP con respuesta 429
  • Paginacion, filtros por categoria/fuente/score/horas
  • Scraping historico (scrape_historico.py): importa noticias de enero-febrero
  • python3 scrape_historico.py --dias 60 para scrapear ultimos 60 dias
  • Noticias importadas marcadas como enviadas (no se envian al bot)
  • Modo dry-run disponible: --dry-run

Mejorado

  • Heatmap por dia en comparador: selector de dia especifico (ultimos 14 dias)
  • API /api/heatmap?dia=dd-mm-yyyy para filtrar por fecha
  • Mapa inteligente con scoring de certeza de geolocalizacion
  • Certeza calculada por: posicion en titulo vs resumen, largo del nombre, categoria
  • Indicador visual de certeza (%) en popup de cada marcador
  • Colores: verde (>=80%), amarillo (>=60%), rojo (<60%)
  • Anti-scraping mejorado: protecciones contra bloqueos en todas las plataformas
  • User-Agent rotativo (8 variantes de Chrome, Firefox, Safari)
  • Twitter: delay aleatorio 3-6s (era fijo 2s)
  • Instagram: delay 20-30s aleatorio (era fijo 12s), batch reducido a 4
  • TikTok: delay 20-30s aleatorio (era fijo 15s)
  • Posts Instagram reducidos de 6 a 5 por perfil
  • Sidebar: nuevos links a Trending, Kiosko y API
  • Ideas: 53 completadas, 0 pendientes (100% completado)

[1.33.0] – 17-02-2026 16:48hs



Mejorado

  • 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
  • 8 nuevas ideas (#33-40): Bluesky, sesgo mediatico, resumen semanal, mapa interactivo, scoring personalizado, noticias recicladas, panel de metricas, WhatsApp
  • Filtro por autor en Ideas: botones "Todos / Usuario / Claude" para separar ideas del sistema de las del usuario

Mejorado

  • Browser Playwright compartido: Twitter y TikTok usan el mismo context, cierre al final de _ejecutar_todo()
  • db.py: nueva funcion migrar_perfiles_tiktok() para migracion automatica de perfiles iniciales



[1.29.0] – 17-02-2026 13:17hs



Nuevo

  • Dashboard en tiempo real (WebSocket): noticias nuevas aparecen al instante sin recargar la pagina
  • Flask-SocketIO: reemplaza polling por WebSocket con fallback automatico a polling
  • Tabla events en SQLite: cola de mensajes entre el scraper (main.py) y la web (web_app.py)
  • Background emitter: thread que lee eventos pendientes cada 3s y emite via SocketIO
  • Handlers SocketIO: connect, request_refresh, nuevas_noticias, keyword_alert, stats_update, health_update, resumen_enviado
  • Toast notifications: notificaciones flotantes en tiempo real (5s) para eventos del sistema
  • Auto-reload dashboard: cuando llegan noticias nuevas, el dashboard se recarga automaticamente

Mejorado

  • main.py emite eventos en ciclos RSS, social y resumen via tabla events
  • keyword_alerts.py usa insertar_evento() para push via WebSocket
  • Polling de keyword alerts mantenido como fallback si WebSocket no esta disponible



[1.28.0] – 17-02-2026 13:17hs



Nuevo

  • Deteccion de fake news / divergencia narrativa: analiza grupos de noticias buscando manipulacion o framing divergente
  • Modulo fakenews.py: compara pares de titulos con Jaccard (lexico) y Coseno (semantico)
  • Pagina /fakenews: vista completa con resultados del analisis, niveles alto/medio, pares divergentes
  • Badge en dashboard: indicador visual de divergencia narrativa en tarjetas de noticias
  • Ciclo automatico: analisis cada 30 minutos, resultados guardados en config_runtime
  • Link en sidebar: seccion "Analisis" → "Divergencias"

Criterio de deteccion

  • Divergencia = Jaccard < 0.25 (titulos lexicamente diferentes) + Coseno >= 0.80 (semanticamente iguales)
  • 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

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)
  • /scan mejorado — Reporta resultado: cuantas noticias nuevas encontro (RSS vs RRSS)
  • /ultimas mejorado — Muestra score con estrellas y hora de deteccion
  • Menu reorganizado con 3 filas: Stats/Ultimas/Top, Escanear/Resumen, Salud/Intervalo/Config
  • Botones "Salud" y "Top" agregados al menu inline
  • Dashboard auto-refresh: ya no dispara un scan al refrescar (el scheduler lo maneja), simplemente recarga la pagina para mostrar datos nuevos



[1.23.0] – 17-02-2026 10:40hs



Agregado

  • Ticker de noticias en tiempo real: barra tipo CNN/ESPN debajo del topbar con titulares scrolleando
  • Scroll horizontal continuo con CSS @keyframes, pausa al hover
  • Cada noticia muestra emoji de categoria + titulo + fuente
  • Click abre la noticia en nueva pestaña
  • Datos via AJAX desde /api/noticias?limit=15, refresca cada 2 min
  • Label "AHORA" en rojo para identificar la barra
  • Oculto automaticamente en mobile (<768px)
  • Ideas nuevas en la seccion Ideas: 6 nuevas sugerencias para el roadmap
  • Modo breaking news, Resumen editorial diario, Feed RSS propio, Dashboard de categorias
  • Ideas completadas: Indicador de salud del scraper (v1.22.0), Ticker de noticias (v1.23.0)

Mejorado

  • Sidebar footer: version con link a changelog visible encima del copyright
  • Topbar simplificado: eliminados "GMT-3" y version del topbar (movida al sidebar)

Limpieza

  • Eliminado noticias.db vacio de la raiz del proyecto
  • Actualizado .gitignore para ignorar noticias.db
  • Actualizado ideas-mejoras.md con todas las ideas completadas



[1.22.0] – 17-02-2026 10:20hs



Agregado

  • Indicador de salud del scraper en tiempo real: el topbar muestra el estado real del sistema
  • Verde "Activo": ultimo scan < 2x intervalo RSS (~20 min)
  • 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
  • buscar_noticia_similar() ahora tiene 2 pasos: Jaccard (umbral 0.55) → Embeddings coseno (umbral 0.70)
  • Noticias con titulos reformulados pero semanticamente iguales se agrupan automaticamente
  • Fallback silencioso si Ollama no esta disponible (solo Jaccard)
  • Reagrupamiento batch de noticias huerfanas (reagrupar_por_embeddings())
  • Despues de generar embeddings, compara noticias "solas" (grupo de 1) entre si
  • Une noticias huerfanas con similitud coseno >= 0.70
  • Corre automaticamente en cada ciclo de procesamiento IA
  • Logs informativos: "Match semantico" y "Reagrupadas" para seguimiento



[1.18.1] – 16-02-2026 21:15hs



Mejorado

  • Tab Lucia mejorada: busqueda dinamica, ordenamiento por puntuacion/fecha, filtro firma/mencion
  • Filtro "Firmadas por Lucia": notas donde Lucia es autora (feed dedicado + byline)
  • Filtro "Mencionan a Lucia": notas de otros medios que mencionan su nombre en titulo/resumen/texto
  • Busqueda por texto en titulos y resumenes
  • Ordenamiento por puntuacion IA (score) o por fecha
  • Boton "Limpiar filtros" cuando hay filtros activos
  • Badges diferenciados: "Feed dedicado", "Firma: autor", "Mencion en texto"
  • Tab Grupo Aldrey: ahora muestra ambas fechas (publicacion + deteccion) por noticia

Corregido

  • Fix migracion Pasetti: columna correcta nombre_display en UPDATE de cuentas_rrss



[1.18.0] – 16-02-2026 20:45hs



Agregado

  • Grupo Aldrey / Multimedios La Capital: nueva tab dedicada en el sidebar
  • Monitoreo de todo el grupo: La Capital MdP, Canal 2, LU6 Radio Atlantica, Marcelo Pasetti
  • Seccion "Menciones externas": noticias de otros medios que mencionan Aldrey, Hermitage, Paseo Aldrey, etc.
  • Seccion "Publicaciones del grupo": noticias publicadas por fuentes del grupo
  • Nuevas cuentas RRSS del Grupo Aldrey:
  • Twitter: @canal2mdp, @LU6_Atlantica, @lacapitalmdq
  • Instagram: canal2mdp, radioatlanticalu6
  • Ayuda: Estado de noticias: nueva seccion explicando el tilde verde, boton enviar, desmarcar y eliminar
  • Ayuda: Backup a Google Drive: seccion con estado pendiente y pasos para activar

Mejorado

  • Comparador expandido: ahora incluye todas las fuentes del Grupo Aldrey (Canal 2, LU6, Pasetti) como "La Capital"
  • Noticias de Pasetti ya no aparecen como "otro medio" sino como parte de La Capital
  • Filtro de "otros medios" excluye correctamente todas las fuentes del grupo
  • Reclasificacion de Pasetti: de "periodista" a "medio" (subdirector de La Capital, Grupo Aldrey)



[1.17.0] – 16-02-2026 22:30hs



Agregado

  • Actualizacion de metricas RRSS: al rescanear, likes/retweets/replies/comments se actualizan en posts existentes
  • Aplica a Twitter, Instagram y TikTok
  • Las metricas ya no quedan congeladas desde la primera deteccion
  • Deteccion de autoria (byline): nueva columna autor en la DB
  • Captura entry.author / dc:creator de feeds RSS automaticamente
  • Pagina Lucia ahora detecta notas de Lucia Castorina en cualquier medio (no solo feed dedicado)
  • Badge de procedencia: "Feed dedicado" vs "Byline: nombre"
  • Stat-boxes clickeables en Comparador: click en estadisticas filtra las noticias por tipo
  • Hover con efecto visual, borde azul en filtro activo, boton limpiar
  • Resumen diario del Comparador: seccion colapsable con tablas
  • Tabla por dia: fecha, total, LC primero, otro primero, simultaneas, solo LC
  • Tabla por tema: categoria, total, LC primero, barra de progreso % LC
  • Nueva fuente: LoQuePasa.net (RSS local de Mar del Plata)
  • Sincronizacion automatica de fuentes nuevas de DEFAULT_FEEDS al iniciar
  • Ayuda contextual: modal accesible desde el sidebar
  • Secciones: Score IA, Tipos de fuentes, Engagement RRSS, Comparador, TikTok
  • Tooltips en badges de score: "Relevancia IA: X/5"

Corregido

  • Timestamps del changelog: v1.15.0 corregido a 19:32hs, v1.16.0 corregido a 20:03hs



[1.16.0] – 16-02-2026 20:03hs



Agregado

  • Pagina "Lucia": nueva seccion dedicada a las notas de Lucia Castorina en La Capital MdP
  • Feed RSS dedicado: /author/luciacastorina/feed/ con paginacion
  • 100 notas importadas (desde julio 2025)
  • Links clickeables a cada articulo en lacapitalmdp.com
  • Acceso desde el sidebar con icono de pluma

Corregido

  • Algoritmo de merge de noticias (falsos positivos graves):
  • Stop words locales: "plata", "marplatense", "carnaval", dias de la semana, meses, etc.
  • Similitud Jaccard real (interseccion/union) en vez de containment (interseccion/min)
  • Minimo 2 palabras en comun para considerar merge
  • Threshold subido de 0.45 a 0.55
  • Reset y recalculo de todos los grupos existentes

Mejorado

  • Google Drive backup: soporte para servidor headless (puerto fijo 8085, instrucciones SSH tunnel)
  • Instalada dependencia google-auth-oauthlib en servidor



[1.15.0] – 16-02-2026 19:32hs



Agregado

  • WordPress REST API para 4 sitios: Mi8, MdP Hoy, Punto Noticias, El Retrato de Hoy
  • Hasta 20 posts por scan (vs 10 de RSS), JSON estructurado con contenido completo
  • Mi8 MdP ahora accesible (tenia RSS deshabilitado)
  • Playwright sync para sitios con Cloudflare: Ahora MdP, Que Digital
  • Scraping headless con extraccion de articulos via selectores CSS
  • trafilatura para obtener texto completo de cada articulo
  • fastfeedparser como parser RSS primario (10x mas rapido que feedparser)
  • Fallback automatico a feedparser si no esta instalado
  • trafilatura para extraccion de contenido de articulos web

Optimizado

  • Arquitectura fetch-paralelo + write-secuencial en scraper
  • Fase 1: 5 threads descargan HTTP en paralelo (sin DB writes)
  • Fase 2: procesamiento secuencial de resultados (elimina "database is locked")
  • Playwright ejecuta despues de la fase paralela

Corregido

  • Eliminados errores "database is locked" sistematicos (cambiado de 5 threads write-paralelo a write-secuencial)
  • Infobrisas: URL corregida de /rss/ (HTML) a /rss/sociedad (RSS valido)
  • Playwright usa sync_api en vez de async_api (evita conflicto con event loop de Telegram bot)



[1.14.1] – 16-02-2026 22:30hs



Agregado

  • Nuevas fuentes RSS: El Retrato de Hoy, Noticias y Protagonistas, Infobrisas
  • Mi8 MdP agregado como cuenta RRSS (Twitter + Instagram) - RSS deshabilitado en su sitio
  • Credenciales de Instagram configuradas (monitor.noticias.mdp2026)
  • 290 embeddings generados para noticias existentes

Investigacion

  • Analisis de CMS de medios de MdP: 4 WordPress (WP REST API disponible), 2 Cloudflare (requieren Playwright)
  • Recomendacion: integrar WP REST API, trafilatura, fastfeedparser en futuro refactor



[1.14.0] – 16-02-2026 21:00hs



Agregado

  • Busqueda semantica con embeddings (Ollama nomic-embed-text)
  • Nuevo modulo embeddings.py: genera, almacena y busca por similitud coseno
  • Tabla embeddings en DB para vectores de 768 dims como BLOB
  • /api/search ahora combina SQL LIKE + busqueda semantica
  • Generacion automatica de embeddings post-procesamiento IA
  • Stats de IA en pagina de Configuracion
  • Modelo LLM (Groq), tokens consumidos hoy/total, calls hoy/total
  • Estado de Ollama (online/offline), modelo embeddings, noticias indexadas
  • Endpoint /api/ai-stats
  • Tracking de tokens LLM en ai_filter.py
  • Acumula prompt_tokens, completion_tokens, total por dia
  • Reset automatico diario con acumulado historico

Analisis de rendimiento

  • Ollama nomic-embed-text: ~61ms/embedding (137M params, CPU only)
  • Busqueda semantica completa: ~109ms (embedding + 500 cosine similarity)
  • Batch 50 noticias: ~3.1s (+12% sobre Groq IA)
  • RAM: 350MB modelo cargado (de 11.6GB disponibles)



[1.13.0] – 16-02-2026 17:50hs



Agregado

  • Cuentas RRSS nacionales y provinciales (19 cuentas nuevas)
  • Twitter: Clarin, Infobae, TN, C5N, A24, Cronica TV, Telefe Noticias
  • Twitter: Gob. Prov. Buenos Aires, Axel Kicillof, Vialidad Nacional
  • Instagram: mismos medios nacionales + Gob. BA + Kicillof

Corregido

  • Titulos de Instagram: eliminado prefijo feo "135 likes, 6 comments - username el date:"
  • Limpiados 8 titulos existentes en DB
  • Scraping Twitter: mejorado captura de engagement (likes, RT, replies)
  • Doble metodo: aria-label del grupo + botones individuales
  • Fix SyntaxWarning por escape sequences en JS inline



[1.12.0] – 16-02-2026 17:30hs



Agregado

  • Sistema de backup a Google Drive (backup.py)
  • Backup automatico cada 24 horas (DB + config + templates)
  • Rotacion: mantiene ultimos 7 en Drive, 3 locales
  • Setup: python3 backup.py --setup con OAuth de Google Cloud
  • Procesamiento paralelo de feeds RSS (5 threads simultaneos)

Optimizacion de performance (benchmark medido)

  • Cache TTL para keywords/dominios: 0.260ms -> 0.001ms por llamada (260x mas rapido)
  • Connection pool thread-local SQLite: reutiliza conexiones entre llamadas
  • Cache 30s para stats_dashboard(): 0.950ms -> 0.000ms (cache hit)
  • Query bulk stats_fuente(): 6.1ms (17 queries) -> 0.054ms (1 query, 113x mas rapido)
  • obtener_noticias_mergeadas(): 6.4ms -> 1.6ms (4x mas rapido)
  • obtener_fuentes_activas(): 0.31ms -> 0.05ms (6x mas rapido)
  • Scan RSS filtrado (500 entries): 181ms -> 1.1ms (165x mas rapido)
  • Dashboard load total: 7.7ms -> 1.7ms (4.5x mas rapido)
  • Fuentes page total: 6.5ms -> 0.1ms (65x mas rapido)
  • busy_timeout=5s para evitar "database is locked" en threads paralelos

Mejorado

  • Vista movil: stats con labels visibles, timestamps compactos HH:MM
  • Vista movil: header del dashboard en 2 filas para mejor uso del espacio
  • Vista movil: info secundaria del servidor oculta (CPU temp, disco, DB)
  • Fuentes: conteos de noticias clickeables (link a noticias filtradas)
  • Fuentes: errores de scraping mas visibles con indicador "Feed posiblemente roto"

Limpieza

  • Eliminados archivos HTML duplicados del root (solo quedan en templates/)



[1.11.0] – 17-02-2026 14:10hs



Agregado

  • Nuevas fuentes RSS locales: Que Digital, Punto Noticias, MdP Hoy
  • Feeds RSS directos para mayor cobertura de medios marplatenses

Corregido

  • Feed El Marplatense restaurado (nueva URL API Atom)
  • Feed Pagina 12 actualizado a nueva URL
  • Colores del topbar y sidebar: fondo azul claro (#1e40af) para mejor legibilidad
  • Nombre del sitio ahora visible con color blanco forzado
  • Formato de fechas dd-mm-aaaa HH:MMhs (GMT-3) en toda la interfaz



[1.10.0] – 17-02-2026 01:00hs



Agregado

  • Umbrales virales configurables por plataforma (Twitter, Instagram, TikTok)
  • Cada red social tiene sus propias metricas y umbrales
  • Defaults: Twitter 50 likes/20 RT/30 replies, IG 500 likes/50 comments, TT 1000 likes/50k views
  • Configurable desde /config
  • Keywords aplicables a todas las RRSS (Twitter, Instagram, TikTok)
  • Los posts de redes sociales se filtran por las mismas keywords que RSS
  • Conteo de noticias por cuenta RRSS en la pagina de Fuentes
  • Muestra noticias "hoy" y total por cada cuenta monitoreada
  • Ranking de cuentas RRSS mas activas (ultimos 7 dias)
  • Se actualiza automaticamente con cada scan social
  • Muestra cantidad de noticias y score promedio
  • Indicador GMT-3 en la interfaz

Mejorado

  • Sidebar colapsable en desktop y movil
  • Boton de menu en topbar fija para colapsar/expandir
  • Estado persistente en localStorage
  • Overlay en movil al abrir menu
  • Mejor visualizacion movil
  • Stats compactos que se adaptan al ancho de pantalla
  • Filtros de fuentes se ajustan en pantallas chicas (iconos sin texto)
  • Botones y badges mas compactos en moviles
  • Timestamps ocultos en pantallas muy chicas para ganar espacio
  • Card-header con flex-wrap para controles responsive
  • Filtro de fuentes en dashboard: botones exclusivos (Todas / Medios / X / IG / TikTok)
  • Reemplaza los toggles individuales por filtro de tipo exclusivo
  • "Medios" agrupa medios tradicionales + La Capital
  • Paleta de colores armonizada en toda la interfaz



[1.9.0] – 16-02-2026 23:30hs



Agregado

  • Scraping de TikTok viral por temas configurables
  • Usa yt-dlp para hashtags de TikTok (gratis, sin API key)
  • Temas configurables desde /config (ej: mardelplata, argentina, mdq)
  • Filtro de likes minimos configurable (default: 1000)
  • Muestra views, likes, comments, shares en cada post
  • Toggle en dashboard para mostrar/ocultar TikTok
  • Icono TT: en feed, noticias y busqueda
  • Barra de busqueda dinamica en dashboard
  • Filtrado local inmediato + busqueda AJAX en toda la DB
  • Resultados con icono de plataforma y hora
  • Endpoint: /api/search
  • Alertas meteorologicas del SMN en widget de clima
  • Detecta alertas para Mar del Plata y 100km a la redonda
  • Muestra tipo de alerta, nivel y resumen
  • Se actualiza cada 15 minutos via Open Data SMN
  • Endpoint: /api/alerts
  • Ultima hora de actualizacion visible en header del feed de noticias

Mejorado

  • Tipografia unificada en toda la pagina (font-size, line-height, font-family consistentes)
  • Engagement ampliado: views y shares ademas de likes/retweets/comments
  • Colores de badges de categoria ahora coinciden con el color de la categoria



[1.8.0] – 16-02-2026 22:00hs



Agregado

  • Clima de Mar del Plata en dashboard desde SMN Argentina (Open Data)
  • Temperatura, condicion, humedad, viento, sensacion termica
  • Cache de 30 minutos, actualiza via AJAX
  • Fuente: Servicio Meteorologico Nacional (ssl.smn.gob.ar)
  • Doble timestamp en feed del dashboard: hora de publicacion + hora de deteccion
  • Usuarios online clickeable: modal con detalles de conexiones (IP, user-agent, paginas, tiempo)
  • Endpoint API: /api/usuarios-online
  • Metricas de engagement en noticias RRSS: likes, reposts, comentarios
  • Badge "viral" con alcance estimado para noticias de alto engagement
  • Comparador ampliado: incluye noticias de RRSS de La Capital (Twitter/Instagram) ademas del feed RSS

Mejorado

  • Tracking de usuarios mejorado: almacena first_seen, pages, user_agent
  • Comparador reconoce cuentas RRSS de La Capital (@lacapitalmdp, IG:lacapitalmdp, etc.)



[1.7.0] – 16-02-2026 17:00hs



Agregado

  • Scraping de Instagram con Instaloader: 15 perfiles iniciales (medios, gobierno, servicios)
  • Posts insertados con fuente "IG:username" y metadata diferenciada (likes, comments, is_video)
  • Pausa de 5s entre perfiles para respetar rate limits de IG
  • Perfiles IG migrados automaticamente a tabla cuentas_rrss
  • Toggle de fuentes X e Instagram en dashboard: botones para mostrar/ocultar posts de RRSS
  • Preferencia guardada en localStorage
  • Links clickeables en Comparador: titulo de noticia de La Capital ahora lleva a la nota original
  • Doble timestamp en feed de Noticias: hora de publicacion + hora de deteccion
  • Estado del servidor en dashboard: CPU, temperatura, RAM, disco y tamaño DB
  • Se actualiza via AJAX cada 30 segundos sin recargar la pagina
  • Endpoint API: /api/server-status
  • Auto-refresh configurable en minutos (1, 2, 5, 10 min o Off)
  • Lanza escaneo automatico (POST /scan) al cumplirse el intervalo
  • Countdown visible en header del card de noticias
  • Preferencia guardada en localStorage

Mejorado

  • Iconos de Instagram (IG:) detectados correctamente en dashboard, noticias y comparador
  • Funcion ejecutar_scan_social() ahora ejecuta Twitter + Instagram secuencialmente



[1.6.0] – 16-02-2026 15:20hs



Agregado

  • Panel Comparador: La Capital MdP vs otros medios, muestra quien publico primero cada noticia
  • Estadisticas: LC primero, otro medio primero, simultaneas, exclusivas
  • Timeline visual por noticia con timestamps de cada fuente
  • Selector de periodo: 24h, 48h, 72h, 7 dias
  • Gestion de cuentas RRSS desde el dashboard (tabla cuentas_rrss en DB)
  • Agregar, eliminar y activar/desactivar cuentas de X/Twitter e Instagram
  • Cuentas RRSS separadas de fuentes RSS en pagina Fuentes
  • Perfiles iniciales migrados automaticamente de hardcoded a DB
  • Categorias clickeables en dashboard: filtran por categoria en listado de noticias
  • Fuentes clickeables en dashboard: filtran por fuente en listado de noticias
  • Selector de cantidad de noticias en dashboard (15, 30, 50, 100)
  • Fecha y hora de publicacion visible en cada noticia del dashboard

Mejorado

  • Dashboard rediseniado: stats compactos arriba, categorias y fuentes como chips, noticias como feed principal
  • Deteccion de noticias duplicadas mejorada: nombres propios, numeros, normalizacion sin acentos
  • Umbral de similitud ajustado (0.45) y ventana de busqueda ampliada a 48h para mejor agrupacion
  • Pagina Fuentes rediseniada: tabla para RRSS con acciones, cards para RSS



[1.5.2] – 16-02-2026 14:30hs



Mejorado

  • Dashboard reorganizado: noticias aparecen primero al entrar, stats y categorias debajo
  • Verificacion de fechas de tweets con 3 metodos: Snowflake ID (infalible), datetime tag, rechazo
  • Deteccion de tweets pinneados (se descartan automaticamente)
  • Limpieza de 58 tweets antiguos (2016-2022) de la base de datos



[1.5.1] – 16-02-2026 14:10hs



Mejorado

  • Proyecto renombrado a "Monitor de Noticias MdP" (antes "Noticias Lucia")
  • Iconos de X (𝕏) e Instagram (📷) en mensajes de Telegram para identificar fuentes RRSS
  • Filtro de fechas en tweets: descarta tweets con mas de 48 horas
  • Truncado seguro de mensajes Telegram (no corta tags HTML)



[1.5.0] – 16-02-2026 13:55hs



Agregado

  • Version visible en sidebar del dashboard (link al changelog)
  • Scraper de X/Twitter via Playwright: monitorea 25 perfiles de MdP
  • 11 medios locales: 0223, El Marplatense, Ahora MdP, Que Digital, MdP Web, Canal 8, Canal 10, Punto Noticias, La Tecla MdQ, Radio Brisas, LU9
  • 10 periodistas: Camila Osorio, Carlos Walker, Carlos Vazquez, Gabriela Azcoitia, Mariana Gerez, Marcelo Pasetti, Vito Amalfitano, Jorge Penin, Florencia Cordero, German Lagrasta
  • 2 gobierno: Municipalidad MdP, Intendente Montenegro, Bomberos MdP
  • 2 servicios: Transito MdP, OSSE
  • Cada tweet se inserta como noticia con fuente "@username"
  • Metadata diferenciada por tipo de perfil (medio, periodista, gobierno, servicio)

Mejorado

  • social.py reescrito: usa Playwright directo en perfiles de X (Nitter esta muerto)
  • Pausa entre perfiles para no saturar X.com

Corregido

  • Horas del changelog ajustadas a la hora real GMT-3



[1.4.2] – 16-02-2026 13:48hs



Corregido

  • Toda la aplicacion usa zona horaria GMT-3 (Argentina)
  • Funcion centralizada ahora() en config.py reemplaza todos los datetime.now()
  • Afecta: timestamps de noticias, filtros 24h, resúmenes, stats, limpieza



[1.4.1] – 16-02-2026 13:47hs



Mejorado

  • Bot de Telegram restringido: solo @lucia_cast y @carlosmdq pueden usarlo
  • Cualquier otro usuario recibe "Bot privado. No tienes acceso."
  • Proteccion en todos los comandos y botones inline



[1.4.0] – 16-02-2026 13:43hs



Agregado

  • Pagina Changelog en el dashboard web (sidebar + ruta /changelog)
  • Cruce con La Capital MdP: compara timestamps de publicacion
  • La Capital como fuente tipo "referencia" (no se envia a Telegram)
  • Badge "La Capital primero" / "Otro medio primero" en noticias cruzadas
  • Muestra hora de publicacion de cada fuente
  • Fuentes de redes sociales: X/Twitter MdP e Instagram MdP via Google News RSS
  • Tipo "rrss" con metadata diferenciada
  • Iconos de Twitter/Instagram en dashboard y feeds

Mejorado

  • Notificador Telegram excluye noticias de referencia (La Capital) del envio
  • Scraper maneja 3 tipos de fuente: normal, referencia, rrss
  • Dashboard muestra cruce de timestamps en noticias mergeadas



[1.3.0] – 16-02-2026 13:35hs



Agregado

  • Bot de Telegram interactivo con menú y comandos:
  • /menu - Menú principal con botones inline
  • /stats - Estadísticas en tiempo real
  • /ultimas - Últimas 5 noticias con links
  • /scan - Forzar escaneo desde Telegram
  • /resumen - Enviar resumen manualmente
  • /intervalo [min] - Ver/cambiar intervalo de resumen (3, 5, 10, 15, 30, 60 min)
  • Botón directo al dashboard web
  • Resúmenes periódicos automáticos (cada 5 minutos por defecto, ajustable)
  • Links cortos en Telegram: nombre de fuente clickeable en vez de URL larga
  • Mensajes en formato HTML (negritas, links embebidos)
  • Bot de Telegram configurado: @noticias_lucia_bot en grupo "Carlos y Lucia"

Mejorado

  • Notificador reescrito: resúmenes agrupados con header de hora
  • Arquitectura: main.py ahora corre bot Telegram + scheduler en paralelo
  • Links al dashboard en mensajes del bot



[1.2.0] – 16-02-2026 13:20hs



Agregado

  • HTTPS con certificado SSL via nginx reverse proxy (puerto 5100)
  • Scrapers de redes sociales: X/Twitter e Instagram via Playwright + Google
  • Búsqueda por hashtags (#mardelplata, #mdp, #mdq, #lafeliz)
  • Búsqueda por keywords en posts/reels
  • Ejecución cada 15 minutos
  • Merge automático de noticias entre medios (misma noticia de distintas fuentes se agrupa)
  • Badge "X medios" cuando una noticia aparece en múltiples fuentes
  • Todos los links de todas las fuentes visibles en dashboard y Telegram
  • Filtro por últimas 24 horas por defecto en dashboard y listado
  • Limpieza automática de noticias viejas (>7 días)
  • Resolución de URLs reales de Google News (ya no muestra links de redirect)
  • Extracción de fuente real de Google News (muestra "La Nación", "Canal26", etc.)
  • Iconos diferenciados por tipo de fuente (Twitter, Instagram, prensa)
  • API JSON: /api/stats y /api/noticias

Mejorado

  • Exclusión reforzada de La Capital MdP (todas las variantes de dominio + nombre en feed)
  • IA ahora prioriza contenido viral de RRSS con score alto
  • Notificador Telegram agrupa por grupo de merge, evita duplicados
  • Dashboard muestra estadísticas de últimas 24h (noticias únicas vs menciones totales)
  • Paginación mejorada en listado de noticias

Corregido

  • URL de feed TN actualizada a https://tn.com.ar/rss.xml
  • Feeds rotos desactivados: El Marplatense, Página 12



[1.1.0] – 16-02-2026 13:00hs



Agregado

  • Dashboard web Flask en puerto 5100 con Bootstrap 5
  • Página Dashboard: feed en tiempo real con stats
  • Página Noticias: listado completo con filtros (categoría, fuente, score, enviada)
  • Página Fuentes: gestión de fuentes RSS (activar/desactivar, agregar nueva)
  • Página Configuración: keywords, dominios excluidos, intervalos, Telegram
  • Servicios systemd: noticias-lucia-scraper y noticias-lucia-web
  • Puerto 5100 abierto en firewall UFW



[1.0.0] – 16-02-2026 12:50hs



Inicial

  • Proyecto Noticias Lucia creado
  • Scraper RSS: Clarín, La Nación, TN, Infobae (scraping), Ámbito, 0223, Google News MdP
  • Filtro por keywords: "Mar del Plata", "MdP", "La Feliz", "marplatense"
  • Exclusión de La Capital MdP
  • Deduplicación por URL + similitud de títulos
  • Filtro IA con Groq (llama-3.3-70b): categorización, resumen, score de importancia
  • Categorías: policial, turismo, política, deportes, clima, economía, cultura, sociedad, viral
  • Notificador Telegram: envío inmediato (score>=4) + batch (score<4)
  • Scheduler: RSS cada 10min, redes sociales cada 15min
  • Base de datos SQLite con WAL