# Player próprio da Rádio 1313 na home (S25) Status: rascunho Atualizado em: 2026-09-21 Issue: #1239 Priority: P2 Impeccable: C — componente novo (player) dentro da seção de som existente da home Design UI: docs/plans/radio-player-proprio-ui-design.html Appetite: ~1 dia eng; um outcome verificável — a rádio toca num player próprio, discreto, sem marca zeno, com CTA de compartilhar Responsável: — ## Intenção O embed oficial do zeno.fm que o S24 (#1235) montou na home ficou pequeno: o iframe de 150/168px corta título e capa e carrega a marca zeno. O humano quer um player próprio, mais discreto e com a cara da campanha, sobre o mesmo stream (`https://stream.zeno.fm/hys86kx6k16tv`), mais um CTA de compartilhar que manda o link público da rádio no Zeno. Esta Issue é a **sucessora explícita** do S24: nova evidência de produto reverte os anti-goals dele ("não vira player custom", "não cria framework de consent/CSP"). Planos de Issues `done`/`in-prod` são imutáveis — `docs/plans/radio-embed-direto.md` não é editado nem reaberto; a reversão de propósito fica registrada aqui. Ganho colateral a registrar com honestidade: o iframe do S24 traz GA `G-2T527NZWVM` + redes de anúncio em todo pageview da home (trade-off assumido lá). Com player próprio + `preload="none"`, nenhum request de terceiro sai antes do gesto de play; a conexão com o stream só acontece ali. Isso **reverte o trade-off para melhor**, mas não promete analytics nem contador — não há dado nosso novo. ## Persona e fluxo - **Persona / contexto:** visitante e militante que chega pela home no celular (link no WhatsApp, busca, indicação), com pressa e em conexão qualquer. - **Job principal:** ouvir a Rádio Jorge Solla 1313 num player que parece da campanha e poder mandar o link da rádio para alguém. - **Fluxo desejado:** abre a home → rola até a seção de som → vê o player discreto "Rádio Jorge Solla 1313" com indicador "Ao vivo" → dá play e ouve (a conexão com o stream começa só agora); se um jingle estiver tocando, ele pausa → toca o "Compartilhar" e escolhe WhatsApp (mensagem pronta) ou copiar link → se o play falhar, vê um estado honesto com link para ouvir no Zeno. - **Anti-goals de produto:** não redesenha a seção de som nem a grade/`/jingles`; não vira proxy nem player de streaming próprio; não autoplay com som; não busca "tocando agora" nem analytics/contador; não cria consent/CSP novo; não mexe em schema. ### Esboço de fluxo (C) ```text [visitante na home] → seção de som → player próprio: "Rádio Jorge Solla 1313" · [Ao vivo] · [▶] · [Compartilhar] → dá play → conecta no stream (sem request de terceiro antes) · toca [jingle tocando] → pausa o jingle · [play no jingle] → pausa a rádio → "Compartilhar" → WhatsApp (mensagem pronta) | copiar link → feedback [play falha/estola] → estado de erro + "ouvir no Zeno" + compartilhar (nunca spinner infinito) [0 jingles] → rádio sozinha (compact) · [N jingles] → grade + "Ver todos" → /jingles ``` ### Design UI (C) - Design UI (gate): `docs/plans/radio-player-proprio-ui-design.html` — cenas: 390 mobile, 1280 desktop, variante compacta (0 jingles) e estados do player (parado, carregando, ao vivo, erro). Capa/arte é NEEDS ASSET: ativo oficial do kit 1313 (`public/campaign-kit/README.md`) ou disco neutro — nunca inventar capa nem usar banco de imagens. ## Objetivo e aceite - O iframe zeno some da home; o player próprio é a única superfície de rádio da seção, com título fixo "Rádio Jorge Solla 1313" e indicador "Ao vivo" — sem corte de título/capa. - Só toca com gesto do visitante; com `preload="none"` nenhum request ao stream ou a terceiros acontece antes do play. - Um áudio por vez na seção de som: play na rádio pausa o jingle em reprodução e vice-versa. - Compartilhar envia a mensagem literal `Ouça a Rádio Jorge Solla 1313 — https://zeno.fm/radio/jorge-solla-1313/` (WhatsApp + copiar link com feedback), reusando o padrão público. - Fail-soft: play que falha ou estola vira estado de erro com alternativa honesta (ouvir no Zeno / compartilhar) — nunca spinner infinito. - Kill switch do S21 e variante compact preservados: 0 jingles → rádio sozinha; com jingles, grade e "Ver todos" seguem abaixo; `/jingles` e o player dos jingles ficam intocados além da exclusividade. - Home segue estática (leitura única de `getPublishedJingleItems()`, cache tag `jingles`); sem PII nova, sem Consent novo; MetaPixel da home intocado; sem overflow horizontal a 390px e operável por teclado com rótulos acessíveis. ## Dados (intenção) - **Vou apresentar dados?** Não — **N/A**: nenhum dado nosso é apresentado ou coletado; não há contador de ouvintes, analytics de reprodução nem metadados "tocando agora". A decisão do visitante é ouvir agora, não ler números. - **Decisões desbloqueadas:** N/A — sem métrica que desbloqueie escolha de ator. - **Forma:** N/A — sem dado agregado a definir. ## Dados da decisão (literais) - ID `S25`; slug `radio-player-proprio`; tipo `feature`; Priority `P2`; Impeccable `C`; rota: a home `/` (sem rota nova). - Stream a tocar: `https://stream.zeno.fm/hys86kx6k16tv` → 302 para CDN `stream-*.surfernetwork.com` com token assinado por request; resposta final `content-type: audio/mpeg`, `icy-name: Jorge Solla 1313`, 128 kbps, 44.1 kHz; **sem headers CORS/ACAO** (playback em `