mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-01-17 13:03:10 +01:00
writing satellites.xml impl
This commit is contained in:
@@ -14,28 +14,18 @@ class Type(Enum):
|
||||
Cable = "c"
|
||||
|
||||
|
||||
class Polarization(Enum):
|
||||
H = 0
|
||||
V = 1
|
||||
L = 2
|
||||
R = 3
|
||||
POLARIZATION = {"0": "H", "1": "V", "2": "L", "3": "R"}
|
||||
|
||||
PLS_MODE = {"0": "Root", "1": "Gold", "2": "Combo"}
|
||||
|
||||
class PlsMode(Enum):
|
||||
Root = 0
|
||||
Gold = 1
|
||||
Combo = 2
|
||||
FEC = {"0": "None", "1": "Auto", "2": "1/2",
|
||||
"3": "2/3", "4": "3/4", "5": "5/6",
|
||||
"6": "7/8", "7": "3/5", "8": "4/5",
|
||||
"9": "8/9", "10": "9/10"}
|
||||
|
||||
SYSTEM = {"0": "DVB-S", "1": "DVB-S2"}
|
||||
|
||||
# Symbol rate
|
||||
FEC = {0: "None", 1: "Auto", 2: "1/2",
|
||||
3: "2/3", 4: "3/4", 5: "5/6",
|
||||
6: "7/8", 7: "3/5", 8: "4/5",
|
||||
9: "8/9", 10: "9/10"}
|
||||
|
||||
SYSTEM = {0: "DVB-S", 1: "DVB-S2"}
|
||||
|
||||
MODULATION = {0: "Auto", 1: "QPSK", 2: "8PSK", 3: "16APSK", 5: "32APSK"}
|
||||
MODULATION = {"0": "Auto", "1": "QPSK", "2": "8PSK", "3": "16APSK", "5": "32APSK"}
|
||||
|
||||
SERVICE_TYPE = {-2: "Unknown", 1: "TV", 2: "Radio", 3: "Data",
|
||||
10: "Radio", 12: "Data", 22: "TV", 25: "TV",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from .lamedb import get_channels
|
||||
from .bouquets import get_bouquets, get_bouquet
|
||||
from .satxml import get_satellites
|
||||
from .satxml import get_satellites, write_satellites, Satellite, Transponder
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
Currently implemented only for satellite channels!!!
|
||||
Description of format taken from here: http://www.satsupreme.com/showthread.php/194074-Lamedb-format-explained
|
||||
"""
|
||||
from main.eparser.__constants import Polarization, SYSTEM, FEC, Channel, SERVICE_TYPE
|
||||
from main.eparser.__constants import POLARIZATION, SYSTEM, FEC, Channel, SERVICE_TYPE
|
||||
|
||||
_HEADER = "eDVB services /4/"
|
||||
_FILE_PATH = "../data/lamedb"
|
||||
@@ -55,7 +55,7 @@ def parse_channels(*args):
|
||||
tr = str(transponder)[2:].split(_SEP) # Removing type of DVB transponders (s , t, c) and split
|
||||
pack = pack[2:] if pack.find(",") < 0 else pack[2:pack.find(",")]
|
||||
channels.append(Channel(ch[1], pack, SERVICE_TYPE.get(int(data[4]), SERVICE_TYPE[-2]), data[0], tr[0],
|
||||
tr[1], Polarization(int(tr[2])).name, FEC[int(tr[3])], SYSTEM[int(tr[6])],
|
||||
tr[1], POLARIZATION[tr[2]], FEC[tr[3]], SYSTEM[tr[6]],
|
||||
"{}{}.{}".format(*list(tr[4])), ch[0], fav_id.upper()))
|
||||
return channels
|
||||
|
||||
|
||||
@@ -13,21 +13,82 @@ pls_mode: 0 - Root, 1 - Gold, 2 - Combo
|
||||
pls_code: 0 - 262142
|
||||
"""
|
||||
from collections import namedtuple
|
||||
from xml.dom.minidom import parse
|
||||
from main.eparser.__constants import Polarization, FEC, SYSTEM, MODULATION, PlsMode
|
||||
from xml.dom.minidom import parse, Document
|
||||
from main.eparser.__constants import POLARIZATION, FEC, SYSTEM, MODULATION, PLS_MODE
|
||||
|
||||
# temporary
|
||||
__XML_PATH = "../data/satellites.xml"
|
||||
__XML_PATH = "../data/"
|
||||
|
||||
Satellite = namedtuple("Satellite", ["name", "flags", "position", "transponders"])
|
||||
|
||||
Transponder = namedtuple("Transponder", ["frequency", "symbol_rate", "polarization", "fec_inner",
|
||||
"system", "modulation", "pls_mode", "pls_code", "is_id"])
|
||||
|
||||
__COMMENT = (" File was created in DemonEditor\n\n"
|
||||
"useable 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 - 6/7, 6 - 7/8, 7 - 8/9, "
|
||||
"8 - 3/5, 9 - 4/5, 10 - 9/10\n"
|
||||
"modulation: 0 - Auto, 1 - QPSK, 2 - 8PSK, 3 - 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"
|
||||
|
||||
"Info taken from satellites.xml generated by http://satellites-xml.eu\n")
|
||||
|
||||
|
||||
def get_satellites(path):
|
||||
return parse_satellites(path + "satellites.xml")
|
||||
|
||||
|
||||
def write_satellites(satellites, data_path):
|
||||
""" Creation satellites.xml file """
|
||||
doc = Document()
|
||||
comment = doc.createComment(__COMMENT)
|
||||
doc.appendChild(comment)
|
||||
root = doc.createElement("satellites")
|
||||
doc.appendChild(root)
|
||||
for sat in satellites:
|
||||
# Create Element
|
||||
sat_child = doc.createElement("sat")
|
||||
sat_child.setAttribute("name", sat.name)
|
||||
sat_child.setAttribute("flags", sat.flags)
|
||||
sat_child.setAttribute("position", sat.position)
|
||||
for tr in sat.transponders:
|
||||
transponder_child = doc.createElement("transponder")
|
||||
transponder_child.setAttribute("frequency", tr.frequency)
|
||||
transponder_child.setAttribute("symbol_rate", tr.symbol_rate)
|
||||
transponder_child.setAttribute("polarization", get_key_by_value(POLARIZATION, tr.polarization))
|
||||
transponder_child.setAttribute("fec_inner", get_key_by_value(FEC, tr.fec_inner))
|
||||
transponder_child.setAttribute("system", get_key_by_value(SYSTEM, tr.system))
|
||||
transponder_child.setAttribute("modulation", get_key_by_value(MODULATION, tr.modulation))
|
||||
if tr.pls_mode:
|
||||
transponder_child.setAttribute("pls_mode", get_key_by_value(PLS_MODE, tr.pls_mode))
|
||||
if tr.pls_code:
|
||||
transponder_child.setAttribute("pls_code", tr.pls_code)
|
||||
if tr.is_id:
|
||||
transponder_child.setAttribute("is_id", tr.is_id)
|
||||
sat_child.appendChild(transponder_child)
|
||||
root.appendChild(sat_child)
|
||||
doc.writexml(open(data_path + "new_satellites.xml", "w"),
|
||||
# indent="",
|
||||
addindent=" ",
|
||||
newl='\n',
|
||||
encoding="iso-8859-1")
|
||||
doc.unlink()
|
||||
|
||||
|
||||
def parse_transponders(elem):
|
||||
""" Parsing satellite transponders """
|
||||
transponders = []
|
||||
@@ -36,11 +97,11 @@ def parse_transponders(elem):
|
||||
atr = el.attributes
|
||||
tr = Transponder(atr["frequency"].value,
|
||||
atr["symbol_rate"].value,
|
||||
Polarization(int(atr["polarization"].value)).name,
|
||||
FEC[int(atr["fec_inner"].value)],
|
||||
SYSTEM[int(atr["system"].value)],
|
||||
MODULATION[int(atr["modulation"].value)],
|
||||
PlsMode(int(atr["pls_mode"].value)).name if "pls_mode" in atr else None,
|
||||
POLARIZATION[atr["polarization"].value],
|
||||
FEC[atr["fec_inner"].value],
|
||||
SYSTEM[atr["system"].value],
|
||||
MODULATION[atr["modulation"].value],
|
||||
PLS_MODE[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)
|
||||
transponders.append(tr)
|
||||
@@ -65,5 +126,16 @@ def parse_satellites(path):
|
||||
return satellites
|
||||
|
||||
|
||||
def get_key_by_value(dictionary, value):
|
||||
for k, v in dictionary.items():
|
||||
if v == value:
|
||||
return k
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
sats = get_satellites(__XML_PATH)
|
||||
for sat in sats:
|
||||
trnsp = sat.transponders
|
||||
for tr in trnsp:
|
||||
if tr.pls_mode or tr.pls_code or tr.is_id:
|
||||
print(tr, sat.name)
|
||||
|
||||
@@ -127,7 +127,10 @@ def on_to_fav_move(view):
|
||||
""" Move items from main to fav list """
|
||||
selection = get_selection(view)
|
||||
if selection:
|
||||
receive_selection(view=__fav_view, drop_info=None, data=selection)
|
||||
if is_bouquet_selected():
|
||||
receive_selection(view=__fav_view, drop_info=None, data=selection)
|
||||
else:
|
||||
show_message_dialog("Error. No bouquet is selected!")
|
||||
|
||||
|
||||
def get_selection(view):
|
||||
@@ -189,7 +192,10 @@ def on_fav_tree_view_drag_data_get(view, drag_context, data, info, time):
|
||||
|
||||
def on_fav_tree_view_drag_data_received(view, drag_context, x, y, data, info, time):
|
||||
""" DnD """
|
||||
receive_selection(view=view, drop_info=view.get_dest_row_at_pos(x, y), data=data.get_text())
|
||||
if is_bouquet_selected():
|
||||
receive_selection(view=view, drop_info=view.get_dest_row_at_pos(x, y), data=data.get_text())
|
||||
else:
|
||||
show_message_dialog("Error. No bouquet is selected!")
|
||||
|
||||
|
||||
def on_view_popup_menu(menu, event):
|
||||
@@ -231,26 +237,44 @@ def on_data_open(model):
|
||||
|
||||
|
||||
def on_services_selection(model, path, column):
|
||||
delete_selection(__fav_view, __bouquets_view)
|
||||
delete_selection(__fav_view)
|
||||
|
||||
|
||||
def on_fav_selection(model, path, column):
|
||||
delete_selection(__services_view, __bouquets_view)
|
||||
delete_selection(__services_view)
|
||||
|
||||
|
||||
def on_bouquets_selection(model, path, column):
|
||||
__fav_model.clear()
|
||||
if len(path) > 1:
|
||||
delete_selection(__services_view)
|
||||
tree_iter = model.get_iter(path)
|
||||
name = model.get_value(tree_iter, 0)
|
||||
# 'tv' Temporary! It is necessary to implement a row type attribute.
|
||||
bq = get_bouquet(__options["data_dir_path"], name, SERVICE_TYPE[1].lower())
|
||||
__fav_model.clear()
|
||||
for num, ch_id in enumerate(bq):
|
||||
channel = __channels.get(ch_id, None)
|
||||
__fav_model.append((num + 1, channel[0], channel[2], channel[9]))
|
||||
|
||||
|
||||
def is_bouquet_selected():
|
||||
""" Checks whether the bouquet is selected """
|
||||
selection = __bouquets_view.get_selection()
|
||||
model, path = selection.get_selected_rows()
|
||||
if len(path) < 1:
|
||||
return False
|
||||
return not model.iter_has_child(model.get_iter(path))
|
||||
|
||||
|
||||
def show_message_dialog(text):
|
||||
builder = Gtk.Builder()
|
||||
builder.add_from_file("ui/main_window.glade")
|
||||
dialog = builder.get_object("message_dialog")
|
||||
dialog.set_markup(text)
|
||||
dialog.run()
|
||||
dialog.destroy()
|
||||
|
||||
|
||||
def delete_selection(view, *args):
|
||||
""" Used for clear selection on given view(s) """
|
||||
for v in [view, *args]:
|
||||
|
||||
@@ -1022,8 +1022,11 @@
|
||||
<property name="transient_for">main_window</property>
|
||||
<property name="program_name">DemonEditor</property>
|
||||
<property name="version">0.1 Pre-alpha</property>
|
||||
<property name="copyright" translatable="yes">2017 Dmitriy Yefremov
|
||||
</property>
|
||||
<property name="comments" translatable="yes">Enigma2 channel list editor for GNU/Linux</property>
|
||||
<property name="authors">Dmitriy Yefremov</property>
|
||||
<property name="authors">Dmitriy Yefremov
|
||||
</property>
|
||||
<property name="logo_icon_name">accessories-text-editor</property>
|
||||
<property name="license_type">mit-x11</property>
|
||||
<child internal-child="vbox">
|
||||
@@ -1048,12 +1051,15 @@
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkMessageDialog" id="messagedialog1">
|
||||
<object class="GtkMessageDialog" id="message_dialog">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="default_width">320</property>
|
||||
<property name="default_height">240</property>
|
||||
<property name="icon_name">accessories-text-editor</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="transient_for">main_window</property>
|
||||
<property name="message_type">question</property>
|
||||
<property name="buttons">ok-cancel</property>
|
||||
<property name="message_type">error</property>
|
||||
<property name="buttons">ok</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkBox" id="messagedialog-vbox">
|
||||
<property name="can_focus">False</property>
|
||||
|
||||
@@ -2,6 +2,39 @@
|
||||
<!-- Generated with glade 3.18.3 -->
|
||||
<interface>
|
||||
<requires lib="gtk+" version="3.12"/>
|
||||
<object class="GtkMenu" id="popup_menu">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="reserve_toggle_size">False</property>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="add_popoup_menu_item">
|
||||
<property name="label">gtk-add</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="edit_popoup_menu_item">
|
||||
<property name="label">gtk-edit</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="remove_popup_menu_item">
|
||||
<property name="label">gtk-remove</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<signal name="activate" handler="on_remove" object="satellites_editor_tree_view" swapped="no"/>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<object class="GtkTreeStore" id="satellites_tree_store">
|
||||
<columns>
|
||||
<!-- column-name satelitte -->
|
||||
@@ -299,6 +332,7 @@
|
||||
<property name="can_focus">True</property>
|
||||
<property name="model">satellites_tree_store</property>
|
||||
<property name="search_column">0</property>
|
||||
<signal name="button-press-event" handler="on_popup_menu" object="popup_menu" swapped="no"/>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="tree_view_selection">
|
||||
<property name="mode">multiple</property>
|
||||
@@ -390,6 +424,7 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="pls_mode_column">
|
||||
<property name="visible">False</property>
|
||||
<property name="title" translatable="yes">Pls mode</property>
|
||||
<property name="expand">True</property>
|
||||
<child>
|
||||
@@ -402,6 +437,7 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="pls_code_column">
|
||||
<property name="visible">False</property>
|
||||
<property name="title" translatable="yes">Pls code</property>
|
||||
<property name="expand">True</property>
|
||||
<child>
|
||||
@@ -414,6 +450,7 @@
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="is_id_column">
|
||||
<property name="visible">False</property>
|
||||
<property name="resizable">True</property>
|
||||
<property name="title" translatable="yes">Is ID</property>
|
||||
<property name="expand">True</property>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from main.eparser import get_satellites
|
||||
from main.eparser.satxml import Satellite, Transponder
|
||||
from . import Gtk
|
||||
from main.eparser import get_satellites, write_satellites, Satellite, Transponder
|
||||
from . import Gtk, Gdk
|
||||
|
||||
__data_path = None
|
||||
|
||||
@@ -8,7 +7,9 @@ __data_path = None
|
||||
def show_satellites_dialog(transient, data_path):
|
||||
global __data_path
|
||||
__data_path = data_path
|
||||
handlers = {"on_satellites_list_load": on_satellites_list_load, "on_remove": on_remove, "on_save": on_save}
|
||||
handlers = {"on_satellites_list_load": on_satellites_list_load,
|
||||
"on_remove": on_remove, "on_save": on_save,
|
||||
"on_popup_menu": on_popup_menu}
|
||||
builder = Gtk.Builder()
|
||||
builder.add_from_file("./ui/satellites_dialog.glade")
|
||||
builder.connect_signals(handlers)
|
||||
@@ -41,8 +42,7 @@ def on_save(view):
|
||||
model = view.get_model()
|
||||
satellites = []
|
||||
model.foreach(parse_data, satellites)
|
||||
for sat in satellites:
|
||||
print(sat)
|
||||
write_satellites(satellites, __data_path)
|
||||
|
||||
|
||||
def parse_data(model, path, itr, sats):
|
||||
@@ -58,5 +58,10 @@ def parse_data(model, path, itr, sats):
|
||||
sats.append(satellite)
|
||||
|
||||
|
||||
def on_popup_menu(menu, event):
|
||||
if event.get_event_type() == Gdk.EventType.BUTTON_PRESS and event.button == Gdk.BUTTON_SECONDARY:
|
||||
menu.popup(None, None, None, None, event.button, event.time)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user