Teil 1 – Raspberry Pi 3B, TVHeadend, DIGIBIT TWIN, Astra 19,2°E, easyEPG/XMLTV und Senderlogos

In dieser sechsteiligen Serie entsteht Schritt für Schritt ein eigener TV-Server. Der Kern ist ein Raspberry Pi 3B, der die verschiedenen Empfangswege in TVHeadend zusammenführt. In diesem ersten Teil bauen wir die Basis: Satellitenfernsehen über einen Telestar DIGIBIT TWIN, Programmdaten per XMLTV/easyEPG und lokale Senderlogos.

Hinweis: Diese Serie beschreibt die technische Einbindung von Empfangs- und Streamingquellen, auf die man rechtmäßig zugreifen darf. Für Zattoo, TV4 Play und andere kontogebundene Angebote werden eigene gültige Zugänge vorausgesetzt. Zugangsdaten, Tokens und persönliche Kennungen gehören niemals in eine öffentliche M3U-Datei oder in einen Blogbeitrag. Verfügbarkeit, Senderangebot und Stream-Adressen können sich ändern.

1. Ausgangslage

Für den ursprünglichen Aufbau wurde folgende Hardware verwendet:

  • Raspberry Pi 3 Model B, 1 GB RAM
  • microSD-Karte, im Projekt später 128 GB
  • Debian 12 / Bookworm bereits installiert und per LAN erreichbar
  • Telestar DIGIBIT TWIN als SAT>IP-Server
  • Sat-Anlage für Astra 19,2° Ost
  • Gigabit-/Fast-Ethernet-Heimnetz; der Pi selbst arbeitet beim 3B mit 100-Mbit-Ethernet

Der DIGIBIT TWIN besitzt zwei SAT-Eingänge und stellt zwei SAT>IP-Tuner im Netzwerk bereit. Telestar beschreibt das Gerät ausdrücklich als SAT>IP-Server für zwei Teilnehmer mit zwei F-Buchsen und Ethernet-Anschluss.

Raspberry Pi 3B mit Display im Hutschienegehäuse im Schaltschrank
TELESTAR Digibit Twin

 

Beispieladressen dieser Anleitung


Raspberry Pi / TVHeadend: 192.168.1.20
DIGIBIT TWIN:             192.168.1.30
Router:                   192.168.1.1

TVHeadend-Admin:          tvadmin
Passwort:                 CHANGE-ME-NOW

Die Adressen sind absichtlich Dummywerte. Für beide Geräte empfiehlt sich eine feste DHCP-Zuweisung im Router.

2. Grundpakete installieren


sudo apt update
sudo apt full-upgrade -y

sudo apt install -y \
  curl wget git unzip jq nano ca-certificates \
  ffmpeg mbuffer socat libxml2-utils \
  python3 python3-venv python3-pip

3. TVHeadend aus dem offiziellen Repository installieren

TVHeadend empfiehlt für Debian und Raspberry Pi OS das offizielle Paket-Repository. Die 4.3er-Reihe ist inzwischen die laufend aktualisierte stabile Version.


curl -1sLf 'https://dl.cloudsmith.io/public/tvheadend/tvheadend/setup.deb.sh' | sudo -E bash

sudo apt update
sudo apt install -y tvheadend

sudo systemctl enable --now tvheadend
sudo systemctl status tvheadend --no-pager

Danach ist die Weboberfläche unter http://192.168.1.20:9981/ erreichbar. Der HTSP-Port für Kodi und andere Clients ist standardmäßig 9982.

TVHeadend – erste Weboberfläche

 

4. Ersteinrichtung von TVHeadend

Im Assistenten habe ich folgende Grundstruktur verwendet:

  1. Sprache: Deutsch.
  2. Erlaubtes Netzwerk: das eigene LAN, zum Beispiel 192.168.1.0/24.
  3. Administratorkonto anlegen.
  4. Optional ein getrenntes Benutzerkonto für Kodi/Clients anlegen.
  5. Den DVB-Teil des Assistenten zunächst nur grob konfigurieren; die eigentliche SAT>IP-Konfiguration erfolgt anschließend.

5. DIGIBIT TWIN zuverlässig an TVHeadend übergeben

