improved reference assignment for IPTV

This commit is contained in:
DYefremov
2022-07-27 00:03:28 +03:00
parent 2a2611abde
commit deb161a153
6 changed files with 124 additions and 74 deletions

View File

@@ -1116,6 +1116,7 @@ Author: Dmitriy Yefremov
<property name="can_focus">True</property>
<property name="model">bouquet_list_store</property>
<property name="search_column">2</property>
<property name="rubber_banding">True</property>
<property name="enable_grid_lines">both</property>
<property name="tooltip_column">9</property>
<signal name="button-press-event" handler="on_bouquet_popup_menu" object="bouquet_popup_menu" swapped="no"/>
@@ -1123,7 +1124,7 @@ Author: Dmitriy Yefremov
<signal name="drag-data-received" handler="on_drag_data_received" swapped="no"/>
<signal name="key-release-event" handler="on_key_press" swapped="no"/>
<child internal-child="selection">
<object class="GtkTreeSelection">
<object class="GtkTreeSelection" id="bouquet_view_selection">
<property name="mode">multiple</property>
</object>
</child>

View File

@@ -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 *********************#

View File

@@ -81,10 +81,18 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property>
<property name="tooltip_text" translatable="yes">EPG source</property>
<property name="active">0</property>
<property name="has_entry">True</property>
<property name="active_id">0</property>
<items>
<item id="0" translatable="yes">Receiver</item>
</items>
<child internal-child="entry">
<object class="GtkEntry">
<property name="can_focus">False</property>
<property name="editable">False</property>
<property name="width_chars">10</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>

View File

@@ -73,6 +73,11 @@ Author: Dmitriy Yefremov
</object>
</child>
</object>
<object class="GtkImage" id="assign_ref_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">insert-link</property>
</object>
<object class="GtkTreeStore" id="bouquets_tree_store">
<columns>
<!-- column-name bouquet -->
@@ -1341,6 +1346,16 @@ Author: Dmitriy Yefremov
<accelerator key="c" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="services_reference_popup_item">
<property name="label" translatable="yes">Copy reference</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">copy_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_reference_copy" object="services_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="services_edit_popup_item">
<property name="label">gtk-edit</property>
@@ -1440,22 +1455,6 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="services_reference_picon_popup_item">
<property name="label" translatable="yes">Copy reference</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">copy_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_reference_picon" object="services_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="services_separatormenuitem_5">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="services_remove_unused_picons_popup_item">
<property name="label" translatable="yes">Remove all unused</property>
@@ -1471,7 +1470,7 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="services_separatormenuitem_6">
<object class="GtkSeparatorMenuItem" id="services_separatormenuitem_5">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
@@ -4578,6 +4577,16 @@ Author: Dmitriy Yefremov
<accelerator key="c" signal="activate" modifiers="Primary"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_reference_popup_item">
<property name="label" translatable="yes">Copy reference</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">copy_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_reference_copy" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_paste_popup_item">
<property name="label">gtk-paste</property>
@@ -4673,7 +4682,7 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_3">
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
@@ -4747,7 +4756,7 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_5">
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_5">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
@@ -4794,11 +4803,22 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_6">
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_6">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_assign_ref_popup_item">
<property name="label" translatable="yes">Assign reference</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">assign_ref_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_reference_assign" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_epg_configuration_popup_item">
<property name="label" translatable="yes">EPG configuration</property>
@@ -4810,7 +4830,7 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_7">
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_7">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
@@ -4826,7 +4846,7 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_8">
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_8">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
@@ -4860,7 +4880,7 @@ Author: Dmitriy Yefremov
<property name="image">insert_image</property>
<property name="use_stock">False</property>
<child type="submenu">
<object class="GtkMenu" id="fav_picon_popoup_menu">
<object class="GtkMenu" id="fav_picon_popup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
@@ -4899,22 +4919,6 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_reference_picon_popup_item">
<property name="label" translatable="yes">Copy reference</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">copy_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_reference_picon" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_11">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_remove_unused_picons_popup_item">
<property name="label" translatable="yes">Remove all unused</property>
@@ -4930,7 +4934,7 @@ Author: Dmitriy Yefremov
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_12">
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_11">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>

View File

@@ -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

View File

@@ -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. """