From b355d746f9141a539be7cbf2bdc91025d416bc51 Mon Sep 17 00:00:00 2001 From: owner Date: Sat, 31 Aug 2019 20:43:28 -0500 Subject: [PATCH 1/6] Updates project structure to Kodi v17 --- addon.xml | 4 ++-- fanart.png => resources/fanart.png | Bin icon.png => resources/icon.png | Bin kodi_icon.png => resources/kodi_icon.png | Bin resources/lib/entrypoint/default.py | 8 +++++--- resources/lib/helper/utils.py | 2 +- resources/lib/objects/actions.py | 22 +++++++++++++++------- resources/lib/views.py | 2 +- 8 files changed, 24 insertions(+), 14 deletions(-) rename fanart.png => resources/fanart.png (100%) rename icon.png => resources/icon.png (100%) rename kodi_icon.png => resources/kodi_icon.png (100%) diff --git a/addon.xml b/addon.xml index 9f407b0b..e1a6fdea 100644 --- a/addon.xml +++ b/addon.xml @@ -39,8 +39,8 @@ #44 Remove code caching, fixing Kodi 18 Music syncing for existing installs. - icon.png - fanart.png + resources/icon.png + resources/fanart.png diff --git a/fanart.png b/resources/fanart.png similarity index 100% rename from fanart.png rename to resources/fanart.png diff --git a/icon.png b/resources/icon.png similarity index 100% rename from icon.png rename to resources/icon.png diff --git a/kodi_icon.png b/resources/kodi_icon.png similarity index 100% rename from kodi_icon.png rename to resources/kodi_icon.png diff --git a/resources/lib/entrypoint/default.py b/resources/lib/entrypoint/default.py index d79ebb07..339c160a 100644 --- a/resources/lib/entrypoint/default.py +++ b/resources/lib/entrypoint/default.py @@ -209,10 +209,12 @@ def directory(label, path, folder=True, artwork=None, fanart=None, context=None) def dir_listitem(label, path, artwork=None, fanart=None): + ''' Gets the icon paths for default node listings + ''' li = xbmcgui.ListItem(label, path=path) - li.setThumbnailImage(artwork or "special://home/addons/plugin.video.jellyfin/icon.png") - li.setArt({"fanart": fanart or "special://home/addons/plugin.video.jellyfin/fanart.png"}) - li.setArt({"landscape": artwork or fanart or "special://home/addons/plugin.video.jellyfin/fanart.png"}) + li.setThumbnailImage(artwork or "special://home/addons/plugin.video.jellyfin/resources/icon.png") + li.setArt({"fanart": fanart or "special://home/addons/plugin.video.jellyfin/resources/fanart.png"}) + li.setArt({"landscape": artwork or fanart or "special://home/addons/plugin.video.jellyfin/resources/fanart.png"}) return li diff --git a/resources/lib/helper/utils.py b/resources/lib/helper/utils.py index 18757878..1f57e74b 100644 --- a/resources/lib/helper/utils.py +++ b/resources/lib/helper/utils.py @@ -140,7 +140,7 @@ def dialog(dialog_type, *args, **kwargs): if "icon" in kwargs: kwargs['icon'] = kwargs['icon'].replace("{jellyfin}", - "special://home/addons/plugin.video.jellyfin/icon.png") + "special://home/addons/plugin.video.jellyfin/resources/icon.png") if "heading" in kwargs: kwargs['heading'] = kwargs['heading'].replace("{jellyfin}", _('addon_name')) diff --git a/resources/lib/objects/actions.py b/resources/lib/objects/actions.py index de919d8c..a4c5d4b5 100644 --- a/resources/lib/objects/actions.py +++ b/resources/lib/objects/actions.py @@ -311,10 +311,16 @@ class Actions(object): obj['Artwork']['Thumb'] = obj['Artwork']['Thumb'] or "" if not intro and not obj['Type'] == 'Trailer': - obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or "special://home/addons/plugin.video.jellyfin/icon.png" + obj['Artwork']['Primary'] = obj['Artwork']['Primary'] \ + or "special://home/addons/plugin.video.jellyfin/resources/icon.png" else: - obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or obj['Artwork']['Thumb'] or (obj['Artwork']['Backdrop'][0] if len(obj['Artwork']['Backdrop']) else "special://home/addons/plugin.video.jellyfin/fanart.png") - obj['Artwork']['Primary'] += "&KodiTrailer=true" if obj['Type'] == 'Trailer' else "&KodiCinemaMode=true" + obj['Artwork']['Primary'] = obj['Artwork']['Primary'] \ + or obj['Artwork']['Thumb'] \ + or (obj['Artwork']['Backdrop'][0] \ + if len(obj['Artwork']['Backdrop']) \ + else "special://home/addons/plugin.video.jellyfin/resources/fanart.png") + obj['Artwork']['Primary'] += "&KodiTrailer=true" \ + if obj['Type'] == 'Trailer' else "&KodiCinemaMode=true" obj['Artwork']['Backdrop'] = [obj['Artwork']['Primary']] self.set_artwork(obj['Artwork'], listitem, obj['Type']) @@ -471,10 +477,12 @@ class Actions(object): obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6) obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) or 0 obj['Overlay'] = 7 if obj['Played'] else 6 - obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or "special://home/addons/plugin.video.jellyfin/icon.png" - obj['Artwork']['Thumb'] = obj['Artwork']['Thumb'] or "special://home/addons/plugin.video.jellyfin/fanart.png" - obj['Artwork']['Backdrop'] = obj['Artwork']['Backdrop'] or ["special://home/addons/plugin.video.jellyfin/fanart.png"] - + obj['Artwork']['Primary'] = obj['Artwork']['Primary'] \ + or "special://home/addons/plugin.video.jellyfin/resources/icon.png" + obj['Artwork']['Thumb'] = obj['Artwork']['Thumb'] \ + or "special://home/addons/plugin.video.jellyfin/resources/fanart.png" + obj['Artwork']['Backdrop'] = obj['Artwork']['Backdrop'] \ + or ["special://home/addons/plugin.video.jellyfin/resources/fanart.png"] metadata = { 'title': obj['Title'], diff --git a/resources/lib/views.py b/resources/lib/views.py index 9c2fc457..bacb90fe 100644 --- a/resources/lib/views.py +++ b/resources/lib/views.py @@ -363,7 +363,7 @@ class Views(object): else: element = etree.Element('node', {'order': str(index), 'type': "folder"}) - etree.SubElement(element, 'icon').text = "special://home/addons/plugin.video.jellyfin/icon.png" + etree.SubElement(element, 'icon').text = "special://home/addons/plugin.video.jellyfin/resources/icon.png" return element From b193a608252f7e5570587d57aa5d91db3449e522 Mon Sep 17 00:00:00 2001 From: owner Date: Mon, 2 Sep 2019 19:47:24 -0500 Subject: [PATCH 2/6] Removes kodi_icon.png from baseline --- resources/kodi_icon.png | Bin 16737 -> 0 bytes resources/lib/monitor.py | 1 - 2 files changed, 1 deletion(-) delete mode 100644 resources/kodi_icon.png diff --git a/resources/kodi_icon.png b/resources/kodi_icon.png deleted file mode 100644 index 99749229ccd3b48d5a65618a4dd1c223dd77e402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16737 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 diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py index 9e6b9c39..2dd6dbdd 100644 --- a/resources/lib/monitor.py +++ b/resources/lib/monitor.py @@ -313,7 +313,6 @@ class Monitor(xbmc.Monitor): "Mute,Unmute,SetVolume," "Play,Playstate,PlayNext,PlayMediaSource" ), - 'IconUrl': "https://raw.githubusercontent.com/jellyfin/jellyfin-kodi/master/kodi_icon.png", }) session = server['api'].get_device(self.device_id) From 97fe6a69444f7ea8c55a20665bb6b8e35291596d Mon Sep 17 00:00:00 2001 From: TrueTechy Date: Tue, 3 Sep 2019 22:39:30 +0100 Subject: [PATCH 3/6] Remove __shortcuts__ from lib/jellyfin/core/http.py --- resources/lib/jellyfin/client.py | 2 +- resources/lib/jellyfin/core/http.py | 8 -------- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/resources/lib/jellyfin/client.py b/resources/lib/jellyfin/client.py index e58a7bea..85b90261 100644 --- a/resources/lib/jellyfin/client.py +++ b/resources/lib/jellyfin/client.py @@ -89,7 +89,7 @@ class JellyfinClient(object): return self.config[key.replace('config/', "", 1)] if "/" in key else self.config elif key.startswith('http'): - return self.http.__shortcuts__(key.replace('http/', "", 1)) + return self.http.request elif key.startswith('websocket'): return self.wsc.__shortcuts__(key.replace('websocket/', "", 1)) diff --git a/resources/lib/jellyfin/core/http.py b/resources/lib/jellyfin/core/http.py index 43892150..f6344ff3 100644 --- a/resources/lib/jellyfin/core/http.py +++ b/resources/lib/jellyfin/core/http.py @@ -26,14 +26,6 @@ class HTTP(object): self.client = client self.config = client['config'] - def __shortcuts__(self, key): - LOG.debug("__shortcuts__(%r)", key) - - if key == "request": - return self.request - - return - def start_session(self): self.session = requests.Session() From bf2b4e8c32dd8dd9b3d83f143a5b06cf2080bee1 Mon Sep 17 00:00:00 2001 From: TrueTechy Date: Wed, 4 Sep 2019 00:08:41 +0100 Subject: [PATCH 4/6] Remove http shortcut from client.py __getitem__ --- resources/lib/downloader.py | 4 +--- resources/lib/jellyfin/client.py | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/resources/lib/downloader.py b/resources/lib/downloader.py index 53efc1be..03b9bc82 100644 --- a/resources/lib/downloader.py +++ b/resources/lib/downloader.py @@ -40,9 +40,7 @@ def browse_info(): def _http(action, url, request={}, server_id=None): request.update({'url': url, 'type': action}) - - return Jellyfin(server_id)['http/request'](request) - + return Jellyfin(server_id).http.request(request) def _get(handler, params=None, server_id=None): return _http("GET", get_jellyfinserver_url(handler), {'params': params}, server_id) diff --git a/resources/lib/jellyfin/client.py b/resources/lib/jellyfin/client.py index 85b90261..7642ded8 100644 --- a/resources/lib/jellyfin/client.py +++ b/resources/lib/jellyfin/client.py @@ -88,9 +88,6 @@ class JellyfinClient(object): if key.startswith('config'): return self.config[key.replace('config/', "", 1)] if "/" in key else self.config - elif key.startswith('http'): - return self.http.request - elif key.startswith('websocket'): return self.wsc.__shortcuts__(key.replace('websocket/', "", 1)) From b7fa48ea84fcbdd2f79f249dbbd536f226a11aee Mon Sep 17 00:00:00 2001 From: TrueTechy Date: Wed, 4 Sep 2019 03:58:31 +0100 Subject: [PATCH 5/6] client.py - remove api --- resources/lib/connect.py | 2 +- resources/lib/full_sync.py | 2 +- resources/lib/helper/wrapper.py | 2 +- resources/lib/jellyfin/client.py | 3 -- resources/lib/library.py | 10 +++--- resources/lib/monitor.py | 58 ++++++++++++++++---------------- resources/lib/objects/actions.py | 4 +-- resources/lib/objects/movies.py | 2 +- resources/lib/objects/music.py | 8 ++--- resources/lib/objects/tvshows.py | 4 +-- resources/lib/player.py | 16 ++++----- resources/lib/views.py | 4 +-- 12 files changed, 56 insertions(+), 59 deletions(-) diff --git a/resources/lib/connect.py b/resources/lib/connect.py index b1fba75d..041b51ab 100644 --- a/resources/lib/connect.py +++ b/resources/lib/connect.py @@ -148,7 +148,7 @@ class Connect(object): ''' Save user info. ''' - self.user = client['api'].get_user() + self.user = client.jellyfin.get_user() settings('username', self.user['Name']) if 'PrimaryImageTag' in self.user: diff --git a/resources/lib/full_sync.py b/resources/lib/full_sync.py index 50560cea..6ba1c86b 100644 --- a/resources/lib/full_sync.py +++ b/resources/lib/full_sync.py @@ -228,7 +228,7 @@ class FullSync(object): return - library = self.server['api'].get_item(library_id.replace('Mixed:', "")) + library = self.server.jellyfin.get_item(library_id.replace('Mixed:', "")) if library_id.startswith('Mixed:'): for mixed in ('movies', 'tvshows'): diff --git a/resources/lib/helper/wrapper.py b/resources/lib/helper/wrapper.py index 71c07280..b5a89976 100644 --- a/resources/lib/helper/wrapper.py +++ b/resources/lib/helper/wrapper.py @@ -136,7 +136,7 @@ def library_check(): view = None if view is None: - ancestors = self.server['api'].get_ancestors(item['Id']) + ancestors = self.server.jellyfin.get_ancestors(item['Id']) if not ancestors: if item['Type'] == 'MusicArtist': diff --git a/resources/lib/jellyfin/client.py b/resources/lib/jellyfin/client.py index 7642ded8..5f4f4007 100644 --- a/resources/lib/jellyfin/client.py +++ b/resources/lib/jellyfin/client.py @@ -97,9 +97,6 @@ class JellyfinClient(object): elif key.startswith('auth'): return self.auth.__shortcuts__(key.replace('auth/', "", 1)) - elif key.startswith('api'): - return self.jellyfin - elif key == 'connected': return self.logged_in diff --git a/resources/lib/library.py b/resources/lib/library.py index a33a6407..9332cd4b 100644 --- a/resources/lib/library.py +++ b/resources/lib/library.py @@ -348,7 +348,7 @@ class Library(threading.Thread): if settings('SyncInstallRunDone.bool'): if settings('kodiCompanion.bool'): - for plugin in self.server['api'].get_plugins(): + for plugin in self.server.jellyfin.get_plugins(): if plugin['Name'] in ("Jellyfin.Kodi Sync Queue", "Kodi companion", "Kodi Sync Queue"): if not self.fast_sync(): @@ -400,7 +400,7 @@ class Library(threading.Thread): """ for library in sync['Whitelist']: - data = self.server['api'].get_date_modified(last_sync, library.replace('Mixed:', ""), "Series,Episode,BoxSet,Movie,MusicVideo,MusicArtist,MusicAlbum,Audio") + data = self.server.jellyfin.get_date_modified(last_sync, library.replace('Mixed:', ""), "Series,Episode,BoxSet,Movie,MusicVideo,MusicArtist,MusicAlbum,Audio") [self.updated_output[query['Type']].put(query) for query in data['Items']] """ try: @@ -409,7 +409,7 @@ class Library(threading.Thread): removed = [] for media in filters: - result = self.server['api'].get_sync_queue(last_sync, ",".join([x for x in filters if x != media])) + result = self.server.jellyfin.get_sync_queue(last_sync, ",".join([x for x in filters if x != media])) updated.extend(result['ItemsAdded']) updated.extend(result['ItemsUpdated']) userdata.extend(result['UserDataChanged']) @@ -431,7 +431,7 @@ class Library(threading.Thread): self.removed(removed) """ - result = self.server['api'].get_sync_queue(last_sync) + result = self.server.jellyfin.get_sync_queue(last_sync) self.userdata(result['UserDataChanged']) self.removed(result['ItemsRemoved']) @@ -439,7 +439,7 @@ class Library(threading.Thread): filters.extend(["tvshows", "boxsets", "musicvideos", "music"]) # Get only movies. - result = self.server['api'].get_sync_queue(last_sync, ",".join(filters)) + result = self.server.jellyfin.get_sync_queue(last_sync, ",".join(filters)) self.updated(result['ItemsAdded']) self.updated(result['ItemsUpdated']) self.userdata(result['UserDataChanged']) diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py index 9e6b9c39..d2c60d68 100644 --- a/resources/lib/monitor.py +++ b/resources/lib/monitor.py @@ -125,22 +125,22 @@ class Monitor(xbmc.Monitor): if method == 'GetItem': - item = server['api'].get_item(data['Id']) + item = server.jellyfin.get_item(data['Id']) self.void_responder(data, item) elif method == 'GetAdditionalParts': - item = server['api'].get_additional_parts(data['Id']) + item = server.jellyfin.get_additional_parts(data['Id']) self.void_responder(data, item) elif method == 'GetIntros': - item = server['api'].get_intros(data['Id']) + item = server.jellyfin.get_intros(data['Id']) self.void_responder(data, item) elif method == 'GetImages': - item = server['api'].get_images(data['Id']) + item = server.jellyfin.get_images(data['Id']) self.void_responder(data, item) elif method == 'GetServerAddress': @@ -150,12 +150,12 @@ class Monitor(xbmc.Monitor): elif method == 'GetPlaybackInfo': - sources = server['api'].get_play_info(data['Id'], data['Profile']) + sources = server.jellyfin.get_play_info(data['Id'], data['Profile']) self.void_responder(data, sources) elif method == 'GetLiveStream': - sources = server['api'].get_live_stream(data['Id'], data['PlaySessionId'], data['Token'], data['Profile']) + sources = server.jellyfin.get_live_stream(data['Id'], data['PlaySessionId'], data['Token'], data['Profile']) self.void_responder(data, sources) elif method == 'GetToken': @@ -165,31 +165,31 @@ class Monitor(xbmc.Monitor): elif method == 'GetSession': - session = server['api'].get_device(self.device_id) + session = server.jellyfin.get_device(self.device_id) self.void_responder(data, session) elif method == 'GetUsers': - users = server['api'].get_users() + users = server.jellyfin.get_users() self.void_responder(data, users) elif method == 'GetTranscodeOptions': - result = server['api'].get_transcode_settings() + result = server.jellyfin.get_transcode_settings() self.void_responder(data, result) elif method == 'GetThemes': if data['Type'] == 'Video': - theme = server['api'].get_items_theme_video(data['Id']) + theme = server.jellyfin.get_items_theme_video(data['Id']) else: - theme = server['api'].get_items_theme_song(data['Id']) + theme = server.jellyfin.get_items_theme_song(data['Id']) self.void_responder(data, theme) elif method == 'GetTheme': - theme = server['api'].get_themes(data['Id']) + theme = server.jellyfin.get_themes(data['Id']) self.void_responder(data, theme) elif method == 'Browse': @@ -201,41 +201,41 @@ class Monitor(xbmc.Monitor): elif method == 'BrowseSeason': - result = server['api'].get_seasons(data['Id']) + result = server.jellyfin.get_seasons(data['Id']) self.void_responder(data, result) elif method == 'LiveTV': - result = server['api'].get_channels() + result = server.jellyfin.get_channels() self.void_responder(data, result) elif method == 'RecentlyAdded': - result = server['api'].get_recently_added(data.get('Media'), data.get('Id'), data.get('Limit')) + result = server.jellyfin.get_recently_added(data.get('Media'), data.get('Id'), data.get('Limit')) self.void_responder(data, result) elif method == 'Genres': - result = server['api'].get_genres(data.get('Id')) + result = server.jellyfin.get_genres(data.get('Id')) self.void_responder(data, result) elif method == 'Recommended': - result = server['api'].get_recommendation(data.get('Id'), data.get('Limit')) + result = server.jellyfin.get_recommendation(data.get('Id'), data.get('Limit')) self.void_responder(data, result) elif method == 'RefreshItem': - server['api'].refresh_item(data['Id']) + server.jellyfin.refresh_item(data['Id']) elif method == 'FavoriteItem': - server['api'].favorite(data['Id'], data['Favorite']) + server.jellyfin.favorite(data['Id'], data['Favorite']) elif method == 'DeleteItem': - server['api'].delete_item(data['Id']) + server.jellyfin.delete_item(data['Id']) elif method == 'PlayPlaylist': - server['api'].post_session(server['config/app.session'], "Playing", { + server.jellyfin.post_session(server['config/app.session'], "Playing", { 'PlayCommand': "PlayNow", 'ItemIds': data['Id'], 'StartPositionTicks': 0 @@ -243,7 +243,7 @@ class Monitor(xbmc.Monitor): elif method == 'Play': - items = server['api'].get_items(data['ItemIds']) + items = server.jellyfin.get_items(data['ItemIds']) PlaylistWorker(data.get('ServerId'), items, data['PlayCommand'] == 'PlayNow', data.get('StartPositionTicks', 0), data.get('AudioStreamIndex'), @@ -262,7 +262,7 @@ class Monitor(xbmc.Monitor): self.server_instance(data['ServerId']) elif method == 'AddUser': - server['api'].session_add_user(server['config/app.session'], data['Id'], data['Add']) + server.jellyfin.session_add_user(server['config/app.session'], data['Id'], data['Add']) self.additional_users(server) elif method == 'Player.OnPlay': @@ -286,20 +286,20 @@ class Monitor(xbmc.Monitor): elif settings('additionalUsers'): users = settings('additionalUsers').split(',') - all_users = server['api'].get_users() + all_users = server.jellyfin.get_users() for additional in users: for user in all_users: if user['Name'].lower() in additional.decode('utf-8').lower(): - server['api'].session_add_user(server['config/app.session'], user['Id'], True) + server.jellyfin.session_add_user(server['config/app.session'], user['Id'], True) self.additional_users(server) def post_capabilities(self, server): LOG.info("--[ post capabilities/%s ]", server['auth/server-id']) - server['api'].post_capabilities({ + server.jellyfin.post_capabilities({ 'PlayableMediaTypes': "Audio,Video", 'SupportsMediaControl': True, 'SupportedCommands': ( @@ -316,7 +316,7 @@ class Monitor(xbmc.Monitor): 'IconUrl': "https://raw.githubusercontent.com/jellyfin/jellyfin-kodi/master/kodi_icon.png", }) - session = server['api'].get_device(self.device_id) + session = server.jellyfin.get_device(self.device_id) server['config']['app.session'] = session[0]['Id'] def additional_users(self, server): @@ -327,7 +327,7 @@ class Monitor(xbmc.Monitor): window('JellyfinAdditionalUserImage.%s' % i, clear=True) try: - session = server['api'].get_device(self.device_id) + session = server.jellyfin.get_device(self.device_id) except Exception as error: LOG.exception(error) @@ -335,7 +335,7 @@ class Monitor(xbmc.Monitor): for index, user in enumerate(session[0]['AdditionalUsers']): - info = server['api'].get_user(user['UserId']) + info = server.jellyfin.get_user(user['UserId']) image = api.API(info, server['config/auth.server']).get_user_artwork(user['UserId']) window('JellyfinAdditionalUserImage.%s' % index, image) window('JellyfinAdditionalUserPosition.%s' % user['UserId'], str(index)) diff --git a/resources/lib/objects/actions.py b/resources/lib/objects/actions.py index de919d8c..5c5b169c 100644 --- a/resources/lib/objects/actions.py +++ b/resources/lib/objects/actions.py @@ -721,7 +721,7 @@ def on_update(data, server): if item: if not window('jellyfin.skip.%s.bool' % item[0]): - server['api'].item_played(item[0], playcount) + server.jellyfin.item_played(item[0], playcount) window('jellyfin.skip.%s' % item[0], clear=True) @@ -769,7 +769,7 @@ def on_play(data, server): return - item = server['api'].get_item(item[0]) + item = server.jellyfin.get_item(item[0]) item['PlaybackInfo'] = {'Path': file} playutils.set_properties(item, 'DirectStream' if settings('useDirectPaths') == '0' else 'DirectPlay') diff --git a/resources/lib/objects/movies.py b/resources/lib/objects/movies.py index b5f8ef05..6aae8c7f 100644 --- a/resources/lib/objects/movies.py +++ b/resources/lib/objects/movies.py @@ -169,7 +169,7 @@ class Movies(KodiDb): try: if obj['LocalTrailer']: - trailer = self.server['api'].get_local_trailers(obj['Id']) + trailer = self.server.jellyfin.get_local_trailers(obj['Id']) obj['Trailer'] = "plugin://plugin.video.jellyfin/trailer?id=%s&mode=play" % trailer[0]['Id'] elif obj['Trailer']: diff --git a/resources/lib/objects/music.py b/resources/lib/objects/music.py index d1c502fd..d526c4ad 100644 --- a/resources/lib/objects/music.py +++ b/resources/lib/objects/music.py @@ -217,7 +217,7 @@ class Music(KodiDb): except TypeError: try: - self.artist(self.server['api'].get_item(temp_obj['Id']), library=None) + self.artist(self.server.jellyfin.get_item(temp_obj['Id']), library=None) temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0] except Exception as error: LOG.exception(error) @@ -318,7 +318,7 @@ class Music(KodiDb): if obj['SongAlbumId'] is None: raise TypeError("No album id found associated?") - self.album(self.server['api'].get_item(obj['SongAlbumId'])) + self.album(self.server.jellyfin.get_item(obj['SongAlbumId'])) obj['AlbumId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_song_obj))[0] except TypeError: self.single(obj) @@ -373,7 +373,7 @@ class Music(KodiDb): except TypeError: try: - self.artist(self.server['api'].get_item(temp_obj['Id']), library=None) + self.artist(self.server.jellyfin.get_item(temp_obj['Id']), library=None) temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0] except Exception as error: LOG.exception(error) @@ -407,7 +407,7 @@ class Music(KodiDb): except TypeError: try: - self.artist(self.server['api'].get_item(temp_obj['Id']), library=None) + self.artist(self.server.jellyfin.get_item(temp_obj['Id']), library=None) temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0] except Exception as error: LOG.exception(error) diff --git a/resources/lib/objects/tvshows.py b/resources/lib/objects/tvshows.py index fa7d614e..e155d806 100644 --- a/resources/lib/objects/tvshows.py +++ b/resources/lib/objects/tvshows.py @@ -137,7 +137,7 @@ class TVShows(KodiDb): season_episodes = {} - for season in self.server['api'].get_seasons(obj['Id'])['Items']: + for season in self.server.jellyfin.get_seasons(obj['Id'])['Items']: if season['SeriesId'] != obj['Id']: obj['SeriesId'] = season['SeriesId'] @@ -435,7 +435,7 @@ class TVShows(KodiDb): if obj['ShowId'] is None: try: - self.tvshow(self.server['api'].get_item(obj['SeriesId']), library=None) + self.tvshow(self.server.jellyfin.get_item(obj['SeriesId']), library=None) obj['ShowId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0] except (TypeError, KeyError): LOG.error("Unable to add series %s", obj['SeriesId']) diff --git a/resources/lib/player.py b/resources/lib/player.py index 712c9bb9..ef0f8ccc 100644 --- a/resources/lib/player.py +++ b/resources/lib/player.py @@ -110,7 +110,7 @@ class Player(xbmc.Player): 'AudioStreamIndex': item['AudioStreamIndex'], 'SubtitleStreamIndex': item['SubtitleStreamIndex'] } - item['Server']['api'].session_playing(data) + item['Server'].jellyfin.session_playing(data) window('jellyfin.skip.%s.bool' % item['Id'], True) if monitor.waitForAbort(2): @@ -239,7 +239,7 @@ class Player(xbmc.Player): if item['Type'] != 'Episode' or not item.get('CurrentEpisode'): return - next_items = item['Server']['api'].get_adjacent_episodes(item['CurrentEpisode']['tvshowid'], item['Id']) + next_items = item['Server'].jellyfin.get_adjacent_episodes(item['CurrentEpisode']['tvshowid'], item['Id']) for index, next_item in enumerate(next_items['Items']): if next_item['Id'] == item['Id']: @@ -359,7 +359,7 @@ class Player(xbmc.Player): 'AudioStreamIndex': item['AudioStreamIndex'], 'SubtitleStreamIndex': item['SubtitleStreamIndex'] } - item['Server']['api'].session_progress(data) + item['Server'].jellyfin.session_progress(data) def onPlayBackStopped(self): @@ -402,17 +402,17 @@ class Player(xbmc.Player): 'PositionTicks': int(item['CurrentPosition'] * 10000000), 'PlaySessionId': item['PlaySessionId'] } - item['Server']['api'].session_stop(data) + item['Server'].jellyfin.session_stop(data) if item.get('LiveStreamId'): LOG.info("<[ livestream/%s ]", item['LiveStreamId']) - item['Server']['api'].close_live_stream(item['LiveStreamId']) + item['Server'].jellyfin.close_live_stream(item['LiveStreamId']) elif item['PlayMethod'] == 'Transcode': LOG.info("<[ transcode/%s ]", item['Id']) - item['Server']['api'].close_transcode(item['DeviceId']) + item['Server'].jellyfin.close_transcode(item['DeviceId']) path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/temp/").decode('utf-8') @@ -423,7 +423,7 @@ class Player(xbmc.Player): for file in files: xbmcvfs.delete(os.path.join(path, file.decode('utf-8'))) - result = item['Server']['api'].get_item(item['Id']) or {} + result = item['Server'].jellyfin.get_item(item['Id']) or {} if 'UserData' in result and result['UserData']['Played']: delete = False @@ -440,7 +440,7 @@ class Player(xbmc.Player): LOG.info("Offer delete option") if dialog("yesno", heading=_(30091), line1=_(33015), autoclose=120000): - item['Server']['api'].delete_item(item['Id']) + item['Server'].jellyfin.delete_item(item['Id']) window('jellyfin.external_check', clear=True) diff --git a/resources/lib/views.py b/resources/lib/views.py index 9c2fc457..c3b5af91 100644 --- a/resources/lib/views.py +++ b/resources/lib/views.py @@ -167,8 +167,8 @@ class Views(object): def get_libraries(self): try: - libraries = self.server['api'].get_media_folders()['Items'] - views = self.server['api'].get_views()['Items'] + libraries = self.server.jellyfin.get_media_folders()['Items'] + views = self.server.jellyfin.get_views()['Items'] except Exception as error: LOG.exception(error) raise IndexError("Unable to retrieve libraries: %s" % error) From ae3dc2ab0f8e96cc42fb55fbbcbaa9cbe3039183 Mon Sep 17 00:00:00 2001 From: TrueTechy Date: Sun, 8 Sep 2019 04:14:40 +0100 Subject: [PATCH 6/6] correct missed change when removing http shortcuts --- resources/lib/downloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lib/downloader.py b/resources/lib/downloader.py index 03b9bc82..0561165a 100644 --- a/resources/lib/downloader.py +++ b/resources/lib/downloader.py @@ -303,7 +303,7 @@ class GetItemWorker(threading.Thread): } try: - result = self.server['http/request'](request, s) + result = self.server.http.request(request, s) for item in result['Items']: