yt list import dialog skeleton

This commit is contained in:
DYefremov
2019-06-24 00:36:54 +03:00
parent 95069bbf24
commit 8fee65cabb
5 changed files with 797 additions and 341 deletions

View File

@@ -4,7 +4,8 @@ import urllib
from html.parser import HTMLParser from html.parser import HTMLParser
from urllib.request import Request from urllib.request import Request
_YT_PATTERN = re.compile(r"https://www.youtube.com/.+(?:v=|\/)([\w-]{11})&?(list=)?([\w-]{34})?.*") _YT_PATTERN = re.compile(r"https://www.youtube.com/.+(?:v=)([\w-]{11}).*")
_YT_LIST_PATTERN = re.compile(r"https://www.youtube.com/.+?(?:list=)([\w-]{34})?.*")
_YT_VIDEO_PATTERN = re.compile(r"https://r\d+---sn-[\w]{10}-[\w]{3,5}.googlevideo.com/videoplayback?.*") _YT_VIDEO_PATTERN = re.compile(r"https://r\d+---sn-[\w]{10}-[\w]{3,5}.googlevideo.com/videoplayback?.*")
_HEADERS = {"User-Agent": "Mozilla/5.0"} _HEADERS = {"User-Agent": "Mozilla/5.0"}
@@ -23,6 +24,13 @@ class YouTube:
if yt: if yt:
return yt.group(1) return yt.group(1)
@staticmethod
def get_yt_list_id(url):
""" Returns playlist id or None """
yt = re.search(_YT_LIST_PATTERN, url)
if yt:
return yt.group(1)
@staticmethod @staticmethod
def get_yt_link(video_id): def get_yt_link(video_id):
""" Getting link to YouTube video by id. """ Getting link to YouTube video by id.

View File

