Referência da API do player

Construtor, carregamento de conteúdo, métodos, propriedades e recursos do player instalável.

Referência técnica do player instalável. Para as opções do construtor em linguagem simples, veja Ajustes do player; para ouvir o que acontece com o vídeo, veja Eventos do player.

Construtor

new SpallaPlayer(elementoOuSeletor, opcoes);

O primeiro argumento é um seletor CSS ou um elemento DOM. O segundo é opcional; qualquer opção informada aqui sempre vence o que o backend da Spalla configurou para aquele conteúdo.

O construtor também aceita o formato de uma integração anterior (videoId, liveId, playlistId e aliases) — ver compatibilidade com o player anterior.

Carregando conteúdo

await player.load('019e6f63-…');                    // detecta live, VOD ou playlist pelo ID
await player.load({ contentId: '019e…' });
await player.load({ contentId: '019e…', contentKind: 'video' }); // ou 'live'
await player.load({ playlistId: '01a0…', startIndex: 3 });
await player.load({ url: 'https://…/playlist.m3u8' }); // manifesto direto

IDs precisam ser UUIDs completos. Se você informar contentKind e ele divergir do que a Spalla retorna para aquele ID, o carregamento é recusado — prefira deixar o player autodetectar quando não tiver certeza.

Várias instâncias na mesma página

SpallaPlayer.getPlayers();                  // todas as instâncias vivas
SpallaPlayer.getPlayerById('spalla-player-1');
SpallaPlayer.getPlayerByElement(el);
await SpallaPlayer.destroyAll();            // destrói todas as instâncias
SpallaPlayer.isSupported();                 // navegador atende os requisitos mínimos
SpallaPlayer.version;                       // versão do player em uso

Reprodução

Método/propriedadeO que fazExemplo / retorno
play()Inicia ou retoma a reproduçãoawait player.play(); → Promise<void>
pause()Pausa a reproduçãoplayer.pause();
togglePlay()Alterna entre tocar e pausarplayer.togglePlay();
stop()Para e volta ao início, sem descarregar a mídiaplayer.stop();
seek(s)Vai para um instante absoluto, em segundosplayer.seek(120); // pula para 2min
seekBy(delta)Avança ou retrocede a partir da posição atualplayer.seekBy(-10); // volta 10s
seekToLive()Vai para o ponto ao vivo mais recente (conteúdo live)player.seekToLive();
replay()Reinicia o conteúdo atual do zeroplayer.replay();
retry()Tenta recarregar depois de um erro, preservando a posição atualawait player.retry();
reload()Recarrega o conteúdo atual do inícioawait player.reload();
unload()Descarrega a mídia sem destruir a instânciaawait player.unload();
destroy()Destrói a instância e libera todos os recursosawait player.destroy();
trickPlay(rate)Reproduz em velocidade diferente de 1x (avanço/retrocesso rápido)player.trickPlay(2); // 2x
cancelTrickPlay()Volta à velocidade normal após trickPlay()player.cancelTrickPlay();
setStartTime(s)Define o instante inicial antes de carregar o conteúdoplayer.setStartTime(30);

Propriedades (leitura, e escrita quando indicado):

PropriedadeTipoExemplo de valor
currentTimenumber (leitura/escrita)player.currentTime → 42.3
durationnumberplayer.duration → 184.5
pausedbooleanplayer.paused → false
endedbooleanplayer.ended → false
seekingbooleanplayer.seeking → false
bufferedTimeRangesintervalos de mídia já baixados
seekableTimeRangesintervalos para onde dá para saltar
volumenumber (0–1, leitura/escrita)player.volume = 0.5;
mutedboolean (leitura/escrita)player.muted = true;
playbackRatenumber (leitura/escrita)player.playbackRate = 1.5;
posterstringURL da imagem de capa
srcstringURL do manifesto em reprodução
liveStatestring'live', 'ended', etc.
destroyedbooleantrue depois de destroy()
startTimeRequestednumber | undefinedvalor passado a setStartTime/startTime

Para desenhar controles próprios, player.media é o elemento de mídia efetivo (equivalente a um <video>) e player.engine é o motor de reprodução interno — durante uma sessão de Chromecast, os dois passam a apontar para o dispositivo remoto automaticamente, sem precisar tratar os dois casos no seu código.

Live e DVR

