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éclamation | Preuve | Compté |
|---|---|---|
| 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 = 15 | 31 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 = 2 | 31 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 = 1 | 31 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 = 1 | 23 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 = 1 | 23 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 = 1 | 15 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 = 1 | 23 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 = 1 | 31 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 = 2203 | 31 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 = 1 | 31 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 = 1 | 31 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 = 13 | 1 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 = 1 | 1 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 = 2 | 1 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 = 1 | 1 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 = 1 | 1 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 = 1 | 1 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 = 1 | 15 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 = 1 | 1 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 = 2 | 1 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 = 1 | 1 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 = 308 | 23 août 2026 |