{"id":17,"date":"2026-06-02T18:09:51","date_gmt":"2026-06-02T18:09:51","guid":{"rendered":"https:\/\/radioazul.pt\/wordpress\/?page_id=17"},"modified":"2026-06-15T18:45:14","modified_gmt":"2026-06-15T18:45:14","slug":"inicio","status":"publish","type":"page","link":"https:\/\/radioazul.pt\/wordpress\/inicio\/","title":{"rendered":"Player"},"content":{"rendered":"<p><head><br \/>\n    <meta charset=\"UTF-8\"><br \/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\"><br \/>\n    <title>R\u00e1dio Azul 98.9 FM &#8211; Site Oficial<\/title>\n    <link rel=\"icon\" href=\"https:\/\/i.postimg.cc\/hGkJwk3y\/favicon.jpg\" sizes=\"32x32\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\n    <link rel=\"stylesheet\" href=\"css\/base.css\">\n<style>\n        \/* Estilos espec\u00edficos do index (player, agora, info cards) *\/\n        .player-agora-container {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 24px;\n        }\n        .player-left {\n            flex: 7;\n            min-width: 260px;\n        }\n        .agora-right {\n            flex: 3;\n            min-width: 200px;\n        }\n        .player-row {\n            display: flex;\n            gap: 20px;\n            flex-wrap: wrap;\n            align-items: center;\n        }\n        .cover {\n            width: 85px;\n            height: 85px;\n            background: var(--preto);\n            border-radius: 16px;\n            overflow: hidden;\n        }\n        .cover img {\n            width: 100%;\n            height: 100%;\n            object-fit: contain;\n        }\n        .song-details {\n            flex: 1;\n        }\n        .song-title {\n            font-size: 1.2rem;\n            font-weight: bold;\n        }\n        .song-artist {\n            font-size: 0.85rem;\n            opacity: 0.9;\n        }\n        .player-controls {\n            display: flex;\n            align-items: center;\n            gap: 15px;\n            flex-wrap: wrap;\n            margin: 12px 0;\n        }\n        .play-btn {\n            width: 48px;\n            height: 48px;\n            background: var(--laranja);\n            border: none;\n            border-radius: 50%;\n            color: white;\n            cursor: pointer;\n            transition: 0.2s;\n        }\n        .play-btn:hover {\n            transform: scale(1.05);\n            background: var(--laranja-escuro);\n        }\n        .volume-slider {\n            flex: 1;\n            min-width: 130px;\n        }\n        .volume-slider input {\n            width: 100%;\n            cursor: pointer;\n        }\n        .status-badge {\n            background: rgba(0,0,0,0.3);\n            padding: 4px 12px;\n            border-radius: 30px;\n            font-size: 0.7rem;\n        }\n        .visualizer {\n            width: 100%;\n            height: 50px;\n            background: rgba(0,0,0,0.3);\n            border-radius: 12px;\n            margin: 10px 0;\n            overflow: hidden;\n        }\n        canvas {\n            width: 100%;\n            height: 100%;\n            display: block;\n        }\n        .action-buttons {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n            margin-top: 10px;\n        }\n        .agora-vertical {\n            display: flex;\n            flex-direction: column;\n            gap: 12px;\n            margin-top: 10px;\n        }\n        .agora-card {\n            background: rgba(0,0,0,0.35);\n            border-radius: 16px;\n            padding: 14px;\n            border-left: 4px solid var(--laranja);\n        }\n        .agora-title {\n            font-size: 0.7rem;\n            text-transform: uppercase;\n            font-weight: bold;\n            color: #ffd966;\n            letter-spacing: 1px;\n            margin-bottom: 6px;\n        }\n        .agora-value {\n            font-weight: 700;\n            font-size: 0.95rem;\n            line-height: 1.3;\n        }\n        .programa-no-ar {\n            display: inline-block;\n            background: var(--laranja);\n            color: white;\n            font-size: 0.65rem;\n            padding: 2px 8px;\n            border-radius: 20px;\n            margin-left: 8px;\n            animation: pulse 1.5s infinite;\n        }\n        @keyframes pulse {\n            0%, 100% { opacity: 0.6; }\n            50% { opacity: 1; }\n        }\n        .info-grid {\n            display: grid;\n            grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n            gap: 20px;\n            margin-top: 10px;\n        }\n        .info-card {\n            background: rgba(0,0,0,0.25);\n            border-radius: 18px;\n            padding: 16px;\n            text-align: center;\n        }\n        .info-card i {\n            font-size: 2rem;\n            margin-bottom: 8px;\n            color: #ffd966;\n        }\n        .noticias-grid-moderno {\n            display: grid;\n            grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n            gap: 24px;\n            margin-top: 20px;\n        }\n        .noticia-card-moderno {\n            background: rgba(0,0,0,0.4);\n            backdrop-filter: blur(8px);\n            border-radius: 20px;\n            overflow: hidden;\n            transition: 0.2s;\n            cursor: pointer;\n        }\n        .noticia-card-moderno:hover {\n            transform: translateY(-5px);\n        }\n        .noticia-imagem {\n            width: 100%;\n            height: 160px;\n            object-fit: cover;\n        }\n        .noticia-conteudo {\n            padding: 16px;\n        }\n        .noticia-categoria {\n            display: inline-block;\n            background: var(--laranja);\n            font-size: 0.7rem;\n            padding: 4px 12px;\n            border-radius: 30px;\n            color: white;\n            margin-bottom: 10px;\n        }\n        .noticia-titulo {\n            font-size: 1.1rem;\n            font-weight: bold;\n            margin-bottom: 8px;\n        }\n        .noticia-resumo {\n            font-size: 0.8rem;\n            opacity: 0.9;\n            margin-bottom: 12px;\n        }\n        .noticia-data {\n            font-size: 0.7rem;\n            display: flex;\n            align-items: center;\n            gap: 5px;\n            opacity: 0.7;\n        }\n        @media (max-width: 768px) {\n            .player-agora-container {\n                flex-direction: column;\n            }\n            .player-row {\n                flex-direction: column;\n                text-align: center;\n            }\n            .agora-vertical {\n                flex-direction: row;\n                flex-wrap: wrap;\n            }\n            .agora-vertical .agora-card {\n                flex: 1;\n                min-width: 160px;\n            }\n        }\n    <\/style>\n<p><\/head><\/p>\n<div class=\"container\">\n<p>        <!-- ========== PLAYER + AGORA ========== --><\/p>\n<div class=\"card player-agora-container\">\n            <!-- Lado esquerdo: player --><\/p>\n<div class=\"player-left\">\n<div class=\"player-row\">\n<div class=\"cover\"><img decoding=\"async\" id=\"coverImg\" src=\"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\" alt=\"capa\"><\/div>\n<div class=\"song-details\">\n<div class=\"song-title\" id=\"currentSong\">R\u00e1dio Azul<\/div>\n<div class=\"song-artist\" id=\"currentArtist\">Emiss\u00e3o em direto<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"player-controls\">\n                    <button class=\"play-btn\" id=\"playBtn\"><i class=\"fas fa-play\"><\/i><\/button><\/p>\n<div class=\"volume-slider\"><input type=\"range\" id=\"volumeSlider\" min=\"0\" max=\"1\" step=\"0.01\" value=\"0.7\"><\/div>\n<div class=\"status-badge\" id=\"statusText\">\u23f8 Pausado<\/div>\n<\/p><\/div>\n<div class=\"visualizer\"><canvas id=\"visualizer\"><\/canvas><\/div>\n<div class=\"action-buttons\">\n                    <button class=\"btn-action\" onclick=\"openScheduleModal()\"><i class=\"fas fa-calendar-alt\"><\/i> Programa\u00e7\u00e3o Semanal<\/button><br \/>\n                    <button class=\"btn-action\" onclick=\"openModal('modalRecent')\"><i class=\"fas fa-history\"><\/i> \u00daltimas 10 M\u00fasicas<\/button><br \/>\n                    <button class=\"btn-action\" onclick=\"openModal('modalHistory')\"><i class=\"fas fa-list\"><\/i> Meu Hist\u00f3rico<\/button><br \/>\n                    <button class=\"btn-action\" onclick=\"openModal('modalSettings')\"><i class=\"fas fa-cog\"><\/i> Configura\u00e7\u00f5es<\/button><br \/>\n                    <button class=\"btn-action\" id=\"copyMusicBtn\"><i class=\"fas fa-copy\"><\/i> Copiar M\u00fasica<\/button><br \/>\n                    <button class=\"btn-action\" id=\"shareMusicBtn\"><i class=\"fas fa-share-alt\"><\/i> Partilhar<\/button><br \/>\n                    <button class=\"btn-action\" id=\"likeBtn\"><i class=\"fas fa-thumbs-up\"><\/i> Like<\/button>\n                <\/div>\n<\/p><\/div>\n<p>            <!-- Lado direito: Agora na R\u00e1dio Azul --><\/p>\n<div class=\"agora-right\">\n<h3><i class=\"fas fa-chart-line\"><\/i> Agora na R\u00e1dio Azul<\/h3>\n<div class=\"agora-vertical\">\n<div class=\"agora-card\">\n<div class=\"agora-title\">\ud83d\udce1 PROGRAMA ATUAL<\/div>\n<div class=\"agora-value\" id=\"progAtual\">&#8212;<\/div>\n<\/div>\n<div class=\"agora-card\">\n<div class=\"agora-title\">\u23e9 A SEGUIR<\/div>\n<div class=\"agora-value\" id=\"progSeguinte\">&#8212;<\/div>\n<\/div>\n<div class=\"agora-card\">\n<div class=\"agora-title\">\ud83c\udfa4 M\u00daSICA \/ PROGRAMA<\/div>\n<div class=\"agora-value\" id=\"musicaDisplay\">&#8212;<\/div>\n<\/div><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>        <!-- ========== \u00daLTIMAS NOT\u00cdCIAS ========== >\n        \n\n<div class=\"card\">\n            \n\n<h3><i class=\"fas fa-newspaper\"><\/i> \u00daltimas Not\u00edcias<\/h3>\n\n\n            \n\n<div id=\"ultimasNoticias\" class=\"noticias-grid-moderno\"><\/div>\n\n\n            \n\n<div style=\"text-align: center; margin-top: 15px;\">\n                <button class=\"btn-action\" onclick=\"location.href='noticias.html'\">Ver todas as not\u00edcias \u2192<\/button>\n            <\/div>\n\n\n        <\/div-->\n<p>        <!-- ========== INFO CARDS ========== --><\/p>\n<div class=\"info-grid\">\n<div class=\"info-card\"><i class=\"fas fa-microphone-alt\"><\/i><\/p>\n<h3>Programa\u00e7\u00e3o Variada<\/h3>\n<p>Informa\u00e7\u00e3o, desporto, m\u00fasica e entretenimento.<\/p>\n<\/div>\n<div class=\"info-card\"><i class=\"fas fa-headphones\"><\/i><\/p>\n<h3>Emiss\u00e3o 24\/7<\/h3>\n<p>Ou\u00e7a-nos em qualquer lugar, a qualquer hora.<\/p>\n<\/div>\n<div class=\"info-card\"><i class=\"fas fa-chart-line\"><\/i><\/p>\n<h3>Top M\u00fasicas<\/h3>\n<p>As mais tocadas na nossa emiss\u00e3o.<\/p>\n<\/div><\/div>\n<p>    <!-- ========== MODAIS ========== --><\/p>\n<p>    <!-- Modal Admin Login --><\/p>\n<div id=\"modalAdminLogin\" class=\"modal-overlay\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3><i class=\"fas fa-cog\"><\/i> Acesso Administrativo<\/h3>\n<p>                <button class=\"modal-close\" onclick=\"closeModal('modalAdminLogin')\">&times;<\/button>\n            <\/div>\n<p>            <input type=\"password\" id=\"adminLoginPass\" placeholder=\"Palavra-passe\" style=\"width:100%; padding:10px; margin:10px 0; border-radius:8px; border:none;\"><br \/>\n            <button class=\"btn-action\" onclick=\"verificarAdminLogin()\" style=\"width:100%;\">Entrar<\/button>\n        <\/div>\n<\/p><\/div>\n<p>    <!-- Modal Programa\u00e7\u00e3o Semanal --><\/p>\n<div id=\"modalSchedule\" class=\"modal-overlay\">\n<div class=\"modal-content modal-content-large\">\n<div class=\"modal-header\">\n<h3>Programa\u00e7\u00e3o Semanal<\/h3>\n<p>                <button class=\"modal-close\" onclick=\"closeModal('modalSchedule')\">&times;<\/button>\n            <\/div>\n<div id=\"scheduleModalContent\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>    <!-- Modal \u00daltimas 10 M\u00fasicas --><\/p>\n<div id=\"modalRecent\" class=\"modal-overlay\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3>\u00daltimas 10 M\u00fasicas<\/h3>\n<p>                <button class=\"modal-close\" onclick=\"closeModal('modalRecent')\">&times;<\/button>\n            <\/div>\n<div id=\"recentList\"><\/div>\n<p>            <button class=\"btn-action\" onclick=\"closeModal('modalRecent')\" style=\"margin-top:15px;\">Fechar<\/button>\n        <\/div>\n<\/p><\/div>\n<p>    <!-- Modal Meu Hist\u00f3rico --><\/p>\n<div id=\"modalHistory\" class=\"modal-overlay\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3>Meu Hist\u00f3rico (\u00faltimas 100)<\/h3>\n<p>                <button class=\"modal-close\" onclick=\"closeModal('modalHistory')\">&times;<\/button>\n            <\/div>\n<div id=\"historyListModal\"><\/div>\n<div style=\"display:flex; gap:10px; margin-top:15px;\">\n                <button class=\"btn-action\" onclick=\"clearHistory()\">Limpar<\/button><br \/>\n                <button class=\"btn-action\" onclick=\"closeModal('modalHistory')\">Fechar<\/button>\n            <\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>    <!-- Modal Configura\u00e7\u00f5es --><\/p>\n<div id=\"modalSettings\" class=\"modal-overlay\">\n<div class=\"modal-content\">\n<div class=\"modal-header\">\n<h3>Configura\u00e7\u00f5es<\/h3>\n<p>                <button class=\"modal-close\" onclick=\"closeModal('modalSettings')\">&times;<\/button>\n            <\/div>\n<div class=\"form-group\" style=\"margin-bottom:15px;\">\n                <label>Reprodu\u00e7\u00e3o Autom\u00e1tica<\/label><br \/>\n                <select id=\"autoplaySelect\" style=\"width:100%; padding:8px; border-radius:8px;\"><option value=\"false\">Desligado<\/option><option value=\"true\">Ligado<\/option><\/select>\n            <\/div>\n<div class=\"form-group\" style=\"margin-bottom:15px;\">\n                <label>Tamanho do Texto<\/label><br \/>\n                <select id=\"fontSizeSelect\" style=\"width:100%; padding:8px; border-radius:8px;\"><option value=\"small\">Pequeno<\/option><option value=\"normal\">Normal<\/option><option value=\"large\">Grande<\/option><option value=\"xlarge\">Extra Grande<\/option><\/select>\n            <\/div>\n<div class=\"form-group\" style=\"margin-bottom:15px;\">\n                <label>Alto Contraste<\/label><br \/>\n                <select id=\"contrastSelect\" style=\"width:100%; padding:8px; border-radius:8px;\"><option value=\"false\">N\u00e3o<\/option><option value=\"true\">Sim<\/option><\/select>\n            <\/div>\n<p>            <button class=\"btn-action\" onclick=\"saveSettings()\" style=\"width:100%;\">Guardar<\/button>\n        <\/div>\n<\/p><\/div>\n<p>    <!-- Modal Not\u00edcia (detalhe) --><\/p>\n<div id=\"noticiaModal\" class=\"modal-noticia\">\n<div class=\"modal-noticia-content\">\n            <button class=\"close-modal-noticia\">&times;<\/button><br \/>\n            <img decoding=\"async\" id=\"modalImagem\" class=\"modal-noticia-imagem\" src=\"\"><br \/>\n            <span id=\"modalCategoria\" class=\"modal-noticia-categoria\"><\/span><\/p>\n<h2 id=\"modalTitulo\" class=\"modal-noticia-titulo\"><\/h2>\n<div id=\"modalData\" class=\"modal-noticia-data\"><i class=\"far fa-calendar-alt\"><\/i> <span><\/span><\/div>\n<div id=\"modalTexto\" class=\"modal-noticia-texto\"><\/div>\n<div class=\"modal-noticia-share\">\n                <button id=\"shareFacebook\" class=\"share-btn\"><i class=\"fab fa-facebook-f\"><\/i> Partilhar<\/button><br \/>\n                <button id=\"shareTwitter\" class=\"share-btn\"><i class=\"fab fa-twitter\"><\/i> Partilhar<\/button><br \/>\n                <button id=\"shareWhatsapp\" class=\"share-btn\"><i class=\"fab fa-whatsapp\"><\/i> Partilhar<\/button><br \/>\n                <button id=\"copyLink\" class=\"share-btn\"><i class=\"fas fa-link\"><\/i> Copiar link<\/button>\n            <\/div>\n<div class=\"related-articles\">\n<h4>\ud83d\udcf0 Artigos Relacionados<\/h4>\n<div id=\"relatedArticlesList\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>    <!-- ========== ELEMENTOS GLOBAIS ========== --><\/p>\n<div id=\"toast\" class=\"toast\"><\/div>\n<p>    <audio id=\"radioStream\" src=\"https:\/\/sado.radioazul.pt\/live?type=.mp3\" preload=\"none\" crossorigin=\"anonymous\"><\/audio><\/p>\n<p>    <script><\/p>\n<p>\/**\n * R\u00c1DIO AZUL 98.9 FM - JS INDEX (P\u00c1GINA PRINCIPAL)\n * Player, m\u00fasica atual, hist\u00f3rico recente, not\u00edcias, etc.\n *\/<\/p>\n<p>let audioPlaying = false;\nlet lastSongTitle = \"\";\nlet isProgramaAtivo = false;\nlet localHistory = [];\nlet noticias = [];\nlet scheduleData = [];\nlet currentMusic = { titulo: \"R\u00e1dio Azul\", artista: \"Emiss\u00e3o em direto\", capa: \"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\" };<\/p>\n<p>\/\/ ==================== M\u00daSICA ATUAL ====================\nasync function obterMusicaAtual() {\n    try {\n        const res = await fetch(`${API_MUSICA}?action=current`, { cache: 'no-store' });\n        const data = await res.json();\n        if (data && data.titulo && data.artista) {\n            return { titulo: data.titulo, artista: data.artista, capa: data.capa || null };\n        }\n    } catch(e) { console.warn(e); }\n    return { titulo: \"R\u00e1dio Azul\", artista: \"Emiss\u00e3o em direto\", capa: null };\n}<\/p>\n<p>async function getCapaFromServer(artista, titulo) {\n    if (!artista || !titulo) return null;\n    try {\n        const url = `${API_MUSICA}?action=get_capa&artista=${encodeURIComponent(artista)}&titulo=${encodeURIComponent(titulo)}`;\n        const res = await fetch(url);\n        const data = await res.json();\n        return data.capa;\n    } catch(e) { return null; }\n}<\/p>\n<p>async function refreshMusica() {\n    const musica = await obterMusicaAtual();\n    const tituloCompleto = `${musica.artista} - ${musica.titulo}`;\n    const isDefault = (musica.titulo === \"R\u00e1dio Azul\" && musica.artista === \"Emiss\u00e3o em direto\");<\/p>\n<p>    if (lastSongTitle !== tituloCompleto) {\n        lastSongTitle = tituloCompleto;\n        document.getElementById('currentSong').innerText = musica.titulo;\n        document.getElementById('currentArtist').innerText = musica.artista;<\/p>\n<p>        let capaUrl = musica.capa;\n        if (!isDefault && musica.artista && musica.titulo) {\n            const serverCapa = await getCapaFromServer(musica.artista, musica.titulo);\n            if (serverCapa) capaUrl = serverCapa;\n        }\n        if (!capaUrl) capaUrl = \"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\";\n        document.getElementById('coverImg').src = capaUrl;\n        currentMusic = { titulo: musica.titulo, artista: musica.artista, capa: capaUrl };<\/p>\n<p>        if (!isDefault) {\n            isProgramaAtivo = false;\n            document.getElementById('musicaDisplay').innerHTML = `<strong>${musica.titulo}<\/strong><br \/>${musica.artista}`;\n            setMediaSessionForMusic(musica.titulo, musica.artista, capaUrl);\n            await fetch(`${API_MUSICA}?action=add_history`, {\n                method: 'POST',\n                headers: { 'Content-Type': 'application\/json' },\n                body: JSON.stringify({ titulo: musica.titulo, artista: musica.artista, capa: capaUrl })\n            });\n            await carregarLocalHistoryIndex();\n            showToast(`\ud83c\udfb5 ${musica.artista} - ${musica.titulo}`, 'music');\n        } else {\n            const cur = getCurrentProgramFromScheduleIndex();\n            if (cur) {\n                isProgramaAtivo = true;\n                document.getElementById('musicaDisplay').innerHTML = `<strong>${cur.program}<\/strong><br \/>${cur.host}`;\n                setMediaSessionForProgram(cur.program, cur.host, `${cur.start}-${cur.end}`);\n            }\n            document.getElementById('coverImg').src = \"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\";\n        }<\/p>\n<p>        atualizarMiniPlayer();\n        addToRecentIndex(musica.titulo, musica.artista, capaUrl);\n    }\n}<\/p>\n<p>\/\/ ==================== HIST\u00d3RICO ====================\nasync function carregarLocalHistoryIndex() {\n    try {\n        const res = await fetch(`${API_MUSICA}?action=get_history`, { cache: 'no-store' });\n        const data = await res.json();\n        if (Array.isArray(data)) localHistory = data;\n        else throw new Error();\n    } catch(e) {\n        let stored = localStorage.getItem('radio_local_history');\n        localHistory = (stored && cookieConsent === 'accepted') ? JSON.parse(stored) : [];\n    }\n    renderRecentModalIndex();\n    renderHistoryModalIndex();\n}<\/p>\n<p>function renderRecentModalIndex() {\n    const container = document.getElementById('recentList');\n    if (!container) return;\n    let recentTracks = JSON.parse(localStorage.getItem('recent_tracks') || '[]');\n    if (recentTracks.length === 0) { container.innerHTML = '<\/p>\n<p>Nenhuma m\u00fasica ouvida ainda.<\/p>\n<p>'; return; }\n    container.innerHTML = recentTracks.map(t => `<\/p>\n<div style=\"display:flex; gap:10px; margin-bottom:8px;\">\n            <img loading=\"lazy\" decoding=\"async\" src=\"${t.capa}\" width=\"40\" height=\"40\" style=\"border-radius:6px;\"><\/p>\n<div><strong>${escapeHtml(t.title)}<\/strong> - ${escapeHtml(t.artist)}<br \/><small>${t.time}<\/small><\/div>\n<\/p><\/div>\n<p>    `).join('');\n}<\/p>\n<p>function renderHistoryModalIndex() {\n    const container = document.getElementById('historyListModal');\n    if (!container) return;\n    if (localHistory.length === 0) { container.innerHTML = '<\/p>\n<p>Nenhum hist\u00f3rico dispon\u00edvel.<\/p>\n<p>'; return; }\n    container.innerHTML = localHistory.map(h => `<\/p>\n<div class=\"history-item\" style=\"margin-bottom:8px;\">\n            <img loading=\"lazy\" decoding=\"async\" src=\"${h.capa || 'https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png'}\" width=\"40\" height=\"40\" style=\"border-radius:8px;\"><\/p>\n<div><strong>${escapeHtml(h.titulo)}<\/strong> - ${escapeHtml(h.artista)}<br \/><small>${new Date(h.timestamp * 1000).toLocaleString()}<\/small><\/div>\n<\/p><\/div>\n<p>    `).join('');\n}<\/p>\n<p>function clearHistory() {\n    if (confirm(\"Limpar todo o hist\u00f3rico de m\u00fasicas?\")) {\n        fetch(`${API_MUSICA}?action=clear_history`, { method: 'POST' }).catch(e=>console.warn);\n        localStorage.removeItem('radio_local_history');\n        carregarLocalHistoryIndex();\n        showToast(\"Hist\u00f3rico limpo!\");\n    }\n}<\/p>\n<p>function addToRecentIndex(title, artist, capaUrl) {\n    let recentTracks = JSON.parse(localStorage.getItem('recent_tracks') || '[]');\n    if (recentTracks.length > 0 && recentTracks[0].title === title && recentTracks[0].artist === artist) return;\n    recentTracks.unshift({ title, artist, time: new Date().toLocaleTimeString(), capa: capaUrl || \"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\" });\n    if (recentTracks.length > 10) recentTracks.pop();\n    localStorage.setItem('recent_tracks', JSON.stringify(recentTracks));\n    renderRecentModalIndex();\n}<\/p>\n<p>\/\/ ==================== PROGRAMA\u00c7\u00c3O ====================\nfunction timeToMinutesIndex(t) {\n    if (!t) return 0;\n    let [h, m] = t.split(':');\n    return parseInt(h) * 60 + parseInt(m);\n}<\/p>\n<p>function getDefaultScheduleIndex() {\n    const raw = [\n        \"DOM. | 00:00-01:00 | A R\u00e1dio de Todos os Sons | R\u00e1dio Azul\",\n        \"SEG. | 00:00-01:00 | A R\u00e1dio de Todos os Sons | R\u00e1dio Azul\",\n        \"TER. | 00:00-01:00 | A R\u00e1dio de Todos os Sons | R\u00e1dio Azul\",\n        \"QUA. | 00:00-01:00 | A R\u00e1dio de Todos os Sons | R\u00e1dio Azul\",\n        \"QUI. | 00:00-01:00 | A R\u00e1dio de Todos os Sons | R\u00e1dio Azul\",\n        \"SEX. | 00:00-01:00 | A R\u00e1dio de Todos os Sons | R\u00e1dio Azul\",\n        \"SAB. | 00:00-01:00 | A R\u00e1dio de Todos os Sons | R\u00e1dio Azul\"\n    ];\n    const diasMap = { \"DOM\": 0, \"SEG\": 1, \"TER\": 2, \"QUA\": 3, \"QUI\": 4, \"SEX\": 5, \"SAB\": 6 };\n    return raw.map(line => {\n        let parts = line.split('|').map(s => s.trim());\n        let diaAbrev = parts[0].replace('.', '');\n        let diaNum = diasMap[diaAbrev];\n        let [start, end] = parts[1].split('-');\n        return { day: diaNum, start, end, program: parts[2], host: parts[3] };\n    });\n}<\/p>\n<p>async function carregarScheduleIndex() {\n    const data = await callAPI(`${API_PROGRAMACAO}?action=read`);\n    if (data && Array.isArray(data) && data.length) {\n        scheduleData = data;\n    } else {\n        let stored = localStorage.getItem('radio_schedule_data');\n        scheduleData = (stored && cookieConsent === 'accepted') ? JSON.parse(stored) : getDefaultScheduleIndex();\n    }\n    updateProgramDisplayIndex();\n}<\/p>\n<p>function updateProgramDisplayIndex() {\n    let now = new Date(), day = now.getDay(), mins = now.getHours() * 60 + now.getMinutes();\n    let cur = scheduleData.find(p => p.day === day && mins >= timeToMinutesIndex(p.start) && mins < timeToMinutesIndex(p.end));\n    if (!cur) cur = { program: \"Emiss\u00e3o online\", host: \"R\u00e1dio Azul\", start: \"--:--\", end: \"--:--\" };\n    \n    document.getElementById('progAtual').innerHTML = `<strong>${escapeHtml(cur.program)}${cur.program !== \"Emiss\u00e3o online\" ? ' <span class=\"programa-no-ar\">\ud83d\udd34 NO AR<\/span>' : ''}<\/strong><br \/><small>${escapeHtml(cur.host)}<\/small>`;<\/p>\n<p>    let next = scheduleData.find(p => p.day === day && timeToMinutesIndex(p.start) > mins);\n    if (!next) next = scheduleData.find(p => p.day === (day + 1) % 7);\n    document.getElementById('progSeguinte').innerHTML = next ? `<strong>${escapeHtml(next.program)}<\/strong><br \/><small>${next.start}<\/small>` : \"--\";\n}<\/p>\n<p>function getCurrentProgramFromScheduleIndex() {\n    let now = new Date(), day = now.getDay(), mins = now.getHours() * 60 + now.getMinutes();\n    let cur = scheduleData.find(p => p.day === day && mins >= timeToMinutesIndex(p.start) && mins < timeToMinutesIndex(p.end));\n    if (!cur) cur = { program: \"Emiss\u00e3o online\", host: \"R\u00e1dio Azul\", start: \"--:--\", end: \"--:--\" };\n    return cur;\n}\n\nfunction renderScheduleModalIndex(day) {\n    let now = new Date();\n    let currentMins = now.getHours() * 60 + now.getMinutes();\n    let currentDay = now.getDay();\n    let filtered = scheduleData.filter(p => p.day === day).sort((a, b) => a.start.localeCompare(b.start));\n    let dias = ['Domingo', 'Segunda', 'Ter\u00e7a', 'Quarta', 'Quinta', 'Sexta', 'S\u00e1bado'];\n    let html = `<\/p>\n<div class=\"day-tabs\">${dias.map((d, idx) => `<button class=\"day-tab ${idx === day ? 'active' : ''}\" onclick=\"renderScheduleModalIndex(${idx})\">${d}<\/button>`).join('')}<\/div>\n<table class=\"schedule-table\">\n<thead>\n<tr>\n<th>Hor\u00e1rio<\/th>\n<th>Programa<\/th>\n<th>Locutor<\/th>\n<\/tr>\n<\/thead>\n<tbody>`;\n    filtered.forEach(p => {\n        let isCurrent = (day === currentDay && currentMins >= timeToMinutesIndex(p.start) && currentMins < timeToMinutesIndex(p.end));\n        let emDiretoTag = isCurrent ? ' <span class=\"programa-no-ar\">\ud83d\udd34 EM DIRETO<\/span>' : '';\n        html += `<\/p>\n<tr class=\"${isCurrent ? 'programa-atual' : ''}\">\n<td>${p.start}-${p.end}<\/td>\n<td><strong>${escapeHtml(p.program)}${emDiretoTag}<\/strong><\/td>\n<td>${escapeHtml(p.host)}<\/td>\n<\/tr>\n<p>`;\n    });\n    html += `<\/tbody>\n<table>`;\n    const container = document.getElementById('scheduleModalContent');\n    if (container) container.innerHTML = html;\n}<\/p>\n<p>function openScheduleModal() {\n    renderScheduleModalIndex(new Date().getDay());\n    openModal('modalSchedule');\n}<\/p>\n<p>\/\/ ==================== NOT\u00cdCIAS ====================\nasync function carregarNoticiasIndex() {\n    const data = await callAPI(`${API_NOTICIAS}?action=read`);\n    if (data && Array.isArray(data)) noticias = data;\n    else {\n        let stored = localStorage.getItem('radio_noticias');\n        noticias = (stored && cookieConsent === 'accepted') ? JSON.parse(stored) : [];\n    }\n    if (!noticias.length) {\n        noticias = [{\n            id: 1, titulo: \"Bem-vindo \u00e0 R\u00e1dio Azul\",\n            resumo: \"A sua r\u00e1dio de sempre, agora com novas funcionalidades.\",\n            data: new Date().toISOString().slice(0, 10), destaque: true,\n            imagem: \"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\", categoria: \"Destaque\"\n        }];\n    }\n    renderizarUltimasNoticiasIndex();\n}<\/p>\n<p>function formatarDataIndex(dataStr) {\n    if (!dataStr) return '';\n    let partes = dataStr.split('-');\n    return `${partes[2]}\/${partes[1]}\/${partes[0]}`;\n}<\/p>\n<p>function criarCardNoticiaIndex(n) {\n    return `<\/p>\n<div class=\"noticia-card-moderno\" data-id=\"${n.id}\">\n        <img decoding=\"async\" class=\"noticia-imagem\" src=\"${n.imagem || 'https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png'}\" onerror=\"this.src='https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png'\"><\/p>\n<div class=\"noticia-conteudo\">\n            <span class=\"noticia-categoria\">${escapeHtml(n.categoria || 'Destaque')}<\/span><\/p>\n<div class=\"noticia-titulo\">${escapeHtml(n.titulo)}<\/div>\n<div class=\"noticia-resumo\">${escapeHtml(n.resumo.substring(0, 80))}${n.resumo.length > 80 ? '...' : ''}<\/div>\n<div class=\"noticia-data\"><i class=\"far fa-calendar-alt\"><\/i> ${formatarDataIndex(n.data)}<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<p>`;\n}<\/p>\n<p>function renderizarUltimasNoticiasIndex() {\n    let container = document.getElementById('ultimasNoticias');\n    if (container) {\n        container.innerHTML = noticias.slice(0, 6).map(n => criarCardNoticiaIndex(n)).join('');\n        adicionarEventosCardsIndex();\n    }\n}<\/p>\n<p>function adicionarEventosCardsIndex() {\n    document.querySelectorAll('#ultimasNoticias .noticia-card-moderno').forEach(card => {\n        card.removeEventListener('click', abrirModalHandlerIndex);\n        card.addEventListener('click', abrirModalHandlerIndex);\n    });\n}<\/p>\n<p>function abrirModalHandlerIndex(e) {\n    const id = parseInt(this.getAttribute('data-id'));\n    const noticia = noticias.find(n => n.id === id);\n    if (noticia) abrirModalNoticiaIndex(noticia);\n}<\/p>\n<p>function abrirModalNoticiaIndex(noticia) {\n    window.noticiaAtual = noticia;\n    document.getElementById('modalImagem').src = noticia.imagem || 'https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png';\n    document.getElementById('modalCategoria').textContent = noticia.categoria || 'Destaque';\n    document.getElementById('modalTitulo').textContent = noticia.titulo;\n    const dataSpan = document.querySelector('#modalData span');\n    if (dataSpan) dataSpan.textContent = formatarDataIndex(noticia.data);\n    const textoCompleto = noticia.texto_completo || noticia.resumo;\n    document.getElementById('modalTexto').innerHTML = textoCompleto.replace(\/\\n\/g, '<br \/>');<\/p>\n<p>    let relacionados = noticias.filter(n => n.categoria === noticia.categoria && n.id !== noticia.id).slice(0, 3);\n    let relatedHtml = relacionados.map(r => `<\/p>\n<div class=\"related-item\" data-id=\"${r.id}\">\ud83d\udccc ${escapeHtml(r.titulo)}<br \/><small>${formatarDataIndex(r.data)}<\/small><\/div>\n<p>`).join('');\n    if (relacionados.length === 0) relatedHtml = '<\/p>\n<p>Sem artigos relacionados.<\/p>\n<p>';\n    document.getElementById('relatedArticlesList').innerHTML = relatedHtml;<\/p>\n<p>    document.querySelectorAll('.related-item').forEach(item => {\n        item.addEventListener('click', () => {\n            let id = parseInt(item.dataset.id);\n            let relNoticia = noticias.find(n => n.id === id);\n            if (relNoticia) abrirModalNoticiaIndex(relNoticia);\n        });\n    });<\/p>\n<p>    document.getElementById('noticiaModal').classList.add('visible');\n    document.body.style.overflow = 'hidden';\n}<\/p>\n<p>function fecharModalNoticiaIndex() {\n    document.getElementById('noticiaModal').classList.remove('visible');\n    document.body.style.overflow = '';\n}<\/p>\n<p>\/\/ ==================== MEDIA SESSION ====================\nfunction setMediaSessionForMusic(title, artist, artworkUrl) {\n    if ('mediaSession' in navigator) {\n        navigator.mediaSession.metadata = new MediaMetadata({\n            title: title,\n            artist: artist,\n            album: \"R\u00e1dio Azul 98.9 FM\",\n            artwork: [{ src: artworkUrl || \"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\", sizes: \"512x512\", type: \"image\/png\" }]\n        });\n        navigator.mediaSession.playbackState = audioPlaying ? \"playing\" : \"paused\";\n    }\n}<\/p>\n<p>function setMediaSessionForProgram(programa, locutor, horario) {\n    if ('mediaSession' in navigator) {\n        navigator.mediaSession.metadata = new MediaMetadata({\n            title: programa,\n            artist: `${locutor} \u2022 ${horario}`,\n            album: \"R\u00e1dio Azul 98.9 FM - Programa\u00e7\u00e3o\",\n            artwork: [{ src: \"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\", sizes: \"512x512\", type: \"image\/png\" }]\n        });\n        navigator.mediaSession.playbackState = audioPlaying ? \"playing\" : \"paused\";\n    }\n}<\/p>\n<p>\/\/ ==================== LIKES ====================\nasync function likeMusicIndex(titulo, artista) {\n    if (!titulo || !artista || titulo === \"R\u00e1dio Azul\") {\n        showToast(\"Apenas pode dar like a m\u00fasicas em directo\", \"info\");\n        return;\n    }\n    try {\n        const result = await callAPI(`${API_MUSICA}?action=like`, { titulo, artista }, 'POST');\n        if (result && result.success) {\n            showToast(\"Like registado! \ud83d\udc4d\", \"info\");\n        } else {\n            showToast(result?.error || \"Erro ao registar like\", \"error\");\n        }\n    } catch(e) { showToast(\"Erro de liga\u00e7\u00e3o\", \"error\"); }\n}<\/p>\n<p>\/\/ ==================== SETUP BOT\u00d5ES ====================\nfunction setupHomeButtonsIndex() {\n    const copyBtn = document.getElementById('copyMusicBtn');\n    if (copyBtn) copyBtn.onclick = () => {\n        const s = document.getElementById('currentSong').innerText;\n        const a = document.getElementById('currentArtist').innerText;\n        navigator.clipboard.writeText(`${s} - ${a}`);\n        showToast(\"Copiado!\");\n    };<\/p>\n<p>    const shareBtn = document.getElementById('shareMusicBtn');\n    if (shareBtn) shareBtn.onclick = async () => {\n        const s = document.getElementById('currentSong').innerText;\n        const a = document.getElementById('currentArtist').innerText;\n        let txt = `A ouvir: ${s} - ${a} na R\u00e1dio Azul`;\n        if (navigator.share) try { await navigator.share({ text: txt }); } catch(e) {}\n        else { navigator.clipboard.writeText(txt); showToast(\"Partilha copiada!\"); }\n    };<\/p>\n<p>    const likeBtn = document.getElementById('likeBtn');\n    if (likeBtn) likeBtn.onclick = () => {\n        const titulo = document.getElementById('currentSong').innerText;\n        const artista = document.getElementById('currentArtist').innerText;\n        likeMusicIndex(titulo, artista);\n    };\n}<\/p>\n<p>\/\/ ==================== INICIALIZA\u00c7\u00c3O ====================\ndocument.addEventListener('DOMContentLoaded', () => {\n    \/\/ Carregar dados\n    carregarScheduleIndex();\n    carregarNoticiasIndex();\n    carregarLocalHistoryIndex();\n    refreshMusica();<\/p>\n<p>    \/\/ Configurar player\n    const playBtn = document.getElementById('playBtn');\n    if (playBtn) playBtn.onclick = () => audioPlaying ? pause() : play();<\/p>\n<p>    \/\/ Configurar volume\n    const volSlider = document.getElementById('volumeSlider');\n    if (volSlider) {\n        volSlider.oninput = () => {\n            audio.volume = volSlider.value;\n            if (cookieConsent === 'accepted') localStorage.setItem('radio_volume', volSlider.value);\n            const miniVol = document.getElementById('miniVolume');\n            if (miniVol) miniVol.value = volSlider.value;\n        };\n        if (localStorage.getItem('radio_volume') && cookieConsent === 'accepted') {\n            volSlider.value = parseFloat(localStorage.getItem('radio_volume'));\n        }\n        audio.volume = volSlider.value;\n    }<\/p>\n<p>    \/\/ Configurar bot\u00f5es\n    setupHomeButtonsIndex();<\/p>\n<p>    \/\/ Configurar modais de not\u00edcia\n    const closeNoticiaModal = document.querySelector('.close-modal-noticia');\n    if (closeNoticiaModal) closeNoticiaModal.addEventListener('click', fecharModalNoticiaIndex);\n    const noticiaModalDiv = document.getElementById('noticiaModal');\n    if (noticiaModalDiv) noticiaModalDiv.addEventListener('click', (e) => {\n        if (e.target === noticiaModalDiv) fecharModalNoticiaIndex();\n    });<\/p>\n<p>    \/\/ Share buttons\n    document.getElementById('shareFacebook')?.addEventListener('click', () => {\n        if (window.noticiaAtual) window.open(`https:\/\/www.facebook.com\/sharer\/sharer.php?u=${encodeURIComponent(window.location.href)}`, '_blank');\n    });\n    document.getElementById('shareTwitter')?.addEventListener('click', () => {\n        if (window.noticiaAtual) window.open(`https:\/\/twitter.com\/intent\/tweet?text=${encodeURIComponent(window.noticiaAtual.titulo)}&url=${encodeURIComponent(window.location.href)}`, '_blank');\n    });\n    document.getElementById('shareWhatsapp')?.addEventListener('click', () => {\n        if (window.noticiaAtual) window.open(`https:\/\/api.whatsapp.com\/send?text=${encodeURIComponent(window.noticiaAtual.titulo + '\\n' + window.location.href)}`, '_blank');\n    });\n    document.getElementById('copyLink')?.addEventListener('click', () => {\n        navigator.clipboard.writeText(window.location.href);\n        showToast('Link copiado!');\n    });<\/p>\n<p>    \/\/ Configurar refresh autom\u00e1tico\n    setInterval(updateProgramDisplayIndex, 60000);\n    setInterval(refreshMusica, 5000);\n});<\/p>\n<p><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>R\u00e1dio Azul 98.9 FM &#8211; Site Oficial R\u00e1dio Azul Emiss\u00e3o em direto \u23f8 Pausado Programa\u00e7\u00e3o Semanal \u00daltimas 10 M\u00fasicas Meu Hist\u00f3rico Configura\u00e7\u00f5es Copiar M\u00fasica Partilhar Like Agora na R\u00e1dio Azul \ud83d\udce1 PROGRAMA ATUAL &#8212; \u23e9 A SEGUIR &#8212; \ud83c\udfa4 M\u00daSICA \/ PROGRAMA &#8212; Programa\u00e7\u00e3o Variada Informa\u00e7\u00e3o, desporto, m\u00fasica e entretenimento. Emiss\u00e3o 24\/7 Ou\u00e7a-nos em qualquer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-17","page","type-page","status-publish","hentry","eq-blocks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Player - R\u00e1dio Azul 98.9 FM<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/radioazul.pt\/wordpress\/inicio\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Player - R\u00e1dio Azul 98.9 FM\" \/>\n<meta property=\"og:description\" content=\"R\u00e1dio Azul 98.9 FM &#8211; Site Oficial R\u00e1dio Azul Emiss\u00e3o em direto \u23f8 Pausado Programa\u00e7\u00e3o Semanal \u00daltimas 10 M\u00fasicas Meu Hist\u00f3rico Configura\u00e7\u00f5es Copiar M\u00fasica Partilhar Like Agora na R\u00e1dio Azul \ud83d\udce1 PROGRAMA ATUAL &#8212; \u23e9 A SEGUIR &#8212; \ud83c\udfa4 M\u00daSICA \/ PROGRAMA &#8212; Programa\u00e7\u00e3o Variada Informa\u00e7\u00e3o, desporto, m\u00fasica e entretenimento. Emiss\u00e3o 24\/7 Ou\u00e7a-nos em qualquer [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/radioazul.pt\/wordpress\/inicio\/\" \/>\n<meta property=\"og:site_name\" content=\"R\u00e1dio Azul 98.9 FM\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-15T18:45:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/\",\"url\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/\",\"name\":\"Player - R\u00e1dio Azul 98.9 FM\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i.postimg.cc\\\/PrMhmWMz\\\/logo.png\",\"datePublished\":\"2026-06-02T18:09:51+00:00\",\"dateModified\":\"2026-06-15T18:45:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i.postimg.cc\\\/PrMhmWMz\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/i.postimg.cc\\\/PrMhmWMz\\\/logo.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/inicio\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Player\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/#website\",\"url\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/\",\"name\":\"R\u00e1dio Azul 98.9 FM\",\"description\":\"A r\u00e1dio de todos os sons\",\"publisher\":{\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/#organization\",\"name\":\"R\u00e1dio Azul 98.9 FM\",\"url\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/logo.png\",\"width\":107,\"height\":90,\"caption\":\"R\u00e1dio Azul 98.9 FM\"},\"image\":{\"@id\":\"https:\\\/\\\/radioazul.pt\\\/wordpress\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Player - R\u00e1dio Azul 98.9 FM","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/radioazul.pt\/wordpress\/inicio\/","og_locale":"pt_PT","og_type":"article","og_title":"Player - R\u00e1dio Azul 98.9 FM","og_description":"R\u00e1dio Azul 98.9 FM &#8211; Site Oficial R\u00e1dio Azul Emiss\u00e3o em direto \u23f8 Pausado Programa\u00e7\u00e3o Semanal \u00daltimas 10 M\u00fasicas Meu Hist\u00f3rico Configura\u00e7\u00f5es Copiar M\u00fasica Partilhar Like Agora na R\u00e1dio Azul \ud83d\udce1 PROGRAMA ATUAL &#8212; \u23e9 A SEGUIR &#8212; \ud83c\udfa4 M\u00daSICA \/ PROGRAMA &#8212; Programa\u00e7\u00e3o Variada Informa\u00e7\u00e3o, desporto, m\u00fasica e entretenimento. Emiss\u00e3o 24\/7 Ou\u00e7a-nos em qualquer [&hellip;]","og_url":"https:\/\/radioazul.pt\/wordpress\/inicio\/","og_site_name":"R\u00e1dio Azul 98.9 FM","article_modified_time":"2026-06-15T18:45:14+00:00","og_image":[{"url":"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Tempo estimado de leitura":"2 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/radioazul.pt\/wordpress\/inicio\/","url":"https:\/\/radioazul.pt\/wordpress\/inicio\/","name":"Player - R\u00e1dio Azul 98.9 FM","isPartOf":{"@id":"https:\/\/radioazul.pt\/wordpress\/#website"},"primaryImageOfPage":{"@id":"https:\/\/radioazul.pt\/wordpress\/inicio\/#primaryimage"},"image":{"@id":"https:\/\/radioazul.pt\/wordpress\/inicio\/#primaryimage"},"thumbnailUrl":"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png","datePublished":"2026-06-02T18:09:51+00:00","dateModified":"2026-06-15T18:45:14+00:00","breadcrumb":{"@id":"https:\/\/radioazul.pt\/wordpress\/inicio\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/radioazul.pt\/wordpress\/inicio\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/radioazul.pt\/wordpress\/inicio\/#primaryimage","url":"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png","contentUrl":"https:\/\/i.postimg.cc\/PrMhmWMz\/logo.png"},{"@type":"BreadcrumbList","@id":"https:\/\/radioazul.pt\/wordpress\/inicio\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/radioazul.pt\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Player"}]},{"@type":"WebSite","@id":"https:\/\/radioazul.pt\/wordpress\/#website","url":"https:\/\/radioazul.pt\/wordpress\/","name":"R\u00e1dio Azul 98.9 FM","description":"A r\u00e1dio de todos os sons","publisher":{"@id":"https:\/\/radioazul.pt\/wordpress\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/radioazul.pt\/wordpress\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/radioazul.pt\/wordpress\/#organization","name":"R\u00e1dio Azul 98.9 FM","url":"https:\/\/radioazul.pt\/wordpress\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/radioazul.pt\/wordpress\/#\/schema\/logo\/image\/","url":"https:\/\/radioazul.pt\/wordpress\/wp-content\/uploads\/2026\/06\/logo.png","contentUrl":"https:\/\/radioazul.pt\/wordpress\/wp-content\/uploads\/2026\/06\/logo.png","width":107,"height":90,"caption":"R\u00e1dio Azul 98.9 FM"},"image":{"@id":"https:\/\/radioazul.pt\/wordpress\/#\/schema\/logo\/image\/"}}]}},"jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/pages\/17","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/comments?post=17"}],"version-history":[{"count":26,"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/pages\/17\/revisions"}],"predecessor-version":[{"id":162,"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/pages\/17\/revisions\/162"}],"wp:attachment":[{"href":"https:\/\/radioazul.pt\/wordpress\/wp-json\/wp\/v2\/media?parent=17"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}