Merge pull request #226 from mcarlton00/redesign-quickconnect

Move quickconnect code into user selection list
This commit is contained in:
mcarlton00
2022-10-01 21:06:38 -04:00
committed by GitHub
3 changed files with 78 additions and 205 deletions

View File

@@ -204,43 +204,3 @@ class PlayNextDialog(xbmcgui.WindowXMLDialog):
def get_play_called(self):
return self.play_called
class QuickConnectDialog(xbmcgui.WindowXMLDialog):
connect_method = -1
def __init__(self, *args, **kwargs):
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
log.debug("QuickConnectDialog INITIALISED")
self.code = ''
def onInit(self):
self.action_exitkeys_id = [10, 13]
message_control = self.getControl(3)
message_control.setText(self.code)
message_control = self.getControl(4)
message_control.setLabel(translate_string(30443))
self.getControl(3010).setLabel(translate_string(30444))
self.getControl(3011).setLabel(translate_string(30365))
def onFocus(self, controlId):
pass
def doAction(self, actionID):
pass
def onClick(self, controlID):
if controlID == 3010:
self.connect_method = 1
self.close()
if controlID == 3011:
self.connect_method = 0
self.close()
def getConnectMethod(self):
return self.connect_method

View File

@@ -14,7 +14,6 @@ from .kodi_utils import HomeWindow
from .jellyfin import API
from .lazylogger import LazyLogger
from .utils import datetime_from_string, translate_string, save_user_details, load_user_details, get_current_datetime, get_saved_users
from .dialogs import QuickConnectDialog
log = LazyLogger(__name__)
@@ -212,59 +211,79 @@ def check_server(force=False, change_user=False, notify=False):
# stop playback when switching users
xbmc.Player().stop()
auth = quick_connect(api)
if auth:
users = []
user_selection = -1
selected_user_name = auth.get('User', {}).get('Name')
something_changed = True
else:
users, user_selection = user_select(api, current_username)
if not auth and user_selection > -1:
# Check if quick connect is active on the server, initiate connection
quick = api.get('/QuickConnect/Initiate')
code = quick.get('Code')
secret = quick.get('Secret')
users, user_selection = user_select(api, current_username, code)
if user_selection > -1:
# The user made a selection in the dialog
something_changed = True
selected_user = users[user_selection]
selected_user_name = selected_user.getLabel()
secured = selected_user.getProperty("secure") == "true"
manual = selected_user.getProperty("manual") == "true"
quick_connect = selected_user.getProperty("quickconnect") == "true"
count = 0
if quick_connect:
# Try to authenticate to server with secret code 10 times
while count < 10:
log.debug('Checking for quick connect auth: attempt {}'.format(count))
check = api.get('/QuickConnect/Connect?secret={}'.format(secret))
if check.get('Authenticated'):
break
count += 1
xbmc.sleep(1000)
# If using a manual login, ask for username
if manual:
kb = xbmc.Keyboard()
kb.setHeading(translate_string(30005))
if current_username:
kb.setDefault(current_username)
kb.doModal()
if kb.isConfirmed():
selected_user_name = kb.getText()
log.debug("Manual entered username: {0}".format(selected_user_name))
auth = api.post('/Users/AuthenticateWithQuickConnect',
{'secret': secret})
# If authentication was successful, save the username
if auth:
selected_user_name = auth['User'].get('Name')
else:
return
home_window.set_property('user_name', selected_user_name)
settings.setSetting('username', selected_user_name)
user_details = load_user_details()
if not user_details:
# Ask for password if user has one
password = ''
if secured and not user_details.get('token'):
kb = xbmc.Keyboard()
kb.setHeading(translate_string(30006))
kb.setHiddenInput(True)
kb.doModal()
if kb.isConfirmed():
password = kb.getText()
auth_payload = {'username': selected_user_name, 'pw': password}
auth = api.authenticate(auth_payload)
if not auth:
# Login failed, we don't want to change anything
something_changed = False
log.info('There was an error logging in with user {}'.format(selected_user_name))
xbmcgui.Dialog().ok(__addon_name__, translate_string(30446))
log.info("There was an error logging in with quick connect")
else:
selected_user_name = selected_user.getLabel()
secured = selected_user.getProperty("secure") == "true"
manual = selected_user.getProperty("manual") == "true"
# If using a manual login, ask for username
if manual:
kb = xbmc.Keyboard()
kb.setHeading(translate_string(30005))
if current_username:
kb.setDefault(current_username)
kb.doModal()
if kb.isConfirmed():
selected_user_name = kb.getText()
log.debug("Manual entered username: {0}".format(selected_user_name))
else:
return
home_window.set_property('user_name', selected_user_name)
settings.setSetting('username', selected_user_name)
user_details = load_user_details()
if not user_details:
# Ask for password if user has one
password = ''
if secured and not user_details.get('token'):
kb = xbmc.Keyboard()
kb.setHeading(translate_string(30006))
kb.setHiddenInput(True)
kb.doModal()
if kb.isConfirmed():
password = kb.getText()
auth_payload = {'username': selected_user_name, 'pw': password}
auth = api.authenticate(auth_payload)
if not auth:
# Login failed, we don't want to change anything
something_changed = False
log.info('There was an error logging in with user {}'.format(selected_user_name))
xbmcgui.Dialog().ok(__addon_name__, translate_string(30446))
if something_changed:
@@ -283,55 +302,7 @@ def check_server(force=False, change_user=False, notify=False):
xbmc.executebuiltin("ReloadSkin()")
def quick_connect(api):
'''
Log in using quick connect funcion
'''
settings = xbmcaddon.Addon()
addon_path = settings.getAddonInfo('path')
result = api.get('/QuickConnect/Initiate')
if not isinstance(result, dict) or not result:
log.debug('Quick connect is disabled on the server')
return {}
code = result.get('Code')
secret = result.get('Secret')
# Open Quick Connect dialog, ask to proceed
qc_dialog = QuickConnectDialog("QuickConnectDialog.xml", addon_path, "default", "720p")
qc_dialog.code = code
qc_dialog.doModal()
connect_method = qc_dialog.getConnectMethod()
del qc_dialog
if connect_method < 1:
# User backed out or selected manual login
return {}
count = 0
while count < 15:
# Check the server to see if the auth request has been completed
log.debug('Checking for quick connect auth: attempt {}'.format(count))
check = api.get('/QuickConnect/Connect?secret={}'.format(secret))
if check.get('Authenticated'):
break
count += 1
xbmc.sleep(1000)
if not check.get('Authenticated'):
log.info('Quick connect not authorized in 15 seconds, defaulting to manual authentication')
return {}
# Retrieve authentication information
auth = api.post('/Users/AuthenticateWithQuickConnect',
{'secret': secret})
return auth
def user_select(api, current_username):
def user_select(api, current_username, code):
'''
Display user selection screen
'''
@@ -352,6 +323,16 @@ def user_select(api, current_username):
# Build user display
selected_id = -1
users = []
# If quick connect is active, make it the first entry
if code:
user_item = xbmcgui.ListItem(code)
user_image = "DefaultUser.png"
art = {"Thumb": user_image}
user_item.setArt(art)
user_item.setLabel2(translate_string(30443))
user_item.setProperty('quickconnect', "true")
users.append(user_item)
for user in public:
user_item = create_user_listitem(api.server, user)
if user_item:
@@ -380,7 +361,7 @@ def user_select(api, current_username):
selection_title,
users,
preselect=selected_id,
autoclose=20000,
autoclose=60000,
useDetails=True)
return (users, user_selection)

