mirror of
https://github.com/jellyfin/jellyfin-kodi.git
synced 2024-12-25 10:16:11 +00:00
Remove more Connect
This commit is contained in:
parent
481ee11301
commit
647636430f
6 changed files with 8 additions and 199 deletions
|
@ -115,7 +115,7 @@ class Connect(object):
|
||||||
|
|
||||||
return state['Credentials']
|
return state['Credentials']
|
||||||
|
|
||||||
elif (server_selection or state['State'] in (CONNECTION_STATE['ConnectSignIn'], CONNECTION_STATE['ServerSelection']) or
|
elif (server_selection or state['State'] == CONNECTION_STATE['ServerSelection'] or
|
||||||
state['State'] == CONNECTION_STATE['Unavailable'] and not settings('SyncInstallRunDone.bool')):
|
state['State'] == CONNECTION_STATE['Unavailable'] and not settings('SyncInstallRunDone.bool')):
|
||||||
|
|
||||||
self.select_servers(state)
|
self.select_servers(state)
|
||||||
|
@ -157,7 +157,7 @@ class Connect(object):
|
||||||
def select_servers(self, state=None):
|
def select_servers(self, state=None):
|
||||||
|
|
||||||
state = state or self.connect_manager.connect({'enableAutoLogin': False})
|
state = state or self.connect_manager.connect({'enableAutoLogin': False})
|
||||||
user = state.get('ConnectUser') or {}
|
user = {}
|
||||||
|
|
||||||
dialog = ServerConnect("script-jellyfin-connect-server.xml", *XML_PATH)
|
dialog = ServerConnect("script-jellyfin-connect-server.xml", *XML_PATH)
|
||||||
dialog.set_args(**{
|
dialog.set_args(**{
|
||||||
|
|
|
@ -54,13 +54,9 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
|
||||||
def get_server(self):
|
def get_server(self):
|
||||||
return self._selected_server
|
return self._selected_server
|
||||||
|
|
||||||
def is_connect_login(self):
|
|
||||||
return self._connect_login
|
|
||||||
|
|
||||||
def is_manual_server(self):
|
def is_manual_server(self):
|
||||||
return self._manual_server
|
return self._manual_server
|
||||||
|
|
||||||
|
|
||||||
def onInit(self):
|
def onInit(self):
|
||||||
|
|
||||||
self.message = self.getControl(MESSAGE)
|
self.message = self.getControl(MESSAGE)
|
||||||
|
|
|
@ -34,7 +34,7 @@ class UsersConnect(xbmcgui.WindowXMLDialog):
|
||||||
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
|
xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
|
||||||
|
|
||||||
def set_args(self, **kwargs):
|
def set_args(self, **kwargs):
|
||||||
# connect_manager, user_image, servers, jellyfin_connect
|
# connect_manager, user_image, servers
|
||||||
for key, value in kwargs.iteritems():
|
for key, value in kwargs.iteritems():
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
|
|
||||||
|
@ -47,7 +47,6 @@ class UsersConnect(xbmcgui.WindowXMLDialog):
|
||||||
def is_manual_login(self):
|
def is_manual_login(self):
|
||||||
return self._manual_login
|
return self._manual_login
|
||||||
|
|
||||||
|
|
||||||
def onInit(self):
|
def onInit(self):
|
||||||
|
|
||||||
self.list_ = self.getControl(LIST)
|
self.list_ = self.getControl(LIST)
|
||||||
|
|
|
@ -20,7 +20,6 @@ CONNECTION_STATE = {
|
||||||
'ServerSelection': 1,
|
'ServerSelection': 1,
|
||||||
'ServerSignIn': 2,
|
'ServerSignIn': 2,
|
||||||
'SignedIn': 3,
|
'SignedIn': 3,
|
||||||
'ConnectSignIn': 4,
|
|
||||||
'ServerUpdateNeeded': 5
|
'ServerUpdateNeeded': 5
|
||||||
}
|
}
|
||||||
CONNECTION_MODE = {
|
CONNECTION_MODE = {
|
||||||
|
@ -69,12 +68,6 @@ class ConnectionManager(object):
|
||||||
return self.connect
|
return self.connect
|
||||||
elif key == "login":
|
elif key == "login":
|
||||||
return self.login
|
return self.login
|
||||||
elif key == "connect-user":
|
|
||||||
return self.connect_user()
|
|
||||||
elif key == "connect-token":
|
|
||||||
return self.connect_token()
|
|
||||||
elif key == "connect-user-id":
|
|
||||||
return self.connect_user_id()
|
|
||||||
elif key == "server":
|
elif key == "server":
|
||||||
return self.get_server_info(self.server_id)
|
return self.get_server_info(self.server_id)
|
||||||
elif key == "server-id":
|
elif key == "server-id":
|
||||||
|
@ -111,8 +104,6 @@ class ConnectionManager(object):
|
||||||
|
|
||||||
self.user = None
|
self.user = None
|
||||||
credentials = self.credentials.get_credentials()
|
credentials = self.credentials.get_credentials()
|
||||||
credentials['ConnectAccessToken'] = None
|
|
||||||
credentials['ConnectUserId'] = None
|
|
||||||
credentials['Servers'] = list()
|
credentials['Servers'] = list()
|
||||||
self.credentials.get_credentials(credentials)
|
self.credentials.get_credentials(credentials)
|
||||||
|
|
||||||
|
@ -133,19 +124,14 @@ class ConnectionManager(object):
|
||||||
|
|
||||||
# Clone the credentials
|
# Clone the credentials
|
||||||
credentials = self.credentials.get_credentials()
|
credentials = self.credentials.get_credentials()
|
||||||
connect_servers = self._get_connect_servers(credentials)
|
|
||||||
found_servers = self._find_servers(self._server_discovery())
|
found_servers = self._find_servers(self._server_discovery())
|
||||||
|
|
||||||
if not connect_servers and not found_servers and not credentials['Servers']: # back out right away, no point in continuing
|
if not found_servers and not credentials['Servers']: # back out right away, no point in continuing
|
||||||
LOG.info("Found no servers")
|
LOG.info("Found no servers")
|
||||||
|
|
||||||
return list()
|
return list()
|
||||||
|
|
||||||
servers = list(credentials['Servers'])
|
servers = list(credentials['Servers'])
|
||||||
self._merge_servers(servers, found_servers)
|
self._merge_servers(servers, found_servers)
|
||||||
self._merge_servers(servers, connect_servers)
|
|
||||||
|
|
||||||
servers = self._filter_servers(servers, connect_servers)
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
servers.sort(key=lambda x: datetime.strptime(x['DateLastAccessed'], "%Y-%m-%dT%H:%M:%SZ"), reverse=True)
|
servers.sort(key=lambda x: datetime.strptime(x['DateLastAccessed'], "%Y-%m-%dT%H:%M:%SZ"), reverse=True)
|
||||||
|
@ -240,15 +226,6 @@ class ConnectionManager(object):
|
||||||
LOG.info("Begin connect")
|
LOG.info("Begin connect")
|
||||||
return self._connect_to_servers(self.get_available_servers(), options)
|
return self._connect_to_servers(self.get_available_servers(), options)
|
||||||
|
|
||||||
def connect_user(self):
|
|
||||||
return self.user
|
|
||||||
|
|
||||||
def connect_user_id(self):
|
|
||||||
return self.credentials.get_credentials().get('ConnectUserId')
|
|
||||||
|
|
||||||
def connect_token(self):
|
|
||||||
return self.credentials.get_credentials().get('ConnectAccessToken')
|
|
||||||
|
|
||||||
def emby_user_id(self):
|
def emby_user_id(self):
|
||||||
return self.get_server_info(self.server_id)['UserId']
|
return self.get_server_info(self.server_id)['UserId']
|
||||||
|
|
||||||
|
@ -270,9 +247,6 @@ class ConnectionManager(object):
|
||||||
def get_public_users(self):
|
def get_public_users(self):
|
||||||
return self.client.emby.get_public_users()
|
return self.client.emby.get_public_users()
|
||||||
|
|
||||||
def get_connect_url(self, handler):
|
|
||||||
return "https://connect.emby.media/service/%s" % handler
|
|
||||||
|
|
||||||
def get_emby_url(self, base, handler):
|
def get_emby_url(self, base, handler):
|
||||||
return "%s/emby/%s" % (base, handler)
|
return "%s/emby/%s" % (base, handler)
|
||||||
|
|
||||||
|
@ -310,12 +284,6 @@ class ConnectionManager(object):
|
||||||
|
|
||||||
if len(servers) == 1:
|
if len(servers) == 1:
|
||||||
result = self.connect_to_server(servers[0], options)
|
result = self.connect_to_server(servers[0], options)
|
||||||
|
|
||||||
"""
|
|
||||||
if result['State'] == CONNECTION_STATE['Unavailable']:
|
|
||||||
result['State'] = CONNECTION_STATE['ConnectSignIn'] if result['ConnectUser'] is None else CONNECTION_STATE['ServerSelection']
|
|
||||||
"""
|
|
||||||
|
|
||||||
LOG.debug("resolving connectToServers with result['State']: %s", result)
|
LOG.debug("resolving connectToServers with result['State']: %s", result)
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
@ -330,12 +298,10 @@ class ConnectionManager(object):
|
||||||
|
|
||||||
# Return loaded credentials if exists
|
# Return loaded credentials if exists
|
||||||
credentials = self.credentials.get_credentials()
|
credentials = self.credentials.get_credentials()
|
||||||
self._ensure_connect_user(credentials)
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'Servers': servers,
|
'Servers': servers,
|
||||||
'State': CONNECTION_STATE['ConnectSignIn'] if (not len(servers) and not self.connect_user()) else (result.get('State') or CONNECTION_STATE['ServerSelection']),
|
'State': result.get('State') or CONNECTION_STATE['ServerSelection'],
|
||||||
'ConnectUser': self.connect_user()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def _try_connect(self, url, timeout=None, options={}):
|
def _try_connect(self, url, timeout=None, options={}):
|
||||||
|
@ -408,20 +374,11 @@ class ConnectionManager(object):
|
||||||
def _on_successful_connection(self, server, system_info, connection_mode, options):
|
def _on_successful_connection(self, server, system_info, connection_mode, options):
|
||||||
|
|
||||||
credentials = self.credentials.get_credentials()
|
credentials = self.credentials.get_credentials()
|
||||||
|
|
||||||
if credentials.get('ConnectAccessToken') and options.get('enableAutoLogin') is not False:
|
|
||||||
|
|
||||||
if self._ensure_connect_user(credentials) is not False:
|
|
||||||
|
|
||||||
if server.get('ExchangeToken'):
|
|
||||||
self._add_authentication_info_from_connect(server, connection_mode, credentials, options)
|
|
||||||
|
|
||||||
return self._after_connect_validated(server, credentials, system_info, connection_mode, True, options)
|
return self._after_connect_validated(server, credentials, system_info, connection_mode, True, options)
|
||||||
|
|
||||||
def _resolve_failure(self):
|
def _resolve_failure(self):
|
||||||
return {
|
return {
|
||||||
'State': CONNECTION_STATE['Unavailable'],
|
'State': CONNECTION_STATE['Unavailable']
|
||||||
'ConnectUser': self.connect_user()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def _get_min_server_version(self, val=None):
|
def _get_min_server_version(self, val=None):
|
||||||
|
@ -462,23 +419,6 @@ class ConnectionManager(object):
|
||||||
def _string_equals_ignore_case(self, str1, str2):
|
def _string_equals_ignore_case(self, str1, str2):
|
||||||
return (str1 or "").lower() == (str2 or "").lower()
|
return (str1 or "").lower() == (str2 or "").lower()
|
||||||
|
|
||||||
def _get_connect_user(self, user_id, access_token):
|
|
||||||
|
|
||||||
if not user_id:
|
|
||||||
raise AttributeError("null userId")
|
|
||||||
|
|
||||||
if not access_token:
|
|
||||||
raise AttributeError("null accessToken")
|
|
||||||
|
|
||||||
return self._request_url({
|
|
||||||
'type': "GET",
|
|
||||||
'url': self.get_connect_url('user?id=%s' % user_id),
|
|
||||||
'dataType': "json",
|
|
||||||
'headers': {
|
|
||||||
'X-Connect-UserToken': access_token
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
def _server_discovery(self):
|
def _server_discovery(self):
|
||||||
|
|
||||||
MULTI_GROUP = ("<broadcast>", 7359)
|
MULTI_GROUP = ("<broadcast>", 7359)
|
||||||
|
@ -516,37 +456,6 @@ class ConnectionManager(object):
|
||||||
LOG.error("Error trying to find servers: %s", e)
|
LOG.error("Error trying to find servers: %s", e)
|
||||||
return servers
|
return servers
|
||||||
|
|
||||||
def _get_connect_servers(self, credentials):
|
|
||||||
|
|
||||||
LOG.info("Begin getConnectServers")
|
|
||||||
|
|
||||||
servers = list()
|
|
||||||
|
|
||||||
if not credentials.get('ConnectAccessToken') or not credentials.get('ConnectUserId'):
|
|
||||||
return servers
|
|
||||||
|
|
||||||
url = self.get_connect_url("servers?userId=%s" % credentials['ConnectUserId'])
|
|
||||||
request = {
|
|
||||||
'type': "GET",
|
|
||||||
'url': url,
|
|
||||||
'dataType': "json",
|
|
||||||
'headers': {
|
|
||||||
'X-Connect-UserToken': credentials['ConnectAccessToken']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for server in self._request_url(request):
|
|
||||||
servers.append({
|
|
||||||
'ExchangeToken': server['AccessKey'],
|
|
||||||
'ConnectServerId': server['Id'],
|
|
||||||
'Id': server['SystemId'],
|
|
||||||
'Name': server['Name'],
|
|
||||||
'RemoteAddress': server['Url'],
|
|
||||||
'LocalAddress': server['LocalAddress'],
|
|
||||||
'UserLinkType': "Guest" if server['UserType'].lower() == "guest" else "LinkedUser",
|
|
||||||
})
|
|
||||||
|
|
||||||
return servers
|
|
||||||
|
|
||||||
def _get_last_used_server(self):
|
def _get_last_used_server(self):
|
||||||
|
|
||||||
servers = self.credentials.get_credentials()['Servers']
|
servers = self.credentials.get_credentials()['Servers']
|
||||||
|
@ -590,22 +499,6 @@ class ConnectionManager(object):
|
||||||
else:
|
else:
|
||||||
return servers
|
return servers
|
||||||
|
|
||||||
def _filter_servers(self, servers, connect_servers):
|
|
||||||
|
|
||||||
filtered = list()
|
|
||||||
for server in servers:
|
|
||||||
if server.get('ExchangeToken') is None:
|
|
||||||
# It's not a connect server, so assume it's still valid
|
|
||||||
filtered.append(server)
|
|
||||||
continue
|
|
||||||
|
|
||||||
for connect_server in connect_servers:
|
|
||||||
if server['Id'] == connect_server['Id']:
|
|
||||||
filtered.append(server)
|
|
||||||
break
|
|
||||||
|
|
||||||
return filtered
|
|
||||||
|
|
||||||
def _convert_endpoint_address_to_manual_address(self, info):
|
def _convert_endpoint_address_to_manual_address(self, info):
|
||||||
|
|
||||||
if info.get('Address') and info.get('EndpointAddress'):
|
if info.get('Address') and info.get('EndpointAddress'):
|
||||||
|
@ -634,45 +527,6 @@ class ConnectionManager(object):
|
||||||
|
|
||||||
return address
|
return address
|
||||||
|
|
||||||
def _get_connect_password_hash(self, password):
|
|
||||||
|
|
||||||
password = self._clean_connect_password(password)
|
|
||||||
return hashlib.md5(password).hexdigest()
|
|
||||||
|
|
||||||
def _clean_connect_password(self, password):
|
|
||||||
|
|
||||||
password = password or ""
|
|
||||||
|
|
||||||
password = password.replace("&", '&')
|
|
||||||
password = password.replace("/", '\')
|
|
||||||
password = password.replace("!", '!')
|
|
||||||
password = password.replace("$", '$')
|
|
||||||
password = password.replace("\"", '"')
|
|
||||||
password = password.replace("<", '<')
|
|
||||||
password = password.replace(">", '>')
|
|
||||||
password = password.replace("'", ''')
|
|
||||||
|
|
||||||
return password
|
|
||||||
|
|
||||||
def _ensure_connect_user(self, credentials):
|
|
||||||
|
|
||||||
if self.user and self.user['Id'] == credentials['ConnectUserId']:
|
|
||||||
return
|
|
||||||
|
|
||||||
elif credentials.get('ConnectUserId') and credentials.get('ConnectAccessToken'):
|
|
||||||
self.user = None
|
|
||||||
|
|
||||||
try:
|
|
||||||
result = self._get_connect_user(credentials['ConnectUserId'], credentials['ConnectAccessToken'])
|
|
||||||
self._on_connect_user_signin(result)
|
|
||||||
except Exception:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _on_connect_user_signin(self, user):
|
|
||||||
|
|
||||||
self.user = user
|
|
||||||
LOG.info("connectusersignedin %s", user)
|
|
||||||
|
|
||||||
def _save_user_info_into_credentials(self, server, user):
|
def _save_user_info_into_credentials(self, server, user):
|
||||||
|
|
||||||
info = {
|
info = {
|
||||||
|
@ -681,43 +535,6 @@ class ConnectionManager(object):
|
||||||
}
|
}
|
||||||
self.credentials.add_update_user(server, info)
|
self.credentials.add_update_user(server, info)
|
||||||
|
|
||||||
def _add_authentication_info_from_connect(self, server, connection_mode, credentials, options={}):
|
|
||||||
|
|
||||||
if not server.get('ExchangeToken'):
|
|
||||||
raise KeyError("server['ExchangeToken'] cannot be null")
|
|
||||||
|
|
||||||
if not credentials.get('ConnectUserId'):
|
|
||||||
raise KeyError("credentials['ConnectUserId'] cannot be null")
|
|
||||||
|
|
||||||
auth = "MediaBrowser "
|
|
||||||
auth += "Client=%s, " % self.config['app.name']
|
|
||||||
auth += "Device=%s, " % self.config['app.device_name']
|
|
||||||
auth += "DeviceId=%s, " % self.config['app.device_id']
|
|
||||||
auth += "Version=%s " % self.config['app.version']
|
|
||||||
|
|
||||||
try:
|
|
||||||
auth = self._request_url({
|
|
||||||
'url': self.get_emby_url(get_server_address(server, connection_mode), "Connect/Exchange"),
|
|
||||||
'type': "GET",
|
|
||||||
'dataType': "json",
|
|
||||||
'verify': options.get('ssl'),
|
|
||||||
'params': {
|
|
||||||
'ConnectUserId': credentials['ConnectUserId']
|
|
||||||
},
|
|
||||||
'headers': {
|
|
||||||
'X-MediaBrowser-Token': server['ExchangeToken'],
|
|
||||||
'X-Emby-Authorization': auth
|
|
||||||
}
|
|
||||||
})
|
|
||||||
except Exception:
|
|
||||||
server['UserId'] = None
|
|
||||||
server['AccessToken'] = None
|
|
||||||
return False
|
|
||||||
else:
|
|
||||||
server['UserId'] = auth['LocalUserId']
|
|
||||||
server['AccessToken'] = auth['AccessToken']
|
|
||||||
return auth
|
|
||||||
|
|
||||||
def _after_connect_validated(self, server, credentials, system_info, connection_mode, verify_authentication, options):
|
def _after_connect_validated(self, server, credentials, system_info, connection_mode, verify_authentication, options):
|
||||||
|
|
||||||
if options.get('enableAutoLogin') == False:
|
if options.get('enableAutoLogin') == False:
|
||||||
|
@ -753,8 +570,7 @@ class ConnectionManager(object):
|
||||||
self.config['auth.ssl'] = options.get('ssl', self.config['auth.ssl'])
|
self.config['auth.ssl'] = options.get('ssl', self.config['auth.ssl'])
|
||||||
|
|
||||||
result = {
|
result = {
|
||||||
'Servers': [server],
|
'Servers': [server]
|
||||||
'ConnectUser': self.connect_user()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
result['State'] = CONNECTION_STATE['SignedIn'] if server.get('AccessToken') else CONNECTION_STATE['ServerSignIn']
|
result['State'] = CONNECTION_STATE['SignedIn'] if server.get('AccessToken') else CONNECTION_STATE['ServerSignIn']
|
||||||
|
|
|
@ -100,8 +100,6 @@ class Events(object):
|
||||||
event('RemoveLibrarySelection')
|
event('RemoveLibrarySelection')
|
||||||
elif mode == 'addlibs':
|
elif mode == 'addlibs':
|
||||||
event('AddLibrarySelection')
|
event('AddLibrarySelection')
|
||||||
elif mode == 'connect':
|
|
||||||
event('jellyfinConnect')
|
|
||||||
elif mode == 'addserver':
|
elif mode == 'addserver':
|
||||||
event('AddServer')
|
event('AddServer')
|
||||||
elif mode == 'login':
|
elif mode == 'login':
|
||||||
|
|
|
@ -229,7 +229,7 @@ class Service(xbmc.Monitor):
|
||||||
|
|
||||||
if method not in ('ServerUnreachable', 'ServerShuttingDown', 'UserDataChanged', 'ServerConnect',
|
if method not in ('ServerUnreachable', 'ServerShuttingDown', 'UserDataChanged', 'ServerConnect',
|
||||||
'LibraryChanged', 'ServerOnline', 'SyncLibrary', 'RepairLibrary', 'RemoveLibrary',
|
'LibraryChanged', 'ServerOnline', 'SyncLibrary', 'RepairLibrary', 'RemoveLibrary',
|
||||||
'JellyfinConnect', 'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
|
'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
|
||||||
'Unauthorized', 'UpdateServer', 'UserConfigurationUpdated', 'ServerRestarting',
|
'Unauthorized', 'UpdateServer', 'UserConfigurationUpdated', 'ServerRestarting',
|
||||||
'RemoveServer', 'AddLibrarySelection', 'CheckUpdate', 'RemoveLibrarySelection'):
|
'RemoveServer', 'AddLibrarySelection', 'CheckUpdate', 'RemoveLibrarySelection'):
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in a new issue