From b27a846292dd3addc2aee4a0e59396481773c344 Mon Sep 17 00:00:00 2001 From: croneter Date: Sun, 7 Oct 2018 12:09:27 +0200 Subject: [PATCH] Enable original Plex user select dialog --- resources/lib/image.py | 12 ++ resources/lib/main.py | 1 + resources/lib/util.py | 2 +- resources/lib/windows/userselect-old.py | 202 ++++++++++++++++++++++++ resources/lib/windows/userselect.py | 79 +++++---- 5 files changed, 252 insertions(+), 44 deletions(-) create mode 100644 resources/lib/image.py create mode 100644 resources/lib/windows/userselect-old.py diff --git a/resources/lib/image.py b/resources/lib/image.py new file mode 100644 index 00000000..94e37177 --- /dev/null +++ b/resources/lib/image.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import absolute_import, division, unicode_literals +from . import util, path_ops + +CACHE_PATH = path_ops.path.join(util.PROFILE, 'avatars', '') +if not path_ops.exists(CACHE_PATH): + path_ops.makedirs(CACHE_PATH) + + +def getImage(url, ID): + return url, '' diff --git a/resources/lib/main.py b/resources/lib/main.py index a45c318f..685e1d76 100644 --- a/resources/lib/main.py +++ b/resources/lib/main.py @@ -10,6 +10,7 @@ import xbmc from . import plex, util, backgroundthread from .plexnet import plexapp, threadutils +from .windows import userselect from . import utils from . import userclient diff --git a/resources/lib/util.py b/resources/lib/util.py index 3d6531ce..cd1e3ce8 100644 --- a/resources/lib/util.py +++ b/resources/lib/util.py @@ -45,7 +45,7 @@ MONITOR = UtilityMonitor() def T(ID, eng=''): - return ADDON.getLocalizedString(ID) + return ADDON.getLocalizedString(ID) or xbmc.getLocalizedString(ID) def LOG(msg, level=xbmc.LOGNOTICE): diff --git a/resources/lib/windows/userselect-old.py b/resources/lib/windows/userselect-old.py new file mode 100644 index 00000000..fccd759e --- /dev/null +++ b/resources/lib/windows/userselect-old.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +:module: plexkodiconnect.userselect +:synopsis: This module shows a dialog to let one choose between different Plex + (home) users +""" +from __future__ import absolute_import, division, unicode_literals +from logging import getLogger +import xbmc +import xbmcgui + +from . import kodigui +from .. import backgroundthread, utils, plex_tv, variables as v + +LOG = getLogger('PLEX.' + __name__) + + +class UserThumbTask(backgroundthread.Task): + def setup(self, users, callback): + self.users = users + self.callback = callback + return self + + def run(self): + for user in self.users: + if self.isCanceled(): + return + thumb, back = user.thumb, '' + self.callback(user, thumb, back) + + +class UserSelectWindow(kodigui.BaseWindow): + xmlFile = 'script-plex-user_select.xml' + path = v.ADDON_PATH + theme = 'Main' + res = '1080i' + width = 1920 + height = 1080 + + USER_LIST_ID = 101 + PIN_ENTRY_GROUP_ID = 400 + HOME_BUTTON_ID = 500 + + def __init__(self, *args, **kwargs): + self.task = None + self.user = None + self.aborted = False + kodigui.BaseWindow.__init__(self, *args, **kwargs) + + def onFirstInit(self): + self.userList = kodigui.ManagedControlList(self, self.USER_LIST_ID, 6) + + self.start() + + def onAction(self, action): + try: + ID = action.getId() + if 57 < ID < 68: + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.PIN_ENTRY_GROUP_ID)): + item = self.userList.getSelectedItem() + if not item.dataSource.isProtected: + return + self.setFocusId(self.PIN_ENTRY_GROUP_ID) + self.pinEntryClicked(ID + 142) + return + elif 142 <= ID <= 149: # JumpSMS action + if not xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.PIN_ENTRY_GROUP_ID)): + item = self.userList.getSelectedItem() + if not item.dataSource.isProtected: + return + self.setFocusId(self.PIN_ENTRY_GROUP_ID) + self.pinEntryClicked(ID + 60) + return + elif ID in (xbmcgui.ACTION_NAV_BACK, xbmcgui.ACTION_BACKSPACE): + if xbmc.getCondVisibility('ControlGroup({0}).HasFocus(0)'.format(self.PIN_ENTRY_GROUP_ID)): + self.pinEntryClicked(211) + return + except: + utils.ERROR() + + kodigui.BaseWindow.onAction(self, action) + + def onClick(self, controlID): + if controlID == self.USER_LIST_ID: + item = self.userList.getSelectedItem() + if item.dataSource.isProtected: + self.setFocusId(self.PIN_ENTRY_GROUP_ID) + else: + self.userSelected(item) + elif 200 < controlID < 212: + self.pinEntryClicked(controlID) + elif controlID == self.HOME_BUTTON_ID: + self.home_button_clicked() + + def onFocus(self, controlID): + if controlID == self.USER_LIST_ID: + item = self.userList.getSelectedItem() + item.setProperty('editing.pin', '') + + def userThumbCallback(self, user, thumb, back): + item = self.userList.getListItemByDataSource(user) + if item: + item.setThumbnailImage(thumb) + item.setProperty('back.image', back) + + def start(self): + self.setProperty('busy', '1') + try: + users = plex_tv.plex_home_users(utils.settings('plexToken')) + + items = [] + for user in users: + # thumb, back = image.getImage(user.thumb, user.id) + # mli = kodigui.ManagedListItem(user.title, thumbnailImage=thumb, data_source=user) + mli = kodigui.ManagedListItem(user.title, user.title[0].upper(), data_source=user) + mli.setProperty('pin', user.title) + # mli.setProperty('back.image', back) + mli.setProperty('protected', user.isProtected and '1' or '') + mli.setProperty('admin', user.isAdmin and '1' or '') + items.append(mli) + + self.userList.addItems(items) + self.task = UserThumbTask().setup(users, self.userThumbCallback) + backgroundthread.BGThreader.addTask(self.task) + + self.setFocusId(self.USER_LIST_ID) + self.setProperty('initialized', '1') + finally: + self.setProperty('busy', '') + + def home_button_clicked(self): + """ + Action taken if user clicked the home button + """ + self.user = None + self.aborted = True + self.doClose() + + def pinEntryClicked(self, controlID): + item = self.userList.getSelectedItem() + pin = item.getProperty('editing.pin') or '' + + if len(pin) > 3: + return + + if controlID < 210: + pin += str(controlID - 200) + elif controlID == 210: + pin += '0' + elif controlID == 211: + pin = pin[:-1] + + if pin: + item.setProperty('pin', ' '.join(list(u"\u2022" * len(pin)))) + item.setProperty('editing.pin', pin) + if len(pin) > 3: + self.userSelected(item, pin) + else: + item.setProperty('pin', item.dataSource.title) + item.setProperty('editing.pin', '') + + def userSelected(self, item, pin=None): + self.user = item.dataSource + LOG.info('Home user selected: %s', self.user) + self.user.authToken = plex_tv.switch_home_user( + self.user.id, + pin, + utils.settings('plexToken'), + utils.settings('plex_machineIdentifier')) + if self.user.authToken is None: + self.user = None + item.setProperty('pin', item.dataSource.title) + item.setProperty('editing.pin', '') + # 'Error': 'Login failed with plex.tv for user' + utils.messageDialog(utils.lang(30135), + '%s %s' % (utils.lang(39229), + self.user.username)) + return + self.doClose() + + def finished(self): + if self.task: + self.task.cancel() + + +def start(): + """ + Hit this function to open a dialog to choose the Plex user + + Returns + ======= + tuple (user, aborted) + user : HomeUser + Or None if user switch failed or aborted by the user) + aborted : bool + True if the user cancelled the dialog + """ + w = UserSelectWindow.open() + user, aborted = w.user, w.aborted + del w + return user, aborted diff --git a/resources/lib/windows/userselect.py b/resources/lib/windows/userselect.py index fccd759e..24b78093 100644 --- a/resources/lib/windows/userselect.py +++ b/resources/lib/windows/userselect.py @@ -6,14 +6,14 @@ (home) users """ from __future__ import absolute_import, division, unicode_literals -from logging import getLogger import xbmc import xbmcgui -from . import kodigui -from .. import backgroundthread, utils, plex_tv, variables as v +from . import kodigui, dropdown +from .. import util, image, backgroundthread +from ..util import T +from ..plexnet import plexapp -LOG = getLogger('PLEX.' + __name__) class UserThumbTask(backgroundthread.Task): @@ -26,13 +26,14 @@ class UserThumbTask(backgroundthread.Task): for user in self.users: if self.isCanceled(): return - thumb, back = user.thumb, '' + + thumb, back = image.getImage(user.thumb, user.id) self.callback(user, thumb, back) class UserSelectWindow(kodigui.BaseWindow): xmlFile = 'script-plex-user_select.xml' - path = v.ADDON_PATH + path = util.ADDON.getAddonInfo('path') theme = 'Main' res = '1080i' width = 1920 @@ -44,8 +45,7 @@ class UserSelectWindow(kodigui.BaseWindow): def __init__(self, *args, **kwargs): self.task = None - self.user = None - self.aborted = False + self.selected = False kodigui.BaseWindow.__init__(self, *args, **kwargs) def onFirstInit(self): @@ -77,7 +77,7 @@ class UserSelectWindow(kodigui.BaseWindow): self.pinEntryClicked(211) return except: - utils.ERROR() + util.ERROR() kodigui.BaseWindow.onAction(self, action) @@ -91,7 +91,7 @@ class UserSelectWindow(kodigui.BaseWindow): elif 200 < controlID < 212: self.pinEntryClicked(controlID) elif controlID == self.HOME_BUTTON_ID: - self.home_button_clicked() + self.shutdownClicked() def onFocus(self, controlID): if controlID == self.USER_LIST_ID: @@ -107,7 +107,7 @@ class UserSelectWindow(kodigui.BaseWindow): def start(self): self.setProperty('busy', '1') try: - users = plex_tv.plex_home_users(utils.settings('plexToken')) + users = plexapp.ACCOUNT.homeUsers items = [] for user in users: @@ -133,13 +133,15 @@ class UserSelectWindow(kodigui.BaseWindow): """ Action taken if user clicked the home button """ - self.user = None - self.aborted = True + self.selected = False self.doClose() def pinEntryClicked(self, controlID): item = self.userList.getSelectedItem() - pin = item.getProperty('editing.pin') or '' + if item.getProperty('editing.pin'): + pin = item.getProperty('editing.pin') + else: + pin = '' if len(pin) > 3: return @@ -161,22 +163,24 @@ class UserSelectWindow(kodigui.BaseWindow): item.setProperty('editing.pin', '') def userSelected(self, item, pin=None): - self.user = item.dataSource - LOG.info('Home user selected: %s', self.user) - self.user.authToken = plex_tv.switch_home_user( - self.user.id, - pin, - utils.settings('plexToken'), - utils.settings('plex_machineIdentifier')) - if self.user.authToken is None: - self.user = None - item.setProperty('pin', item.dataSource.title) - item.setProperty('editing.pin', '') - # 'Error': 'Login failed with plex.tv for user' - utils.messageDialog(utils.lang(30135), - '%s %s' % (utils.lang(39229), - self.user.username)) - return + user = item.dataSource + # xbmc.sleep(500) + util.DEBUG_LOG('Home user selected: {0}'.format(user)) + + from .. import plex + with plex.CallbackEvent(plexapp.APP, 'account:response') as e: + if plexapp.ACCOUNT.switchHomeUser(user.id, pin) and plexapp.ACCOUNT.switchUser: + util.DEBUG_LOG('Waiting for user change...') + else: + e.close() + item.setProperty('pin', item.dataSource.title) + item.setProperty('editing.pin', '') + util.messageDialog(T(30135, 'Error'), + '%s %s' % (T(39229, 'Login failed with plex.tv for user'), + self.user.username)) + return + + self.selected = True self.doClose() def finished(self): @@ -185,18 +189,7 @@ class UserSelectWindow(kodigui.BaseWindow): def start(): - """ - Hit this function to open a dialog to choose the Plex user - - Returns - ======= - tuple (user, aborted) - user : HomeUser - Or None if user switch failed or aborted by the user) - aborted : bool - True if the user cancelled the dialog - """ w = UserSelectWindow.open() - user, aborted = w.user, w.aborted + selected = w.selected del w - return user, aborted + return selected