import json import xml.etree.ElementTree as ET from datetime import datetime import gzip import io import re def clean_html(text): if not text: return "" #
zu Zeilenumbruch machen text = re.sub(r'', '\n', text, flags=re.IGNORECASE) # alle anderen HTML-Tags entfernen text = re.sub(r'<.*?>', '', text) return text.strip() def format_time(xmltv_time): dt = datetime.fromisoformat(xmltv_time.replace('Z', '+00:00')) return dt.strftime('%Y%m%d%H%M%S %z') def convert_to_xmltv(json_data): tv = ET.Element("tv", {"generator-info-name": "Pluxbox EPG Exporter"}) # Einmaliger Channel-Eintrag channel = ET.SubElement(tv, "channel", {"id": "stadtfilter"}) display_name = ET.SubElement(channel, "display-name") display_name.text = "Radio Stadtfilter" for day in json_data["days"]: for item in day["results"]: programme = ET.SubElement(tv, "programme", { "start": format_time(item["start"]), "stop": format_time(item["stop"]), "channel": "stadtfilter" }) ET.SubElement(programme, "title", {"lang": "de"}).text = item["title"] desc = item.get("description", "") if desc: #clean_desc = clean_html(desc) ET.SubElement(programme, "desc", {"lang": "de"}).text = clean_html(desc) if item.get("language"): ET.SubElement(programme, "language").text = item["language"] if item.get("genre_id"): ET.SubElement(programme, "category", {"lang": "de"}).text = str(item["genre_id"]) # Presenter if item.get("presenters"): credits = ET.SubElement(programme, "credits") for presenter in item["presenters"]: ET.SubElement(credits, "presenter").text = presenter["name"] return ET.ElementTree(tv) # Einlesen und Schreiben with open("sample.json", "r", encoding="utf-8") as f: json_data = json.load(f) # XML generieren xmltv_tree = convert_to_xmltv(json_data) # In String schreiben xml_io = io.StringIO() xmltv_tree.write(xml_io, encoding="unicode", xml_declaration=True) xml_string = xml_io.getvalue() # Als .xml.gz speichern with gzip.open("epg_stadtfilter.xml.gz", "wt", encoding="utf-8") as f: f.write(xml_string)