Se andaste a fazer pesquisas sobre IPTV, viste duas expressões a repetir-se vezes sem conta: "URL M3U" e "Xtream Codes". Por baixo do capô são quase a mesma coisa, e quase todos os leitores modernos suportam as duas, mas a escolha conta — falham de formas diferentes, e trocar de uma para a outra é, muitas vezes, a forma mais barata de resolver um problema.

Esta é a comparação de um utilizador prático de IPTV, não uma análise do protocolo.

Comparação lado a lado: um leitor a ir buscar um único ficheiro playlist.m3u uma vez, contra o mesmo leitor a despachar três setas a turquesa para get.php, player_api.php e xmltv.php.

O M3U é uma transferência de um ficheiro; o Xtream é uma pequena API com a qual o leitor mantém conversa.

O que são, na realidade

O M3U é um ficheiro de texto plano. Abre um num editor de texto e vês um cabeçalho (#EXTM3U) seguido de uma sequência de linhas #EXTINF:… que emparelham cada canal com um URL de stream. É praticamente o formato mais simples que existe. O teu leitor descarrega o ficheiro uma vez, analisa-o e fica com a lista de canais.

#EXTM3U
#EXTINF:-1 tvg-id="bbc1" group-title="UK",BBC One HD
http://provider.example/live/bbc1/index.m3u8

É este o modelo de dados todo: uma lista de canais, cada um com um nome e um URL. Nada dinâmico. Se queres uma lista atualizada, voltas a descarregar o ficheiro.

O Xtream Codes é uma API HTTP. Dás ao leitor um servidor, um nome de utilizador e uma palavra-passe; o leitor chama uma mão-cheia de endpoints (get.php?type=m3u_plus, player_api.php, xmltv.php) para ir buscar a lista de canais, a biblioteca de VOD, o catálogo de séries e o guia como documentos separados. Os URLs de stream propriamente ditos são construídos pelo leitor a partir das credenciais e do ID do canal.

Em termos mecânicos, um login Xtream devolve quase sempre uma M3U num dos seus endpoints — quando "importas uma M3U" de um fornecedor Xtream, estás a usar uma chamada específica desta API. O contrário não é verdade: uma M3U pura não expõe mais nada.

Quando escolher cada

Usa M3U se:

  • Só te interessam canais em direto. A M3U não tem conceito de catálogo de VOD ou séries; se o teu fornecedor entrega isso, a M3U não os mostra.
  • Queres guardar uma cópia local. O ficheiro M3U é portátil — fazes backup, editas num editor de texto, partilhas um subconjunto cuidado com outra pessoa.
  • Não confias que o fornecedor vá ficar por aí. Uma M3U exportada continua a funcionar enquanto os URLs de stream lá dentro funcionarem, mesmo que o endpoint da API do fornecedor desapareça amanhã.
  • O fornecedor tem bugs. A M3U tem menos peças em movimento. Se a API Xtream deles é instável mas a exportação M3U funciona, usa simplesmente a M3U.

Usa Xtream Codes se:

  • Queres VOD e séries. Não aparecem em M3U pura.
  • Queres categorias que o leitor consiga usar de forma nativa. O Xtream envia "live", "VOD", "series" como árvores separadas; a M3U só tem strings group-title, que são convencionais mas não estruturadas.
  • Mudas de dispositivo com frequência e não queres voltar a importar. As credenciais Xtream funcionam em todo o lado, e qualquer leitor compatível pega exatamente na mesma biblioteca a partir delas.
  • Queres que o leitor atualize a lista de canais dinamicamente. O Xtream volta a ir buscar a cada sessão; a M3U é uma fotografia num momento.

Como saber qual é o teu

Se subscreveste um fornecedor e te mandaram uma única linha tipo:

http://server.example:8080/get.php?username=ABC&password=XYZ&type=m3u_plus&output=mpegts

Isso é um URL M3U. Podes colá-lo diretamente no testador de M3U para confirmar que funciona.

Se te mandaram três coisas — um URL de servidor, um nome de utilizador, uma palavra-passe — isso é um login Xtream. A maioria dos leitores modernos tem um formulário separado de "Adicionar fonte Xtream". Quase todos os fornecedores expõem alegremente os dois: as mesmas credenciais funcionam por ambas as interfaces, e podes usar o testador de M3U para verificar o endpoint da playlist e o validador de EPG para verificar o endpoint do guia, tudo sem instalar nada.

Modos de falha comuns (e para que forma trocar)

O mesmo fornecedor pode estar perfeitamente saudável numa interface e estragado na outra. Vale a pena conhecer seis modos de falha.

A M3U devolve HTML

Colas o URL no testador e obténs "o servidor devolveu uma página HTML". Normalmente significa que o endpoint M3U precisa de um cookie de sessão, ou que o teu fornecedor aplicou rate limit ao IP que está a aceder. Experimenta Xtream — os endpoints da API são, muitas vezes, menos restringidos do que a exportação em massa M3U.

O Xtream devolve "auth failed" mas a M3U funciona

Há fornecedores que atualizam a base de credenciais Xtream com atraso. O URL M3U é assinado no momento da emissão e continua a funcionar; a API rejeita-te porque ainda não pegou na nova palavra-passe. Espera uma hora, ou usa simplesmente a M3U.

Um leitor lê, outro não

O Xtream Codes é uma especificação de facto, não uma especificação real. Há fornecedores que dizem suportar Xtream mas só implementam dois dos endpoints normalmente esperados; há leitores que vão a um endpoint não-padrão e falham quando ele falta. Se um leitor não consegue ler o teu fornecedor Xtream mas lê M3U sem problemas, passa para M3U. O contrário é mais raro, mas acontece.

Logótipos de canais em falta na M3U, presentes no Xtream

Na M3U, os URLs dos logótipos são inline (tvg-logo="…"). No Xtream, são servidos por um endpoint de logótipos. Se a tua M3U tem URLs de logótipo malformados ou desatualizados, passar para Xtream volta a preenchê-los. O caso inverso (logótipos na M3U, em falta no Xtream) quase nunca acontece.

O EPG associa-se aos canais numa forma mas não na outra

O <channel id="…"> do XMLTV tem de bater certo com tvg-id="…" na M3U ou com o campo channel-id no Xtream. Estes IDs nem sempre são os mesmos nas duas formas — há fornecedores que os regeneram periodicamente. Se o teu guia está vazio em M3U mas preenchido em Xtream, os IDs estavam dessincronizados na M3U; usa Xtream.

Uma das formas é mais rápida

O Xtream numa rede lenta faz muito mais idas e voltas do que a M3U. Numa ligação instável, a diferença pode ser de 5 a 10 segundos no arranque. A M3U descarrega uma vez e continua a partir de dados locais. Se a velocidade no primeiro arranque te interessa, a M3U costuma ganhar.

O que o Klipa faz

O Klipa suporta as duas, trata-as como fontes intercambiáveis (podes ter uma M3U e um login Xtream lado a lado na mesma biblioteca) e volta a procurá-las em segundo plano. Se a M3U começa a devolver HTML, a sessão Xtream mantém a tua lista de canais viva até à próxima atualização. Se a autenticação Xtream se parte, a M3U em cache continua a funcionar.

A recomendação forte é: escolhe a que o teu fornecedor oferecer com mais fiabilidade, mas não sejas leal a uma forma. O formato não é o produto. Os canais é que são.