View File

@@ -1,68 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<window id="3301" type="dialog">
<defaultcontrol always="true">3010</defaultcontrol>
<zorder>2</zorder>
<coordinates>
<system>1</system>
<left>450</left>
<top>200</top>
</coordinates>
<controls>
<control type="image">
<left>0</left>
<top>0</top>
<width>400</width>
<height>270</height>
<texture border="40">bg.png</texture>
</control>
<control type="label" id="4">
<left>20</left>
<top>5</top>
<width>360</width>
<height>50</height>
<label>Heading</label>
<font>font45_title</font>
<align>center</align>
</control>
<control type="textbox" id="3">
<left>20</left>
<top>65</top>
<width>360</width>
<height>50</height>
<font>font45</font>
<align>center</align>
</control>
<control type="button" id="3010">
<texturenofocus border="1" colordiffuse="ff161616">white.png</texturenofocus>
<texturefocus border="1" colordiffuse="ff525252">white.png</texturefocus>
<left>20</left>
<top>135</top>
<width>360</width>
<height>40</height>
<label></label>
<onup></onup>
<ondown>3011</ondown>
<font>font14</font>
<align>center</align>
</control>
<control type="button" id="3011">
<texturenofocus border="1" colordiffuse="ff161616">white.png</texturenofocus>
<texturefocus border="1" colordiffuse="ff525252">white.png</texturefocus>
<left>20</left>
<top>195</top>
<width>360</width>
<height>40</height>
<label></label>
<onup>3010</onup>
<ondown>3012</ondown>
<font>font14</font>
<align>center</align>
</control>
</controls>
</window>