Dateien nach "/" hochladen
This commit is contained in:
70
convertjson2xmltv-gz.py
Normal file
70
convertjson2xmltv-gz.py
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
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)
|
||||||
1
sample.json
Normal file
1
sample.json
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user