M3U ou API Xtream : lequel utiliser vraiment

Le même fournisseur vous donnera les deux, et ce ne sont pas deux formats pour les mêmes données. L’un est une photographie, l’autre est une conversation.

Votre fournisseur vous a envoyé un e-mail avec un nom d’utilisateur, un mot de passe et un hôte. Le même e-mail, ou le même panneau, vous donnera aussi une longue URL qui télécharge un fichier de playlist. Ce ne sont pas 2 formats pour la même information. Ce ne sont pas les mêmes données en double, et choisir le mauvais vous coûte des fonctionnalités que vous supposerez plus tard absentes de l’application.

Ce que chacun est réellement

Un export M3U est un fichier texte : des noms de chaînes et des URL, générés à l’instant où vous l’avez demandé, avec quelques attributs attachés. C’est une photographie de votre ligne.

L’API Xtream est un unique point d’entrée HTTP qui répond à des questions. C’est une conversation avec votre ligne, et les réponses changent à mesure que la ligne change.

Concrètement, l’API est un seul script qui prend un paramètre action plutôt qu’un ensemble de ressources :

player_api.php?username=U&password=P                        handshake
player_api.php?username=U&password=P&action=get_live_categories
player_api.php?username=U&password=P&action=get_live_streams
player_api.php?username=U&password=P&action=get_live_streams&category_id=12
player_api.php?username=U&password=P&action=get_vod_info&vod_id=884
player_api.php?username=U&password=P&action=get_series_info&series_id=41
player_api.php?username=U&password=P&action=get_short_epg&stream_id=1201

Ce n’est pas une API REST et elle ne prétend pas l’être. C’est un point d’entrée de panneau, et cette forme a des conséquences sur lesquelles nous reviendrons.

L’export vit sur le même portail, sur un chemin différent. Un export et une session API sont donc 2 vues d’1 compte plutôt que 2 produits, ce qui fait de « lequel utiliser » une vraie question plutôt qu’une affaire de ce que votre fournisseur prend en charge.

Les trois choses que seule l’API peut exprimer

Les catégories comme données. Un export porte un attribut group-title par entrée, qui est une chaîne de caractères. L’API a des objets catégorie avec des identifiants, et les flux y font référence. Sur une petite playlist, la distinction est académique. Sur une vraie, elle ne l’est pas : une source de production dans notre propre échantillon portait environ 77 842 titres répartis sur environ 444 catégories, allant de 8 entrées à 3 655. Une liste plate de 77 842 éléments avec une chaîne répétée attachée est une structure de données différente d’un catalogue, et l’expérience de navigation découle de celle que vous avez.

Le quota de connexions. L’API rapporte combien de connexions simultanées votre ligne autorise. Un export ne peut pas le dire, parce qu’une liste d’URL n’a nulle part où le mettre.

Ce n’est pas un nombre décoratif. La multivue le lit et compte le budget avant d’attribuer une tuile, si bien que demander une grille de 9 tuiles sur une ligne à 2 connexions est refusé dans le sélecteur plutôt que sous la forme de 7 erreurs de lecture identiques sur la grille. Impossible sans l’API. Connexions maximales détaille la comptabilité.

L’archive. Un portail peut indiquer quelles chaînes conservent une fenêtre rembobinable et jusqu’où elle remonte. C’est toute la base du replay, et là encore il n’y a nulle part dans une ligne M3U pour l’exprimer.

La façon dont le client s’en sert compte : les URL de replay sont construites à partir d’une chaîne, d’une heure de début et d’une durée plutôt que lues programme par programme quelque part. Le portail nous dit que la fenêtre existe et nous construisons les adresses nous-mêmes. Ce que sont le replay et le timeshift explique le mécanisme.

Ce qu’une playlist fait encore mieux

Trois choses, et elles sont réelles plutôt que de simples consolations.

Elle fonctionne quand il n’y a pas de portail. Beaucoup de sources ne sont pas du tout des panneaux Xtream. Une liste de flux publics entretenue par une communauté, le fichier d’un diffuseur local, une playlist que vous avez écrite vous-même : aucune n’a d’API, et un M3U est le format universel pour elles.

Elle est inspectable. Ouvrez-la dans un éditeur de texte et vous voyez exactement ce que vous avez. Quand quelque chose ne va pas, pouvoir lire l’entrée vaut beaucoup, et une réponse d’API que vous ne pouvez pas voir est plus difficile à raisonner.