Normalerweise findet TVHeadend SAT>IP-Geräte per SSDP automatisch. Im fertigen Aufbau wurde der DIGIBIT zusätzlich explizit über seine SAT>IP-Gerätebeschreibung angegeben. Das macht den Aufbau deterministisch.

In /etc/default/tvheadend wird die vorhandene Variable OPTIONS um den SAT>IP-XML-Endpunkt ergänzt:

sudo nano /etc/default/tvheadend

Beispiel:

OPTIONS="--satip_xml http://192.168.1.30:38400/description.xml"

Anschließend:

sudo systemctl restart tvheadend
sudo systemctl status tvheadend --no-pager

Unter Konfiguration → DVB-Eingänge → TV-Adapter sollten nun zwei SAT>IP-DVB-S-Tuner erscheinen.

Die zwei SAT>IP-Tuner

 

6. Astra 19,2° Ost als DVB-S-Netzwerk anlegen

Unter Konfiguration → DVB-Eingänge → Netzwerke wird ein neues DVB-S-Netzwerk angelegt:

Name:              Astra 19.2E
Typ:               DVB-S
Vordefinierte Muxe: Astra 19.2E
Netzwerksuche:      aktiv

Danach jeden der beiden SAT>IP-Tuner öffnen und bei Netzwerke das Netzwerk Astra 19.2E zuweisen. TVHeadend beginnt anschließend mit dem Einlesen der Muxe und Dienste.

Astra-Netzwerk
Muxe

 

7. Dienste zu Kanälen mappen

Wenn die Suche abgeschlossen ist:

Konfiguration → DVB-Eingänge → Dienste → Dienste zu Kanälen zuordnen.

Für einen aufgeräumten Server lohnt sich danach eine eigene Nummernlogik. In meinem Aufbau hat sich folgendes Schema bewährt:

1–99     Fernsehsender
100–199  private Radios / Internet-Radio
200–299  öffentlich-rechtliche Radios
300–399  technische Kanäle / Kameras / Testbilder

Zusätzlich können Tags wie TV, Radio, SAT, IPTV und Favoriten vergeben werden.

8. easyEPG lite installieren

TVHeadend kann EPG-Daten direkt aus DVB empfangen. Für den später gemischten SAT-/IPTV-Aufbau wollte ich jedoch eine einheitliche XMLTV-Quelle. Dafür läuft easyEPG lite separat auf Port 4000. Das Projekt kann Sender auswählen, eigene EPG-IDs vergeben, XMLTV erzeugen und die Aktualisierung planen.

sudo useradd --system \
  --home /opt/easyepg \
  --shell /usr/sbin/nologin \
  easyepg

sudo git clone https://github.com/sunsettrack4/script.service.easyepg-lite.git /opt/easyepg

sudo python3 -m venv /opt/easyepg/venv

sudo /opt/easyepg/venv/bin/pip install --upgrade pip
sudo /opt/easyepg/venv/bin/pip install \
  bottle beautifulsoup4 cheroot curl-cffi pytz requests xmltodict

sudo chown -R easyepg:easyepg /opt/easyepg

systemd-Dienst für easyEPG

sudo tee /etc/systemd/system/easyepg.service >/dev/null <<'EOF'
[Unit]
Description=easyEPG lite XMLTV service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=easyepg
Group=easyepg
WorkingDirectory=/opt/easyepg
ExecStart=/opt/easyepg/venv/bin/python /opt/easyepg/main.py
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now easyepg
sudo systemctl status easyepg --no-pager

Die Oberfläche liegt nun unter http://192.168.1.20:4000/.

easyEPG konfigurieren

  1. Passendes Lineup bzw. die gewünschte EPG-Quelle auswählen.
  2. Nur die tatsächlich benötigten Sender aktivieren.
  3. Jedem Sender eine eindeutige EPG-ID geben.
  4. Sendernamen kontrollieren.
  5. XMLTV-Erzeugung aktivieren.
  6. Den internen Scheduler so planen, dass die XMLTV-Datei vor unserem TVHeadend-Import fertig ist.

Wichtig ist die EPG-ID. Sie ist später die Verbindung zwischen Kanal und Programmdaten.

