From a21f6faab2244813ccfc8fec8cc0f5de9bc9903f Mon Sep 17 00:00:00 2001 From: DYefremov Date: Tue, 19 Aug 2025 23:33:56 +0300 Subject: [PATCH] add support for creating terrestrial and cable channels --- app/eparser/ecommons.py | 6 ++- app/ui/main.glade | 36 ++++++++++++- app/ui/main.py | 4 +- app/ui/service_details_dialog.py | 86 +++++++++++++++++++++----------- 4 files changed, 99 insertions(+), 33 deletions(-) diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py index a89c8b06..aac29c71 100644 --- a/app/eparser/ecommons.py +++ b/app/eparser/ecommons.py @@ -72,12 +72,16 @@ CableTransponder = namedtuple("CableTransponder", ["frequency", "symbol_rate", " class TrType(Enum): - """ Transponders type """ + """ Transponders type. """ Satellite = "s" Terrestrial = "t" Cable = "c" ATSC = "a" + @classmethod + def _missing_(cls, value): + return cls.Satellite + class BqType(Enum): """ Bouquet type. """ diff --git a/app/ui/main.glade b/app/ui/main.glade index 798bf3b9..1db6d1bf 100644 --- a/app/ui/main.glade +++ b/app/ui/main.glade @@ -1551,10 +1551,42 @@ Author: Dmitriy Yefremov + New True False - New - + + + True + False + + + True + False + Satellite channel + s + + + + + + True + False + Terrestrial channel + t + + + + + + True + False + Cable channel + c + + + + + diff --git a/app/ui/main.py b/app/ui/main.py index 155ce71e..e5224d9c 100644 --- a/app/ui/main.py +++ b/app/ui/main.py @@ -43,7 +43,7 @@ from app.commons import run_idle, log, run_task, run_with_delay, init_logger, De from app.connections import (HttpAPI, download_data, DownloadType, upload_data, STC_XML_FILE) from app.eparser import get_blacklist, write_blacklist, write_bouquet from app.eparser import get_services, get_bouquets, write_bouquets, write_services, Bouquets, Bouquet, Service -from app.eparser.ecommons import CAS, Flag, BouquetService +from app.eparser.ecommons import CAS, Flag, BouquetService, TrType from app.eparser.enigma.bouquets import BqServiceType from app.eparser.enigma.streamrelay import StreamRelay from app.eparser.iptv import export_to_m3u, StreamType @@ -4047,7 +4047,7 @@ class Application(Gtk.Application): self.show_error_message("Neutrino at the moment not supported!") return - ServiceDetailsDialog(self, action=Action.ADD).show() + ServiceDetailsDialog(self, action=Action.ADD, tr_type=TrType(item.get_name())).show() def on_bouquets_edit(self, view): """ Renaming bouquets. """ diff --git a/app/ui/service_details_dialog.py b/app/ui/service_details_dialog.py index 9e535c40..9c8a599a 100644 --- a/app/ui/service_details_dialog.py +++ b/app/ui/service_details_dialog.py @@ -62,7 +62,7 @@ class ServiceDetailsDialog: _DIGIT_ENTRY_NAME = "digit-entry" - def __init__(self, app, action=Action.EDIT): + def __init__(self, app, action=Action.EDIT, tr_type=TrType.Satellite): handlers = {"on_system_changed": self.on_system_changed, "on_save": self.on_save, "on_tr_edit_toggled": self.on_tr_edit_toggled, @@ -80,7 +80,7 @@ class ServiceDetailsDialog: self._dialog = builder.get_object("service_details_dialog") self._dialog.set_transient_for(app.app_window) self._s_type = settings.setting_type - self._tr_type = TrType.Satellite + self._tr_type = tr_type self._picons_path = settings.profile_picons_path self._services_view = app.services_view self._fav_view = app.fav_view @@ -174,29 +174,51 @@ class ServiceDetailsDialog: def show(self): self._dialog.show() - @run_idle def init_default_data_elements(self): - srv = Service(None, "s", None, "New", None, None, "New", "TV", None, - "1_0_1_0_0_0_000000_0_0_0.png", "0", "10700", "27500", "H", "3/4", "DVB-S", "0.0E", - "0:00000000:0:0000:0:0:0:0:0:0", "1:0:1:0:0:0:000000:0:0:0::0:0:0:0", - "s 10720000:27500000:0:1:0:0:0:0:0") + srv_data = [None] * 20 + srv_data[Column.SRV_CAS_FLAGS] = "f:40" + srv_data[Column.SRV_SERVICE] = "New" + srv_data[Column.SRV_PACKAGE] = "New" + srv_data[Column.SRV_SSID] = "0" + srv_data[Column.SRV_PICON_ID] = "1_0_1_0_0_0_000000_0_0_0.png" + srv_data[Column.SRV_FAV_ID] = "1:0:1:0:0:0:000000:0:0:0::0:0:0:0" + + if self._tr_type is TrType.Cable: + srv_data[Column.SRV_STANDARD] = "c" + srv_data[Column.SRV_FREQ] = "300" + srv_data[Column.SRV_RATE] = "6000" + srv_data[Column.SRV_SYSTEM] = "DVB-C" + srv_data[Column.SRV_POS] = "C" + srv_data[Column.SRV_DATA_ID] = "0000:00000000:0:0:1:0" + srv_data[Column.SRV_TRANSPONDER] = "t 300000000:0:0:0:0:0:0:0:0:0:0:0" + elif self._tr_type is TrType.Terrestrial: + srv_data[Column.SRV_STANDARD] = "t" + srv_data[Column.SRV_FREQ] = "420000" + srv_data[Column.SRV_RATE] = "0" + srv_data[Column.SRV_SYSTEM] = "DVB-T2" + srv_data[Column.SRV_POS] = "T" + srv_data[Column.SRV_DATA_ID] = "0000:00000000:0:0:1:0" + srv_data[Column.SRV_TRANSPONDER] = "t 420000000:0:5:5:3:2:4:4:2:1:0:0" + else: + srv_data[Column.SRV_STANDARD] = "s" + srv_data[Column.SRV_FREQ] = "10720" + srv_data[Column.SRV_RATE] = "27500" + srv_data[Column.SRV_POL] = "H" + srv_data[Column.SRV_FEC] = "Auto" + srv_data[Column.SRV_SYSTEM] = "DVB-S" + srv_data[Column.SRV_POS] = "0.0E" + srv_data[Column.SRV_DATA_ID] = "0:00000000:0:0000:1:0:0:0:0:0" + srv_data[Column.SRV_TRANSPONDER] = "s 10720000:27500000:0:1:0:0:0:0:0" + + srv = Service(*srv_data) self._old_service = srv self._apply_button.set_visible(False) self._create_button.set_visible(True) self._tr_edit_switch.set_sensitive(False) self.on_tr_edit_toggled(self._tr_edit_switch.set_active(True), True) - [elem.set_text("0") for elem in self._non_empty_elements.values()] - self._new_check_button.set_active(True) - self._name_entry.set_text(srv.service) - self._package_entry.set_text(srv.package) - self._freq_entry.set_text(srv.freq) - self._service_type_combo_box.set_active(0) - self._pol_combo_box.set_active(0) - self._fec_combo_box.set_active(0) - self._sys_combo_box.set_active(0) - self._invertion_combo_box.set_active(2) + self.init_service_data(srv) self._current_model = get_base_model(self._services_view.get_model()) @@ -224,6 +246,9 @@ class ServiceDetailsDialog: srv = Service(*self._current_model[itr][: Column.SRV_TOOLTIP]) self._old_service = srv self._current_itr = itr + self.init_service_data(srv) + + def init_service_data(self, srv): # Service self._name_entry.set_text(srv.service) self._package_entry.set_text(srv.package) @@ -235,6 +260,15 @@ class ServiceDetailsDialog: self.select_active_text(self._pol_combo_box, srv.pol) self.select_active_text(self._fec_combo_box, srv.fec) self.select_active_text(self._sys_combo_box, srv.system) + self.update_ui(srv) + if self._s_type is SettingsType.ENIGMA_2: + self.init_enigma2_service_data(srv) + self.init_enigma2_transponder_data(srv) + elif self._s_type is SettingsType.NEUTRINO_MP: + self.init_neutrino_data(srv) + self.init_neutrino_ui_elements() + + def update_ui(self, srv): if self._tr_type is TrType.Terrestrial: self.update_ui_for_terrestrial() elif self._tr_type is TrType.Cable: @@ -244,13 +278,6 @@ class ServiceDetailsDialog: else: self.set_sat_positions(srv.pos) - if self._s_type is SettingsType.ENIGMA_2: - self.init_enigma2_service_data(srv) - self.init_enigma2_transponder_data(srv) - elif self._s_type is SettingsType.NEUTRINO_MP: - self.init_neutrino_data(srv) - self.init_neutrino_ui_elements() - # ***************** Init Enigma2 data *********************# @run_idle @@ -413,7 +440,7 @@ class ServiceDetailsDialog: self.save_data() def save_data(self): - if self._s_type is SettingsType.NEUTRINO_MP and self._tr_type is not TrType.Satellite: + if self._s_type is SettingsType.NEUTRINO_MP: show_dialog(DialogType.ERROR, transient=self._dialog, text="Not implemented yet!") return @@ -430,9 +457,11 @@ class ServiceDetailsDialog: def on_new(self): """ Create new service. """ srv_data = self.update_service_data() - if srv_data: - service, data = srv_data - self._current_model.append(service + (None, data.get(Column.SRV_BACKGROUND, None))) + if not srv_data: + return False + + service, data = srv_data + self._current_model.append(service + (None, data.get(Column.SRV_BACKGROUND, None))) return True def on_edit(self): @@ -460,6 +489,7 @@ class ServiceDetailsDialog: except Exception as e: log(f"Edit service error: {e}") show_dialog(DialogType.ERROR, transient=self._dialog, text="Error getting transponder parameters!") + return False else: if self._transponder_services_iters: self.update_transponder_services(transponder, self.get_sat_position())