MétodoO que fazExemplo / retorno
isLive()Diz se o conteúdo atual é uma transmissão ao vivoplayer.isLive() → true
getSeekRange()Intervalo navegável da linha do tempo, em segundosplayer.getSeekRange() → { start: 0, end: 3600 }
getLiveLatency()Atraso atual em relação ao ponto ao vivo real, em segundosplayer.getLiveLatency() → 4.2
getDvrWindow()Duração da janela de DVR disponível, em segundosplayer.getDvrWindow() → 1800
isAtLiveEdge()Diz se a reprodução está exatamente no ponto ao vivoplayer.isAtLiveEdge() → false
getTimeUntilStart()Segundos até uma live agendada começar (0 se já começou)player.getTimeUntilStart() → 120
toggleSignal()Alterna entre os sinais de uma live com múltiplos ângulos/fontesplayer.toggleSignal();

Faixas

MétodoO que fazExemplo / retorno
getVideoQualities()Lista as qualidades de vídeo disponíveisplayer.getVideoQualities() → [{ height: 1080, ... }]
setVideoQuality(altura)Fixa a qualidade de vídeo por altura, ou libera o ABRplayer.setVideoQuality(720);
limitQuality(bool)Restringe a qualidade automática a um tetoplayer.limitQuality(true);
getAudioTracks()Lista as faixas de áudio disponíveisplayer.getAudioTracks() → [{ language: 'pt', ... }]
setAudioTrack(idioma, papel)Troca a faixa de áudio ativaplayer.setAudioTrack('en');
getTextTracks()Lista as faixas de legenda/CC disponíveisplayer.getTextTracks() → [{ language: 'pt', ... }]
setTextTrack(idioma)Troca a faixa de legenda ativaplayer.setTextTrack('en');
setTextTrackVisibility(bool)Mostra ou esconde a legenda atualplayer.setTextTrackVisibility(false);
isTextTrackVisible()Diz se a legenda está visível no momentoplayer.isTextTrackVisible() → true
getTextStyle() / setTextStyle(estilo)Lê/define a aparência da legenda (fonte, cor, fundo)player.setTextStyle({ fontSize: '120%' });

Playlist

MétodoO que fazExemplo / retorno
getPlaylist()Lista os itens da playlist atualplayer.getPlaylist() → [{ id, title, ... }]
getCurrentItem()Item da playlist tocando no momentoplayer.getCurrentItem() → { id, title, ... }
getCurrentItemIndex()Posição (índice) do item atual na playlistplayer.getCurrentItemIndex() → 2
playItem(i)Pula para um item específico da playlistplayer.playItem(0);
next()Avança para o próximo itemawait player.next();
previous()Volta para o item anteriorawait player.previous();

Interface

MétodoO que fazExemplo / retorno
showControls() / hideControls()Mostra ou esconde a barra de controles manualmenteplayer.hideControls();
setControlsVisible(bool)Define a visibilidade da barra diretamenteplayer.setControlsVisible(false);
setControls(nomes)Troca a lista de controles da barraplayer.setControls([]);
addControlButton(spec)Adiciona um botão próprio à barraver exemplo abaixo
removeControlButton(nome)Remove um botão adicionado com addControlButtonplayer.removeControlButton('ajuda');
setSkin(slug)Troca de skin com o vídeo já tocandoplayer.setSkin('tv');
skinSlug da skin ativa (leitura)player.skin → 'vibranium'
enterFullscreen() / exitFullscreen() / isFullscreen()Controla e consulta o modo tela cheiaplayer.isFullscreen() → false
enterPiP() / exitPiP() / isPiP()Controla e consulta o modo picture-in-pictureplayer.isPiP() → false
setTheme({ accent })Sobrescreve a cor de destaque da skin ativa em runtimeplayer.setTheme({ accent: '#ff0055' });
toast(mensagem, opcoes)Mostra um aviso temporário sobre o vídeoplayer.toast('Salvo!');

Adicionar um botão próprio à barra:

player.addControlButton({
  name: 'ajuda',
  label: 'Ajuda',
  icon: 'M11 18h2v-2h-2v2zm1-16A10…', // atributo `d` de um path SVG, viewBox 24x24
  onClick: () => player.toast('olá'),
});
player.removeControlButton('ajuda');

setControls(nomes) troca a lista inteira de controles da barra (a ordem do array é a ordem visual). Botões de plugin, rewind_10 e forward_10 não são reinseridos automaticamente — quem quiser mantê-los precisa nomeá-los. A lista completa de nomes aceitos está em Ajustes do player.

player.setControls(['play_pause', 'time_and_duration', 'spacer', 'fullscreen']);
player.setControls([]);   // volta ao padrão da skin/dispositivo
player.setControls(false); // mantém a barra oculta

Em lives, com ou sem DVR, a seleção de velocidade fica oculta por padrão em todas as skins. Para habilitá-la, inclua playback_rate na lista explícita de controls do construtor ou de setControls.

