71 lines
2.4 KiB
Python
71 lines
2.4 KiB
Python
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 ""
|
|
# <br> zu Zeilenumbruch machen
|
|
text = re.sub(r'<br\s*/?>', '\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("/export/scripts/weeklyepg.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("/var/www/html/stream/api/epg_stadtfilter.xml.gz", "wt", encoding="utf-8") as f:
|
|
f.write(xml_string)
|