Elle survit. Un fichier que vous avez téléchargé fonctionne encore pendant que le panneau est en maintenance, au moins jusqu’à ce que les URL qu’il contient expirent.

Un point de donnée ici est facile à surinterpréter. Dans un corpus mesuré de 308 entrées de direct, 303 se terminaient en .m3u8, 5 n’avaient pas d’extension, et aucune ne se terminait en .ts. Ce corpus est fait de playlists de type annuaire, curatées, plutôt que d’exports de portail, donc il dit quelque chose de la façon dont les playlists publiques sont écrites et rien de ce que votre fournisseur sert. Nous ne détenons aucun corpus mesuré d’URL de direct de portail.

Ce qu’aucun des deux ne vous dit

Ni un export ni l’API ne disent à un client quel transport une chaîne utilise réellement. L’enregistrement d’une chaîne en direct dans notre catalogue n’a pas de champ conteneur, pas de champ transport et pas de champ MIME. Il n’y a nulle part où cette information pourrait vivre, parce qu’aucune des deux sources ne la fournit.

Le transport ne peut donc jamais qu’être déduit de la chaîne de l’URL, et le client demande .ts pour les chaînes en direct, sans branche et sans réglage. Un portail est libre de rediriger cela vers un manifeste HLS. Certains le font.

Il existe un contrôle Format de flux sur une source Xtream, et il ne fait actuellement rien. Il normalise sa valeur, l’enregistre et la recharge, et quand je suis allé chercher le constructeur d’URL ou le code de lecture qui la relit, je n’en ai pas trouvé, parce qu’il n’y en a pas. C’est sur la liste, plutôt qu’un interrupteur que vous n’arriveriez pas à trouver. MPEG-TS ou HLS explique ce que les deux transports font réellement de différent et pourquoi la distinction compte moins qu’il n’y paraît.

Ce qu’un export porte réellement, mesuré

L’argument pour un export est que les attributs de chaque ligne portent l’essentiel de ce dont un catalogue a besoin. C’est vrai quand ils sont présents, et leur fréquence de présence varie.

Mesuré sur 2 203 entrées de notre propre corpus :

                   entries   tvg-id          group-title   tvg-chno
playlist_01.m3u        308   308  (100%)     283           0
playlist_02.m3u8     1,895   1,392 (73.5%)   1,895         1,355

Les deux fichiers sont des playlists de type annuaire, curatées, plutôt que des exports de panneau, donc lisez ceci comme une démonstration de variance plutôt que comme une prédiction sur votre fournisseur.

Trois choses ressortent de ce tableau.

Les titres de groupe sont sur chaque entrée des deux fichiers. Le regroupement est l’attribut que les fournisseurs réussissent, parce que c’est celui qui casse visiblement leur propre produit s’ils l’omettent.

Les numéros de chaîne sont entièrement absents d’un fichier et présents sur 71 pour cent de l’autre. Si vous tenez à ce que vos chaînes apparaissent dans l’ordre de diffusion, c’est une vraie différence entre sources, et elle vaut d’être vérifiée avant de vous engager. Les numéros de chaîne dans une playlist explique ce que fait l’attribut.

Et 20 entrées du second fichier portent un attribut identifiant présent mais vide. Un identifiant vide n’est pas un identifiant, et le traiter comme tel rattacherait ces 20 chaînes les unes aux autres. Cela doit être géré explicitement plutôt que de tomber juste par chance dans le code.

Séries et films : là où les deux divergent le plus

Chaînes en direct : c’est là qu’un export s’approche le plus de l’adéquat, parce qu’une chaîne en direct est vraiment un nom et une URL. Le contenu à la demande est là où l’écart s’ouvre.

Un film dans un export est une ligne : un titre et une URL. Un film via l’API est un objet avec son propre appel de détail, où vivent l’intrigue, la distribution, l’année, la note et l’extension de conteneur.

Ce dernier point n’est pas un luxe. L’API rapporte l’extension de conteneur d’un film, et le client construit l’URL à partir d’elle :

live      portal/live/username/password/{stream_id}.ts
film      portal/movie/username/password/{vod_id}.{container_ext}