@@ -1,3 +1,4 @@
import concurrent.futures
import glob import glob
import os import os
import re import re
@@ -11,9 +12,9 @@ from gi.repository import GLib
from app.commons import run_idle, run_task from app.commons import run_idle, run_task
from app.eparser.ecommons import BqServiceType, Service from app.eparser.ecommons import BqServiceType, Service
from app.eparser.iptv import NEUTRINO_FAV_ID_FORMAT, StreamType, ENIGMA2_FAV_ID_FORMAT from app.eparser.iptv import NEUTRINO_FAV_ID_FORMAT, StreamType, ENIGMA2_FAV_ID_FORMAT, get_fav_id
from app.properties import Profile from app.properties import Profile
from app.tools.yt import YouTube from app.tools.yt import YouTube, PlayListParser
from .dialogs import Action, show_dialog, DialogType, get_dialogs_string, get_message from .dialogs import Action, show_dialog, DialogType, get_dialogs_string, get_message
from .main_helper import get_base_model, get_iptv_url from .main_helper import get_base_model, get_iptv_url
from .uicommons import Gtk, Gdk, TEXT_DOMAIN, UI_RESOURCES_PATH, IPTV_ICON, Column, IS_GNOME_SESSION from .uicommons import Gtk, Gdk, TEXT_DOMAIN, UI_RESOURCES_PATH, IPTV_ICON, Column, IS_GNOME_SESSION
@@ -543,5 +544,155 @@ class IptvListConfigurationDialog:
self.update_reference() self.update_reference()
class YtListImportDialog:
def __init__(self, transient, bouquet, fav_view, profile):
handlers = {"on_import": self.on_import,
"on_receive": self.on_receive,
"on_yt_url_entry_changed": self.on_url_entry_changed,
"on_yt_info_bar_close": self.on_info_bar_close,
"on_selected_toggled": self.on_selected_toggled,
"on_close": self.on_close}
builder = Gtk.Builder()
builder.set_translation_domain(TEXT_DOMAIN)
builder.add_objects_from_string(
get_dialogs_string(UI_RESOURCES_PATH + "yt_dialog.glade").format(use_header=IS_GNOME_SESSION),
("yt_import_dialog_window", "yt_liststore"))
builder.connect_signals(handlers)
self._dialog = builder.get_object("yt_import_dialog_window")
self._dialog.set_transient_for(transient)
self._list_view_scrolled_window = builder.get_object("yt_list_view_scrolled_window")
self._model = builder.get_object("yt_liststore")
self._progress_bar = builder.get_object("yt_progress_bar")
self._info_bar_box = builder.get_object("yt_info_bar_box")
self._message_label = builder.get_object("yt_info_bar_message_label")
self._info_bar = builder.get_object("yt_info_bar")
self._url_entry = builder.get_object("yt_url_entry")
self._receive_button = builder.get_object("yt_receive_button")
self._import_button = builder.get_object("yt_import_button")
# style
self._style_provider = Gtk.CssProvider()
self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css")
self._url_entry.get_style_context().add_provider_for_screen(Gdk.Screen.get_default(), self._style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_USER)
self._bouquet = bouquet
self._fav_path, c = fav_view.get_cursor()
self._fav_model = fav_view.get_model()
self._profile = profile
self._download_task = False
self._yt_list_id = None
self._yt_list_title = None
def show(self):
self._dialog.show()
@run_task
def on_import(self, item):
self.update_active_elements(False)
self._download_task = True
try:
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
done_links = []
futures = {executor.submit(YouTube.get_yt_link, r[1]): r for r in self._model if r[2]}
size = len(futures)
counter = 0
for future in concurrent.futures.as_completed(futures):
if not self._download_task:
executor.shutdown()
return
done_links.append(future.result())
counter += 1
self.update_progress_bar(counter / size)
except Exception as e:
print(e)
else:
self.show_info_message(get_message("Done!"), Gtk.MessageType.INFO)
self.append_services(done_links)
finally:
self._download_task = False
self.update_active_elements(True)
def on_receive(self, item):
self.update_active_elements(False)
self._model.clear()
self.on_info_bar_close()
self.update_refs_list()
@run_task
def update_refs_list(self):
if self._yt_list_id:
try:
self._yt_list_title, links = PlayListParser.get_yt_playlist(self._yt_list_id)
except Exception as e:
print(e)
return
else:
gen = self.update_links(links)
GLib.idle_add(lambda: next(gen, False), priority=GLib.PRIORITY_LOW)
finally:
self.update_active_elements(True)
def update_links(self, links):
for l in links:
yield self._model.append((l[0], l[1], True, None))
@run_idle
def append_services(self, links):
aggr = [None] * 10
print("List title:", self._yt_list_title)
for l in links:
fav_id = get_fav_id(*l, self._profile)
srv = Service(None, None, IPTV_ICON, l[1], *aggr[0:3], BqServiceType.IPTV.name, *aggr, fav_id, None)
print(srv)
@run_idle
def update_active_elements(self, sensitive):
self._list_view_scrolled_window.set_visible(sensitive or not sensitive)
self._url_entry.set_sensitive(sensitive)
self._receive_button.set_sensitive(sensitive)
self._import_button.set_sensitive(sensitive)
def on_url_entry_changed(self, entry):
url_str = entry.get_text()
yt_id = YouTube.get_yt_list_id(url_str)
entry.set_name("GtkEntry" if yt_id else _DIGIT_ENTRY_NAME)
self._receive_button.set_sensitive(bool(yt_id))
self._yt_list_id = yt_id
if yt_id:
entry.set_icon_from_pixbuf(Gtk.EntryIconPosition.SECONDARY, get_yt_icon("youtube", 32))
else:
entry.set_icon_from_stock(Gtk.EntryIconPosition.SECONDARY, None)
@run_idle
def on_info_bar_close(self, bar=None, resp=None):
self._info_bar.set_visible(False)
@run_idle
def update_progress_bar(self, value):
self._info_bar_box.set_visible(value < 1)
self._progress_bar.set_fraction(value)
@run_idle
def show_info_message(self, text, message_type):
self._info_bar.set_visible(True)
self._info_bar.set_message_type(message_type)
self._message_label.set_text(text)
def on_selected_toggled(self, toggle, path):
self._model.set_value(self._model.get_iter(path), 2, not toggle.get_active())
@run_idle
def on_close(self, window, event):
if self._download_task and show_dialog(DialogType.QUESTION, self._dialog) == Gtk.ResponseType.CANCEL:
return
self._download_task = False
self._dialog.destroy()
if __name__ == "__main__": if __name__ == "__main__":
pass pass

