From 66679ce54c5f3d0f72a7465bed69e77d5e4738c4 Mon Sep 17 00:00:00 2001 From: TrueTechy Date: Sat, 7 Sep 2019 04:14:32 +0100 Subject: [PATCH] client.py - remove "config" & configuration.py - removed shortcuts and get/set item functions --- resources/lib/connect.py | 12 ++--- resources/lib/jellyfin/__init__.py | 4 +- resources/lib/jellyfin/client.py | 5 +-- resources/lib/jellyfin/core/api.py | 2 +- resources/lib/jellyfin/core/configuration.py | 21 --------- .../lib/jellyfin/core/connection_manager.py | 24 +++++----- resources/lib/jellyfin/core/http.py | 44 +++++++++---------- resources/lib/jellyfin/core/ws_client.py | 8 ++-- resources/lib/library.py | 2 +- resources/lib/monitor.py | 10 ++--- 10 files changed, 54 insertions(+), 78 deletions(-) diff --git a/resources/lib/connect.py b/resources/lib/connect.py index 041b51ab..6b2d4f17 100644 --- a/resources/lib/connect.py +++ b/resources/lib/connect.py @@ -81,9 +81,9 @@ class Connect(object): ''' Get Jellyfin client. ''' client = Jellyfin(server_id) - client['config/app']("Kodi", self.info['Version'], self.info['DeviceName'], self.info['DeviceId']) - client['config']['http.user_agent'] = "Jellyfin-Kodi/%s" % self.info['Version'] - client['config']['auth.ssl'] = self.get_ssl() + client.config.app("Kodi", self.info['Version'], self.info['DeviceName'], self.info['DeviceId']) + client.config.data['http.user_agent'] = "Jellyfin-Kodi/%s" % self.info['Version'] + client.config.data['auth.ssl'] = self.get_ssl() return client @@ -94,7 +94,7 @@ class Connect(object): self.connect_manager = client.auth if server_id is None: - client['config']['app.default'] = True + client.config.data['app.default'] = True try: state = client.authenticate(credentials or {}, options or {}) @@ -107,8 +107,8 @@ class Connect(object): client.callback = event self.get_user(client) - settings('serverName', client['config/auth.server-name']) - settings('server', client['config/auth.server']) + settings('serverName', client.config.data['auth.server-name']) + settings('server', client.config.data['auth.server']) event('ServerOnline', {'ServerId': server_id}) event('LoadServer', {'ServerId': server_id}) diff --git a/resources/lib/jellyfin/__init__.py b/resources/lib/jellyfin/__init__.py index 1ee4399e..63a493eb 100644 --- a/resources/lib/jellyfin/__init__.py +++ b/resources/lib/jellyfin/__init__.py @@ -45,11 +45,11 @@ class Jellyfin(object): from jellyfin import Jellyfin - Jellyfin('123456')['config/app'] + Jellyfin('123456').config.data['app'] # Permanent client reference client = Jellyfin('123456').get_client() - client['config/app'] + client.config.data['app'] ''' # Borg - multiple instances, shared state diff --git a/resources/lib/jellyfin/client.py b/resources/lib/jellyfin/client.py index 2dbe1547..9a3ded86 100644 --- a/resources/lib/jellyfin/client.py +++ b/resources/lib/jellyfin/client.py @@ -85,10 +85,7 @@ class JellyfinClient(object): def __getitem__(self, key): LOG.debug("__getitem__(%r)", key) - if key.startswith('config'): - return self.config[key.replace('config/', "", 1)] if "/" in key else self.config - - elif key.startswith('websocket'): + if key.startswith('websocket'): return self.wsc.__shortcuts__(key.replace('websocket/', "", 1)) elif key.startswith('callback'): diff --git a/resources/lib/jellyfin/core/api.py b/resources/lib/jellyfin/core/api.py index 21b2d913..e364e2dc 100644 --- a/resources/lib/jellyfin/core/api.py +++ b/resources/lib/jellyfin/core/api.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- def jellyfin_url(client, handler): - return "%s/emby/%s" % (client.config['auth.server'], handler) + return "%s/emby/%s" % (client.config.data['auth.server'], handler) def basic_info(): diff --git a/resources/lib/jellyfin/core/configuration.py b/resources/lib/jellyfin/core/configuration.py index 41c0c5c3..31587552 100644 --- a/resources/lib/jellyfin/core/configuration.py +++ b/resources/lib/jellyfin/core/configuration.py @@ -25,27 +25,6 @@ class Config(object): self.data = {} self.http() - def __shortcuts__(self, key): - LOG.debug("__shortcuts__(%r)", key) - - if key == "auth": - return self.auth - elif key == "app": - return self.app - elif key == "http": - return self.http - elif key == "data": - return self - - return - - def __getitem__(self, key): - LOG.debug("__getitem__(%r)", key) - return self.data.get(key, self.__shortcuts__(key)) - - def __setitem__(self, key, value): - self.data[key] = value - def app(self, name, version, device_name, device_id, capabilities=None, device_pixel_ratio=None): LOG.info("Begin app constructor.") diff --git a/resources/lib/jellyfin/core/connection_manager.py b/resources/lib/jellyfin/core/connection_manager.py index 3c8b310a..7c7b28ed 100644 --- a/resources/lib/jellyfin/core/connection_manager.py +++ b/resources/lib/jellyfin/core/connection_manager.py @@ -117,7 +117,7 @@ class ConnectionManager(object): self['server']['AccessToken'] = None self.credentials.get_credentials(self.credentials.get_credentials()) - self.config['auth.token'] = None + self.config.data['auth.token'] = None def get_available_servers(self): @@ -261,7 +261,7 @@ class ConnectionManager(object): raise def _add_app_info(self): - return "%s/%s" % (self.config['app.name'], self.config['app.version']) + return "%s/%s" % (self.config.data['app.name'], self.config.data['app.version']) def _get_headers(self, request): @@ -526,15 +526,15 @@ class ConnectionManager(object): if options.get('enableAutoLogin') == False: - self.config['auth.user_id'] = server.pop('UserId', None) - self.config['auth.token'] = server.pop('AccessToken', None) + self.config.data['auth.user_id'] = server.pop('UserId', None) + self.config.data['auth.token'] = server.pop('AccessToken', None) elif verify_authentication and server.get('AccessToken'): if self._validate_authentication(server, connection_mode, options) is not False: - self.config['auth.user_id'] = server['UserId'] - self.config['auth.token'] = server['AccessToken'] + self.config.data['auth.user_id'] = server['UserId'] + self.config.data['auth.token'] = server['AccessToken'] return self._after_connect_validated(server, credentials, system_info, connection_mode, False, options) return self._resolve_failure() @@ -551,10 +551,10 @@ class ConnectionManager(object): self.server_id = server['Id'] # Update configs - self.config['auth.server'] = get_server_address(server, connection_mode) - self.config['auth.server-name'] = server['Name'] - self.config['auth.server=id'] = server['Id'] - self.config['auth.ssl'] = options.get('ssl', self.config['auth.ssl']) + self.config.data['auth.server'] = get_server_address(server, connection_mode) + self.config.data['auth.server-name'] = server['Name'] + self.config.data['auth.server=id'] = server['Id'] + self.config.data['auth.ssl'] = options.get('ssl', self.config.data['auth.ssl']) result = { 'Servers': [server] @@ -602,8 +602,8 @@ class ConnectionManager(object): credentials = self.credentials.get_credentials() - self.config['auth.user_id'] = result['User']['Id'] - self.config['auth.token'] = result['AccessToken'] + self.config.data['auth.user_id'] = result['User']['Id'] + self.config.data['auth.token'] = result['AccessToken'] for server in credentials['Servers']: if server['Id'] == result['ServerId']: diff --git a/resources/lib/jellyfin/core/http.py b/resources/lib/jellyfin/core/http.py index f6344ff3..2ae1491b 100644 --- a/resources/lib/jellyfin/core/http.py +++ b/resources/lib/jellyfin/core/http.py @@ -24,13 +24,13 @@ class HTTP(object): def __init__(self, client): self.client = client - self.config = client['config'] + self.config = client.config def start_session(self): self.session = requests.Session() - max_retries = self.config['http.max_retries'] + max_retries = self.config.data['http.max_retries'] self.session.mount("http://", requests.adapters.HTTPAdapter(max_retries=max_retries)) self.session.mount("https://", requests.adapters.HTTPAdapter(max_retries=max_retries)) @@ -48,14 +48,14 @@ class HTTP(object): def _replace_user_info(self, string): if '{server}' in string: - if self.config['auth.server']: - string = string.decode('utf-8').replace("{server}", self.config['auth.server']) + if self.config.data['auth.server']: + string = string.decode('utf-8').replace("{server}", self.config.data['auth.server']) else: raise Exception("Server address not set.") if '{UserId}'in string: - if self.config['auth.user_id']: - string = string.decode('utf-8').replace("{UserId}", self.config['auth.user_id']) + if self.config.data['auth.user_id']: + string = string.decode('utf-8').replace("{UserId}", self.config.data['auth.user_id']) else: raise Exception("UserId is not set.") @@ -100,7 +100,7 @@ class HTTP(object): continue LOG.error(error) - self.client['callback']("ServerUnreachable", {'ServerId': self.config['auth.server-id']}) + self.client['callback']("ServerUnreachable", {'ServerId': self.config.data['auth.server-id']}) raise HTTPException("ServerUnreachable", error) @@ -122,11 +122,11 @@ class HTTP(object): if r.status_code == 401: if 'X-Application-Error-Code' in r.headers: - self.client['callback']("AccessRestricted", {'ServerId': self.config['auth.server-id']}) + self.client['callback']("AccessRestricted", {'ServerId': self.config.data['auth.server-id']}) raise HTTPException("AccessRestricted", error) else: - self.client['callback']("Unauthorized", {'ServerId': self.config['auth.server-id']}) + self.client['callback']("Unauthorized", {'ServerId': self.config.data['auth.server-id']}) self.client['auth/revoke-token'] raise HTTPException("Unauthorized", error) @@ -147,14 +147,14 @@ class HTTP(object): raise HTTPException(r.status_code, error) except requests.exceptions.MissingSchema as error: - raise HTTPException("MissingSchema", {'Id': self.config['auth.server']}) + raise HTTPException("MissingSchema", {'Id': self.config.data['auth.server']}) except Exception as error: raise else: try: - self.config['server-time'] = r.headers['Date'] + self.config.data['server-time'] = r.headers['Date'] elapsed = int(r.elapsed.total_seconds() * 1000) response = r.json() LOG.debug("---<[ http ][%s ms]", elapsed) @@ -167,11 +167,11 @@ class HTTP(object): def _request(self, data): if 'url' not in data: - data['url'] = "%s/emby/%s" % (self.config['auth.server'], data.pop('handler', "")) + data['url'] = "%s/emby/%s" % (self.config.data['auth.server'], data.pop('handler', "")) self._get_header(data) - data['timeout'] = data.get('timeout') or self.config['http.timeout'] - data['verify'] = data.get('verify') or self.config['auth.ssl'] or False + data['timeout'] = data.get('timeout') or self.config.data['http.timeout'] + data['verify'] = data.get('verify') or self.config.data['auth.ssl'] or False data['url'] = self._replace_user_info(data['url']) self._process_params(data.get('params') or {}) self._process_params(data.get('json') or {}) @@ -198,7 +198,7 @@ class HTTP(object): 'Content-type': "application/json", 'Accept-Charset': "UTF-8,*", 'Accept-encoding': "gzip", - 'User-Agent': self.config['http.user_agent'] or "%s/%s" % (self.config['app.name'], self.config['app.version']) + 'User-Agent': self.config.data['http.user_agent'] or "%s/%s" % (self.config.data['app.name'], self.config.data['app.version']) }) if 'x-emby-authorization' not in data['headers']: @@ -209,17 +209,17 @@ class HTTP(object): def _authorization(self, data): auth = "MediaBrowser " - auth += "Client=%s, " % self.config['app.name'].encode('utf-8') - auth += "Device=%s, " % self.config['app.device_name'].encode('utf-8') - auth += "DeviceId=%s, " % self.config['app.device_id'].encode('utf-8') - auth += "Version=%s" % self.config['app.version'].encode('utf-8') + auth += "Client=%s, " % self.config.data['app.name'].encode('utf-8') + auth += "Device=%s, " % self.config.data['app.device_name'].encode('utf-8') + auth += "DeviceId=%s, " % self.config.data['app.device_id'].encode('utf-8') + auth += "Version=%s" % self.config.data['app.version'].encode('utf-8') data['headers'].update({'x-emby-authorization': auth}) - if self.config['auth.token'] and self.config['auth.user_id']: + if self.config.data.get('auth.token') and self.config.data.get('auth.user_id'): - auth += ', UserId=%s' % self.config['auth.user_id'].encode('utf-8') - data['headers'].update({'x-emby-authorization': auth, 'X-MediaBrowser-Token': self.config['auth.token'].encode('utf-8')}) + auth += ', UserId=%s' % self.config.data['auth.user_id'].encode('utf-8') + data['headers'].update({'x-emby-authorization': auth, 'X-MediaBrowser-Token': self.config.data['auth.token'].encode('utf-8')}) return data diff --git a/resources/lib/jellyfin/core/ws_client.py b/resources/lib/jellyfin/core/ws_client.py index 02d1e398..e09a5d8f 100644 --- a/resources/lib/jellyfin/core/ws_client.py +++ b/resources/lib/jellyfin/core/ws_client.py @@ -50,9 +50,9 @@ class WSClient(threading.Thread): def run(self): monitor = xbmc.Monitor() - token = self.client['config/auth.token'] - device_id = self.client['config/app.device_id'] - server = self.client['config/auth.server'] + token = self.client.config.data['auth.token'] + device_id = self.client.config.data['app.device_id'] + server = self.client.config.data['auth.server'] server = server.replace('https', "wss") if server.startswith('https') else server.replace('http', "ws") wsc_url = "%s/embywebsocket?api_key=%s&device_id=%s" % (server, token, device_id) @@ -88,7 +88,7 @@ class WSClient(threading.Thread): return - if not self.client['config/app.default']: + if not self.client.config.data['app.default']: data['ServerId'] = self.client['auth/server-id'] self.client['callback_ws'](message['MessageType'], data) diff --git a/resources/lib/library.py b/resources/lib/library.py index 9332cd4b..bf801a5f 100644 --- a/resources/lib/library.py +++ b/resources/lib/library.py @@ -456,7 +456,7 @@ class Library(threading.Thread): def save_last_sync(self): try: - time_now = datetime.strptime(self.server['config/server-time'].split(', ', 1)[1], '%d %b %Y %H:%M:%S GMT') - timedelta(minutes=2) + time_now = datetime.strptime(self.server.config.data['server-time'].split(', ', 1)[1], '%d %b %Y %H:%M:%S GMT') - timedelta(minutes=2) except Exception as error: LOG.exception(error) diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py index d2c60d68..90c3806c 100644 --- a/resources/lib/monitor.py +++ b/resources/lib/monitor.py @@ -235,7 +235,7 @@ class Monitor(xbmc.Monitor): elif method == 'PlayPlaylist': - server.jellyfin.post_session(server['config/app.session'], "Playing", { + server.jellyfin.post_session(server.config.data['app.session'], "Playing", { 'PlayCommand': "PlayNow", 'ItemIds': data['Id'], 'StartPositionTicks': 0 @@ -262,7 +262,7 @@ class Monitor(xbmc.Monitor): self.server_instance(data['ServerId']) elif method == 'AddUser': - server.jellyfin.session_add_user(server['config/app.session'], data['Id'], data['Add']) + server.jellyfin.session_add_user(server.config.data['app.session'], data['Id'], data['Add']) self.additional_users(server) elif method == 'Player.OnPlay': @@ -292,7 +292,7 @@ class Monitor(xbmc.Monitor): for user in all_users: if user['Name'].lower() in additional.decode('utf-8').lower(): - server.jellyfin.session_add_user(server['config/app.session'], user['Id'], True) + server.jellyfin.session_add_user(server.config.data['app.session'], user['Id'], True) self.additional_users(server) @@ -317,7 +317,7 @@ class Monitor(xbmc.Monitor): }) session = server.jellyfin.get_device(self.device_id) - server['config']['app.session'] = session[0]['Id'] + server.config.data['app.session'] = session[0]['Id'] def additional_users(self, server): @@ -336,7 +336,7 @@ class Monitor(xbmc.Monitor): for index, user in enumerate(session[0]['AdditionalUsers']): info = server.jellyfin.get_user(user['UserId']) - image = api.API(info, server['config/auth.server']).get_user_artwork(user['UserId']) + image = api.API(info, server.config.data['auth.server']).get_user_artwork(user['UserId']) window('JellyfinAdditionalUserImage.%s' % index, image) window('JellyfinAdditionalUserPosition.%s' % user['UserId'], str(index))