Le direct est un .ts fixe. Le film est ce que le panneau dit qu’il est, parce que les films sont des fichiers stockés avec de vrais conteneurs et qu’un client qui devinerait devinerait mal.

Les séries sont plus loin encore sur le même axe. Un export aplatit une série en une liste d’URL d’épisodes dont les noms encodent la saison et l’épisode si vous avez de la chance. L’API a un objet série, un appel de détail par série, et des épisodes groupés par saison. Une bibliothèque de séries qui se comporte comme une bibliothèque de séries plutôt que comme un dossier de fichiers a besoin que cette structure vienne de quelque part.

Combiner des fournisseurs, et où ce travail se fait

Dès que vous avez plus d’une source, le souhait évident est une seule liste de chaînes plutôt que deux, avec la même chaîne de deux fournisseurs apparaissant une fois et basculant entre eux.

C’est pris en charge, et la règle qui le sous-tend explique les caractéristiques de performance. Le serveur stocke la définition d’une source agrégée et rien d’autre : la résolution et la matérialisation s’exécutent toujours sur l’appareil.

La fusion, l’appariement et l’index se font donc tous sur la machine sur laquelle vous regardez. Cela laisse le service ignorant du contenu de votre playlist, ce qui est la même règle qui l’empêche d’analyser votre M3U en premier lieu. Le coût, c’est que le travail est fait une fois par appareil plutôt qu’une fois par compte, ce qui explique en partie pourquoi un premier lancement après l’ajout d’une grande source est plus lent que tous les lancements suivants.

Le basculement de lecture entre sources est livré par-dessus. Une chaîne qui existe dans deux sources peut passer à l’autre quand la première échoue.

Un troisième type de portail

Le couple M3U et API de panneau n’est pas le monde entier. Une troisième famille est le middleware Stalker et Ministra, l’écosystème derrière les décodeurs MAG, et il authentifie un appareil plutôt qu’un compte. L’identifiant est une adresse MAC plutôt qu’un nom d’utilisateur et un mot de passe, si bien que la notion qu’a un fournisseur du nombre d’appareils que vous possédez est liée à cette identité plutôt qu’à une connexion.

Si votre fournisseur vous a donné une URL de portail et une adresse MAC, c’est ce que vous avez. Ce n’est aucune des deux options comparées ici.

Lequel choisir

Si votre fournisseur vous a donné un hôte, un nom d’utilisateur et un mot de passe, utilisez-les. Ajoutez une source Xtream. Vous obtenez le catalogue avec de vraies catégories, le nombre de connexions qui rend la multivue honnête, et le replay là où le fournisseur le propose. L’export ne vous donne rien de tout cela et aucun avantage compensatoire.

Si vous avez une playlist et rien d’autre, utilisez la playlist. C’est à cela qu’elle sert, et l’essentiel de l’application fonctionne à l’identique.

Si vous avez les deux et que vous déboguez quelque chose, l’export est un diagnostic utile même quand l’API est ce sur quoi vous tournez. C’est le seul artefact que vous pouvez lire.

La seule chose à ne pas faire est d’ajouter les deux comme sources séparées et d’attendre de l’application qu’elle comprenne qu’il s’agit de la même ligne. Ce sont 2 sources, chacune consommant des connexions, et la comptabilité des connexions aura raison à propos d’une situation que vous n’aviez pas voulue.

Pour amener l’un ou l’autre sur une console, ajouter une playlist M3U pour Xbox et se connecter avec Xtream Codes pour Xbox couvrent la même décision côté configuration. Pour ce que signifient les attributs à l’intérieur d’un export, M3U+ face au M3U simple.

