# EPG Quellen zusammenführen
# by Smiley007 Version 1.0 22.02.2025
import requests
import xml.etree.ElementTree as ET
import gzip
import io
import os
# Liste der Quellen (URLs oder lokale Dateien, auch .gz)
sources = [
"http://xyz.com/epg1.xml.gz", # Gzip-komprimierte Datei
"http://abc.com/epg2.xml", # Normale XML-Datei
"/home/user/epg3.xml.gz" # Lokale Gzip-Datei
]
# Zielpfad für die komprimierte Datei
output_file = "/var/www/html/epg/merged_epg.xml.gz"
def fetch_epg(source):
"""Lädt eine EPG-Datei von einer URL oder lokalem Pfad, unterstützt auch .gz Dateien."""
if source.startswith("http://") or source.startswith("https://"):
response = requests.get(source, stream=True)
if response.status_code == 200:
if source.endswith(".gz"):
with gzip.GzipFile(fileobj=io.BytesIO(response.content)) as f:
return ET.parse(f).getroot()
else:
return ET.fromstring(response.content)
else:
print(f"Fehler beim Abrufen von {source}: HTTP {response.status_code}")
return None
else:
try:
if source.endswith(".gz"):
with gzip.open(source, "rb") as f:
return ET.parse(f).getroot()
else:
return ET.parse(source).getroot()
except Exception as e:
print(f"Fehler beim Laden der Datei {source}: {e}")
return None
def merge_epg(sources, output_path):
"""Fügt mehrere EPG-Dateien zusammen und speichert sie als GZIP-komprimierte XML-Datei."""
root = ET.Element("tv") # Neues XMLTV-Root-Element
for source in sources:
epg = fetch_epg(source)
if epg is None:
continue # Überspringe fehlerhafte Quellen
# Sender hinzufügen (falls noch nicht vorhanden)
for channel in epg.findall("channel"):
root.append(channel)
# Programme hinzufügen
for programme in epg.findall("programme"):
root.append(programme)
# Sicherstellen, dass der Zielordner existiert
os.makedirs(os.path.dirname(output_path), exist_ok=True)
# XML als String speichern
xml_str = ET.tostring(root, encoding="utf-8", xml_declaration=True)
# XML GZIP-komprimiert speichern
with gzip.open(output_path, "wb") as f:
f.write(xml_str)
print(f"Neue GZIP-komprimierte EPG-Datei gespeichert: {output_path}")
# EPGs zusammenführen und speichern
merge_epg(sources, output_file)