It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: https://www.limiteinformativo.com/feed/

  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <head>
  4.    <meta charset="UTF-8">
  5.    <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.    
  7.        
  8.        <meta name="description" content="Límite Informativo: Tu fuente de noticias en vivo. La información más relevante de Posadas, Misiones, Argentina y el mundo. Noticias, deportes, política y la radio en directo.">
  9.        <meta name="keywords" content="noticias, Posadas, Misiones, Argentina, Límite Informativo, radio en vivo, deportes, política, actualidad, información">
  10.        <meta name="author" content="Límite Informativo">
  11.        <meta name="robots" content="index, follow">
  12.  
  13.                <meta name="geo.region" content="AR-N">
  14.        <meta name="geo.placename" content="Posadas">
  15.        <meta name="geo.position" content="-27.367; -55.897">
  16.        <meta name="ICBM" content="-27.367, -55.897">
  17.  
  18.                <meta property="og:title" content="Límite Informativo - Noticias de Misiones y el Mundo">
  19.        <meta property="og:description" content="Tu fuente de noticias en vivo. La información más relevante de Posadas, Misiones, Argentina y el mundo. Noticias, deportes, política y la radio en directo.">
  20.  
  21.        <meta property="og:type" content="website">
  22.  
  23.        <meta property="og:url" content="https://limiteinformativo.com">
  24.        <meta property="og:image" content="https://limiteinformativo.com/icono.png">
  25.  
  26.        <meta property="og:locale" content="es_AR">
  27.  
  28.                <meta name="twitter:card" content="summary_large_image">
  29.        <meta name="twitter:site" content="@limiteinformativo">
  30.        <meta name="twitter:creator" content="@limiteinformativo">
  31.        <meta name="twitter:title" content="Límite Informativo - Noticias de Posadas, Misiones y el Mundo">
  32.        <meta name="twitter:description" content="Tu fuente de noticias en vivo. La información más relevante de Posadas, Misiones, Argentina y el mundo. Noticias, deportes, política y la radio en directo.">
  33.        <meta name="twitter:image" content="/uploads/logoLimiteInformativo.png">
  34.  
  35.    
  36.    <title>Página no encontrada</title>
  37.  
  38.        <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" xintegrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
  39.    <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-5207694529058458" crossorigin="anonymous"></script>
  40.    <script async defer crossorigin="anonymous" src="https://connect.facebook.net/es_ES/sdk.js#xfbml=1&version=v23.0&appId=APP_ID"></script>
  41.        <link rel="stylesheet" href="/assets/styles/app-MElU8fB.css">
  42.    <link rel="stylesheet" href="/assets/icons/all.min-z-L2sjV.css">
  43.        <link rel="manifest" href="/manifest.json">
  44.        <style>
  45.        @keyframes pulse-green {
  46.            0% { opacity: 1; }
  47.            50% { opacity: 0.5; }
  48.            100% { opacity: 1; }
  49.        }
  50.        .live-pulse {
  51.            animation: pulse-green 1.5s infinite;
  52.        }
  53.  
  54.        /* Estilo para el banner de notificaciones */
  55.        .notification-prompt-banner {
  56.            position: fixed;
  57.            bottom: 20px;
  58.            right: 20px;
  59.            z-index: 1050;
  60.            max-width: 350px;
  61.            transition: all 0.5s ease-in-out;
  62.            opacity: 1;
  63.            transform: translateY(0);
  64.        }
  65.  
  66.        .notification-prompt-banner.hidden {
  67.            opacity: 0;
  68.            transform: translateY(100px);
  69.            display: none !important; /* Solución aplicada aquí */
  70.        }
  71.  
  72.        /* Estilo para la animación de éxito */
  73.        .notification-success-animation {
  74.            background-color: #28a745;
  75.            color: #fff;
  76.            display: flex;
  77.            align-items: center;
  78.            justify-content: center;
  79.            font-size: 24px;
  80.            font-weight: bold;
  81.            border-radius: 100%;
  82.            width: 80px;
  83.            height: 80px;
  84.            animation: pop-in 0.3s ease-in-out forwards;
  85.            position: absolute;
  86.            top: 50%;
  87.            left: 50%;
  88.            transform: translate(-50%, -50%);
  89.        }
  90.  
  91.        @keyframes pop-in {
  92.            0% { transform: translate(-50%, -50%) scale(0); opacity: 0; }
  93.            100% { transform: translate(-50%, -50%) scale(1); opacity: 1; }
  94.        }
  95.    </style>
  96. </head>
  97. <body class="bg-light">
  98.  
  99.    <div class="top-bar bg-black text-white py-1  d-none d-lg-block shadow-sm">
  100.        <div class="container d-flex justify-content-between align-items-center">
  101.                        
  102.            <span class="fw-bold">
  103.  
  104.                <i class="fas fa-calendar-alt me-1" style="color: gray"></i>
  105.  
  106.                Sábado 13 de Junio de 2026
  107.  
  108.            </span>
  109.  
  110.            <div>
  111.                                                        <a href="/login" class="text-white mx-2">Iniciar Sesión</a>
  112.                            </div>
  113.            <div>
  114.                <a href="" class="text-white mx-2" target="_blank" ><i class="fab fa-facebook-f"></i></a>
  115.                <a href="" class="text-white mx-2" target="_blank" ><i class="fab fa-x-twitter "></i></a>
  116.                <a href="" class="text-white mx-2" target="_blank" ><i class="fab fa-instagram"></i></a>
  117.            </div>
  118.        </div>
  119.    </div>
  120.    <header class="bg-primary-custom text-white py-3 shadow-sm">
  121.        <div class="container d-flex flex-wrap justify-content-between align-items-center">
  122.            <a href="/" class="navbar-brand mb-2 mb-md-0 d-flex align-items-center">
  123.                <img src="/uploads/logoLimiteInformativoW.png" alt="Logo Límite Informativo" style="height: 50px;">
  124.            </a>
  125.            <div class="d-flex flex-column flex-md-row align-items-center flex-grow-1 justify-content-end">
  126.                <div class="d-flex align-items-center mb-2 mb-md-0 me-md-5">
  127.                    <p class="mb-0 me-3">Radio en Vivo</p>
  128.  
  129.                    <div id="radio-container" class="d-flex align-items-center">
  130.                        <audio id="audio-player" preload="none"></audio>
  131.                        <button id="play-pause-button" class="btn btn-outline-primary-custom btn-sm me-2 text-white">
  132.                            <i class="fas fa-play"></i>
  133.                        </button>
  134.                        <span id="live-indicator" class="text-success small">
  135.                            <i id="live-icon" class="fas fa-rss me-1"></i>En vivo
  136.                        </span>
  137.                        <span id="error-message" class="text-danger small d-none"></span>
  138.                    </div>
  139.                </div>
  140.  
  141.                <form action="/busqueda" method="GET" class="d-flex flex-grow-1 flex-md-grow-0">
  142.                    <input type="search" name="q" class="form-control me-2" placeholder="Buscar..." aria-label="Search">
  143.                    <button class="btn btn-outline-primary-custom text-white" type="submit">Buscar</button>
  144.                </form>
  145.            </div>
  146.        </div>
  147.    </header>
  148.  
  149. <nav class="navbar navbar-expand-lg shadow-sm">
  150.    <div class="container">
  151.        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
  152.            <span class="navbar-toggler-icon"></span>
  153.        </button>
  154.        <div class="collapse navbar-collapse" id="navbarNav">
  155.            <ul class="navbar-nav w-100">
  156.                                <li class="nav-item">
  157.                    <a class="nav-link active" href="/contacto">Contáctenos</a>
  158.                </li>
  159.  
  160.                                
  161.                                
  162.                                
  163.            </ul>
  164.        </div>
  165.    </div>
  166. </nav>
  167.  
  168. <main class="container my-4">
  169.    <div class="row">
  170.        <div class="col-lg-8">
  171.                <div class="error-container text-center">
  172.        <h1 class="error-code">404</h1>
  173.        <p class="error-message">Ups... La página que buscas no existe.</p>
  174.        <a href="/" class="btn btn-primary">Volver al inicio</a>
  175.    </div>
  176.  
  177.    <style>
  178.        .error-container {
  179.            display: flex;
  180.            flex-direction: column;
  181.            justify-content: center;
  182.            align-items: center;
  183.            height: 80vh;
  184.        }
  185.  
  186.        .error-code {
  187.            font-size: 8rem;
  188.            font-weight: bold;
  189.            color: #0e1e57;
  190.            animation: bounce 1.5s infinite;
  191.        }
  192.  
  193.        .error-message {
  194.            font-size: 1.5rem;
  195.            margin-bottom: 20px;
  196.            animation: fadeIn 2s ease-in-out;
  197.        }
  198.  
  199.        @keyframes bounce {
  200.            0%, 20%, 50%, 80%, 100% {
  201.                transform: translateY(0);
  202.            }
  203.            40% {
  204.                transform: translateY(-30px);
  205.            }
  206.            60% {
  207.                transform: translateY(-15px);
  208.            }
  209.        }
  210.  
  211.        @keyframes fadeIn {
  212.            from { opacity: 0; }
  213.            to { opacity: 1; }
  214.        }
  215.    </style>
  216.        </div>
  217.  
  218.                <div class="col-lg-4">
  219.        
  220.            <div class="col">
  221.                <div class="d-grid gap-4">
  222.                    <img src="https://www.limiteinformativo.com/media/cache/sidebar_ad_image/uploads/Argentina-1-300x188.png" class="img-fluid rounded shadow-sm" alt="Somos Argentinos">
  223.                </div>
  224.            </div>
  225.            <div class="col">
  226.                <div class="d-grid gap-4 mt-1 mb-1">
  227.                    <a href="https://streaminglocucionar.com/radio/apostoles991"><img src="https://www.limiteinformativo.com/media/cache/sidebar_ad_image/uploads/appDownload.png" class="img-fluid rounded shadow-sm" alt="Descargá nuestra app"></a>
  228.                </div>
  229.            </div>
  230.             <div class="col">
  231.                <div class="d-grid gap-4">
  232.                    <img src="https://www.limiteinformativo.com/media/cache/sidebar_ad_image/uploads/ligroupo-1-1758588164.jpg" alt="Logo LIGroup">
  233.                </div>
  234.            </div>
  235.            <div class="col">
  236.                <h2 class="section-title">Anuncios</h2>
  237.                <div class="d-grid gap-4">
  238.                                    </div>
  239.            </div>
  240.                        <div id="fb-root"></div>
  241.            <div class="fb-page" data-href="https://www.facebook.com/limiteinformativo" data-tabs="timeline" data-width="" data-height="1200" data-small-header="false" data-adapt-container-width="true" data-hide-cover="false" data-show-facepile="true"><blockquote cite="https://www.facebook.com/limiteinformativo" class="fb-xfbml-parse-ignore"><a href="https://www.facebook.com/limiteinformativo">Limite Informativo</a></blockquote></div>
  242.                </div>
  243.    </div>
  244. </main>
  245.  
  246. <div id="notification-prompt" class="notification-prompt-banner alert alert-info d-flex align-items-center justify-content-between p-3 rounded-xl shadow-md mb-4" style="display: none;">
  247.    <div class="d-flex align-items-center">
  248.        <i class="fas fa-bell me-3 text-2xl text-info"></i>
  249.        <p class="mb-0">¿Quieres recibir notificaciones de noticias nuevas?</p>
  250.    </div>
  251.    <div>
  252.        <button id="subscribe-button" class="btn btn-primary-custom btn-sm me-2">Sí, activar</button>
  253.        <button id="dismiss-button" class="btn btn-outline-secondary btn-sm" aria-label="Descartar">No, gracias</button>
  254.    </div>
  255. </div>
  256.  
  257.    <footer class="bg-dark text-white py-5 mt-5">
  258.        <div class="container">
  259.            <div class="row">
  260.                <div class="col-md-4 mb-4">
  261.                    <h5 class="fw-bold text-white mb-3">Contacto</h5>
  262.                    <ul class="list-unstyled text-white-50 small">
  263.  
  264.                                                                                                <li class="mb-2">
  265.                            <i class="fas fa-envelope me-2"></i>
  266.                            <a href="/contacto"  class="text-white-50 text-decoration-none">
  267.                                Envíanos tu mensaje desde aquí
  268.                            </a>
  269.                        </li>
  270.                                            </ul>
  271.                </div>
  272.  
  273.                <div class="col-md-4 mb-4 text-md-center">
  274.                    <h5 class="fw-bold text-white mb-3">Síguenos</h5>
  275.                    <ul class="list-unstyled d-flex justify-content-center">
  276.                                                                                                                    </ul>
  277.                    <div>
  278.                                            </div>
  279.                </div>
  280.                <div class="col-md-4 mb-4 text-md-end">
  281.                    <img src="/uploads/logoLimiteInformativoW.png" alt="Logo Límite Informativo" style="height: 60px;">
  282.                    <p class="text-white-50 small mt-3">
  283.                        © 2026 Diario Límite Informativo. Todos los derechos reservados.
  284.                    </p>
  285.  
  286.                </div>
  287.            </div>
  288.  
  289.            <div class="row">
  290.                <div class="col-12 text-center small">
  291.                    <p class="mb-0 text-white-50">
  292.                                            </p>
  293.                </div>
  294.            </div>
  295.            <hr class="border-secondary">
  296.            <div class="row">
  297.                <div class="col-12 text-center small">
  298.                <p class="mb-0 text-white-50">
  299.                    Desarrollado por <a href="https://www.shophardware.com.ar" target="_blank" class="text-white text-decoration-none">Shop Hardware</a>
  300.                </p>
  301.                </div>
  302.            </div>
  303.        </div>
  304.    </footer>
  305.  
  306. <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" xintegrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
  307.  
  308.    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
  309.    <script>
  310.        document.addEventListener('DOMContentLoaded', () => {
  311.            // Lógica del reproductor de radio
  312.            const audioPlayer = document.getElementById('audio-player');
  313.            const playPauseButton = document.getElementById('play-pause-button');
  314.            const liveIndicator = document.getElementById('live-indicator');
  315.            const liveIcon = document.getElementById('live-icon');
  316.            const errorMessage = document.getElementById('error-message');
  317.  
  318.            const radioStreamUrl = 'https://streaming3.locucionar.com/proxy/apostoles991?mp=%2Fstream';
  319.  
  320.            if (audioPlayer.canPlayType('audio/aac') || audioPlayer.canPlayType('audio/aacp')) {
  321.                audioPlayer.src = radioStreamUrl;
  322.  
  323.                audioPlayer.addEventListener('error', (e) => {
  324.                    console.error('Error nativo del reproductor, intentando con HLS.js...', e);
  325.                    initializeHls();
  326.                });
  327.            } else {
  328.                initializeHls();
  329.            }
  330.  
  331.            function initializeHls() {
  332.                if (Hls.isSupported()) {
  333.                    const hls = new Hls();
  334.                    hls.attachMedia(audioPlayer);
  335.                    hls.loadSource(radioStreamUrl);
  336.  
  337.                    hls.on(Hls.Events.MANIFEST_PARSED, function() {
  338.                        playPauseButton.disabled = false;
  339.                        errorMessage.classList.add('d-none');
  340.                    });
  341.  
  342.                    hls.on(Hls.Events.ERROR, function (event, data) {
  343.                        if (data.fatal) {
  344.                            errorMessage.textContent = 'Error: No se pudo cargar el stream.';
  345.                            errorMessage.classList.remove('d-none');
  346.                            liveIcon.classList.remove('live-pulse');
  347.                            console.error('Hls.js error:', data.details, data.url, data.reason);
  348.                            playPauseButton.innerHTML = '<i class="fas fa-play"></i>';
  349.                            playPauseButton.disabled = false;
  350.                        }
  351.                    });
  352.                } else {
  353.                    errorMessage.textContent = 'Navegador no compatible.';
  354.                    errorMessage.classList.remove('d-none');
  355.                    liveIcon.classList.remove('live-pulse');
  356.                    playPauseButton.disabled = true;
  357.                }
  358.            }
  359.  
  360.            let isPlaying = false;
  361.  
  362.            playPauseButton.addEventListener('click', () => {
  363.                if (isPlaying) {
  364.                    audioPlayer.pause();
  365.                } else {
  366.                    audioPlayer.play().catch(error => {
  367.                        console.error('Error al intentar reproducir:', error);
  368.                        errorMessage.textContent = 'Error: se requiere interacción del usuario.';
  369.                        errorMessage.classList.add('d-none');
  370.                    });
  371.                }
  372.            });
  373.  
  374.            audioPlayer.addEventListener('playing', () => {
  375.                playPauseButton.innerHTML = '<i class="fas fa-pause"></i>';
  376.                liveIcon.classList.add('live-pulse');
  377.                errorMessage.classList.add('d-none');
  378.                isPlaying = true;
  379.            });
  380.  
  381.            audioPlayer.addEventListener('pause', () => {
  382.                playPauseButton.innerHTML = '<i class="fas fa-play"></i>';
  383.                liveIcon.classList.remove('live-pulse');
  384.                isPlaying = false;
  385.            });
  386.  
  387.            audioPlayer.addEventListener('waiting', () => {
  388.                liveIcon.classList.remove('live-pulse');
  389.            });
  390.  
  391.            // --- Lógica de Notificaciones Push (corregida) ---
  392.            const notificationPrompt = document.getElementById('notification-prompt');
  393.            const subscribeButton = document.getElementById('subscribe-button');
  394.            const dismissButton = document.getElementById('dismiss-button');
  395.  
  396.            const VAPID_PUBLIC_KEY = 'BMYVxtBBzcRDLmkycVWZe2fINnxfUvt7-pf2EPkjpH2EvIpPcY9hnyNWQfU3IcL_QEC4VZDaoMdg-UxLgw_7QpU';
  397.            const DISMISS_FLAG = 'notification_dismissed';
  398.  
  399.            // Nueva función para convertir la clave Base64 a Uint8Array
  400.            function urlBase64ToUint8Array(base64String) {
  401.                const padding = '='.repeat((4 - base64String.length % 4) % 4);
  402.                const base64 = (base64String + padding)
  403.                    .replace(/\-/g, '+')
  404.                    .replace(/_/g, '/');
  405.  
  406.                const rawData = window.atob(base64);
  407.                const outputArray = new Uint8Array(rawData.length);
  408.  
  409.                for (let i = 0; i < rawData.length; ++i) {
  410.                    outputArray[i] = rawData.charCodeAt(i);
  411.                }
  412.                return outputArray;
  413.            }
  414.  
  415.            async function setupPushNotifications() {
  416.                if (!('serviceWorker' in navigator && 'PushManager' in window)) {
  417.                    console.warn('Este navegador no soporta notificaciones push.');
  418.                    notificationPrompt.classList.add('hidden');
  419.                    return;
  420.                }
  421.  
  422.                if (localStorage.getItem(DISMISS_FLAG) === 'true') {
  423.                    console.log('Notificaciones ya descartadas o concedidas. Ocultando banner.');
  424.                    notificationPrompt.classList.add('hidden');
  425.                    return;
  426.                }
  427.  
  428.                try {
  429.                    const registration = await navigator.serviceWorker.register('/service-worker.js');
  430.                    console.log('Service Worker registrado con éxito:', registration);
  431.  
  432.                    const permissionStatus = Notification.permission;
  433.                    if (permissionStatus === 'default') {
  434.                        notificationPrompt.classList.remove('hidden');
  435.                    } else {
  436.                        notificationPrompt.classList.add('hidden');
  437.                    }
  438.  
  439.                    subscribeButton.addEventListener('click', async () => {
  440.                        try {
  441.                            const permission = await Notification.requestPermission();
  442.                            if (permission === 'granted') {
  443.                                // Aquí se convierte la clave VAPID correctamente
  444.                                const applicationServerKey = urlBase64ToUint8Array(VAPID_PUBLIC_KEY);
  445.                                if (!applicationServerKey) {
  446.                                    console.error("No se pudo convertir la clave VAPID.");
  447.                                    return;
  448.                                }
  449.  
  450.                                const pushSubscription = await registration.pushManager.subscribe({
  451.                                    userVisibleOnly: true,
  452.                                    applicationServerKey: applicationServerKey,
  453.                                });
  454.  
  455.                                console.log('Objeto de suscripción:', pushSubscription);
  456.  
  457.                                const response = await fetch('/api/subscribe', {
  458.                                    method: 'POST',
  459.                                    headers: {
  460.                                        'Content-Type': 'application/json',
  461.                                    },
  462.                                    body: JSON.stringify(pushSubscription),
  463.                                });
  464.  
  465.                                if (!response.ok) {
  466.                                    throw new Error(`Error en el servidor: ${response.status} ${response.statusText}`);
  467.                                }
  468.  
  469.                                // Animación de éxito
  470.                                notificationPrompt.innerHTML = '<div class="notification-success-animation"><i class="fas fa-check"></i></div>';
  471.                                setTimeout(() => {
  472.                                    notificationPrompt.classList.add('hidden');
  473.                                    localStorage.setItem(DISMISS_FLAG, 'true');
  474.                                }, 1000);
  475.  
  476.                                console.log('Suscripción a notificaciones exitosa.');
  477.                            } else {
  478.                                console.log('Permiso de notificaciones denegado. Ocultando banner.');
  479.                                notificationPrompt.classList.add('hidden');
  480.                                localStorage.setItem(DISMISS_FLAG, 'true');
  481.                            }
  482.                        } catch (error) {
  483.                            console.error('Error al suscribir al usuario:', error);
  484.                            notificationPrompt.classList.add('hidden');
  485.                            localStorage.setItem(DISMISS_FLAG, 'true');
  486.                        }
  487.                    });
  488.  
  489.                    dismissButton.addEventListener('click', () => {
  490.                        notificationPrompt.classList.add('hidden');
  491.                        localStorage.setItem(DISMISS_FLAG, 'true');
  492.                        console.log('Banner de notificaciones descartado.');
  493.                    });
  494.  
  495.                } catch (error) {
  496.                    console.error('Error al registrar el Service Worker:', error);
  497.                    notificationPrompt.classList.add('hidden');
  498.                }
  499.            }
  500.  
  501.            setupPushNotifications();
  502.        });
  503.  
  504.    </script>
  505.  
  506. </body>
  507. </html>
  508.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda