diff --git a/app/tools/epg.py b/app/tools/epg.py index 02dcc8a6..1c340d06 100644 --- a/app/tools/epg.py +++ b/app/tools/epg.py @@ -29,6 +29,7 @@ """ Module for working with epg.dat file. """ import abc import os +import re import shutil import struct import sys @@ -374,32 +375,39 @@ class ChannelsParser: refs = [] dom = parse(path) description = "".join(n.data + "\n" for n in dom.childNodes if n.nodeType == Node.COMMENT_NODE) + pos_pat = re.compile(r"^\d+\.\d+[EW]$") for elem in dom.getElementsByTagName("channels"): c_count = 0 comment_count = 0 - current_data = "" + data = "" + ch_id = None + pos = None + ch_type = BqServiceType.DEFAULT if elem.hasChildNodes(): for n in elem.childNodes: + if n.nodeType == Node.ELEMENT_NODE: + ch_id = n.getAttribute("id") + if n.nodeType == Node.COMMENT_NODE: c_count += 1 comment_count += 1 txt = n.data.strip() + + if re.match(pos_pat, txt): + pos = txt + if comment_count: comment_count -= 1 else: - ref_data = current_data.split(":") - refs.append(BouquetService(name=txt, - type=BqServiceType.DEFAULT, - data="{}:{}:{}:{}".format(*ref_data[3:7]).upper(), - num="{}:{}:{}".format(*ref_data[3:6]).upper())) + refs.append(BouquetService(name=txt, type=ch_type, data=data.upper(), num=(pos, ch_id))) if n.hasChildNodes(): for s_node in n.childNodes: if s_node.nodeType == Node.TEXT_NODE: comment_count -= 1 - current_data = s_node.data + data = s_node.data return refs, description @staticmethod diff --git a/app/ui/epg/dialog.glade b/app/ui/epg/dialog.glade index c9f14430..79323082 100644 --- a/app/ui/epg/dialog.glade +++ b/app/ui/epg/dialog.glade @@ -907,7 +907,6 @@ Author: Dmitriy Yefremov 50 True - True True False True diff --git a/app/ui/epg/epg.py b/app/ui/epg/epg.py index 886df5c6..47bd05bd 100644 --- a/app/ui/epg/epg.py +++ b/app/ui/epg/epg.py @@ -663,12 +663,20 @@ class EpgDialog: except Exception as e: raise ValueError(f"{get_message('XML parsing error:')} {e}") else: - if refs: - s_refs = filter(lambda x: x.num in refs, s_refs) - + refs = refs or {} factor = self._app.DEL_FACTOR / 4 + for index, srv in enumerate(s_refs): - self._services_model.append((srv.name, " ", srv.data, "")) + ref_data = srv.data.split(":") + ref = ":".join(ref_data[3:6]) + if ref in refs: + continue + + data = ":".join(ref_data[3:7]) + pos, ch_id = srv.num + pos = pos or " " + self._services_model.append((srv.name, pos, data, "_".join(ref_data))) + if index % factor == 0: yield True @@ -811,7 +819,7 @@ class EpgDialog: def services_filter_function(self, model, itr, data): txt = self._filter_entry.get_text().upper() pos = model.get_value(itr, 1) - pos = self._sat_positions is None or self._xml_radiobutton.get_active() or pos in self._sat_positions + pos = self._sat_positions is None or pos in self._sat_positions return model is None or model == "None" or (txt in model.get_value(itr, 0).upper() and pos) def on_info_bar_close(self, bar=None, resp=None):