View File

@@ -22,7 +22,7 @@ from app.ui.epg_dialog import EpgDialog
from .backup import BackupDialog, backup_data, clear_data_path from .backup import BackupDialog, backup_data, clear_data_path
from .imports import ImportDialog, import_bouquet from .imports import ImportDialog, import_bouquet
from .download_dialog import DownloadDialog from .download_dialog import DownloadDialog
from .iptv import IptvDialog, SearchUnavailableDialog, IptvListConfigurationDialog from .iptv import IptvDialog, SearchUnavailableDialog, IptvListConfigurationDialog, YtListImportDialog
from .search import SearchProvider from .search import SearchProvider
from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON, IPTV_ICON, MOVE_KEYS, KeyboardKey, Column, \ from .uicommons import Gtk, Gdk, UI_RESOURCES_PATH, LOCKED_ICON, HIDE_ICON, IPTV_ICON, MOVE_KEYS, KeyboardKey, Column, \
EXTRA_COLOR, NEW_COLOR, FavClickMode EXTRA_COLOR, NEW_COLOR, FavClickMode
@@ -110,6 +110,7 @@ class Application(Gtk.Application):
"on_hide": self.on_hide, "on_hide": self.on_hide,
"on_locked": self.on_locked, "on_locked": self.on_locked,
"on_model_changed": self.on_model_changed, "on_model_changed": self.on_model_changed,
"on_import_yt_list": self.on_import_yt_list,
"on_import_m3u": self.on_import_m3u, "on_import_m3u": self.on_import_m3u,
"on_export_to_m3u": self.on_export_to_m3u, "on_export_to_m3u": self.on_export_to_m3u,
"on_import_bouquet": self.on_import_bouquet, "on_import_bouquet": self.on_import_bouquet,
@@ -1373,6 +1374,14 @@ class Application(Gtk.Application):
# ***************** Import ********************# # ***************** Import ********************#
def on_import_yt_list(self, item):
""" Import playlist from YouTube """
if not self._bq_selected:
return
bq = self._bouquets.get(self._bq_selected, [])
YtListImportDialog(self._main_window, bq, self._fav_view, Profile(self._profile)).show()
def on_import_m3u(self, item): def on_import_m3u(self, item):
""" Imports iptv from m3u files. """ """ Imports iptv from m3u files. """
response = get_chooser_dialog(self._main_window, self._options.get(self._profile), "*.m3u", "m3u files") response = get_chooser_dialog(self._main_window, self._options.get(self._profile), "*.m3u", "m3u files")

View File