Publicidade e cast

MétodoO que fazExemplo / retorno
isAdPlaying()Diz se um anúncio está tocando no momentoplayer.isAdPlaying() → false
skipAd()Pula o anúncio atual, se ele permitir pularplayer.skipAd();
requestAds(vastUrl)Solicita a reprodução de um anúncio a partir de uma tag VASTplayer.requestAds('https://.../vast.xml');
getAdManager()Acesso ao gerenciador de anúncios interno, para casos avançadosplayer.getAdManager()
isCastAvailable()Diz se há um receptor de Chromecast na redeplayer.isCastAvailable() → true
startCast() / stopCast()Inicia ou encerra uma sessão de Chromecastawait player.startCast();
isCasting()Diz se uma sessão de Chromecast está ativaplayer.isCasting() → false
startAirPlay()Abre o seletor nativo de AirPlay (Safari/WebKit)player.startAirPlay();

Diagnóstico

MétodoO que fazExemplo / retorno
getStats()Estatísticas de reprodução (bitrate, quedas de quadro, etc.)player.getStats() → { bitrate: 2500000, ... }
getConfig()Configuração efetiva do conteúdo atualplayer.getConfig() → { isVod: true, ... }
updateConfig(patch)Aplica um ajuste pontual à configuração em runtimeplayer.updateConfig({ showInfo: true });
getSessionId()Identificador único da sessão de reprodução atualplayer.getSessionId() → 'a1b2c3...'
getViewId()Identificador único desta exibição de conteúdoplayer.getViewId() → 'x9y8z7...'
getChapters()Lista os capítulos do conteúdo, se houverplayer.getChapters() → [{ title, start }, ...]
seekToChapter(i)Pula para o início de um capítuloplayer.seekToChapter(2);
getPlugin(nome)Acessa a instância de um plugin já montadoplayer.getPlugin('comments')
use(ClassePlugin)Registra e monta um plugin diretamente nesta instânciaplayer.use(MeuPlugin);

Estáticos:

MétodoO que faz
SpallaPlayer.getPlayers()Lista todas as instâncias vivas na página
SpallaPlayer.getPlayerById(id)Busca uma instância pelo seu ID
SpallaPlayer.destroyAll()Destrói todas as instâncias da página
SpallaPlayer.registerPlugin(nome, fabrica)Registra um plugin próprio globalmente (ver skins e plugins)
SpallaPlayer.registerSkin(classe)Registra uma skin própria (ver skins e plugins)
SpallaPlayer.isSupported()Diz se o navegador atende aos requisitos mínimos
SpallaPlayer.versionVersão do player em uso

Vídeos 360 graus

Conteúdos marcados como sp_video_360 no backend ativam projeção equiretangular e navegação circular com quatro direções — arraste com mouse/toque, WASD e zoom com roda ou pinça.

  • O botão cardboard oferece tela dividida para visores simples (não é WebXR imersivo). Nas skins embarcadas ele entra automaticamente com os plugins; se informar uma lista personalizada de controles, inclua esse nome.
  • Durante anúncios, a projeção é suspensa e volta com direção e zoom preservados.
  • PiP, Cast, AirPlay e fullscreen exclusivo do vídeo (iPhone) ficam bloqueados nesses conteúdos; fullscreen por container permanece disponível.
  • Sem WebGL ou com DRM, há aviso e reprodução plana. TVs exibem vídeo plano, sem navegação por D-pad nesta etapa.
  • features: { 'video-360': false } desativa projeção e navegação. Fontes por URL direta não ativam 360 graus — a ativação depende da configuração do conteúdo.

Chromecast

O envio replica o estado do player para o dispositivo — a API pública inteira segue a sessão. Com cast ativo, player.currentTime é o tempo na TV, player.volume = 0.5 mexe no volume da TV e player.on('timeupdate') dispara com os eventos que vêm de lá. Controles próprios funcionam iguais nos dois modos:

player.on('timeupdate', () => (barra.value = player.currentTime));
botaoPlay.onclick = () => player.togglePlay(); // local ou na TV, tanto faz

Quem precisa do elemento real — para PiP, AirPlay ou desenhar num canvas — usa player.video, que é sempre o <video> local, mesmo durante o cast.

Um evento não atravessa para o Cast: durationchange. A duração continua correta em player.duration, só a notificação de mudança não chega.

App ID padrão do receptor Spalla: 3C6B9439. Para usar outro:

new SpallaPlayer('#player', { cast: { receiverAppId: 'XXXXXXXX' } });

Nesta página