From deb161a15365df3adc5b2eafdddbddab58d50cee Mon Sep 17 00:00:00 2001 From: DYefremov Date: Wed, 27 Jul 2022 00:03:28 +0300 Subject: [PATCH] improved reference assignment for IPTV --- app/ui/epg/dialog.glade | 3 +- app/ui/epg/epg.py | 11 ++++-- app/ui/epg/tab.glade | 8 ++++ app/ui/main.glade | 84 +++++++++++++++++++++-------------------- app/ui/main.py | 46 +++++++++++++++++++--- app/ui/main_helper.py | 46 +++++++++++----------- 6 files changed, 124 insertions(+), 74 deletions(-) diff --git a/app/ui/epg/dialog.glade b/app/ui/epg/dialog.glade index bff2ba50..f96276fc 100644 --- a/app/ui/epg/dialog.glade +++ b/app/ui/epg/dialog.glade @@ -1116,6 +1116,7 @@ Author: Dmitriy Yefremov True bouquet_list_store 2 + True both 9 @@ -1123,7 +1124,7 @@ Author: Dmitriy Yefremov - + multiple diff --git a/app/ui/epg/epg.py b/app/ui/epg/epg.py index 2e59e284..d8dbd400 100644 --- a/app/ui/epg/epg.py +++ b/app/ui/epg/epg.py @@ -706,6 +706,10 @@ class EpgDialog: get_message("Count of successfully configured services:"), success_count), Gtk.MessageType.INFO) + def assign_refs(self, model, paths, data): + [self.assign_data(model[p], data) for p in paths] + self.update_epg_count() + def assign_data(self, row, data, show_error=False): if row[Column.FAV_TYPE] != BqServiceType.IPTV.value: if not show_error: @@ -750,8 +754,7 @@ class EpgDialog: def on_assign_ref(self, item=None): if self._current_ref: model, paths = self._bouquet_view.get_selection().get_selected_rows() - self.assign_data(model[paths], self._current_ref.pop()) - self.update_epg_count() + self.assign_refs(model, paths, self._current_ref.pop()) @run_idle def on_reset(self, item): @@ -841,8 +844,8 @@ class EpgDialog: model = view.get_model() data = data.get_text() if data: - self.assign_data(model[path], data.split("::::")) - self.update_epg_count() + data = data.split("::::") + self.assign_refs(model, path, data) return False # ***************** Options *********************# diff --git a/app/ui/epg/tab.glade b/app/ui/epg/tab.glade index f1601885..dcd41e48 100644 --- a/app/ui/epg/tab.glade +++ b/app/ui/epg/tab.glade @@ -81,10 +81,18 @@ Author: Dmitriy Yefremov False EPG source 0 + True 0 Receiver + + + False + False + 10 + + False diff --git a/app/ui/main.glade b/app/ui/main.glade index 3e24313f..b2ff86e0 100644 --- a/app/ui/main.glade +++ b/app/ui/main.glade @@ -73,6 +73,11 @@ Author: Dmitriy Yefremov + + True + False + insert-link + @@ -1341,6 +1346,16 @@ Author: Dmitriy Yefremov + + + Copy reference + True + False + copy_image + False + + + gtk-edit @@ -1440,22 +1455,6 @@ Author: Dmitriy Yefremov False - - - Copy reference - True - False - copy_image - False - - - - - - True - False - - Remove all unused @@ -1471,7 +1470,7 @@ Author: Dmitriy Yefremov - + True False @@ -4578,6 +4577,16 @@ Author: Dmitriy Yefremov + + + Copy reference + True + False + copy_image_2 + False + + + gtk-paste @@ -4673,7 +4682,7 @@ Author: Dmitriy Yefremov - + True False @@ -4747,7 +4756,7 @@ Author: Dmitriy Yefremov - + True False @@ -4794,11 +4803,22 @@ Author: Dmitriy Yefremov - + True False + + + Assign reference + True + False + False + assign_ref_image + False + + + EPG configuration @@ -4810,7 +4830,7 @@ Author: Dmitriy Yefremov - + True False @@ -4826,7 +4846,7 @@ Author: Dmitriy Yefremov - + True False @@ -4860,7 +4880,7 @@ Author: Dmitriy Yefremov insert_image False - + True False @@ -4899,22 +4919,6 @@ Author: Dmitriy Yefremov False - - - Copy reference - True - False - copy_image_2 - False - - - - - - True - False - - Remove all unused @@ -4930,7 +4934,7 @@ Author: Dmitriy Yefremov - + True False diff --git a/app/ui/main.py b/app/ui/main.py index 06400418..4838015a 100644 --- a/app/ui/main.py +++ b/app/ui/main.py @@ -27,6 +27,7 @@ import os +import re import sys from collections import Counter from contextlib import suppress @@ -95,7 +96,7 @@ class Application(Gtk.Application): _FAV_ELEMENTS = ("fav_cut_popup_item", "fav_paste_popup_item", "fav_locate_popup_item", "fav_iptv_popup_item", "fav_insert_marker_popup_item", "fav_insert_space_popup_item", "fav_edit_sub_menu_popup_item", "fav_edit_popup_item", "fav_picon_popup_item", "fav_copy_popup_item", "fav_add_alt_popup_item", - "fav_epg_configuration_popup_item", "fav_mark_dup_popup_item") + "fav_epg_configuration_popup_item", "fav_mark_dup_popup_item", "fav_reference_popup_item") _BOUQUET_ELEMENTS = ("bouquets_new_popup_item", "bouquets_edit_popup_item", "bouquets_cut_popup_item", "bouquets_copy_popup_item", "bouquets_paste_popup_item", "new_header_button", @@ -132,6 +133,8 @@ class Application(Gtk.Application): "on_iptv_services_copy": self.on_iptv_services_copy, "on_fav_copy": self.on_fav_copy, "on_bouquets_copy": self.on_bouquets_copy, + "on_reference_copy": self.on_reference_copy, + "on_reference_assign": self.on_reference_assign, "on_fav_paste": self.on_fav_paste, "on_bouquets_paste": self.on_bouquets_paste, "on_rename_for_bouquet": self.on_rename_for_bouquet, @@ -184,7 +187,6 @@ class Application(Gtk.Application): "on_assign_picon_file": self.on_assign_picon_file, "on_assign_picon": self.on_assign_picon, "on_remove_picon": self.on_remove_picon, - "on_reference_picon": self.on_reference_picon, "on_remove_unused_picons": self.on_remove_unused_picons, "on_iptv": self.on_iptv, "on_epg_list_configuration": self.on_epg_list_configuration, @@ -374,6 +376,9 @@ class Application(Gtk.Application): self._fav_view.connect("key-press-event", self.force_ctrl) # Clipboard self._clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) + ref_item = builder.get_object("fav_assign_ref_popup_item") + self.bind_property("is_enigma", ref_item, "visible") + self._clipboard.connect("owner-change", lambda c, o: ref_item.set_sensitive(c.wait_is_text_available())) # Wait dialog self._wait_dialog = WaitDialog(self._main_window) # Filter @@ -1129,6 +1134,10 @@ class Application(Gtk.Application): if to_copy: self._bouquets_buffer.extend([model[i][:] for i in to_copy]) + def on_reference_copy(self, view): + """ Copying picon id to clipboard. """ + copy_reference(self.get_target_view(view), view, self._services, self._clipboard, self._main_window) + def on_fav_cut(self, view): self.on_cut(view, ViewTarget.FAV) @@ -2926,6 +2935,35 @@ class Application(Gtk.Application): gen = self.remove_favs(response, self._fav_model) GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW) + def on_reference_assign(self, view): + """ Assigns DVB reference to the selected IPTV services. """ + model, paths = view.get_selection().get_selected_rows() + iptv_paths = [p for p in paths if model[p][Column.FAV_TYPE] == BqServiceType.IPTV.value] + if not iptv_paths: + self.show_error_message("No IPTV services selected!") + return + + ref = self._clipboard.wait_for_text() + if ref and re.match(r"\d+_\d+_\d+_\w+_\d+_\d+_\d+_0_0_0", ref): + [self.assign_reference(model, p, ref) for p in iptv_paths] + self._clipboard.clear() + + def assign_reference(self, model, path, ref): + ref_data = ref.split("_") + row = model[path] + fav_id = row[Column.FAV_ID] + fav_id_data = fav_id.split(":") + fav_id_data[3:7] = ref_data[3:7] + new_fav_id = ":".join(fav_id_data) + new_data_id = ":".join(fav_id_data[:11]).strip() + old_srv = self._services.pop(fav_id, None) + if old_srv: + picon_id_data = old_srv.picon_id.split("_") + picon_id_data[3:7] = ref_data[3:7] + new_service = old_srv._replace(data_id=new_data_id, fav_id=new_fav_id, picon_id="_".join(picon_id_data)) + self._services[new_fav_id] = new_service + self.emit("iptv-service-edited", (old_srv, new_service)) + # ****************** EPG ********************** # def set_display_epg(self, action, value): @@ -3925,10 +3963,6 @@ class Application(Gtk.Application): def on_remove_picon(self, view): remove_picon(self.get_target_view(view), self._services_view, self._fav_view, self._picons, self._settings) - def on_reference_picon(self, view): - """ Copying picon id to clipboard """ - copy_picon_reference(self.get_target_view(view), view, self._services, self._clipboard, self._main_window) - def on_remove_unused_picons(self, item): if show_dialog(DialogType.QUESTION, self._main_window) == Gtk.ResponseType.CANCEL: return diff --git a/app/ui/main_helper.py b/app/ui/main_helper.py index 34026452..85ad7a9a 100644 --- a/app/ui/main_helper.py +++ b/app/ui/main_helper.py @@ -29,7 +29,7 @@ """ Helper module for the GUI. """ __all__ = ("insert_marker", "move_items", "rename", "ViewTarget", "set_flags", "locate_in_services", - "scroll_to", "get_base_model", "copy_picon_reference", "assign_picons", "remove_picon", + "scroll_to", "get_base_model", "copy_reference", "assign_picons", "remove_picon", "is_only_one_item_selected", "gen_bouquets", "BqGenType", "get_selection", "get_model_data", "remove_all_unused_picons", "get_picon_pixbuf", "get_base_itrs", "get_iptv_url", "get_iptv_data", "update_entry_data", "append_text_to_tview", "on_popup_menu") @@ -523,27 +523,6 @@ def remove_picon(target, srv_view, fav_view, picons, settings): remove_picons(settings, picon_ids, picons) -def copy_picon_reference(target, view, services, clipboard, transient): - """ Copying picon id to clipboard """ - model, paths = view.get_selection().get_selected_rows() - if not is_only_one_item_selected(paths, transient): - return - - if target is ViewTarget.SERVICES: - picon_id = model.get_value(model.get_iter(paths), Column.SRV_PICON_ID) - if picon_id: - clipboard.set_text(picon_id.rstrip(".png"), -1) - else: - show_dialog(DialogType.ERROR, transient, "No reference is present!") - elif target is ViewTarget.FAV: - fav_id = model.get_value(model.get_iter(paths), Column.FAV_ID) - srv = services.get(fav_id, None) - if srv and srv.picon_id: - clipboard.set_text(srv.picon_id.rstrip(".png"), -1) - else: - show_dialog(DialogType.ERROR, transient, "No reference is present!") - - def remove_all_unused_picons(settings, services): """ Removes picons from profile picons folder if there are no services for these picons. """ ids = {s.picon_id for s in services} @@ -637,7 +616,28 @@ def get_bouquets_names(model): return bouquets_names -# ***************** Others *********************# +# ***************** Others ********************* # + +def copy_reference(target, view, services, clipboard, transient): + """ Copying picon id to clipboard """ + model, paths = view.get_selection().get_selected_rows() + if not is_only_one_item_selected(paths, transient): + return + + if target is ViewTarget.SERVICES: + picon_id = model.get_value(model.get_iter(paths), Column.SRV_PICON_ID) + if picon_id: + clipboard.set_text(picon_id.rstrip(".png"), -1) + else: + show_dialog(DialogType.ERROR, transient, "No reference is present!") + elif target is ViewTarget.FAV: + fav_id = model.get_value(model.get_iter(paths), Column.FAV_ID) + srv = services.get(fav_id, None) + if srv and srv.picon_id: + clipboard.set_text(srv.picon_id.rstrip(".png"), -1) + else: + show_dialog(DialogType.ERROR, transient, "No reference is present!") + def update_entry_data(entry, dialog, settings): """ Updates value in text entry from chooser dialog. """