diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py
index ae9efb9f..36148082 100644
--- a/app/eparser/ecommons.py
+++ b/app/eparser/ecommons.py
@@ -67,7 +67,7 @@ Transponder = namedtuple("Transponder", ["frequency", "symbol_rate", "polarizati
"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"])
+ "hierarchy_information", "inversion", "plp_id"])
CableTransponder = namedtuple("CableTransponder", ["frequency", "symbol_rate", "fec_inner", "modulation"])
@@ -201,6 +201,8 @@ SERVICE_TYPE = {"-2": "Data", "1": "TV", "2": "Radio", "3": "Data", "10": "Radio
# Terrestrial
BANDWIDTH = {"0": "8MHz", "1": "7MHz", "2": "6MHz", "3": "Auto", "4": "5MHz", "5": "1/712MHz", "6": "10MHz"}
+CONSTELLATION = {"0": "QPSK", "1": "16-QAM", "2": "64-QAM", "3": "Auto"}
+
T_MODULATION = {"0": "QPSK", "1": "QAM16", "2": "QAM64", "3": "Auto", "4": "QAM256"}
TRANSMISSION_MODE = {"0": "2k", "1": "8k", "2": "Auto", "3": "4k", "4": "1k", "5": "16k", "6": "32k"}
@@ -215,7 +217,7 @@ T_FEC = {"0": "1/2", "1": "2/3", "2": "3/4", "3": "5/6", "4": "7/8", "5": "Auto"
T_SYSTEM = {"0": "DVB-T", "1": "DVB-T2", "-1": "DVB-T/T2"}
# Cable
-C_MODULATION = {"0": "Auto", "1": "QAM16", "2": "QAM32", "3": "QAM64", "4": "QAM128", "5": "QAM256"}
+C_MODULATION = {"0": "QPSK", "1": "QAM16", "2": "QAM32", "3": "QAM64", "4": "QAM128", "5": "QAM256", "6": "Auto"}
# ATSC
A_MODULATION = {"0": "Auto", "1": "QAM16", "2": "QAM32", "3": "QAM64", "4": "QAM128", "5": "QAM256", "6": "8VSB",
diff --git a/app/eparser/satxml.py b/app/eparser/satxml.py
index 75ea7cf8..c5b7cc22 100644
--- a/app/eparser/satxml.py
+++ b/app/eparser/satxml.py
@@ -30,11 +30,12 @@
For more info see comments.
"""
-from xml.dom.minidom import parse, Document
+from xml.dom.minidom import Document
+import xml.etree.ElementTree as ETree
-from app.commons import log
-from .ecommons import POLARIZATION, FEC, SYSTEM, MODULATION, Transponder, Satellite, get_key_by_value, Terrestrial, \
- Cable
+from .ecommons import (POLARIZATION, FEC, SYSTEM, MODULATION, Transponder, Satellite, get_key_by_value,
+ Terrestrial, Cable, TerTransponder, CableTransponder, T_SYSTEM, BANDWIDTH, GUARD_INTERVAL,
+ TRANSMISSION_MODE, T_FEC, HIERARCHY, C_MODULATION, FEC_DEFAULT, Inversion, CONSTELLATION)
_SAT_COMMENT = (" File was created in DemonEditor\n\n"
"usable flags are\n"
@@ -60,17 +61,65 @@ _SAT_COMMENT = (" File was created in DemonEditor\n\n"
def get_satellites(path):
""" Returns data [Satellite] list from *.xml. """
- return [parse_sat(elem) for elem in parse(path).getElementsByTagName("sat") if elem.hasAttributes()]
+ return [Satellite(e.get("name", None),
+ e.get("flags", None),
+ e.get("position", None) or "0",
+ get_sat_transponders(e)) for e in ETree.parse(path).iter("sat")]
+
+
+def get_sat_transponders(elem):
+ """ Returns satellite transponders list. """
+ return [Transponder(e.get("frequency", "0"),
+ e.get("symbol_rate", "0"),
+ POLARIZATION[e.get("polarization", "0")],
+ FEC[e.get("fec_inner", "0")],
+ SYSTEM[e.get("system", "0")],
+ MODULATION[e.get("modulation", "0")],
+ e.get("pls_mode", None),
+ e.get("pls_code", None),
+ e.get("is_id", None),
+ e.get("t2mi_plp_id", None)) for e in elem.iter("transponder")]
def get_terrestrial(path):
""" Returns data [Terrestrial] list from *.xml. """
- return [parse_terrestrial(elem) for elem in parse(path).getElementsByTagName("terrestrial") if elem.hasAttributes()]
+ return [Terrestrial(e.get("name", None),
+ e.get("flags", None),
+ e.get("countrycode", None),
+ [get_ter_transponder(e) for e in e.iter("transponder")]
+ ) for e in ETree.parse(path).iter("terrestrial")]
+
+
+def get_ter_transponder(elem):
+ """ Returns terrestrial transponder. """
+ return TerTransponder(elem.get("centre_frequency", "0"),
+ T_SYSTEM.get(elem.get("system", None), None),
+ BANDWIDTH.get(elem.get("bandwidth", None), None),
+ CONSTELLATION.get(elem.get("constellation", None), None),
+ T_FEC.get(elem.get("code_rate_hp", None), None),
+ T_FEC.get(elem.get("code_rate_lp", None), None),
+ GUARD_INTERVAL.get(elem.get("guard_interval", None), None),
+ TRANSMISSION_MODE.get(elem.get("transmission_mode", None), None),
+ HIERARCHY.get(elem.get("hierarchy_information", None), None),
+ Inversion(elem.get("inversion")).name if "inversion" in elem.keys() else None,
+ elem.get("plp_id", None))
def get_cable(path):
""" Returns data [Cable] list from *.xml. """
- return [parse_cable(elem) for elem in parse(path).getElementsByTagName("cable") if elem.hasAttributes()]
+ return [Cable(e.get("name", None),
+ e.get("flags", None),
+ e.get("satfeed", None),
+ e.get("countrycode", None),
+ get_cable_transponders(e)) for e in ETree.parse(path).iter("cable")]
+
+
+def get_cable_transponders(elem):
+ """ Returns cable transponders list. """
+ return [CableTransponder(e.get("frequency", "0"),
+ e.get("symbol_rate", "0"),
+ FEC_DEFAULT[e.get("fec_inner", "0")],
+ C_MODULATION[e.get("modulation", "0")]) for e in elem.iter("transponder")]
def write_satellites(satellites, data_path):
@@ -114,49 +163,5 @@ def write_satellites(satellites, data_path):
doc.unlink()
-def parse_transponders(elem, sat_name):
- """ Parsing satellite transponders """
- transponders = []
- for el in elem.getElementsByTagName("transponder"):
- if el.hasAttributes():
- atr = el.attributes
- try:
- tr = Transponder(atr["frequency"].value,
- atr["symbol_rate"].value,
- POLARIZATION[atr["polarization"].value],
- FEC[atr["fec_inner"].value],
- SYSTEM[atr["system"].value],
- MODULATION[atr["modulation"].value],
- atr["pls_mode"].value if "pls_mode" in atr else None,
- atr["pls_code"].value if "pls_code" in atr else None,
- atr["is_id"].value if "is_id" in atr else None,
- atr["t2mi_plp_id"].value if "t2mi_plp_id" in atr else None)
- except Exception as e:
- message = f"Error: can't parse transponder for '{sat_name}' satellite! {repr(e)}"
- log(message)
- else:
- transponders.append(tr)
- return transponders
-
-
-def parse_sat(elem):
- """ Parsing satellite. """
- sat_name = elem.attributes["name"].value
- return Satellite(sat_name,
- elem.attributes["flags"].value,
- elem.attributes["position"].value,
- parse_transponders(elem, sat_name))
-
-
-def parse_terrestrial(elem):
- atr = elem.attributes
- return Terrestrial(atr["name"].value, None, None, [])
-
-
-def parse_cable(elem):
- atr = elem.attributes
- return Cable(atr["name"].value, None, None, None, [])
-
-
if __name__ == "__main__":
pass
diff --git a/app/ui/xml/edit.py b/app/ui/xml/edit.py
index 9c01d817..bd409b8e 100644
--- a/app/ui/xml/edit.py
+++ b/app/ui/xml/edit.py
@@ -64,6 +64,8 @@ class SatellitesTool(Gtk.Box):
self._settings = settings
self._current_sat_path = None
+ self._current_ter_path = None
+ self._current_cable_path = None
self._dvb_type = self.DVB.SAT
handlers = {"on_satellite_view_realize": self.on_satellite_view_realize,
@@ -79,7 +81,9 @@ class SatellitesTool(Gtk.Box):
"on_edit": self.on_edit,
"on_key_release": self.on_key_release,
"on_visible_page": self.on_visible_page,
- "on_satellite_selection": self.on_satellite_selection}
+ "on_satellite_selection": self.on_satellite_selection,
+ "on_terrestrial_selection": self.on_terrestrial_selection,
+ "on_cable_selection": self.on_cable_selection}
builder = get_builder(f"{UI_RESOURCES_PATH}xml/editor.glade", handlers)
@@ -87,11 +91,17 @@ class SatellitesTool(Gtk.Box):
self._terrestrial_view = builder.get_object("terrestrial_view")
self._cable_view = builder.get_object("cable_view")
self._sat_tr_view = builder.get_object("sat_tr_view")
- builder.get_object("sat_pos_column").set_cell_data_func(builder.get_object("sat_pos_renderer"),
- self.sat_pos_func)
+ self._ter_tr_view = builder.get_object("ter_tr_view")
+ self._cable_tr_view = builder.get_object("cable_tr_view")
self._transponders_stack = builder.get_object("transponders_stack")
+ self._add_header_button = builder.get_object("add_header_button")
+ self._update_header_button = builder.get_object("update_header_button")
self.pack_start(builder.get_object("main_paned"), True, True, 0)
self._app.connect("profile-changed", lambda a, m: self.load_satellites_list())
+ # Custom renderer
+ sat_pos_renderer = builder.get_object("sat_pos_renderer")
+ builder.get_object("sat_pos_column").set_cell_data_func(sat_pos_renderer, self.sat_pos_func)
+
self.show()
def on_satellite_view_realize(self, view):
@@ -112,6 +122,13 @@ class SatellitesTool(Gtk.Box):
def on_visible_page(self, stack, param):
self._dvb_type = self.DVB(stack.get_visible_child_name())
self._transponders_stack.set_visible_child_name(self._dvb_type)
+ self._update_header_button.set_sensitive(self._dvb_type is self.DVB.SAT)
+ self._add_header_button.set_sensitive(self._dvb_type is self.DVB.SAT)
+
+ if self._dvb_type is self.DVB.SAT:
+ self._app.on_info_bar_close()
+ else:
+ self._app.show_info_message("Read mode only!", Gtk.MessageType.WARNING)
def on_satellite_selection(self, view):
model = self._sat_tr_view.get_model()
@@ -121,6 +138,22 @@ class SatellitesTool(Gtk.Box):
if self._current_sat_path:
list(map(model.append, view.get_model()[self._current_sat_path][-1]))
+ def on_terrestrial_selection(self, view):
+ model = self._ter_tr_view.get_model()
+ model.clear()
+
+ self._current_ter_path, column = view.get_cursor()
+ if self._current_ter_path:
+ list(map(model.append, view.get_model()[self._current_ter_path][-1]))
+
+ def on_cable_selection(self, view):
+ model = self._cable_tr_view.get_model()
+ model.clear()
+
+ self._current_cable_path, column = view.get_cursor()
+ if self._current_cable_path:
+ list(map(model.append, view.get_model()[self._current_cable_path][-1]))
+
def on_up(self, item):
move_items(KeyboardKey.UP, self._satellite_view)
@@ -128,10 +161,11 @@ class SatellitesTool(Gtk.Box):
move_items(KeyboardKey.DOWN, self._satellite_view)
def on_button_press(self, menu, event):
- if event.get_event_type() == Gdk.EventType.DOUBLE_BUTTON_PRESS:
- self.on_edit(self._satellite_view if self._satellite_view.is_focus() else self._sat_tr_view)
- else:
- on_popup_menu(menu, event)
+ if self._dvb_type is self.DVB.SAT:
+ if event.get_event_type() == Gdk.EventType.DOUBLE_BUTTON_PRESS:
+ self.on_edit(self._satellite_view if self._satellite_view.is_focus() else self._sat_tr_view)
+ else:
+ on_popup_menu(menu, event)
def on_key_release(self, view, event):
""" Handling keystrokes """
diff --git a/app/ui/xml/editor.glade b/app/ui/xml/editor.glade
index 9de9cb40..66dceda9 100644
--- a/app/ui/xml/editor.glade
+++ b/app/ui/xml/editor.glade
@@ -225,8 +225,6 @@ Author: Dmitriy Yefremov
-
-