# -*- coding: utf-8 -*- """ Copyright (C) 2017 Sebastian Golasch (plugin.video.netflix) Copyright (C) 2018 Caphm (original implementation module) XML based dialogs SPDX-License-Identifier: MIT See LICENSES/MIT.md for more information. """ import time import xbmc import xbmcgui from resources.lib.common import run_threaded, make_call from resources.lib.globals import G ACTION_PREVIOUS_MENU = 10 ACTION_PLAYER_STOP = 13 ACTION_NAV_BACK = 92 ACTION_NOOP = 999 CMD_CLOSE_DIALOG_BY_NOOP = 'AlarmClock(closedialog,Action(noop),{},silent)' # @time_execution(immediate=True) def show_modal_dialog(non_blocking, dlg_class, xml_filename, **kwargs): """ Show a modal Dialog in the UI. Pass kwargs minutes and/or seconds to have the dialog automatically close after the specified time. :return if exists return self.return_value value of dlg_class (if non_blocking=True return always None) """ # WARNING: doModal when invoked does not release the function immediately! # it seems that doModal waiting for all window operations to be completed before return, # for example the "Skip" dialog takes about 30 seconds to release the function (probably for the included animation) # To be taken into account because it can do very big delays in the execution of the invoking code return run_threaded(non_blocking, _show_modal_dialog, dlg_class, xml_filename, **kwargs) def _show_modal_dialog(dlg_class, xml_filename, **kwargs): dlg = dlg_class(xml_filename, G.ADDON.getAddonInfo('path'), 'default', '1080i', **kwargs) minutes = kwargs.get('minutes', 0) seconds = kwargs.get('seconds', 0) if minutes > 0 or seconds > 0: # Bug in Kodi AlarmClock function, if only the seconds are passed # the time conversion inside the function multiply the seconds by 60 if seconds > 59 and minutes == 0: alarm_time = time.strftime('%M:%S', time.gmtime(seconds)) else: alarm_time = '{:02d}:{:02d}'.format(minutes, seconds) xbmc.executebuiltin(CMD_CLOSE_DIALOG_BY_NOOP.format(alarm_time)) dlg.doModal() if hasattr(dlg, 'return_value'): return dlg.return_value return None # pylint: disable=invalid-name class Skip(xbmcgui.WindowXMLDialog): """Dialog for skipping video parts (intro, recap, ...)""" def __init__(self, *args, **kwargs): self.seek_time = kwargs['seek_time'] self.label = kwargs['label'] self.action_exit_keys_id = [ACTION_PREVIOUS_MENU, ACTION_PLAYER_STOP, ACTION_NAV_BACK, ACTION_NOOP] super().__init__(*args) def onInit(self): self.getControl(6012).setLabel(self.label) def onClick(self, controlID): if controlID == 6012: xbmc.Player().seekTime(self.seek_time) self.close() def onAction(self, action): if action.getId() in self.action_exit_keys_id: self.close() def show_skip_dialog(dialog_duration, seek_time, label): """Show a dialog for ESN and Widevine settings""" show_modal_dialog(True, Skip, "plugin-video-netflix-Skip.xml", seconds=dialog_duration, seek_time=seek_time, label=label) def show_parental_dialog(**kwargs): """Show a dialog for parental control settings""" from resources.lib.kodi.ui.xmldialog_parental import ParentalControl show_modal_dialog(False, ParentalControl, 'plugin-video-netflix-ParentalControl.xml', **kwargs) def show_rating_thumb_dialog(**kwargs): """Show a dialog for rating with thumb""" from resources.lib.kodi.ui.xmldialog_ratingthumb import RatingThumb show_modal_dialog(False, RatingThumb, 'plugin-video-netflix-RatingThumb.xml', **kwargs) def show_profiles_dialog(title=None, title_prefix=None, preselect_guid=None): """ Show a dialog to select a profile :return guid of selected profile or None """ if not title: title = G.ADDON.getLocalizedString(30128) if title_prefix: title = title_prefix + ' - ' + title # Get profiles data # pylint: disable=unused-variable list_data, extra_data = make_call('get_profiles', {'request_update': True, 'preselect_guid': preselect_guid, 'detailed_info': False}) from resources.lib.kodi.ui.xmldialog_profiles import Profiles return show_modal_dialog(False, Profiles, 'plugin-video-netflix-Profiles.xml', title=title, list_data=list_data, preselect_guid=preselect_guid) def show_esn_widevine_dialog(): """Show a dialog for ESN and Widevine settings""" from resources.lib.kodi.ui.xmldialog_esnwidevine import ESNWidevine return show_modal_dialog(False, ESNWidevine, 'plugin-video-netflix-ESN-Widevine.xml')