@@ -582,343 +582,6 @@ Author: Dmitriy Yefremov
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="stock">gtk-remove</property> <property name="stock">gtk-remove</property>
</object> </object>
<object class="GtkMenu" id="fav_popup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_cut_popup_item">
<property name="label">gtk-cut</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_fav_cut" object="fav_tree_view" swapped="no"/>
<accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_copy_popup_item">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_fav_copy" object="fav_tree_view" swapped="no"/>
<accelerator key="c" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_paste_popup_item">
<property name="label">gtk-paste</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_fav_paste" object="fav_tree_view" swapped="no"/>
<accelerator key="v" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_edit_popup_item">
<property name="label">gtk-edit</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_service_edit" object="fav_tree_view" swapped="no"/>
<accelerator key="e" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_edit_sub_menu_popup_item">
<property name="label" translatable="yes">Extra:</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">extra_edit_image</property>
<property name="use_stock">False</property>
<property name="always_show_image">True</property>
<child type="submenu">
<object class="GtkMenu" id="fav_edit_popoup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_rename_popup_item">
<property name="label" translatable="yes">Rename for this bouquet</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">edit_image_1</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_rename_for_bouquet" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_set_default_name_popup_item">
<property name="label" translatable="yes">Set default name</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">edit_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_set_default_name_for_bouquet" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_locate_popup_item">
<property name="label" translatable="yes">Locate in services</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">find_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_locate_in_services" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_insert_marker_popup_item">
<property name="label" translatable="yes">Insert marker</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">insert_text_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_insert_marker" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_4">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_iptv_popup_item">
<property name="label" translatable="yes">IPTV</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">networktransmit_receive_image</property>
<property name="use_stock">False</property>
<child type="submenu">
<object class="GtkMenu" id="fav_iptv_popoup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_play_stream_popup_item">
<property name="label">gtk-media-play</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_play_stream" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_5">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_add_iptv_popup_item">
<property name="label" translatable="yes">Add IPTV or stream service</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">network_transmit_receive_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_iptv" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_import_m3u_popup_item">
<property name="label" translatable="yes">Import m3u</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">downloads_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_import_m3u" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_export_m3u_popup_item">
<property name="label" translatable="yes">Export to m3u</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">export_to_m3u_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_export_to_m3u" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_6">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_epg_configuration_popup_item">
<property name="label" translatable="yes">EPG configuration</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">epg_configuration_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_epg_list_configuration" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_7">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_iptv_list_configuration_popup_item">
<property name="label" translatable="yes">List configuration</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">fav_iptv_list_config_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_iptv_list_configuration" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_8">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_remove_all_unavailable_popup_item">
<property name="label" translatable="yes">Remove all unavailable</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">remova_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_remove_all_unavailable" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_9">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_picon_popup_item">
<property name="label" translatable="yes">Picon</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">insert_image</property>
<property name="use_stock">False</property>
<child type="submenu">
<object class="GtkMenu" id="fav_picon_popoup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_assign_picon_popup_item">
<property name="label" translatable="yes">Assign</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">insert_link_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_assign_picon" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_remove_picon_popup_item">
<property name="label" translatable="yes">Remove</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">clear_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_remove_picon" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_10">
<property name="visible">True</property>
<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>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">remove_all_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_remove_unused_picons" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_12">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_remove_popup_item">
<property name="label">gtk-remove</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_delete" object="fav_tree_view" swapped="no"/>
<accelerator key="Delete" signal="activate"/>
</object>
</child>
</object>
<object class="GtkImage" id="remove_all_image_2"> <object class="GtkImage" id="remove_all_image_2">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
@@ -3114,4 +2777,356 @@ Author: Dmitriy Yefremov
</object> </object>
</child> </child>
</object> </object>
<object class="GtkImage" id="yt_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-connect</property>
</object>
<object class="GtkMenu" id="fav_popup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_cut_popup_item">
<property name="label">gtk-cut</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_fav_cut" object="fav_tree_view" swapped="no"/>
<accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_copy_popup_item">
<property name="label">gtk-copy</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_fav_copy" object="fav_tree_view" swapped="no"/>
<accelerator key="c" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_paste_popup_item">
<property name="label">gtk-paste</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_fav_paste" object="fav_tree_view" swapped="no"/>
<accelerator key="v" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_edit_popup_item">
<property name="label">gtk-edit</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_service_edit" object="fav_tree_view" swapped="no"/>
<accelerator key="e" signal="activate" modifiers="GDK_CONTROL_MASK"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_edit_sub_menu_popup_item">
<property name="label" translatable="yes">Extra:</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">extra_edit_image</property>
<property name="use_stock">False</property>
<property name="always_show_image">True</property>
<child type="submenu">
<object class="GtkMenu" id="fav_edit_popoup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_rename_popup_item">
<property name="label" translatable="yes">Rename for this bouquet</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">edit_image_1</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_rename_for_bouquet" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_set_default_name_popup_item">
<property name="label" translatable="yes">Set default name</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">edit_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_set_default_name_for_bouquet" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_2">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_locate_popup_item">
<property name="label" translatable="yes">Locate in services</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">find_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_locate_in_services" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_3">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_insert_marker_popup_item">
<property name="label" translatable="yes">Insert marker</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">insert_text_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_insert_marker" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_4">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_iptv_popup_item">
<property name="label" translatable="yes">IPTV</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">networktransmit_receive_image</property>
<property name="use_stock">False</property>
<child type="submenu">
<object class="GtkMenu" id="fav_iptv_popoup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_play_stream_popup_item">
<property name="label">gtk-media-play</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_play_stream" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_5">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_add_iptv_popup_item">
<property name="label" translatable="yes">Add IPTV or stream service</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">network_transmit_receive_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_iptv" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_import_yt_popup_item">
<property name="label" translatable="yes">Import YouTube playlist</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">yt_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_import_yt_list" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_import_m3u_popup_item">
<property name="label" translatable="yes">Import m3u</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="image">downloads_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_import_m3u" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_export_m3u_popup_item">
<property name="label" translatable="yes">Export to m3u</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">export_to_m3u_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_export_to_m3u" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_6">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_epg_configuration_popup_item">
<property name="label" translatable="yes">EPG configuration</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">epg_configuration_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_epg_list_configuration" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_7">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_iptv_list_configuration_popup_item">
<property name="label" translatable="yes">List configuration</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">fav_iptv_list_config_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_iptv_list_configuration" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_8">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_remove_all_unavailable_popup_item">
<property name="label" translatable="yes">Remove all unavailable</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">remova_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_remove_all_unavailable" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_9">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_picon_popup_item">
<property name="label" translatable="yes">Picon</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="image">insert_image</property>
<property name="use_stock">False</property>
<child type="submenu">
<object class="GtkMenu" id="fav_picon_popoup_menu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkImageMenuItem" id="fav_assign_picon_popup_item">
<property name="label" translatable="yes">Assign</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">insert_link_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_assign_picon" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_remove_picon_popup_item">
<property name="label" translatable="yes">Remove</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">clear_image_2</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_remove_picon" object="fav_tree_view" swapped="no"/>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_pupup_separator_10">
<property name="visible">True</property>
<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>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="image">remove_all_image</property>
<property name="use_stock">False</property>
<signal name="activate" handler="on_remove_unused_picons" swapped="no"/>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSeparatorMenuItem" id="fav_popup_separator_12">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
</child>
<child>
<object class="GtkImageMenuItem" id="fav_remove_popup_item">
<property name="label">gtk-remove</property>
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">False</property>
<property name="use_underline">True</property>
<property name="use_stock">True</property>
<signal name="activate" handler="on_delete" object="fav_tree_view" swapped="no"/>
<accelerator key="Delete" signal="activate"/>
</object>
</child>
</object>
</interface> </interface>

