diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py index 9b3fa889..ae9efb9f 100644 --- a/app/eparser/ecommons.py +++ b/app/eparser/ecommons.py @@ -57,12 +57,18 @@ Bouquet.__new__.__defaults__ = (None, BqServiceType.DEFAULT, [], None, None, Non Bouquets = namedtuple("Bouquets", ["name", "type", "bouquets"]) BouquetService = namedtuple("BouquetService", ["name", "type", "data", "num"]) -# ***************** Satellites *******************# +# *************** *.xml [Satellites, Terrestrial, Cable] ***************** # Satellite = namedtuple("Satellite", ["name", "flags", "position", "transponders"]) +Terrestrial = namedtuple("Terrestrial", ["name", "flags", "countrycode", "transponders"]) +Cable = namedtuple("Cable", ["name", "flags", "satfeed", "countrycode", "transponders"]) Transponder = namedtuple("Transponder", ["frequency", "symbol_rate", "polarization", "fec_inner", "system", "modulation", "pls_mode", "pls_code", "is_id", "t2mi_plp_id"]) +TerTransponder = namedtuple("TerTransponder", ["centre_frequency", "system", "bandwidth", "constellation", + "code_rate_hp", "code_rate_lp", "guard_interval", "transmission_mode", + "hierarchy_information", "inversion", "plp_id", "comment"]) +CableTransponder = namedtuple("CableTransponder", ["frequency", "symbol_rate", "fec_inner", "modulation"]) class TrType(Enum): diff --git a/app/eparser/satxml.py b/app/eparser/satxml.py index 46f2d9c2..75ea7cf8 100644 --- a/app/eparser/satxml.py +++ b/app/eparser/satxml.py @@ -26,51 +26,63 @@ # -""" Module for parsing satellites.xml file. +""" Module for parsing *.xml files. - For more info see __COMMENT + For more info see comments. """ from xml.dom.minidom import parse, Document from app.commons import log -from .ecommons import POLARIZATION, FEC, SYSTEM, MODULATION, Transponder, Satellite, get_key_by_value +from .ecommons import POLARIZATION, FEC, SYSTEM, MODULATION, Transponder, Satellite, get_key_by_value, Terrestrial, \ + Cable -__COMMENT = (" File was created in DemonEditor\n\n" - "usable flags are\n" - " 1: Network Scan\n" - " 2: use BAT\n" - " 4: use ONIT\n" - " 8: skip NITs of known networks\n" - " and combinations of this.\n\n" +_SAT_COMMENT = (" File was created in DemonEditor\n\n" + "usable flags are\n" + " 1: Network Scan\n" + " 2: use BAT\n" + " 4: use ONIT\n" + " 8: skip NITs of known networks\n" + " and combinations of this.\n\n" - "transponder parameters:\n" - "polarization: 0 - Horizontal, 1 - Vertical, 2 - Left Circular, 3 - Right Circular\n" - "fec_inner: 0 - Auto, 1 - 1/2, 2 - 2/3, 3 - 3/4, 4 - 5/6, 5 - 7/8, 6 - 8/9, 7 - 3/5,\n" - "8 - 4/5, 9 - 9/10, 15 - None\n" - "modulation: 0 - Auto, 1 - QPSK, 2 - 8PSK, 4 - 16APSK, 5 - 32APSK\n" - "rolloff: 0 - 0.35, 1 - 0.25, 2 - 0.20, 3 - Auto\n" - "pilot: 0 - Off, 1 - On, 2 - Auto\n" - "inversion: 0 = Off, 1 = On, 2 = Auto (default)\n" - "system: 0 = DVB-S, 1 = DVB-S2\n" - "is_id: 0 - 255\n" - "pls_mode: 0 - Root, 1 - Gold, 2 - Combo\n" - "pls_code: 0 - 262142\n\n") + "transponder parameters:\n" + "polarization: 0 - Horizontal, 1 - Vertical, 2 - Left Circular, 3 - Right Circular\n" + "fec_inner: 0 - Auto, 1 - 1/2, 2 - 2/3, 3 - 3/4, 4 - 5/6, 5 - 7/8, 6 - 8/9, 7 - 3/5,\n" + "8 - 4/5, 9 - 9/10, 15 - None\n" + "modulation: 0 - Auto, 1 - QPSK, 2 - 8PSK, 4 - 16APSK, 5 - 32APSK\n" + "rolloff: 0 - 0.35, 1 - 0.25, 2 - 0.20, 3 - Auto\n" + "pilot: 0 - Off, 1 - On, 2 - Auto\n" + "inversion: 0 = Off, 1 = On, 2 = Auto (default)\n" + "system: 0 = DVB-S, 1 = DVB-S2\n" + "is_id: 0 - 255\n" + "pls_mode: 0 - Root, 1 - Gold, 2 - Combo\n" + "pls_code: 0 - 262142\n\n") def get_satellites(path): - return parse_satellites(path) + """ Returns data [Satellite] list from *.xml. """ + return [parse_sat(elem) for elem in parse(path).getElementsByTagName("sat") if elem.hasAttributes()] + + +def get_terrestrial(path): + """ Returns data [Terrestrial] list from *.xml. """ + return [parse_terrestrial(elem) for elem in parse(path).getElementsByTagName("terrestrial") if elem.hasAttributes()] + + +def get_cable(path): + """ Returns data [Cable] list from *.xml. """ + return [parse_cable(elem) for elem in parse(path).getElementsByTagName("cable") if elem.hasAttributes()] def write_satellites(satellites, data_path): """ Creation satellites.xml file """ doc = Document() - comment = doc.createComment(__COMMENT) + comment = doc.createComment(_SAT_COMMENT) doc.appendChild(comment) root = doc.createElement("satellites") doc.appendChild(root) for sat in satellites: - # Create Element + # Create Element sat_child = doc.createElement("sat") sat_child.setAttribute("name", sat.name) sat_child.setAttribute("flags", sat.flags) @@ -136,16 +148,14 @@ def parse_sat(elem): parse_transponders(elem, sat_name)) -def parse_satellites(path): - """ Parsing satellites from xml. """ - dom = parse(path) - satellites = [] +def parse_terrestrial(elem): + atr = elem.attributes + return Terrestrial(atr["name"].value, None, None, []) - for elem in dom.getElementsByTagName("sat"): - if elem.hasAttributes(): - satellites.append(parse_sat(elem)) - return satellites +def parse_cable(elem): + atr = elem.attributes + return Cable(atr["name"].value, None, None, None, []) if __name__ == "__main__": diff --git a/app/ui/xml/edit.py b/app/ui/xml/edit.py index 02154056..9c01d817 100644 --- a/app/ui/xml/edit.py +++ b/app/ui/xml/edit.py @@ -34,6 +34,7 @@ from gi.repository import GLib from app.commons import run_idle from app.connections import DownloadType from app.eparser import get_satellites, write_satellites, Satellite, Transponder +from app.eparser.satxml import get_terrestrial, get_cable from .dialogs import SatelliteDialog, TransponderDialog, SatellitesUpdateDialog from ..dialogs import show_dialog, DialogType, get_chooser_dialog, get_message, get_builder from ..main_helper import move_items, on_popup_menu @@ -65,7 +66,10 @@ class SatellitesTool(Gtk.Box): self._current_sat_path = None self._dvb_type = self.DVB.SAT - handlers = {"on_remove": self.on_remove, + handlers = {"on_satellite_view_realize": self.on_satellite_view_realize, + "on_terrestrial_view_realize": self.on_terrestrial_view_realize, + "on_cable_view_realize": self.on_cable_view_realize, + "on_remove": self.on_remove, "on_update": self.on_update, "on_up": self.on_up, "on_down": self.on_down, @@ -90,8 +94,17 @@ class SatellitesTool(Gtk.Box): self._app.connect("profile-changed", lambda a, m: self.load_satellites_list()) self.show() + def on_satellite_view_realize(self, view): self.load_satellites_list() + def on_terrestrial_view_realize(self, view): + gen = self.on_terrestrial_list_load() + GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + + def on_cable_view_realize(self, view): + gen = self.on_cable_list_load() + GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + def load_satellites_list(self, path=None): gen = self.on_satellites_list_load(path) GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) @@ -145,12 +158,23 @@ class SatellitesTool(Gtk.Box): def on_satellites_list_load(self, path=None): """ Load satellites data into model """ - model = self._satellite_view.get_model() + path = path or self._settings.profile_data_path + "satellites.xml" + yield from self.load_data(self._satellite_view, get_satellites, path) + + def on_terrestrial_list_load(self, path=None): + path = path or self._settings.profile_data_path + "terrestrial.xml" + yield from self.load_data(self._terrestrial_view, get_terrestrial, path) + + def on_cable_list_load(self, path=None): + path = path or self._settings.profile_data_path + "cables.xml" + yield from self.load_data(self._cable_view, get_cable, path) + + def load_data(self, view, func, path): + model = view.get_model() model.clear() try: - path = path or self._settings.profile_data_path + "satellites.xml" - satellites = get_satellites(path) + data = func(path) yield True except FileNotFoundError as e: msg = get_message("Please, download files from receiver or setup your path for read data!") @@ -159,8 +183,8 @@ class SatellitesTool(Gtk.Box): msg = f"The file [{path}] is not formatted correctly or contains invalid characters! Cause: {e}" self._app.show_error_message(msg) else: - for sat in satellites: - yield model.append(sat) + for d in data: + yield model.append(d) def on_add(self, item): """ Common adding. """ diff --git a/app/ui/xml/editor.glade b/app/ui/xml/editor.glade index 33391aa7..9de9cb40 100644 --- a/app/ui/xml/editor.glade +++ b/app/ui/xml/editor.glade @@ -37,6 +37,12 @@ Author: Dmitriy Yefremov + + + + + + @@ -205,7 +211,9 @@ Author: Dmitriy Yefremov - + + + @@ -215,12 +223,20 @@ Author: Dmitriy Yefremov + + + + + + + + @@ -343,6 +359,7 @@ Author: Dmitriy Yefremov + multiple @@ -455,6 +472,7 @@ Author: Dmitriy Yefremov True True + multiple @@ -553,6 +571,7 @@ Author: Dmitriy Yefremov True True + multiple @@ -573,21 +592,6 @@ Author: Dmitriy Yefremov - - - 85 - Pos - 0.49000000953674316 - - - 0.49000000953674316 - - - 2 - - - -