diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py index eadaaebc..6a230734 100644 --- a/app/eparser/ecommons.py +++ b/app/eparser/ecommons.py @@ -116,3 +116,19 @@ CAS = {"C:2600": "BISS", "C:0b00": "Conax", "C:0b01": "Conax", "C:0b02": "Conax" # 'on' attribute 0070(hex) = 112(int) = ONID(ONID-TID on www.lyngsat.com) PROVIDER = {112: "HTB+", 253: "Tricolor TV"} + + +# ************* subsidiary functions **************** + +def get_key_by_value(dc: dict, value): + """ Returns key from dict by value """ + for k, v in dc.items(): + if v == value: + return k + + +def get_value_by_name(en, name): + """ Returns value by name from enums """ + for n in en: + if n.name == name: + return n.value diff --git a/app/eparser/satxml.py b/app/eparser/satxml.py index 6a2352b9..27a8faed 100644 --- a/app/eparser/satxml.py +++ b/app/eparser/satxml.py @@ -4,7 +4,7 @@ """ from xml.dom.minidom import parse, Document -from .ecommons import POLARIZATION, FEC, SYSTEM, MODULATION, PLS_MODE, Transponder, Satellite +from .ecommons import POLARIZATION, FEC, SYSTEM, MODULATION, PLS_MODE, Transponder, Satellite, get_key_by_value __COMMENT = (" File was created in DemonEditor\n\n" "usable flags are\n" @@ -110,11 +110,5 @@ 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 diff --git a/app/ui/dialogs.glade b/app/ui/dialogs.glade index 1fb23878..885cddf9 100644 --- a/app/ui/dialogs.glade +++ b/app/ui/dialogs.glade @@ -802,6 +802,9 @@ dmitry.v.yefremov@gmail.com 3 + @@ -914,6 +917,9 @@ dmitry.v.yefremov@gmail.com 1 + 1 @@ -982,6 +988,7 @@ dmitry.v.yefremov@gmail.com True True /etc/enigma2/ + gtk-edit 0 @@ -1005,6 +1012,7 @@ dmitry.v.yefremov@gmail.com True True /etc/enigma2/ + gtk-edit 0 @@ -1028,6 +1036,7 @@ dmitry.v.yefremov@gmail.com True True /etc/tuxbox/ + gtk-edit 0 @@ -1051,6 +1060,7 @@ dmitry.v.yefremov@gmail.com True True /usr/share/enigma2/picon + gtk-edit 0 @@ -1089,7 +1099,7 @@ dmitry.v.yefremov@gmail.com True False Active profile: - 0 + 0.20000000298023224 False @@ -1199,6 +1209,7 @@ dmitry.v.yefremov@gmail.com True True /data + gtk-edit folder-open-symbolic False Select @@ -1217,18 +1228,6 @@ dmitry.v.yefremov@gmail.com 5 - - - True - False - - - False - True - 2 - 6 - - True @@ -1239,7 +1238,7 @@ dmitry.v.yefremov@gmail.com False True - 8 + 7 @@ -1247,12 +1246,25 @@ dmitry.v.yefremov@gmail.com True True /data/picons + gtk-edit folder-open-symbolic False True + 8 + + + + + True + False + + + False + True + 2 9 @@ -1275,6 +1287,7 @@ dmitry.v.yefremov@gmail.com False + 118 False vertical @@ -1282,12 +1295,6 @@ dmitry.v.yefremov@gmail.com False 0 end - - - - - - False @@ -1333,6 +1340,9 @@ dmitry.v.yefremov@gmail.com 1 + diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index 100a60eb..4befcd9e 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -365,9 +365,9 @@ class MainAppWindow: def on_tool_edit(self, item): """ Edit tool bar button """ if self.__services_view.is_focus(): - self.on_rename(self.__services_view) + self.on_service_edit(self.__services_view) elif self.__fav_view.is_focus(): - self.on_rename(self.__fav_view) + self.on_service_edit(self.__fav_view) elif self.__bouquets_view.is_focus(): self.on_rename(self.__bouquets_view) @@ -815,7 +815,7 @@ class MainAppWindow: for ch in self.__services.values(): ch_type = ch.service_type - if ch_type in ("TV", "TV (HD)"): + if ch_type in ("TV", "TV (HD)", "TV (UHD)"): tv_count += 1 elif ch_type == "Radio": radio_count += 1 @@ -913,7 +913,11 @@ class MainAppWindow: return self.on_locate_in_services(view) - dialog = ServiceDetailsDialog(self.__main_window, self.__options, self.__services_view) + dialog = ServiceDetailsDialog(self.__main_window, + self.__options, + self.__services_view, + self.__services, + self.__bouquets) dialog.show() @run_idle diff --git a/app/ui/satellites_dialog.glade b/app/ui/satellites_dialog.glade index af550139..30ccd0b1 100644 --- a/app/ui/satellites_dialog.glade +++ b/app/ui/satellites_dialog.glade @@ -66,6 +66,9 @@ 9/10 + + Auto + diff --git a/app/ui/service_details_dialog.glade b/app/ui/service_details_dialog.glade index 4298b474..73eb594c 100644 --- a/app/ui/service_details_dialog.glade +++ b/app/ui/service_details_dialog.glade @@ -918,6 +918,7 @@ True + False True 10 10 @@ -942,6 +943,7 @@ True + False True 10 10 @@ -966,6 +968,7 @@ True + False False pol_list_store 0 @@ -995,6 +998,7 @@ True + False False fec_list_store 0 @@ -1024,6 +1028,7 @@ True + False False sys_list_store 0 @@ -1074,6 +1079,7 @@ True + False True 15 15 @@ -1098,6 +1104,7 @@ True + False False sat_pos_list_store 0 @@ -1143,6 +1150,7 @@ True + False True 5 8 @@ -1167,6 +1175,7 @@ True + False True 7 8 @@ -1214,6 +1223,7 @@ True + False False invertion_list_store 0 diff --git a/app/ui/service_details_dialog.py b/app/ui/service_details_dialog.py index 74a25eca..ee982756 100644 --- a/app/ui/service_details_dialog.py +++ b/app/ui/service_details_dialog.py @@ -3,7 +3,8 @@ from functools import lru_cache from app.commons import run_idle from app.eparser import Service, get_satellites -from app.eparser.ecommons import MODULATION, Inversion, ROLL_OFF, Pilot, Flag, Pids +from app.eparser.ecommons import MODULATION, Inversion, ROLL_OFF, Pilot, Flag, Pids, SERVICE_TYPE, POLARIZATION, FEC, \ + SYSTEM, get_key_by_value, get_value_by_name from app.properties import Profile from app.ui.dialogs import show_dialog, DialogType from app.ui.main_helper import get_base_model @@ -16,13 +17,18 @@ def get_sat_positions(path): class ServiceDetailsDialog: + _DATA_ID = "{:04x}:{:08x}:{:04x}:{:04x}:{}:{}" + + _FAV_ID = "{:X}:{:X}:{:X}:{:X}" + + _TRANSPONDER_DATA = " {}:{}:{}:{}:{}:{}:{}:{}" _DIGIT_ENTRY_ELEMENTS = ("id_entry", "bitstream_entry", "pcm_entry", "video_pid_entry", "pcr_pid_entry", "audio_pid_entry", "ac3_pid_entry", "ac3plus_pid_entry", "acc_pid_entry", "freq_entry", "he_acc_pid_entry", "teletext_pid_entry", "transponder_id_entry", "network_id_entry", "rate_entry", "pls_code_entry", "stream_id_entry", "flags_entry", "namespace_entry") - def __init__(self, transient, options, view): + def __init__(self, transient, options, view, services, bouquets): handlers = {"on_system_changed": self.on_system_changed, "on_save": self.on_save, "on_create_new": self.on_create_new, @@ -38,6 +44,8 @@ class ServiceDetailsDialog: self._satellites_xml_path = options.get(self._profile.value)["data_dir_path"] + "satellites.xml" self._services_view = view self._old_service = None + self._services = services + self._bouquets = bouquets self._current_model = None self._pattern = re.compile("\D") # style @@ -174,9 +182,10 @@ class ServiceDetailsDialog: tr_data = srv.transponder.split(":") if srv.system == "DVB-S2": - self.select_active_text(self._mod_combo_box, MODULATION.get(tr_data[8])) - self.select_active_text(self._rolloff_combo_box, ROLL_OFF.get(tr_data[9])) - self.select_active_text(self._pilot_combo_box, Pilot(tr_data[10]).name) + pass + # self.select_active_text(self._mod_combo_box, MODULATION.get(tr_data[8])) + # self.select_active_text(self._rolloff_combo_box, ROLL_OFF.get(tr_data[9])) + # self.select_active_text(self._pilot_combo_box, Pilot(tr_data[10]).name) self._namespace_entry.set_text(str(int(data[1], 16))) self._transponder_id_entry.set_text(str(int(data[2], 16))) @@ -218,27 +227,41 @@ class ServiceDetailsDialog: def on_save(self, item): if show_dialog(DialogType.QUESTION, self._dialog) == Gtk.ResponseType.CANCEL: return + fav_id, data_id = self.get_srv_data() + service = Service(flags_cas=self.get_flags(), + transponder_type="s", + coded=self._old_service.coded, + service=self._name_entry.get_text(), + locked=self._old_service.locked, + hide=None, + package=self._package_entry.get_text(), + service_type=self._service_type_combo_box.get_active_id(), + picon=self._old_service.picon, + picon_id=self._old_service.picon_id, + ssid="{:x}".format(int(self._id_entry.get_text())), + freq=self._freq_entry.get_text(), + rate=self._rate_entry.get_text(), + pol=self._pol_combo_box.get_active_id(), + fec=self._fec_combo_box.get_active_id(), + system=self._sys_combo_box.get_active_id(), + pos=self._sat_pos_combo_box.get_active_id(), + data_id=data_id, + fav_id=fav_id, + transponder=self._old_service.transponder) - self.update_data_in_model(Service(flags_cas=self.get_flags(), - transponder_type="s", - coded=None, - service=self._name_entry.get_text(), - locked=self._old_service.locked, - hide=None, - package=self._package_entry.get_text(), - service_type=self._service_type_combo_box.get_active_id(), - picon=self._old_service.picon, - picon_id=self._old_service.picon_id, - ssid=self._id_entry.get_text(), - freq=self._freq_entry.get_text(), - rate=self._rate_entry.get_text(), - pol=self._pol_combo_box.get_active_id(), - fec=self._fec_combo_box.get_active_id(), - system=self._sys_combo_box.get_active_id(), - pos=self._sat_pos_combo_box.get_active_id(), - data_id=self.get_data_id(), - fav_id=self.get_fav_id(), - transponder=self.get_transponder_data())) + old_fav_id = self._old_service.fav_id + if old_fav_id != fav_id: + self._services.pop(old_fav_id, None) + for bq in self._bouquets.values(): + indexes = [] + for i, f_id in enumerate(bq): + if old_fav_id == f_id: + indexes.append(i) + for i in indexes: + bq[i] = fav_id + + self._services[fav_id] = service + self.update_data_in_model(service) def update_data_in_model(self, srv: Service): fav_id = self._old_service.fav_id @@ -297,11 +320,19 @@ class ServiceDetailsDialog: return ",".join(flags) - def get_data_id(self): + def get_srv_data(self): + ssid = int(self._id_entry.get_text()) + namespace = int(self._namespace_entry.get_text()) + transponder_id = int(self._transponder_id_entry.get_text()) + network_id = int(self._network_id_entry.get_text()) + service_type = self.get_value_from_combobox_id(self._service_type_combo_box, SERVICE_TYPE) + if self._profile is Profile.ENIGMA_2: - return self._old_service.data_id + data_id = self._DATA_ID.format(ssid, namespace, transponder_id, network_id, service_type, 0) + fav_id = self._FAV_ID.format(ssid, transponder_id, network_id, namespace) + return fav_id, data_id elif self._profile is Profile.NEUTRINO_MP: - return self._old_service.data_id + return self._old_service.fav_id, self._old_service.data_id def get_fav_id(self): if self._profile is Profile.ENIGMA_2: @@ -310,15 +341,35 @@ class ServiceDetailsDialog: return self._old_service.fav_id def get_transponder_data(self): + sys = self._sys_combo_box.get_active_id() + freq = self._freq_entry.get_text() + rate = self._rate_entry.get_text() + pol = self.get_value_from_combobox_id(self._pol_combo_box, POLARIZATION) + fec = self.get_value_from_combobox_id(self._fec_combo_box, FEC) + sat_pos = self._sat_pos_combo_box.get_active_id().replace(".", "") + inv = get_value_by_name(Inversion, self._invertion_combo_box.get_active_id()) + srv_sys = get_key_by_value(SYSTEM, sys) + if self._profile is Profile.ENIGMA_2: - if self._sys_combo_box.get_active_id() == "DVB-S2": - return self._old_service.transponder + dvb_s_tr = self._TRANSPONDER_DATA.format("s", freq, rate, pol, fec, sat_pos, inv, srv_sys) + if sys == "DVB-S": + return dvb_s_tr + if sys == "DVB-S2": + flag = self._flags_entry.get_text() + mod = self.get_value_from_combobox_id(self._mod_combo_box, MODULATION) + roll_off = self.get_value_from_combobox_id(self._rolloff_combo_box, ROLL_OFF) + pilot = get_value_by_name(Pilot, self._pilot_combo_box.get_active_id()) + return "{}:{}:{}:{}:{}:-1:1:0".format(dvb_s_tr, flag, mod, roll_off, pilot) elif self._profile is Profile.NEUTRINO_MP: return self._old_service.transponder def on_digit_entry_changed(self, entry): entry.set_name("digit-entry" if self._pattern.search(entry.get_text()) else "GtkEntry") + def get_value_from_combobox_id(self, box: Gtk.ComboBox, dc: dict): + cb_id = box.get_active_id() + return get_key_by_value(dc, cb_id) + if __name__ == "__main__": pass