Ce que cet article a mesuré22 affirmations, chacune avec les preuves derrière elles
RéclamationPreuveCompté
L’API du panneau est un seul point d’entrée qui prend un paramètre action, pas un ensemble de ressources. Quinze actions couvrent tout le catalogue : catégories et flux pour le direct, la vidéo et les séries, plus les infos par élément, un guide court et une table de données.n = 1531 août 2026
Les URL de flux sont construites par le client à partir d’un modèle plutôt que lues dans la réponse de l’API : le direct utilise un suffixe .ts et la vidéo à la demande utilise une extension de conteneur que l’API rapporte.n = 231 août 2026
L’export M3U est servi par le même portail sur un chemin différent, si bien qu’un export et une session API sont deux vues d’un seul compte plutôt que deux produits.n = 131 août 2026
Le contrôle Format de flux proposé sur une source Xtream normalise, enregistre et recharge sa valeur, et n’est lu par aucun constructeur d’URL ni aucun code de lecture.n = 123 août 2026
L’enregistrement d’une chaîne en direct ne porte aucun champ de conteneur, de transport ni de type MIME, donc le transport ne peut jamais qu’être déduit de l’URL plutôt que lu dans le catalogue.n = 123 août 2026
Le quota de connexions rapporté par un portail est utilisé plutôt que simplement affiché : la multivue le compte avant d’attribuer une tuile et cesse de proposer des chaînes d’une source épuisée.n = 115 août 2026
Les URL de replay sont construites par le client à partir d’une chaîne, d’une heure de début et d’une durée, plutôt que lues programme par programme dans le guide.n = 123 août 2026
Une source de production dans notre propre échantillon portait environ 77 842 titres distincts répartis sur environ 444 catégories de fournisseur, les catégories individuelles allant de 8 à 3 655 entrées.n = 131 août 2026
Mesuré sur 2 203 entrées de notre propre corpus de playlists : la couverture des identifiants était de 100 pour cent dans un fichier et de 73.5 pour cent dans l’autre, les numéros de chaîne étaient entièrement absents d’un fichier et présents sur 1 355 entrées de l’autre, et les titres de groupe figuraient sur chaque entrée des deux.n = 220331 août 2026
Combiner plusieurs fournisseurs en une seule liste de chaînes est, par conception, une opération côté client : le serveur stocke la définition d’une source agrégée et rien d’autre, et la résolution comme la matérialisation s’exécutent toujours sur l’appareil.n = 131 août 2026
Une troisième famille de portails est prise en charge à côté des playlists et de l’API du panneau : le middleware Stalker et Ministra, qui authentifie un appareil plutôt qu’un compte.n = 131 août 2026
Treize familles d’état de compte se synchronisent entre appareils, et la playlist n’en fait pas partie : ce qui voyage est la définition de la source et vos décisions à son sujet.n = 131 sept. 2026
Les préférences par source forment leur propre famille synchronisée, distincte de la source elle-même, ce qui explique comment un réglage fait à un endroit atteint un appareil qui n’offre aucun éditeur pour lui.n = 11 sept. 2026
Deux familles de surcharges existent et la distinction compte : les surcharges de présentation sont liées à une source, tandis que les corrections de guide sont au niveau du profil et indépendantes de toute source.n = 21 sept. 2026
Un compte contient au plus 10 playlists téléversées, vérifié au moment où un téléversement est initialisé plutôt qu’à son achèvement.n = 11 sept. 2026
Quelle que soit la voie choisie, le serveur ne l’analyse pas : un import de fichier est stocké chiffré, un import d’URL enregistre des métadonnées, et l’analyse se fait sur l’appareil qui le lira.n = 11 sept. 2026
Une adresse collée est acceptée jusqu’à 2048 caractères, ce qui couvre largement les URL porteuses de jeton qu’un portail émet.n = 11 sept. 2026
Le quota de connexions rapporté par l’API est exploité plutôt qu’affiché : une disposition le compte avant d’attribuer une tuile et cesse de proposer des chaînes d’une source épuisée.n = 115 août 2026
Le basculement entre sources coûte une connexion supplémentaire pendant le chevauchement, donc le planificateur refuse chaque fois que cette connexion n’est pas prouvée disponible et retombe sur un redémarrage ordinaire.n = 11 sept. 2026
Les données de guide se configurent séparément de la source dans les deux cas, le mode global acceptant jusqu’à 15 URL et le mode par pays avertissant au-delà de 5 pays.n = 21 sept. 2026
Les fichiers de guide sont téléchargés par vos appareils plutôt que par nos serveurs, ce qui est dit sur l’écran des réglages plutôt que laissé comme détail d’implémentation.n = 11 sept. 2026
Dans un corpus de playlists mesuré, 303 des 308 chemins de direct se terminaient en .m3u8, 5 n’avaient pas d’extension, et aucun ne se terminait en .ts. Ce corpus est fait de fichiers de type annuaire, curatés, plutôt que d’exports de portail, et ne dit rien de ce qu’un portail sert.n = 30823 août 2026