10.12.2025, 12:17
@Muxosat: já třeba ani nevím k čemu tam ta diakritika slouží. Od začátku mám defaultně BEZ a nikdy nebyl problém
|
Hodnocení tématu:
365 EPG Generator (2.30.0)
|
from lxml import etree
def filter_xmltv(input_path, output_path, channel_ids, mode="include", replace_dict=None):
"""
Filtruje XMLTV soubor podle seznamu ID kanálů a volitelně nahrazuje ID.
:param input_path: cesta ke vstupnímu XMLTV souboru
:param output_path: cesta pro výstupní XMLTV soubor
:param channel_ids: seznam ID kanálů
:param mode: "include" nebo "exclude"
:param replace_dict: slovník pro nahrazení ID {původní_id: nové_id}, default None
"""
assert mode in ("include", "exclude"), "mode musí být 'include' nebo 'exclude'"
parser = etree.XMLParser(remove_blank_text=False)
tree = etree.parse(input_path, parser)
root = tree.getroot()
# Funkce rozhodující, zda kanál/progam zůstanou
def keep_channel(cid):
if mode == "include":
return cid in channel_ids
else: # exclude
return cid not in channel_ids
# Filtruj <channel> a nahraď ID, pokud je ve slovníku
kept_channels = set() # uložení zachovaných ID po nahrazení
for ch in root.findall("channel"):
original_id = ch.get("id")
if not keep_channel(original_id):
root.remove(ch)
continue
new_id = replace_dict.get(original_id, original_id) if replace_dict else original_id
ch.set("id", new_id)
kept_channels.add(new_id)
# Filtruj <programme> a nahraď channel ID podle slovníku
for prog in root.findall("programme"):
original_id = prog.get("channel")
if not keep_channel(original_id):
root.remove(prog)
continue
new_id = replace_dict.get(original_id, original_id) if replace_dict else original_id
# pouze pokud nový ID stále patří mezi zachované kanály
if new_id in kept_channels:
prog.set("channel", new_id)
else:
root.remove(prog)
# Ulož XMLTV se zachováním formátování
tree.write(
output_path,
encoding="utf-8",
xml_declaration=True,
pretty_print=True
)