diff --git a/app/eparser/ecommons.py b/app/eparser/ecommons.py index 6537cbb9..ef34fc3a 100644 --- a/app/eparser/ecommons.py +++ b/app/eparser/ecommons.py @@ -13,6 +13,7 @@ class BqServiceType(Enum): DEFAULT = "DEFAULT" IPTV = "IPTV" MARKER = "MARKER" # 64 + SPACE = "SPACE" # 832 [hidden marker] Bouquet = namedtuple("Bouquet", ["name", "type", "services", "locked", "hidden"]) @@ -135,7 +136,7 @@ TRANSMISSION_MODE = {"0": "2k", "1": "8k", "2": "Auto", "3": "4k", "4": "1k", "5 GUARD_INTERVAL = {"0": "1/32", "1": "1/16", "2": "1/8", "3": "1/4", "4": "Auto", "5": "1/128", "6": "19/128", "7": "19/256"} -HIERARCHY = {"0": "None", "1": "1", "2": "2", "3": "4", "4": "Auto"} +HIERARCHY = {"0": "None", "1": "1", "2": "2", "3": "4", "4": "Auto"} T_FEC = {"0": "1/2", "1": "2/3", "2": "3/4", "3": "5/6", "4": "7/8", "5": "Auto", "6": "6/7", "7": "8/9"} diff --git a/app/eparser/enigma/bouquets.py b/app/eparser/enigma/bouquets.py index 7e3818a3..61bef663 100644 --- a/app/eparser/enigma/bouquets.py +++ b/app/eparser/enigma/bouquets.py @@ -24,7 +24,8 @@ def write_bouquets(path, bouquets, force_bq_names=False): srv_line = '#SERVICE 1:7:{}:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.{}.{}" ORDER BY bouquet\n' line = [] pattern = re.compile("[^\\w_()]+") - current_marker = [0] + m_index = [0] + s_index = [0] for bqs in bouquets: line.clear() @@ -37,24 +38,30 @@ def write_bouquets(path, bouquets, force_bq_names=False): else: bq_name = re.sub(pattern, "_", bq.name) if force_bq_names else "de{0:02d}".format(index) line.append(srv_line.format(2 if bq.type == BqType.RADIO.value else 1, bq_name, bq.type)) - write_bouquet(path + "userbouquet.{}.{}".format(bq_name, bq.type), bq.name, bq.services, current_marker) + write_bouquet(path + "userbouquet.{}.{}".format(bq_name, bq.type), bq.name, bq.services, m_index, s_index) with open(path + "bouquets.{}".format(bqs.type), "w", encoding="utf-8") as file: file.writelines(line) -def write_bouquet(path, name, services, current_marker): +def write_bouquet(path, name, services, current_marker, current_space): bouquet = ["#NAME {}\n".format(name)] marker = "#SERVICE 1:64:{:X}:0:0:0:0:0:0:0::{}\n" + space = "#SERVICE 1:832:D:{}:0:0:0:0:0:0:\n" for srv in services: - if srv.service_type == BqServiceType.IPTV.name: + s_type = srv.service_type + + if s_type == BqServiceType.IPTV.name: bouquet.append("#SERVICE {}\n".format(srv.fav_id.strip())) - elif srv.service_type == BqServiceType.MARKER.name: + elif s_type == BqServiceType.MARKER.name: m_data = srv.fav_id.strip().split(":") m_data[2] = current_marker[0] current_marker[0] += 1 bouquet.append(marker.format(m_data[2], m_data[-1])) + elif s_type == BqServiceType.SPACE.name: + bouquet.append(space.format(current_space[0])) + current_space[0] += 1 else: data = to_bouquet_id(srv) if srv.service: @@ -89,18 +96,21 @@ def get_bouquet(path, bq_name, bq_type): bq_name = srvs.pop(0) for srv in srvs: - ch_data = srv.strip().split(":") - if ch_data[1] == "64": + srv_data = srv.strip().split(":") + if srv_data[1] == "64": m_data, sep, desc = srv.partition("#DESCRIPTION") - services.append(BouquetService(desc.strip() if desc else "", BqServiceType.MARKER, srv, ch_data[2])) + services.append(BouquetService(desc.strip() if desc else "", BqServiceType.MARKER, srv, srv_data[2])) + elif srv_data[1] == "832": + m_data, sep, desc = srv.partition("#DESCRIPTION") + services.append(BouquetService(desc.strip() if desc else "", BqServiceType.SPACE, srv, srv_data[3])) elif "http" in srv: stream_data, sep, desc = srv.partition("#DESCRIPTION") services.append(BouquetService(desc.lstrip(":").strip() if desc else "", BqServiceType.IPTV, srv, 0)) else: - fav_id = "{}:{}:{}:{}".format(ch_data[3], ch_data[4], ch_data[5], ch_data[6]) + fav_id = "{}:{}:{}:{}".format(srv_data[3], srv_data[4], srv_data[5], srv_data[6]) name = None - if len(ch_data) == 12: - name, sep, desc = str(ch_data[-1]).partition("\n#DESCRIPTION") + if len(srv_data) == 12: + name, sep, desc = str(srv_data[-1]).partition("\n#DESCRIPTION") services.append(BouquetService(name, BqServiceType.DEFAULT, fav_id.upper(), 0)) return bq_name.lstrip("#NAME").strip(), services diff --git a/app/ui/main_app_window.py b/app/ui/main_app_window.py index 2884c9ef..57573f36 100644 --- a/app/ui/main_app_window.py +++ b/app/ui/main_app_window.py @@ -121,6 +121,7 @@ class Application(Gtk.Application): "on_import_bouquets": self.on_import_bouquets, "on_backup_tool_show": self.on_backup_tool_show, "on_insert_marker": self.on_insert_marker, + "on_insert_space": self.on_insert_space, "on_fav_press": self.on_fav_press, "on_locate_in_services": self.on_locate_in_services, "on_picons_manager_show": self.on_picons_manager_show, @@ -1159,7 +1160,7 @@ class Application(Gtk.Application): fav_id = srv.data # IPTV and MARKER services s_type = srv.type - if s_type is BqServiceType.MARKER or s_type is BqServiceType.IPTV: + if s_type in (BqServiceType.MARKER, BqServiceType.IPTV, BqServiceType.SPACE): icon = None picon_id = None if s_type is BqServiceType.IPTV: @@ -1630,11 +1631,14 @@ class Application(Gtk.Application): self._radio_count_label.set_text(str(radio_count)) self._data_count_label.set_text(str(data_count)) - def on_insert_marker(self, view): + def on_insert_marker(self, view, m_type=BqServiceType.MARKER): """ Inserts marker into bouquet services list. """ - insert_marker(view, self._bouquets, self._bq_selected, self._services, self._main_window) + insert_marker(view, self._bouquets, self._bq_selected, self._services, self._main_window, m_type) self.update_fav_num_column(self._fav_model) + def on_insert_space(self, view): + self.on_insert_marker(view, BqServiceType.SPACE) + def on_fav_press(self, menu, event): if event.get_event_type() == Gdk.EventType.DOUBLE_BUTTON_PRESS: if self._fav_click_mode is FavClickMode.DISABLED: diff --git a/app/ui/main_helper.py b/app/ui/main_helper.py index 468b86cd..bcb83f8e 100644 --- a/app/ui/main_helper.py +++ b/app/ui/main_helper.py @@ -16,23 +16,28 @@ from .uicommons import ViewTarget, BqGenType, Gtk, Gdk, HIDE_ICON, LOCKED_ICON, # ***************** Markers *******************# -def insert_marker(view, bouquets, selected_bouquet, services, parent_window): +def insert_marker(view, bouquets, selected_bouquet, services, parent_window, m_type=BqServiceType.MARKER): """" Inserts marker into bouquet services list. """ - response = show_dialog(DialogType.INPUT, parent_window) - if response == Gtk.ResponseType.CANCEL: - return + fav_id, text = "1:832:D:0:0:0:0:0:0:0:\n", None - if not response.strip(): - show_dialog(DialogType.ERROR, parent_window, "The text of marker is empty, please try again!") - return + if m_type is BqServiceType.MARKER: + response = show_dialog(DialogType.INPUT, parent_window) + if response == Gtk.ResponseType.CANCEL: + return - fav_id = "1:64:0:0:0:0:0:0:0:0::{}\n#DESCRIPTION {}\n".format(response, response) - s_type = BqServiceType.MARKER.name + if not response.strip(): + show_dialog(DialogType.ERROR, parent_window, "The text of marker is empty, please try again!") + return + + fav_id = "1:64:0:0:0:0:0:0:0:0::{}\n#DESCRIPTION {}\n".format(response, response) + text = response + + s_type = m_type.name model, paths = view.get_selection().get_selected_rows() - marker = (None, None, response, None, None, s_type, None, fav_id, None, None, None) + marker = (None, None, text, None, None, s_type, None, fav_id, None, None, None) itr = model.insert_before(model.get_iter(paths[0]), marker) if paths else model.insert(0, marker) bouquets[selected_bouquet].insert(model.get_path(itr)[0], fav_id) - services[fav_id] = Service(None, None, None, response, None, None, None, s_type, *[None] * 9, 0, fav_id, None) + services[fav_id] = Service(None, None, None, text, None, None, None, s_type, *[None] * 9, 0, fav_id, None) # ***************** Movement *******************# diff --git a/app/ui/main_window.glade b/app/ui/main_window.glade index f564b6f7..5b5c22fa 100644 --- a/app/ui/main_window.glade +++ b/app/ui/main_window.glade @@ -307,6 +307,11 @@ Author: Dmitriy Yefremov False insert-link + + True + False + format-text-underline + True False @@ -3173,6 +3178,16 @@ Author: Dmitriy Yefremov + + + Insert space + True + False + insert_space_image + False + + + True