273
app/ui/yt_dialog.glade Normal file
View File

@@ -0,0 +1,273 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkListStore" id="yt_liststore">
<columns>
<!-- column-name title -->
<column type="gchararray"/>
<!-- column-name id -->
<column type="gchararray"/>
<!-- column-name selected -->
<column type="gboolean"/>
<!-- column-name tooltip -->
<column type="gchararray"/>
</columns>
</object>
<object class="GtkWindow" id="yt_import_dialog_window">
<property name="width_request">480</property>
<property name="can_focus">False</property>
<property name="modal">True</property>
<property name="window_position">center-on-parent</property>
<property name="destroy_with_parent">True</property>
<property name="skip_taskbar_hint">True</property>
<property name="skip_pager_hint">True</property>
<property name="gravity">center</property>
<signal name="delete-event" handler="on_close" swapped="no"/>
<child type="titlebar">
<object class="GtkHeaderBar" id="yt_header_bar">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<property name="show_close_button">True</property>
<child>
<object class="GtkButton" id="yt_receive_button">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Receive</property>
<signal name="clicked" handler="on_receive" swapped="no"/>
<child>
<object class="GtkImage" id="yt_receive_button_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-goto-bottom</property>
</object>
</child>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
<child type="title">
<object class="GtkEntry" id="yt_url_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="margin_left">2</property>
<property name="margin_right">2</property>
<property name="hexpand">True</property>
<property name="primary_icon_stock">gtk-edit</property>
<property name="placeholder_text" translatable="yes">YouTube playlist URL:</property>
<signal name="changed" handler="on_yt_url_entry_changed" swapped="no"/>
</object>
</child>
<child>
<object class="GtkButton" id="yt_import_button">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="tooltip_text" translatable="yes">Import</property>
<signal name="clicked" handler="on_import" swapped="no"/>
<child>
<object class="GtkImage" id="yt_import_button_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="icon_name">insert-link</property>
</object>
</child>
</object>
<packing>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child>
<object class="GtkBox" id="yt_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkScrolledWindow" id="yt_list_view_scrolled_window">
<property name="can_focus">True</property>
<property name="shadow_type">in</property>
<property name="min_content_height">120</property>
<property name="max_content_height">480</property>
<child>
<object class="GtkTreeView" id="yt_list_view">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="model">yt_liststore</property>
<property name="search_column">0</property>
<property name="enable_grid_lines">horizontal</property>
<property name="tooltip_column">3</property>
<child internal-child="selection">
<object class="GtkTreeSelection"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="yt_title_column">
<property name="resizable">True</property>
<property name="min_width">50</property>
<property name="title" translatable="yes">Title</property>
<property name="expand">True</property>
<property name="clickable">True</property>
<property name="alignment">0.5</property>
<property name="reorderable">True</property>
<property name="sort_column_id">0</property>
<child>
<object class="GtkCellRendererText" id="yt_title_renderer">
<property name="xpad">5</property>
</object>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="yt_id_column">
<property name="visible">False</property>
<property name="title" translatable="yes">ID</property>
<child>
<object class="GtkCellRendererText" id="yt_id_renderer"/>
<attributes>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="yt_selected_column">
<property name="min_width">50</property>
<property name="max_width">100</property>
<property name="title" translatable="yes">Selected</property>
<property name="clickable">True</property>
<property name="alignment">0.5</property>
<property name="reorderable">True</property>
<property name="sort_column_id">2</property>
<child>
<object class="GtkCellRendererToggle" id="yt_selected_renderer">
<property name="width">50</property>
<signal name="toggled" handler="on_selected_toggled" swapped="no"/>
</object>
<attributes>
<attribute name="active">2</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="yt_tooltip_column">
<property name="visible">False</property>
<property name="title" translatable="yes">Tooltip</property>
<child>
<object class="GtkCellRendererText" id="yt_tooltip_renderer"/>
<attributes>
<attribute name="text">3</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="yt_info_bar_box">
<property name="height_request">24</property>
<property name="can_focus">False</property>
<property name="spacing">2</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkProgressBar" id="yt_progress_bar">
<property name="height_request">10</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="pulse_step">0.01</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<child>
<object class="GtkInfoBar" id="yt_info_bar">
<property name="can_focus">False</property>
<property name="show_close_button">True</property>
<signal name="response" handler="on_yt_info_bar_close" swapped="no"/>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child internal-child="content_area">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="spacing">16</property>
<child>
<object class="GtkLabel" id="yt_info_bar_message_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="label" translatable="yes">info</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">4</property>
</packing>
</child>
</object>
</child>
</object>
</interface>