X-Git-Url: http://git.code-monkey.de/?p=plugin.video.netflix.git;a=blobdiff_plain;f=resources%2Flib%2FKodiHelper.py;h=0e5b6617de3696a9ba009cee73df3dcf1b84184c;hp=100f94e79c653bc293b5bede79533ac0b7ad2bf8;hb=885d0084883d67d0c9a58669baebb25f097b47dc;hpb=3dea5f5254715c91af6320a8b656f7d6836c3665 diff --git a/resources/lib/KodiHelper.py b/resources/lib/KodiHelper.py index 100f94e..0e5b661 100644 --- a/resources/lib/KodiHelper.py +++ b/resources/lib/KodiHelper.py @@ -7,10 +7,13 @@ import xbmcplugin import xbmcgui import xbmc import json -from os.path import join +from MSL import MSL +from os import remove +from os.path import join, isfile from urllib import urlencode from xbmcaddon import Addon from uuid import uuid4 +from utils import get_user_agent_for_current_platform from UniversalAnalytics import Tracker try: import cPickle as pickle @@ -190,6 +193,34 @@ class KodiHelper: 'password': self.get_addon().getSetting('password') } + def get_esn(self): + """ + Returns the esn from settings + """ + self.log(msg='Is FILE: ' + str(isfile(self.msl_data_path + 'msl_data.json'))) + self.log(msg=self.get_addon().getSetting('esn')) + return self.get_addon().getSetting('esn') + + def set_esn(self, esn): + """ + Returns the esn from settings + """ + stored_esn = self.get_esn() + if not stored_esn and esn: + self.set_setting('esn', esn) + self.delete_manifest_data() + return esn + return stored_esn + + def delete_manifest_data(self): + if isfile(self.msl_data_path + 'msl_data.json'): + remove(self.msl_data_path + 'msl_data.json') + if isfile(self.msl_data_path + 'manifest.json'): + remove(self.msl_data_path + 'manifest.json') + msl = MSL(kodi_helper=self) + msl.perform_key_handshake() + msl.save_msl_data() + def get_dolby_setting(self): """ Returns if the dolby sound is enabled @@ -251,22 +282,6 @@ class KodiHelper: """Invalidates the memory cache""" xbmcgui.Window(xbmcgui.getCurrentWindowId()).setProperty('memcache', pickle.dumps({})) - def has_cached_item (self, cache_id): - """Checks if the requested item is in memory cache - - Parameters - ---------- - cache_id : :obj:`str` - ID of the cache entry - - Returns - ------- - bool - Item is cached - """ - cached_items = pickle.loads(xbmcgui.Window(xbmcgui.getCurrentWindowId()).getProperty('memcache')) - return cache_id in cached_items.keys() - def get_cached_item (self, cache_id): """Returns an item from the in memory cache @@ -281,9 +296,8 @@ class KodiHelper: Contents of the requested cache item or none """ cached_items = pickle.loads(xbmcgui.Window(xbmcgui.getCurrentWindowId()).getProperty('memcache')) - if self.has_cached_item(cache_id) != True: - return None - return cached_items[cache_id] + + return cached_items.get(cache_id) def add_cached_item (self, cache_id, contents): """Adds an item to the in memory cache @@ -438,17 +452,21 @@ class KodiHelper: li = xbmcgui.ListItem(label=video['title']) # add some art to the item li = self._generate_art_info(entry=video, li=li) - # it´s a show, so we need a subfolder & route (for seasons) - isFolder = True - url = build_url({'action': actions[video['type']], 'show_id': video_list_id}) + # add list item info + li, infos = self._generate_entry_info(entry=video, li=li) + li = self._generate_context_menu_items(entry=video, li=li) # lists can be mixed with shows & movies, therefor we need to check if its a movie, so play it right away if video_list[video_list_id]['type'] == 'movie': # it´s a movie, so we need no subfolder & a route to play it isFolder = False - url = build_url({'action': 'play_video', 'video_id': video_list_id}) - # add list item info - li = self._generate_entry_info(entry=video, li=li) - li = self._generate_context_menu_items(entry=video, li=li) + url = build_url({'action': 'play_video', 'video_id': video_list_id, 'infoLabels': infos}) + else: + # it´s a show, so we need a subfolder & route (for seasons) + isFolder = True + params = {'action': actions[video['type']], 'show_id': video_list_id} + if 'tvshowtitle' in infos: + params['tvshowtitle'] = infos['tvshowtitle'] + url = build_url(params) xbmcplugin.addDirectoryItem(handle=self.plugin_handle, url=url, listitem=li, isFolder=isFolder) xbmcplugin.addSortMethod(handle=self.plugin_handle, sortMethod=xbmcplugin.SORT_METHOD_LABEL) @@ -570,9 +588,12 @@ class KodiHelper: # add some art to the item li = self._generate_art_info(entry=season, li=li) # add list item info - li = self._generate_entry_info(entry=season, li=li, base_info={'mediatype': 'season'}) + li, infos = self._generate_entry_info(entry=season, li=li, base_info={'mediatype': 'season'}) li = self._generate_context_menu_items(entry=season, li=li) - url = build_url({'action': 'episode_list', 'season_id': season_id}) + params = {'action': 'episode_list', 'season_id': season_id} + if 'tvshowtitle' in infos: + params['tvshowtitle'] = infos['tvshowtitle'] + url = build_url(params) xbmcplugin.addDirectoryItem(handle=self.plugin_handle, url=url, listitem=li, isFolder=True) xbmcplugin.addSortMethod(handle=self.plugin_handle, sortMethod=xbmcplugin.SORT_METHOD_NONE) @@ -610,9 +631,9 @@ class KodiHelper: # add some art to the item li = self._generate_art_info(entry=episode, li=li) # add list item info - li = self._generate_entry_info(entry=episode, li=li, base_info={'mediatype': 'episode'}) + li, infos = self._generate_entry_info(entry=episode, li=li, base_info={'mediatype': 'episode'}) li = self._generate_context_menu_items(entry=episode, li=li) - url = build_url({'action': 'play_video', 'video_id': episode_id, 'start_offset': episode['bookmark']}) + url = build_url({'action': 'play_video', 'video_id': episode_id, 'start_offset': episode['bookmark'], 'infoLabels': infos}) xbmcplugin.addDirectoryItem(handle=self.plugin_handle, url=url, listitem=li, isFolder=False) xbmcplugin.addSortMethod(handle=self.plugin_handle, sortMethod=xbmcplugin.SORT_METHOD_EPISODE) @@ -625,7 +646,7 @@ class KodiHelper: xbmcplugin.endOfDirectory(self.plugin_handle) return True - def play_item (self, esn, video_id, start_offset=-1): + def play_item (self, esn, video_id, start_offset=-1, infoLabels={}): """Plays a video Parameters @@ -638,12 +659,16 @@ class KodiHelper: start_offset : :obj:`str` Offset to resume playback from (in seconds) + + infoLabels : :obj:`str` + the listitem's infoLabels Returns ------- bool List could be build """ + self.set_esn(esn) addon = self.get_addon() inputstream_addon = self.get_inputstream_addon() if inputstream_addon == None: @@ -662,6 +687,9 @@ class KodiHelper: # inputstream addon properties msl_service_url = 'http://localhost:' + str(addon.getSetting('msl_service_port')) play_item = xbmcgui.ListItem(path=msl_service_url + '/manifest?id=' + video_id) + play_item.setContentLookup(False) + play_item.setMimeType('application/dash+xml') + play_item.setProperty(inputstream_addon + '.stream_headers', 'user-agent=' + get_user_agent_for_current_platform()) play_item.setProperty(inputstream_addon + '.license_type', 'com.widevine.alpha') play_item.setProperty(inputstream_addon + '.manifest_type', 'mpd') play_item.setProperty(inputstream_addon + '.license_key', msl_service_url + '/license?id=' + video_id + '||b{SSM}!b{SID}|') @@ -671,6 +699,9 @@ class KodiHelper: # check if we have a bookmark e.g. start offset position if int(start_offset) > 0: play_item.setProperty('StartOffset', str(start_offset) + '.0') + # set infoLabels + if len(infoLabels) > 0: + play_item.setInfo('video', infoLabels) return xbmcplugin.setResolvedUrl(self.plugin_handle, True, listitem=play_item) def _generate_art_info (self, entry, li): @@ -744,7 +775,9 @@ class KodiHelper: if 'mpaa' in entry_keys: infos.update({'mpaa': entry['mpaa']}) else: - infos.update({'mpaa': str(entry['maturity']['board']) + '-' + str(entry['maturity']['value'])}) + if entry.get('maturity', None) is not None: + if entry['maturity']['board'] is not None and entry['maturity']['value'] is not None: + infos.update({'mpaa': str(entry['maturity']['board'].encode('utf-8')) + '-' + str(entry['maturity']['value'].encode('utf-8'))}) if 'rating' in entry_keys: infos.update({'rating': int(entry['rating']) * 2}) if 'synopsis' in entry_keys: @@ -764,6 +797,8 @@ class KodiHelper: if 'type' in entry_keys: if entry['type'] == 'movie' or entry['type'] == 'episode': li.setProperty('IsPlayable', 'true') + elif entry['type'] == 'show': + infos.update({'tvshowtitle': entry['title']}) if 'mediatype' in entry_keys: if entry['mediatype'] == 'movie' or entry['mediatype'] == 'episode': li.setProperty('IsPlayable', 'true') @@ -783,8 +818,10 @@ class KodiHelper: if entry['quality'] == '1080': quality = {'width': '1920', 'height': '1080'} li.addStreamInfo('video', quality) + if 'tvshowtitle' in entry_keys: + infos.update({'tvshowtitle': entry['tvshowtitle']}) li.setInfo('video', infos) - return li + return li, infos def _generate_context_menu_items (self, entry, li): """Adds context menue items to a Kodi list item