M3U-Datei umwandeln für TVHeadend

Ich habe eine M3U Datei mit frei empfangbaren Tv Sendern, diese würde ich gerne mit einem Programm erweitern lassen damit TVHeadend diese M3U lesen kann. es müsste aber on the fly sein, da ich die Datei von einem Server ziehe, und dann müsste das programm zu jedem Sender etwas dazuschreiben.

Da die Anfrage recht unspezifisch ist, ist es auch die Antwort :slight_smile:

Am flexibelsten wäre vermutlich ein kleines Progrämmchen in Go - das kann man für so ziemlich alle Umgebungen kompilieren und auch in Docker laufen lassen.

Im Grunde tuts aber jede Programmier- oder Scriptsprache, je nachdem was du hast. Wenns live on the fly sein soll wäre die Grundfunktionalität ein Web-Proxy, sprich das Ding muss nach außen HTTP sprechen, wird von TVHeadend aufgerufen, holt die M3U, passt sie an und liefert die angepasste Datei an TVHeadend - fertig.

Wie gesagt wäre mein Favorit Go - das kann von Haus aus einen Webserver bereitstellen, hat einen HTTP Client und dazwischen ist es eine Programmiersprache, die die M3U beliebig anpassen könnte. Noch dazu ist es als kompiliertes Programm recht performant und lässt sich gut in irgendwelche Services wie systemd, docker etc. einbinden.

1 „Gefällt mir“

kennst du so ein Programm?

Schau auch mal da
Wie EntertainTV Multicast über tvheadend?
und da
Unverschlüsselte Multicast-Kanäle mit anderen Geräten empfangen (Wiki)

Fertig kenne ich da nichts, das müsstest du selbst entwickeln.

Mir ist aber auch noch nicht ganz klar, wo die Liste herkommt bzw. was du genau machen willst.

Prinzipiell könnte der Ansatz eines Proxies, der die Antwort bearbeitet, schon funktionieren. Da gibt es einige Tools für. Allerdings „sprechen“ die jetzt nicht direkt M3Us. Also ob die Manipulationsmöglichkeiten ausreichen müsstest du ausprobieren. Oder die haben dann auch gleich eine Programmierschnittstelle, Winnie du aber auch wieder was entwickeln müsstest.

Ein möglicher Kandidat wäre
https://mitmproxy.org/

Oder auch diverse Security Tools bieten solche Funktionen, z.B. die Burp Suite. Die sind aber eher nicht dazu gedacht dauerhaft zu laufen.

in der Liste, eine normale .M3U Datei die auf einem freien Server zur Verfügung steht, steht es in etwa so

#EXTM3U
#EXTINF:-1 tvg-name=„Das Erste HD“
https://mcdn.daserste.de/daserste/de/master.m3u8

dann bräuchte ich ein Programm der dann den Pipe befehl dazu setzt

#EXTM3U
#EXTINF:-1 tvg-name=„Das Erste HD“
pipe://ffmpeg -loglevel fatal -i https://mcdn.daserste.de/daserste/de/master.m3u8 -vcodec copy -acodec copy -metadata service_provider=IPTV-DE -mpegts_service_type advanced_codec_digital_hdtv -f mpegts pipe:1

Verstehe… nicht allzu einfach aber auch nicht allzu komplex :wink:
Auf was für einem System läuft das TVHeadend denn? Kannst du da noch andere Programme laufen lassen?

ich habe ein Hyper-V dort ist ein Ubuntu Server 22.04 drauf, habe dort root zugriff, könnte also Programme drauf installieren

OK, dann mal schnell aus der Hüfte geschossen:

Im einfachsten Fall lädst du dir das Binary runter: https://github.com/iptv-blog/m3u-proxy/releases/download/latest/m3u-proxy
Andere Varianten stehen in der README.

Dann erstellst du eine config.yaml, Beispiel:

bind_address: 127.0.0.1:8080

routes:
  - path: /iptv
    sourceUrl: https://gist.githubusercontent.com/Axel-Erfurt/b40584d152e1c2f13259590a135e05f4/raw/5c7d9de47e3e8b9dfddf0df0449270f42efad891/celluloidTV.m3u
    urlPattern: "http.*"
    rewriteUrl: "pipe://ffmpeg -loglevel fatal -i $0 -vcodec copy -acodec copy -metadata service_provider=IPTV-DE -mpegts_service_type advanced_codec_digital_hdtv -f mpegts pipe:1"

Und dann startest du den Proxy mit ./m3u-proxy (wenn du das docker image nutzt, muss die Datei in den / Pfad des containers gemounted/kopiert werden)

Wenn du dann http://127.0.0.1:8080/iptv abrufst, sollte er die sourceUrl abrufen, das Pattern mit der rewriteUrl ersetzen und zurückgeben.
Die URL müsstest du dann auch beim TVHeadend angeben können (sofern beides auf dem gleichen Server liegt, sonst müsstest du die bind_address noch anpassen.
Und du musst dafür sorgen, dass der Proxy immer läuft.

1 „Gefällt mir“

ok ich bin nicht so ein super Linux Crack, ich habe die Datei heruntergeladen, habe sie per chmod 777 ausführbar gemacht, habe die config.yaml erstellt und dann das Programm gestartet, er sagte dann Server läuft, aber wenn ich mit der bind adresse dann drauf zugreifen will, funktioniert es nicht.

Hm… also dass der Server läuft ist ja schonmal gut, dann sollte die config schonmal passen und der Port auch frei sein.
Was heisst denn es funktioniert nicht? Kommt eine Fehlermeldung oder erreichst du den Server schon nicht? Erscheint was in der Ausgabe des Servers?
Ist TVHeadend denn auf der gleichen VM?
Ansonsten kannst du die bind_address mal auf 0.0.0.0:8080 ändern, damit sollte der Server auf allen Netzwerkinterfaces erreichbar sein und nicht mehr nur lokal. Dann müsstest du ihn über die IP-Adresse oder den Namen der VM auch übers Netzwerk aufrufen können.

1 „Gefällt mir“

er schreibt starting server on, und bleibt dann stehen

Eigentlich ganz einfach, auch mit PHP zu machen.
Von der Programmierung her denke ich mal, nicht mehr als 10 Zeilen.
Habe selber eine Playliste erstellt, wo ich den Link nur eintrage, der Rest trägt das Script ein.
Ok ist Youtube, aber lässt sich auch als M3U ausgeben.
Beschäftige dich mal damit.

Mehr kommt da auch nicht mehr, bis man eine Anfrage startet.
Also was passiert wenn du dann versuchst die m3u abzurufen?
z.B. mit
curl http://127.0.0.1:8080/iptv

Klar, geht auch mit PHP. Braucht man halt einen Webserver mit PHP dazu.

<?php
$url = 'https://gist.githubusercontent.com/Axel-Erfurt/b40584d152e1c2f13259590a135e05f4/raw/5c7d9de47e3e8b9dfddf0df0449270f42efad891/celluloidTV.m3u';

echo preg_replace('/http.*/','pipe://ffmpeg -loglevel fatal -i $0 -vcodec copy -acodec copy -metadata service_provider=IPTV-DE -mpegts_service_type advanced_codec_digital_hdtv -f mpegts pipe:1', file_get_contents($url));

?>

na passt doch dann.

Wenn das der eigene Server wäre, von dem er die Datei zieht, dann würde ich sie doch gleich im richtigen Format dort bereitstellen :thinking:
Aber gut, wie auch immer, viele Wege führen nach Rom.

1 „Gefällt mir“