Reprodução
Uma única regra: ninguém monta URLs de vídeo na mão. Você pede
GET /v1/videos/{id}/playback e passa hls_url para o seu player. Nosso
próprio dashboard funciona do mesmo jeito.
Quando chamar
Chame /playback quando o player abrir, nunca antes. No Strict, um link tem
dez minutos para começar; um link preparado com antecedência pode já estar
morto quando o espectador apertar play.
| Você chama a partir de | Use para |
|---|---|
| Sua página web ou app, sem key | Vídeos públicos em Open ou Protected |
| Seu backend, com a secret key | Vídeos privados e workspaces em Strict |
Parâmetros de query opcionais:
viewer_id: um id opaco seu (o id do seu usuário, uma vaga de curso). Ele viaja dentro do link e chega aos nossos logs, então um link vazado pode ser rastreado até quem o recebeu.
O que você recebe
| Campo | O que é |
|---|---|
hls_url |
Playlist mestre. Passe para o player. null se renderiza ou é original. |
original_url |
O original intacto. Mesma expiração e segurança do hls_url. |
poster_url |
Imagem fixa para o poster do player, ou null. |
thumbnails_url |
Sprite WebVTT para as prévias de seek, ou null. |
embed_url |
Nosso player hospedado (iframe). No Strict só funciona com esta URL exata. |
expires_at |
Quando o link para de funcionar (ISO 8601), ou null no Open. |
security |
O nível aplicado: open, protected, strict ou maximum. |
delivery |
hls ou original. Veja abaixo. |
duration_sec |
Duração do vídeo em segundos. |
O token vive no path (/hls/t/{token}/…) porque o AVPlayer, o Chromecast e
os apps nativos não conseguem enviar headers. Todo playlist e segmento sob
esse path já está assinado; você nunca assina nada por conta própria.
Original ou HLS
Todo vídeo guarda o arquivo original exatamente como você o enviou ou importou.
Nunca transcodificamos o original. Você escolhe um delivery ao enviar ou importar:
hls(padrão): a XonaPlay renderiza HLS adaptativo a partir do original. Reproduzahls_url.original: nenhuma transcodificação. O original é o que você reproduz e baixa. Useoriginal_url.
Enquanto o HLS ainda está sendo renderizado, hls_url é null e original_url
já funciona. original_url aceita requisições por byte-range. Com original,
hls_url é sempre null.
A XonaPlay garante hls_url em todos os dispositivos. Quais players conseguem
reproduzir original_url depende do formato: mp4 com H.264 funciona em quase
todos; mkv e HEVC podem não funcionar. Essa escolha é sua.
Sem HLS, poster_url e thumbnails_url são null, a menos que o dono do vídeo
tenha definido um poster próprio.
Vídeos guardados no seu próprio servidor (BYO) retornam original_url: null.
Para passar um vídeo enviado com original para HLS, envie PATCH /v1/videos/{id}
com "delivery": "hls". A mudança só vai em um sentido, e o original_url
continua funcionando nesse meio-tempo.
Expiração
| Nível | O link funciona por |
|---|---|
| Open | Para sempre |
| Protected | Duração do vídeo + 1 hora (2 a 24 horas) |
| Strict | 10 minutos para começar, depois duração do vídeo + 30 minutos (1 a 24 horas) |
Uma aba pausada pode durar mais que o seu link. Isso é esperado: o player se recupera.
Regra do "Recarregar"
Toda receita nestes docs segue os mesmos quatro passos:
- Diante de qualquer erro fatal do player (um 403 em um segmento, um erro de
rede, um erro de decodificação), chame
/playbackde novo — no máximo uma vez por minuto — e retome no mesmo segundo. - Se a resposta trouxer
hls_url, carregue-a e dê seek de volta. - Se a resposta for um erro, mostre sua
message. Ofereça o botão Recarregar só quando ocodefor reexecutável (veja a tabela abaixo). - Se o player falhar de novo dentro de 60 segundos, não chame nada: mostre Recarregar, que volta ao passo 1.
A decisão vem do JSON de /playback, que qualquer cliente HTTP consegue ler.
Não dependa de headers HTTP do host do vídeo: o AVPlayer não consegue lê-los.
Erros
Os erros usam o mesmo envelope do resto da API:
{ "status": "error", "code": "KEY_REQUIRED", "message": "This video needs a secret key." }code |
HTTP | Tentar de novo? |
|---|---|---|
NOT_FOUND |
404 | Não |
KEY_REQUIRED |
401 | Não. Chame pelo seu backend com a key. |
INVALID_KEY |
401 | Não |
DOMAIN_NOT_ALLOWED |
403 | Não |
WORKSPACE_UNAVAILABLE |
403 | Não |
ACCESS_DENIED |
403 | Não |
VIDEO_NOT_READY |
409 | Sim, mais tarde |
LIVE_NOT_ACTIVE |
409 | Sim, mais tarde |
RATE_LIMITED |
429 | Sim, após Retry-After |
| 5xx ou uma resposta sem JSON | — | Sim |
O host do vídeo (não o /playback) responde a um link morto com um
401/403/503 simples e um header X-Xona-Error — TOKEN_EXPIRED,
TOKEN_REVOKED, NETWORK_CHANGED, MAXIMUM_UNAVAILABLE… Ele existe para
depuração; seu player só precisa seguir a regra de recarregar, e
MAXIMUM_UNAVAILABLE (503) é reexecutável como os demais.
Ao vivo
As transmissões ao vivo usam o mesmo contrato:
curl https://api.xonaplay.com/v1/live/{STREAM_ID}/playbackLIVE_NOT_ACTIVE significa que a transmissão ainda não entrou no ar. Tente
de novo mais tarde ou mostre uma contagem regressiva.