
Criar um app (Player) para Smart TVs LG (webOS) é bem simples, basta seguir as etapas abaixo.
1) Entenda o que você vai construir (webOS)
Os apps de LG webOS são, na prática, apps web (HTML/CSS/JS) rodando em um ambiente de TV, com APIs do webOS para controle remoto, mídia, armazenamento etc.
Você tem 2 caminhos comuns:
- Web App (HTML/JS puro): mais simples, leve e o modelo que iremos usar.
- Framework (React/Vue/Angular): funciona, mas precisa otimizar (TV tem limitações).
2) Prepare o ambiente de desenvolvimento
Você vai usar o kit oficial da LG:
- webOS TV SDK (ferramentas de CLI)
- Emulador do webOS TV (para testar sem TV)
- VS Code (opcional, mas ajuda)
Fluxo típico:
- Instalar Node.js
- Instalar o webOS CLI
- Criar um projeto “web app”
- Rodar no emulador
- Testar numa TV real via modo dev
3) Crie o projeto base
Você cria o app com o template padrão e já terá:
appinfo.json(id, nome, versão, permissões)index.htmle scripts- estrutura para build/deploy
O app precisa responder bem a:
- Navegação por setas + OK/Back
- Resolução 1080p/4K (UI escalável)
- Performance (evitar animações pesadas e DOM gigante)
4) Controle remoto e foco (o ponto mais importante em TV)
TV não é “touch/mouse”. Você precisa implementar no controle remoto da TV:
- Gerenciamento de foco (qual botão está selecionado)
- Atalhos de teclas (setas, Enter/OK, Back)
- Estados visuais de foco (borda/realce)
Dica prática: faça sua UI toda baseada em “cards/itens focáveis” e navegação previsível.
5) Vídeo/Streaming (se for app de conteúdo)
Para tocar vídeo:
- Use
<video>com HLS/DASH dependendo do seu streaming. - Teste codecs/DRM (se precisar de conteúdo protegido).
- Garanta fallback e tratamento de erro (reconexão, “loading”, “sem sinal”).
Se for FAST (canais ao vivo), pense em:
- Troca rápida de canal
- Buffer curto (baixa latência vs estabilidade)
- EPG (grade) e categorias
6) Teste no emulador ou/e numa TV real
- Emulador ajuda, mas a TV real é obrigatório (performance e compatibilidade mudam).
- Habilite Developer Mode na TV para instalar app localmente e depurar.
7) Publicação na LG Content Store
Para publicar você vai precisar:
- Conta de desenvolvedor LG
- Certificados/assinatura do app
- Enviar pacote (ipk)
- Materiais: ícones, screenshots, descrição, classificação etária, etc.
- Passar pela equipe de teste da LG
Um “roteiro” bem objetivo (pra você executar)
- Instalar SDK/CLI do webOS
- Criar app template
- Montar UI com navegação por foco
- Integrar player de vídeo (se tiver)
- Testar emulador → testar TV real
- Otimizar performance
- Empacotar, assinar e publicar
*Abaixo o código fonte do app (Simples Player):
Player pra LG webOS pode ser literalmente: 1 tela + 1 vídeo + controle remoto (OK/Play/Pause + Voltar).
Aqui vai o modelo “mínimo que funciona” (bem usado pra testar stream e subir a primeira versão).
Estrutura do app
index.html(tela)main.js(lógica do controle remoto)appinfo.json(metadados do app webOS)
1) index.html
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=1920, height=1080" />
<title>Simple Player</title>
<style>
html, body { margin:0; padding:0; width:100%; height:100%; background:#000; overflow:hidden; }
#video { width:100%; height:100%; background:#000; }
#hud {
position: absolute; left: 40px; bottom: 40px;
color: #fff; font: 28px Arial, sans-serif;
background: rgba(0,0,0,.5); padding: 14px 18px; border-radius: 12px;
}
</style>
</head>
<body>
<video id="video" playsinline></video>
<div id="hud">OK: Play/Pause • Back: Sair</div>
<script src="main.js"></script>
</body>
</html>
2) main.js
const video = document.getElementById("video");
const hud = document.getElementById("hud");
// Coloque aqui seu stream (HLS .m3u8 é o mais comum)
const STREAM_URL = "https://example.com/stream.m3u8";
function show(msg, ms = 2000) {
hud.textContent = msg;
hud.style.display = "block";
clearTimeout(show._t);
show._t = setTimeout(() => {
hud.textContent = "OK: Play/Pause • Back: Sair";
}, ms);
}
function play() {
video.play().then(() => show("Reproduzindo")).catch(err => show("Erro ao tocar: " + err.message, 4000));
}
function togglePlayPause() {
if (video.paused) play();
else { video.pause(); show("Pausado"); }
}
// configura vídeo
video.src = STREAM_URL;
video.autoplay = true;
video.muted = false; // se der bloqueio de autoplay, teste true e depois desmute via OK
video.load();
video.addEventListener("error", () => {
const e = video.error;
show("Erro de mídia (code " + (e?.code ?? "?") + ")", 5000);
});
video.addEventListener("playing", () => show("Reproduzindo"));
video.addEventListener("waiting", () => show("Carregando..."));
video.addEventListener("ended", () => show("Finalizado"));
document.addEventListener("keydown", (ev) => {
const k = ev.keyCode;
// OK / Enter
if (k === 13) {
togglePlayPause();
return;
}
// Back / Return (LG costuma usar 461)
if (k === 461 || k === 8 || k === 27) {
show("Saindo...");
// Em webOS, se existir o objeto webOS, você pode fechar o app:
if (window.webOS?.platformBack) window.webOS.platformBack();
// fallback: tenta voltar histórico
else history.back();
return;
}
// Play/Pause em alguns controles
if (k === 415) { play(); return; } // Play
if (k === 19) { video.pause(); return; } // Pause (varia)
});
3) appinfo.json (exemplo)
{
"id": "com.seunome.simpleplayer",
"version": "1.0.0",
"vendor": "Seu Nome",
"type": "web",
"main": "index.html",
"title": "Simple Player",
"icon": "icon.png"
}
Como testar rápido
- Rode no emulador do webOS TV (pra validar o app abre e toca).
- Depois teste numa TV LG real (Developer Mode), porque playback/codec muda bastante.
Leia também:
✅ Roku vs LG webOS vs Samsung Tizen — Qual Plataforma Escolher?