!DOCTYPE html
html lang=pt-br
head
meta charset=UTF-8
meta name=viewport content=width=device-width, initial-scale=1.0, user-scalable=no
titleRádio Araguari FMtitle
link rel=stylesheet href=httpscdnjs.cloudflare.comajaxlibsfont-awesome6.4.0cssall.min.css
style
root {
--bg-top #19882C;
--primary #001689;
--accent #FAED00;
--text #ffffff;
--text-gray #e0e0e0;
--glass rgba(0, 22, 137, 0.5);
--whatsapp #25D366;
}
{ margin 0; padding 0; box-sizing border-box; font-family 'Segoe UI', Tahoma, sans-serif; outline none; -webkit-tap-highlight-color transparent; }
body {
background linear-gradient(180deg, #19882C 0%, #00105E 100%);
color var(--text);
height 100vh;
overflow hidden;
display flex;
align-items center;
justify-content center;
}
#mainContainer { width 100%; height 100%; display flex; flex-direction column; }
#playerScreen {
flex 1;
padding 20px;
display flex;
flex-direction column;
align-items center;
justify-content center;
max-width 450px;
margin 0 auto;
width 100%;
}
.status-bar {
width 100%;
display flex;
justify-content space-between;
align-items center;
margin-bottom 30px;
height 40px;
}
.clock-badge {
color white;
font-size 0.95rem;
font-weight 600;
background rgba(0,0,0,0.3);
padding 6px 15px;
border-radius 20px;
border 1px solid rgba(255,255,255,0.2);
}
.live-badge {
background #d32f2f;
color white;
padding 5px 12px;
border-radius 5px;
font-size 0.8rem;
font-weight bold;
text-transform uppercase;
box-shadow 0 0 10px rgba(211, 47, 47, 0.6);
display none;
animation pulseLive 2s infinite;
}
@keyframes pulseLive {
0% { opacity 1; }
50% { opacity 0.7; }
100% { opacity 1; }
}
.album-art {
width 260px;
height 260px;
border-radius 50%;
border 6px solid var(--accent);
overflow hidden;
box-shadow 0 0 30px rgba(250, 237, 0, 0.3);
margin-bottom 30px;
background #fff;
display flex;
align-items center;
justify-content center;
transition all 0.3s ease;
}
.album-art img {
width 100%;
height 100%;
object-fit contain;
padding 5px;
}
.playing .album-art {
animation breathLogo 4s ease-in-out infinite;
}
@keyframes breathLogo {
0% { transform scale(1) translateY(0); box-shadow 0 0 30px rgba(250, 237, 0, 0.3); }
50% { transform scale(1.03) translateY(-8px); box-shadow 0 0 60px rgba(250, 237, 0, 0.8); }
100% { transform scale(1) translateY(0); box-shadow 0 0 30px rgba(250, 237, 0, 0.3); }
}
.track-info {
text-align center;
margin-bottom 25px;
width 100%;
}
.track-title {
font-size 1.5rem;
font-weight 800;
margin-bottom 5px;
color var(--accent);
white-space nowrap;
overflow hidden;
text-overflow ellipsis;
text-shadow 2px 2px 4px rgba(0,0,0,0.6);
}
.track-artist {
font-size 1.1rem;
color var(--text);
font-weight 500;
text-shadow 1px 1px 3px rgba(0,0,0,0.6);
}
.progress-container {
width 100%;
display flex;
align-items center;
gap 12px;
margin-bottom 30px;
font-size 0.85rem;
color var(--text-gray);
font-weight 500;
}
.progress-bar {
flex 1;
height 6px;
background rgba(255,255,255,0.2);
border-radius 3px;
overflow hidden;
}
#progressFill {
width 0%;
height 100%;
background var(--accent);
box-shadow 0 0 10px var(--accent);
transition width 1s linear;
}
.controls-wrapper {
display flex;
flex-direction column;
align-items center;
gap 20px;
width 100%;
margin-bottom 20px;
}
.btn-play {
width 90px;
height 90px;
border-radius 50%;
background var(--accent);
color var(--primary);
border none;
display flex;
align-items center;
justify-content center;
font-size 3rem;
cursor pointer;
box-shadow 0 0 30px rgba(250, 237, 0, 0.4);
transition transform 0.2s, background 0.2s;
padding-left 5px;
}
.btn-playactive {
transform scale(0.95);
background #e6d900;
}
.playing .btn-play {
padding-left 0;
}
.action-buttons {
display flex;
gap 15px;
width 100%;
justify-content center;
margin-top 10px;
flex-wrap wrap;
}
.btn-action {
background var(--glass);
border 1px solid rgba(255,255,255,0.2);
color white;
padding 12px 20px;
border-radius 30px;
font-weight 600;
font-size 0.95rem;
display flex;
align-items center;
gap 8px;
cursor pointer;
transition 0.2s;
}
.btn-actionhover {
background rgba(255,255,255,0.1);
border-color var(--accent);
color var(--accent);
}
.btn-actionactive {
transform scale(0.95);
}
.volume-box {
width 80%;
display flex;
align-items center;
gap 15px;
margin-top 10px;
}
input[type=range] {
flex 1;
accent-color var(--accent);
cursor pointer;
height 6px;
background rgba(255,255,255,0.2);
border-radius 3px;
-webkit-appearance none;
}
input[type=range]-webkit-slider-thumb {
-webkit-appearance none;
width 16px;
height 16px;
background var(--accent);
border-radius 50%;
cursor pointer;
}
@media (max-width 768px) {
.volume-box { display none !important; }
}
style
head
body
div id=mainContainer
div id=playerScreen
div class=status-bar
div class=clock-badge id=clockDisplay0000div
div class=live-badge id=liveBadgeAO VIVOdiv
div
div class=album-art
img src=logo.png id=fixedLogo alt=Araguari FM onerror=this.src='logo.jpg'
div
div class=track-info
div class=track-title id=songTitleRádio Araguari FMdiv
div class=track-artist id=artistNameA 1ª Rádio do Rio Araguaridiv
div
div class=progress-container
span id=timeCurrent0000span
div class=progress-bardiv id=progressFilldivdiv
span id=timeTotalAo Vivospan
div
div class=controls-wrapper
button class=btn-play id=btnPlayMain onclick=togglePlay()
i class=fas fa-play id=playIconi
button
div class=action-buttons
button class=btn-action onclick=shareApp()
i class=fas fa-share-nodesi Compartilhar
button
div
div
div class=volume-box id=volumeBox
i class=fas fa-volume-low style=colorrgba(255,255,255,0.6)i
input type=range min=0 max=100 value=100 oninput=setVolume(this.value)
i class=fas fa-volume-high style=colorwhitei
div
div
div
audio id=audio src=httpsmedia.araguarifm.com.brlistenaraguariradio.mp3 preload=noneaudio
script
const audio = document.getElementById('audio');
const icon = document.getElementById('playIcon');
const playerScreen = document.getElementById('playerScreen');
const liveBadge = document.getElementById('liveBadge');
const STREAM_URL = httpsmedia.araguarifm.com.brlistenaraguariradio.mp3;
const API_URL = httpsmedia.araguarifm.com.brapinowplayingaraguari;
let isPlaying = false;
const isAndroidApp = typeof Android !== undefined;
try {
if (isAndroidApp) {
document.getElementById('volumeBox').style.display = 'none';
}
} catch (e) {}
function updateClock() {
const now = new Date();
const options = { timeZone 'AmericaSao_Paulo', hour '2-digit', minute '2-digit' };
document.getElementById('clockDisplay').innerText = now.toLocaleTimeString('pt-BR', options);
}
setInterval(updateClock, 1000);
updateClock();
function togglePlay() {
if (isAndroidApp && Android.play && Android.pause) {
if (isPlaying) {
Android.pause();
atualizarIcone(false);
} else {
Android.play();
atualizarIcone(true);
}
return;
}
if (isPlaying) {
audio.pause();
atualizarIcone(false);
} else {
audio.src = STREAM_URL;
audio.load();
Toca silenciosamente, sem alertar o usuário se o servidor demorar
audio.play()
.then(() = atualizarIcone(true))
.catch(err = {
console.log(Erro de timeout ou bloqueio do navegador, err);
atualizarIcone(false);
});
}
}
function atualizarIcone(tocando) {
isPlaying = tocando;
if (tocando) {
icon.classList.remove('fa-play');
icon.classList.add('fa-pause');
playerScreen.classList.add('playing');
} else {
icon.classList.remove('fa-pause');
icon.classList.add('fa-play');
playerScreen.classList.remove('playing');
}
}
function setVolume(v) {
audio.volume = v 100;
}
function shareApp() {
const titulo = Ouça a Rádio Araguari FM!;
const texto = A 1ª Rádio do Rio Araguari direto no seu celular. Baixe o app;
const urlApp = httpsplay.google.comstoreappsdetailsid=com.araguarynet.araguarifm;
O texto completo pronto para ser compartilhado
const mensagemCompleta = titulo + + texto + + urlApp;
const msgParaZap = encodeURIComponent(mensagemCompleta);
1. Tenta usar a ponte nativa do App (Android Studio)
Correção O código Java espera receber apenas uma string (String text)
if (isAndroidApp && Android.share) {
Android.share(mensagemCompleta);
return;
}
2. Tenta a tela de compartilhamento padrão do celular
if (navigator.share) {
navigator.share({
title titulo,
text texto,
url urlApp
}).catch(err = {
console.log(Compartilhamento nativo falhou, tentando fallback..., err);
window.location.href = `httpswa.metext=${msgParaZap}`;
});
} else {
3. Método bruto para apps que bloqueiam abas novas
window.location.href = `httpswa.metext=${msgParaZap}`;
}
}
async function updateMeta() {
try {
const res = await fetch(API_URL, { cache no-store });
const data = await res.json();
if (data.live && data.live.is_live === true) {
liveBadge.style.display = 'block';
} else {
liveBadge.style.display = 'none';
}
const song = data.now_playing.song {};
document.getElementById('songTitle').innerText = song.text song.title Rádio Araguari FM;
document.getElementById('artistName').innerText = song.artist A 1ª Rádio do Rio Araguari;
const el = data.now_playing.elapsed 0;
const dur = data.now_playing.duration 0;
if (dur 0) {
document.getElementById('progressFill').style.width = ((el dur) 100) + %;
document.getElementById('timeCurrent').innerText = formatTime(el);
document.getElementById('timeTotal').innerText = formatTime(dur);
} else {
document.getElementById('progressFill').style.width = 100%;
document.getElementById('timeCurrent').innerText = 0000;
document.getElementById('timeTotal').innerText = Ao Vivo;
}
} catch (e) {
console.log(Aguardando metadados...);
}
}
function formatTime(s) {
const m = Math.floor(s 60);
const sec = Math.floor(s % 60);
return m + + (sec 10 0 ) + sec;
}
audio.addEventListener(pause, () = {
if (!isAndroidApp) atualizarIcone(false);
});
audio.addEventListener(ended, () = {
if (!isAndroidApp) atualizarIcone(false);
});
setInterval(updateMeta, 5000);
updateMeta();
script
body
html