Skip to main content

260916-IPTV-Publiques — la télévision publique européenne dans Jellyfin

1. Le besoin, et pourquoi pas les proxys ni un VPN

Regarder les télévisions publiques européennes (Rai en tête) depuis la maison. La page 322 raconte les deux impasses de la journée : les proxys seedbox.fr sont des IP de datacenter OVH que la Rai refuse, et un VPN grand public aurait coûté un abonnement pour un résultat incertain.

La troisième voie est la bonne : les diffuseurs publics publient eux-mêmes leurs flux HLS, et le projet communautaire iptv-org les recense par pays. Un flux HLS est une simple URL .m3u8. Il n'y a rien à contourner — seulement à trier ce qui répond réellement depuis le VPS, et à le servir proprement.

Décision de Julien : c'est Jellyfin qui joue la TV. Le VPS porte déjà Jellyfin ; une liste M3U branchée en tuner y ajoute une section « TV en direct » visible sur la télé, la tablette et les téléphones de toute la famille, avec logos, numéros de chaînes et groupes par pays.

2. Ce que fait generer_playlist.py

Toutes les 6 heures sur le VPS (cron 15 */6 * * *), stdlib seule :

  1. lit les listes iptv-org des pays concernés ;
  2. n'en garde que les chaînes de la liste blanche config.json (regex sur le nom) ; ajoute les candidats supplémentaires connus hors liste (les flux CloudFront de Rai 1 et Rai 3, le flux officiel d'arte) ; écarte d'office les hôtes en adresse IP nue et streamhostingcdn (rediffusions pirates) ;
  3. teste chaque candidat : playlist HLS → variante la plus haute → téléchargement d'un vrai segment, avec mesure du débit. Un segment qui n'arrive pas, une playlist vide, un débit sous 3 Mbit/s = KO ;
  4. retient le candidat le plus rapide par chaîne, avec une préférence de stabilité pour celui de la fois précédente ;
  5. écrit tv_publiques.m3u (tvg-id, logo, tvg-chno, group-title = pays) dans /home/debian/jellyfin/config/ (= /config/ dans le conteneur, lu par le tuner) et dans /home/debian/Documents/IPTV/ (= D:\Syncthing\IPTV\, pour VLC depuis n'importe quelle machine) ;
  6. si la liste a changé, demande à Jellyfin de relire son guide (POST /ScheduledTasks/Running/{RefreshGuide}, clé API dédiée iptv-publiques dans /home/debian/.iptv_publiques.env, hors Syncthing) ;
  7. termine par la ligne que lit le canari : === BILAN: 21/41 chaînes vivantes, 0 perdue — absentes : … ===.

« Perdue » ≠ « absente ». Une chaîne géobloquée depuis toujours est absente et ne fait pas parler le canari ; une chaîne vivante au passage précédent et morte maintenant est perdue, et là le canari chante (attendu: "BILAN: .*0 perdue", journal iptv_publiques.log, cadence 8 h). Hystérésis : au premier échec la chaîne est conservée dans la M3U avec son flux précédent (? au journal) ; elle n'est déclarée perdue qu'au second passage raté. Sans cela, les flux RTP « Not 24/7 » faisaient chanter le canari pour rien — constaté dès le second passage.

--simulation teste et affiche sans rien écrire, --verbeux détaille chaque candidat. explorer.py it de … liste et teste toutes les chaînes publiques d'un pays : c'est l'outil pour enrichir la liste blanche.

3. Relevé du 2026-09-16 depuis le VPS — 21 chaînes vivantes sur 41 demandées

Pays Vivantes Absentes et pourquoi
Italie Rai 1, Rai 2, Rai 3, Rai News 24, Rai Storia, Rai Scuola (CloudFront tiers, 80-95 Mbit/s), Rai Südtirol (flux officiel wzstreaming.rai.it) Rai 4, Gulp, Sport : flux officiels géobloqués
Espagne TVE Internacional (le flux officiel RTVE pour l'Europe), Teledeporte, Clan La 1, La 2, 24 Horas : HTTP 451 — RTVE bloque les IP d'hébergeur (mais répond depuis la maison)
Allemagne Das Erste HD, Tagesschau 24, KiKA, hr-fernsehen, SR Fernsehen — tous flux officiels ARD, ouverts au monde ZDF, 3sat : n'existent que via antik.sk, trop lent ; Phoenix, ZDFinfo/neo : géobloqués ; BR, NDR, WDR, ARD-alpha, MDR : géoblocage doux (voir §4)
Arte arte (flux officiel Akamai, 140 Mbit/s) —
Belgique BX1 (Bruxelles) La Une, Tipik : uniquement via des IP nues (écartées) ; VRT absente des listes
Portugal RTP 1, RTP Notícias, RTP Açores (flux officiels) — intermittents, [Not 24/7] RTP 2
Danemark Folketinget (le parlement, Kaltura) DR1, DR2 : géobloqués
Suisse aucune SRF/RTS/RSI : absentes des listes ou géobloquées
Autriche aucune ORF 1/2 : IP nues ; ORF III : géoblocage doux
Luxembourg aucune RTL Télé Lëtzebuerg : géoblocage doux
Pays-Bas aucune NPO : géobloqués

Vérifié de bout en bout : tuner créé par l'API (POST /LiveTv/TunerHosts, type m3u, URL /config/tv_publiques.m3u, User-Agent navigateur), guide rafraîchi, 21 chaînes vues par Jellyfin, puis lecture de Rai 2 par le vrai enchaînement client (PlaybackInfo → LiveStreams/Open) : Jellyfin sonde le flux (hls, h264 1080p, aac) et répond SupportsDirectPlay: true — aucun transcodage, le VPS ne fait que relayer.

4. Pièges rencontrés

  1. Les listes iptv-org ne sont pas la Rai. Rai 1/2/3 y viennent de rediffuseurs tiers (un CloudFront anonyme, un opérateur slovaque). Ils peuvent disparaître : d'où le test à chaque passage et l'hystérésis, plutôt qu'une liste figée.
  2. Un flux « OK » n'est pas forcément jouable : dash2/dash4.antik.sk répond 200 mais sert ses segments au rythme du direct (~1 Mbit/s), mesuré depuis le VPS et depuis la maison. En lecture ça coupe. D'où la mesure de débit et le seuil debit_min_mbit: 3. ZDF et 3sat n'ont pas d'autre source : absentes.
  3. Géoblocage doux : ARD régionales, RTL.lu et ORF III resservent la playlist master à la place de la variante — HTTP 200, aucune erreur, et un lecteur naïf tourne en rond. Détecté par « la variante contient encore #EXT-X-STREAM-INF ».
  4. Le dernier segment d'un direct n'est pas toujours servi (404 fugace sur Das Erste) : le test prend l'avant-avant-dernier et réessaie une fois.
  5. La géographie n'est pas la même depuis la maison et depuis le VPS : RTVE La 2 joue depuis la Livebox (IP Orange) et répond 451 depuis OVH. Jellyfin étant sur le VPS, c'est le VPS qui fait foi — la M3U de Syncthing est la même, VLC à la maison n'aura pas RTVE La 2 même si elle marcherait.
  6. PlaybackInfo seul fait croire à un transcodage (ContainerNotSupported, VideoCodecNotSupported, ffmpeg à 170-290 % CPU) : Jellyfin ne sonde un tuner M3U qu'à l'ouverture (RequiresOpening: true → LiveStreams/Open). Après l'ouverture, direct play. Les ffmpeg de mes premiers essais ont tourné 2 min à 3 cœurs — tués à la main (pgrep -x ffmpeg).
  7. pkill -f 'motif' lancé par plink -m script tue la session elle-même : le motif figure dans la ligne de commande du bash qui l'exécute. Passer par pgrep -x sur le nom du processus.
  8. streaming-live.rtp.pt répond 204 No Content hors antenne ([Not 24/7]) : un 204 est traité comme vide, pas comme un succès.
  9. arte : l'entrée « arte » de la liste France est une IP nue ; le flux officiel est artesimulcast.akamaized.net/hls/live/2030993/artelive_de/index.m3u8 (celui de la liste allemande, marqué à tort [Geo-blocked] — il répond depuis la France). Le chemin artelive_fr n'existe pas.

5. Utilisation et entretien

  • Regarder : Jellyfin → TV en direct (ou Live TV) → les chaînes par groupe de pays. Sur la télé, les numéros 1-7 sont l'Italie.
  • VLC ailleurs : Média → Ouvrir un flux réseau → D:\Syncthing\IPTV\tv_publiques.m3u (ou son équivalent sur chaque machine).
  • Ajouter une chaîne : python3 explorer.py <pays> sur le VPS pour voir ce qui répond, puis une ligne dans chaines de config.json (nom, pays, motif, groupe, éventuels candidats). Le passage suivant l'inclut si elle vit.
  • Voir l'état : tail -3 /home/debian/logs/iptv_publiques.log, ou la page de veille du matin (« Tâches nocturnes »).
  • Retour arrière : supprimer le tuner dans Jellyfin (Tableau de bord → TV en direct), retirer la ligne de cron (sauvegarde /home/debian/crontab.bak-260916), effacer les deux tv_publiques.m3u.

Pas encore fait — le guide des programmes (EPG). Les tvg-id iptv-org (Rai1.it, DasErste.de…) sont ceux du projet iptv-org/epg, qui sait produire un XMLTV par chaîne ; Jellyfin l'accepte en fournisseur de guide XMLTV. Un grabber Node à faire tourner, à évaluer si le « qu'est-ce qui passe ? » manque à l'usage.

6. Fichiers

Jux-scripts/IPTV-Publiques/ : generer_playlist.py (production), config.json (liste blanche, sorties, seuils), explorer.py (exploration), README.md, doc_bookstack.md (cette page). Sur le VPS : journal /home/debian/logs/iptv_publiques.log, état /home/debian/logs/iptv_publiques.etat.json, clé API dans /home/debian/.iptv_publiques.env (chmod 600). Canari : entrée IPTV-Publiques dans Etat-Infra/config.json.