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