easyEPG
Scheduler und XMLTV

 

9. XMLTV über den TVHeadend-Socket importieren

Im fertigen System wurde der XMLTV-Import nicht von Hand angestoßen, sondern täglich per systemd-Timer in den externen XMLTV-Socket von TVHeadend geschrieben.

Zuerst in TVHeadend unter Konfiguration → Kanal / EPG → EPG-Grabber-Module das Modul
External: XMLTV aktivieren. Danach sollte der Socket vorhanden sein:

sudo systemctl restart tvheadend
sudo ls -l /var/lib/tvheadend/epggrab/xmltv.sock

Importscript

sudo tee /usr/local/sbin/easyepg-import.sh >/dev/null <<'EOF'
#!/bin/bash
set -euo pipefail

URL='http://127.0.0.1:4000/download/epg.xml'
SOCKET='/var/lib/tvheadend/epggrab/xmltv.sock'
TMP="$(mktemp)"

cleanup() {
  rm -f "$TMP"
}
trap cleanup EXIT

curl -fsS "$URL" -o "$TMP"

python3 - "$TMP" <<'PY'
import sys
import xml.etree.ElementTree as ET
ET.parse(sys.argv[1])
print("XMLTV ist gültig")
PY

cat "$TMP" | socat - "UNIX-CONNECT:$SOCKET"
EOF

sudo chmod 755 /usr/local/sbin/easyepg-import.sh

systemd-Service

sudo tee /etc/systemd/system/easyepg-import.service >/dev/null <<'EOF'
[Unit]
Description=easyEPG XMLTV in TVHeadend importieren
After=network-online.target easyepg.service tvheadend.service
Wants=network-online.target
Requires=tvheadend.service

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/easyepg-import.sh
EOF

Täglicher Timer um 05:30 Uhr

sudo tee /etc/systemd/system/easyepg-import.timer >/dev/null <<'EOF'
[Unit]
Description=Täglicher easyEPG-Import

[Timer]
OnCalendar=*-*-* 05:30:00
Persistent=true
Unit=easyepg-import.service

[Install]
WantedBy=timers.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now easyepg-import.timer

# einmal sofort testen
sudo systemctl start easyepg-import.service

systemctl status easyepg-import.timer --no-pager

Danach unter Konfiguration → Kanal / EPG → Kanäle die passende XMLTV-Quelle den Kanälen zuordnen. Sind die IDs sauber gewählt, erscheint anschließend das Programm im EPG.

TVHeadend-EPG nach dem XMLTV-Import

10. Senderlogos / Picons lokal hinterlegen

Die Logos speichere ich bewusst lokal. Damit hängt die Darstellung nicht von externen Bildservern ab.

sudo mkdir -p /usr/local/share/tvheadend/picons
sudo chown -R root:video /usr/local/share/tvheadend/picons
sudo chmod -R 755 /usr/local/share/tvheadend/picons

Beispiel:

/usr/local/share/tvheadend/picons/
├── das-erste-hd.png
├── zdf-hd.png
├── mdr-sachsen-hd.png
└── arte-hd.png

In Konfiguration → Kanal / EPG → Kanäle wird im Feld Icon beispielsweise eingetragen:

file:///usr/local/share/tvheadend/picons/das-erste-hd.png

Für veröffentlichte Logo-Dateien sind selbstverständlich die jeweiligen Marken- und Nutzungsrechte zu beachten. Für den privaten TVHeadend-Server genügt es, die benötigten Logos aus zulässigen Quellen lokal abzulegen.

Kanallogos werden später in den Clients (z.B. KODI) angezeigt oder wie hier im EPG Detailfenster

Kanalliste mit hinterlegten Logos

11. Funktionstest

systemctl status tvheadend --no-pager
systemctl status easyepg --no-pager
systemctl status easyepg-import.timer --no-pager

# TVHeadend-Playlist im Browser/VLC:
# http://192.168.1.20:9981/playlist

Damit steht die Basis: zwei SAT>IP-Tuner, Astra 19,2° Ost, Kanalliste, EPG und Logos. Im nächsten Teil kommen ORF, SRF und weitere Sender über Zattoo/Telerising dazu.

Quellen und weiterführende Dokumentation