diff --git a/resources/lib/connect.py b/resources/lib/connect.py index 692b58e8..6f745e1d 100644 --- a/resources/lib/connect.py +++ b/resources/lib/connect.py @@ -152,7 +152,9 @@ class Connect(object): settings('username', self.user['Name']) if 'PrimaryImageTag' in self.user: - window('JellyfinUserImage', api.API(self.user, client['auth/server-address']).get_user_artwork(self.user['Id'])) + server_data = client.auth.get_server_info(client.auth.server_id) + server_address = client.auth.get_server_address(server_data, server_data['LastConnectionMode']) + window('JellyfinUserImage', api.API(self.user, server_address).get_user_artwork(self.user['Id'])) def select_servers(self, state=None): @@ -213,8 +215,9 @@ class Connect(object): def login(self): - users = self.connect_manager['public-users'] - server = self.connect_manager['server-address'] + users = self.connect_manager.get_public_users() + server_data = self.connect_manager.get_server_info(self.connect_manager.server_id) + server = self.connect_manager.get_server_address(server_data, server_data['LastConnectionMode']) if not users: try: @@ -236,7 +239,7 @@ class Connect(object): return self.login_manual(username) except RuntimeError: pass else: - return self.connect_manager['login'](server, username) + return self.connect_manager.login(server, username) elif dialog.is_manual_login(): try: diff --git a/resources/lib/dialogs/loginmanual.py b/resources/lib/dialogs/loginmanual.py index b649d936..6256861a 100644 --- a/resources/lib/dialogs/loginmanual.py +++ b/resources/lib/dialogs/loginmanual.py @@ -118,9 +118,10 @@ class LoginManual(xbmcgui.WindowXMLDialog): def _login(self, username, password): - mode = self.connect_manager['server-mode'] - server = self.connect_manager['server-address'] - result = self.connect_manager['login'](server, username, password) + mode = self.connect_manager.get_server_info(self.connect_manager.server_id)['LastConnectionMode'] + server_data = self.connect_manager.get_server_info(self.connect_manager.server_id) + server = self.connect_manager.get_server_address(server_data, server_data['LastConnectionMode']) + result = self.connect_manager.login(server, username, password) if not result: self._error(ERROR['Invalid'], _('invalid_auth')) diff --git a/resources/lib/dialogs/serverconnect.py b/resources/lib/dialogs/serverconnect.py index f5fce12c..90929d4f 100644 --- a/resources/lib/dialogs/serverconnect.py +++ b/resources/lib/dialogs/serverconnect.py @@ -116,7 +116,7 @@ class ServerConnect(xbmcgui.WindowXMLDialog): self.message_box.setVisibleCondition('true') self.busy.setVisibleCondition('true') - result = self.connect_manager['connect-to-server'](server) + result = self.connect_manager.connect_to_server(server) if result['State'] == CONNECTION_STATE['Unavailable']: self.busy.setVisibleCondition('false') diff --git a/resources/lib/dialogs/servermanual.py b/resources/lib/dialogs/servermanual.py index c0b72b6a..66d0340c 100644 --- a/resources/lib/dialogs/servermanual.py +++ b/resources/lib/dialogs/servermanual.py @@ -118,7 +118,7 @@ class ServerManual(xbmcgui.WindowXMLDialog): server_address = "%s:%s" % (server, port) if port else server self._message("%s %s..." % (_(30610), server_address)) - result = self.connect_manager['manual-server'](server_address) + result = self.connect_manager.connect_to_address(server_address) if result['State'] == CONNECTION_STATE['Unavailable']: self._message(_(30609)) diff --git a/resources/lib/jellyfin/client.py b/resources/lib/jellyfin/client.py index 593a4c3e..f0360111 100644 --- a/resources/lib/jellyfin/client.py +++ b/resources/lib/jellyfin/client.py @@ -55,7 +55,7 @@ class JellyfinClient(object): LOG.info("User is authenticated.") self.logged_in = True - self.callback("ServerOnline", {'Id': self['auth/server-id']}) + self.callback("ServerOnline", {'Id': self.auth.server_id}) state['Credentials'] = self.get_credentials() diff --git a/resources/lib/jellyfin/core/connection_manager.py b/resources/lib/jellyfin/core/connection_manager.py index 7c7b28ed..ff200a3c 100644 --- a/resources/lib/jellyfin/core/connection_manager.py +++ b/resources/lib/jellyfin/core/connection_manager.py @@ -57,48 +57,6 @@ class ConnectionManager(object): self.http = HTTP(client) - def __shortcuts__(self, key): - LOG.debug("__shortcuts__(%r)", key) - - if key == "clear": - return self.clear_data - elif key == "servers": - return self.get_available_servers() - elif key in ("reconnect", "refresh"): - return self.connect - elif key == "login": - return self.login - elif key == "server": - return self.get_server_info(self.server_id) - elif key == "server-id": - return self.server_id - elif key == "server-version": - return self.server_version - elif key == "user-id": - return self.jellyfin_user_id() - elif key == "public-users": - return self.get_public_users() - elif key == "token": - return self.jellyfin_token() - elif key == "manual-server": - return self.connect_to_address - elif key == "connect-to-server": - return self.connect_to_server - elif key == "server-address": - server = self.get_server_info(self.server_id) - return get_server_address(server, server['LastConnectionMode']) - elif key == "revoke-token": - return self.revoke_token() - elif key == "server-mode": - server = self.get_server_info(self.server_id) - return server['LastConnectionMode'] - - return - - def __getitem__(self, key): - LOG.debug("__getitem__(%r)", key) - return self.__shortcuts__(key) - def clear_data(self): LOG.info("connection manager clearing data") @@ -151,7 +109,7 @@ class ConnectionManager(object): if not server: raise AttributeError("server cannot be empty") - + try: request = { 'type': "POST", @@ -219,6 +177,14 @@ class ConnectionManager(object): LOG.info("beginning connection tests") return self._test_next_connection_mode(tests, 0, server, options) + def get_server_address(self, server, mode): #TODO: De-duplicated (Duplicated from above when getting rid of shortcuts) + + modes = { + CONNECTION_MODE['Local']: server.get('LocalAddress'), + CONNECTION_MODE['Manual']: server.get('ManualAddress') + } + return modes.get(mode) or server.get('ManualAddress', server.get('LocalAddress')) + def connect(self, options={}): LOG.info("Begin connect") diff --git a/resources/lib/jellyfin/core/http.py b/resources/lib/jellyfin/core/http.py index c83b562e..da237895 100644 --- a/resources/lib/jellyfin/core/http.py +++ b/resources/lib/jellyfin/core/http.py @@ -135,7 +135,7 @@ class HTTP(object): raise HTTPException("AccessRestricted", error) else: self.client['callback']("Unauthorized", {'ServerId': self.config.data['auth.server-id']}) - self.client['auth/revoke-token'] + self.client.auth.revoke_token() raise HTTPException("Unauthorized", error) diff --git a/resources/lib/jellyfin/core/ws_client.py b/resources/lib/jellyfin/core/ws_client.py index e09a5d8f..e3b76196 100644 --- a/resources/lib/jellyfin/core/ws_client.py +++ b/resources/lib/jellyfin/core/ws_client.py @@ -89,7 +89,7 @@ class WSClient(threading.Thread): return if not self.client.config.data['app.default']: - data['ServerId'] = self.client['auth/server-id'] + data['ServerId'] = self.client.auth.server_id self.client['callback_ws'](message['MessageType'], data) diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py index bf58391f..0eed32f8 100644 --- a/resources/lib/monitor.py +++ b/resources/lib/monitor.py @@ -144,8 +144,9 @@ class Monitor(xbmc.Monitor): self.void_responder(data, item) elif method == 'GetServerAddress': - - server_address = server['auth/server-address'] + + server_data = server.auth.get_server_info(server.auth.server_id) + server_address = server.auth.get_server_address(server_data, server_data['LastConnectionMode']) self.void_responder(data, server_address) elif method == 'GetPlaybackInfo': @@ -160,7 +161,7 @@ class Monitor(xbmc.Monitor): elif method == 'GetToken': - token = server['auth/token'] + token = server.auth.jellyfin_token() self.void_responder(data, token) elif method == 'GetSession': @@ -309,7 +310,7 @@ class Monitor(xbmc.Monitor): self.additional_users(server) def post_capabilities(self, server): - LOG.info("--[ post capabilities/%s ]", server['auth/server-id']) + LOG.info("--[ post capabilities/%s ]", server.auth.server_id) server['api'].post_capabilities({ 'PlayableMediaTypes': "Audio,Video", diff --git a/resources/lib/objects/movies.py b/resources/lib/objects/movies.py index b5f8ef05..b30851b5 100644 --- a/resources/lib/objects/movies.py +++ b/resources/lib/objects/movies.py @@ -54,7 +54,9 @@ class Movies(KodiDb): ''' If item does not exist, entry will be added. If item exists, entry will be updated. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Movie') update = True @@ -213,7 +215,9 @@ class Movies(KodiDb): Process movies inside boxset. Process removals from boxset. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Boxset') obj['Overview'] = API.get_overview(obj['Overview']) @@ -291,7 +295,9 @@ class Movies(KodiDb): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'MovieUserData') try: diff --git a/resources/lib/objects/music.py b/resources/lib/objects/music.py index d1c502fd..2c73d688 100644 --- a/resources/lib/objects/music.py +++ b/resources/lib/objects/music.py @@ -56,7 +56,9 @@ class Music(KodiDb): ''' If item does not exist, entry will be added. If item exists, entry will be updated. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Artist') update = True @@ -125,7 +127,9 @@ class Music(KodiDb): ''' Update object to kodi. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Album') update = True @@ -234,7 +238,9 @@ class Music(KodiDb): ''' Update object to kodi. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Song') update = True @@ -352,7 +358,9 @@ class Music(KodiDb): obj['Path'] = obj['Path'].replace(obj['Filename'], "") else: - obj['Path'] = "%s/emby/Audio/%s/" % (self.server['auth/server-address'], obj['Id']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + obj['Path'] = "%s/emby/Audio/%s/" % (server_address, obj['Id']) obj['Filename'] = "stream.%s?static=true" % obj['Container'] def song_artist_discography(self, obj): @@ -429,7 +437,9 @@ class Music(KodiDb): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'SongUserData') try: diff --git a/resources/lib/objects/musicvideos.py b/resources/lib/objects/musicvideos.py index 44dd33e6..ed247a30 100644 --- a/resources/lib/objects/musicvideos.py +++ b/resources/lib/objects/musicvideos.py @@ -55,7 +55,9 @@ class MusicVideos(KodiDb): If we don't get the track number from Jellyfin, see if we can infer it from the sortname attribute. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'MusicVideo') update = True @@ -192,7 +194,9 @@ class MusicVideos(KodiDb): ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks Poster with progress bar ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'MusicVideoUserData') try: diff --git a/resources/lib/objects/tvshows.py b/resources/lib/objects/tvshows.py index fa7d614e..a743667c 100644 --- a/resources/lib/objects/tvshows.py +++ b/resources/lib/objects/tvshows.py @@ -63,7 +63,9 @@ class TVShows(KodiDb): Process seasons. Apply series pooling. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Series') update = True @@ -230,7 +232,9 @@ class TVShows(KodiDb): If the show is empty, try to remove it. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Season') obj['ShowId'] = show_id @@ -265,7 +269,9 @@ class TVShows(KodiDb): Create additional entry for widgets. This is only required for plugin/episode. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'Episode') update = True @@ -459,7 +465,9 @@ class TVShows(KodiDb): Make sure there's no other bookmarks created by widget. Create additional entry for widgets. This is only required for plugin/episode. ''' - API = api.API(item, self.server['auth/server-address']) + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(item, server_address) obj = self.objects.map(item, 'EpisodeUserData') try: diff --git a/resources/lib/player.py b/resources/lib/player.py index 712c9bb9..d6435ac1 100644 --- a/resources/lib/player.py +++ b/resources/lib/player.py @@ -252,8 +252,9 @@ class Player(xbmc.Player): return break - - API = api.API(next_item, item['Server']['auth/server-address']) + server_data = item['Server'].auth.get_server_info(item['Server'].auth.server_id) + server_address = item['Server'].auth.get_server_address(server_data, server_data['LastConnectionMode']) + API = api.API(next_item, server_address) data = objects.map(next_item, "UpNext") artwork = API.get_all_artwork(objects.map(next_item, 'ArtworkParent'), True) data['art'] = { diff --git a/resources/lib/views.py b/resources/lib/views.py index 0cb3b7df..f3aa9a02 100644 --- a/resources/lib/views.py +++ b/resources/lib/views.py @@ -863,8 +863,9 @@ class Views(object): for library in self.media_folders: if library['Id'] == view_id and 'Primary' in library.get('ImageTags', {}): - - artwork = api.API(None, self.server['auth/server-address']).get_artwork(view_id, 'Primary') + server_data = self.server.auth.get_server_info(self.server.auth.server_id) + server_address = self.server.auth.get_server_address(server_data, server_data['LastConnectionMode']) + artwork = api.API(None, server_address).get_artwork(view_id, 'Primary') window('%s.artwork' % prop, artwork) break