X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=resources%2Flib%2FNavigation.py;h=c2ee4cc05396c692c15c2275b62ba6d8deb19e7a;hb=7e3fc45dbc851661c2a30fdd5faf2932adfd9086;hp=db025988987ace9464430374689ba252d49421de;hpb=69bafa3b4cb738c563f3cc8f7affe7b4fa8e91ea;p=plugin.video.netflix.git diff --git a/resources/lib/Navigation.py b/resources/lib/Navigation.py index db02598..c2ee4cc 100644 --- a/resources/lib/Navigation.py +++ b/resources/lib/Navigation.py @@ -6,6 +6,7 @@ import urllib import urllib2 import json +from xbmcaddon import Addon from urlparse import parse_qsl from utils import noop, log @@ -34,17 +35,6 @@ class Navigation: self.base_url = base_url self.log = log_fn - def get_netflix_service_url (self): - return 'http://localhost:7005' - - def call_netflix_service (self, params): - url_values = urllib.urlencode(params) - url = self.get_netflix_service_url() - full_url = url + '?' + url_values - data = urllib2.urlopen(full_url).read() - parsed_json = json.loads(data) - return parsed_json.get('result', None) - @log def router (self, paramstring): """Route to the requested subfolder & dispatch actions along the way @@ -56,6 +46,10 @@ class Navigation: """ params = self.parse_paramters(paramstring=paramstring) + # open foreign settings dialog + if 'mode' in params.keys() and params['mode'] == 'openSettings': + return self.open_settings(params['url']) + # log out the user if 'action' in params.keys() and params['action'] == 'logout': return self.call_netflix_service({'method': 'logout'}) @@ -134,7 +128,6 @@ class Navigation: start_offset : :obj:`str` Offset to resume playback from (in seconds) """ - # widevine esn esn = self.call_netflix_service({'method': 'get_esn'}) return self.kodi_helper.play_item(esn=esn, video_id=video_id, start_offset=start_offset) @@ -167,7 +160,15 @@ class Navigation: user_list_id : :obj:`str` Type of list to display """ - video_list_ids = self.call_netflix_service({'method': 'fetch_video_list_ids', 'type': type}) + # determine if we´re in kids mode + user_data = self.call_netflix_service({'method': 'get_user_data'}) + profiles = self.call_netflix_service({'method': 'list_profiles'}) + is_kids = profiles.get(user_data['guid']).get('isKids', False) + # fetch video lists + if is_kids == True: + video_list_ids = self.call_netflix_service({'method': 'fetch_video_list_ids_for_kids'}) + else: + video_list_ids = self.call_netflix_service({'method': 'fetch_video_list_ids', 'type': type}) # check for any errors if self._is_dirty_response(response=video_list_ids): return False @@ -264,13 +265,21 @@ class Navigation: if self.kodi_helper.has_cached_item(cache_id=cache_id): video_list_ids = self.kodi_helper.get_cached_item(cache_id=cache_id) else: + # determine if we´re in Kids profile mode + user_data = self.call_netflix_service({'method': 'get_user_data'}) + profiles = self.call_netflix_service({'method': 'list_profiles'}) + is_kids = profiles.get(user_data['guid']).get('isKids', False) # fetch video lists - video_list_ids = self.call_netflix_service({'method': 'fetch_video_list_ids'}) + if is_kids == True: + video_list_ids = self.call_netflix_service({'method': 'fetch_video_list_ids_for_kids'}) + else: + video_list_ids = self.call_netflix_service({'method': 'fetch_video_list_ids'}) + # check for any errors if self._is_dirty_response(response=video_list_ids): return False - # parse the video list ids - self.kodi_helper.add_cached_item(cache_id=cache_id, contents=video_list_ids) + # cache the video list ids + #self.kodi_helper.add_cached_item(cache_id=cache_id, contents=video_list_ids) # defines an order for the user list, as Netflix changes the order at every request user_list_order = ['queue', 'continueWatching', 'topTen', 'netflixOriginals', 'trendingNow', 'newRelease', 'popularTitles'] # define where to route the user @@ -281,6 +290,8 @@ class Navigation: def show_profiles (self): """List the profiles for the active account""" profiles = self.call_netflix_service({'method': 'list_profiles'}) + if len(profiles) == 0: + return self.kodi_helper.show_login_failed_notification() return self.kodi_helper.build_profiles_listing(profiles=profiles, action='video_lists', build_url=self.build_url) @log @@ -384,7 +395,7 @@ class Navigation: If we don't have an active session & the user couldn't be logged in """ is_logged_in = self.call_netflix_service({'method': 'is_logged_in'}) - return True if is_logged_in else self.call_netflix_service({'method': 'login'}) + return True if is_logged_in else self.call_netflix_service({'method': 'login', 'email': account['email'], 'password': account['password']}) @log def before_routing_action (self, params): @@ -517,3 +528,39 @@ class Navigation: Url + querystring based on the param """ return self.base_url + '?' + urllib.urlencode(query) + + def get_netflix_service_url (self): + """Returns URL & Port of the internal Netflix HTTP Proxy service + + Returns + ------- + str + Url + Port + """ + return 'http://localhost:' + str(self.kodi_helper.addon.getSetting('netflix_service_port')) + + def call_netflix_service (self, params): + """Makes a GET request to the internal Netflix HTTP proxy and returns the result + + Parameters + ---------- + params : :obj:`dict` of :obj:`str` + List of paramters to be url encoded + + Returns + ------- + :obj:`dict` + Netflix Service RPC result + """ + url_values = urllib.urlencode(params) + url = self.get_netflix_service_url() + full_url = url + '?' + url_values + data = urllib2.urlopen(full_url).read() + parsed_json = json.loads(data) + return parsed_json.get('result', None) + + def open_settings(self, url): + """Opens a foreign settings dialog""" + is_addon = self.kodi_helper.get_inputstream_addon() + url = is_addon if url == 'is' else url + return Addon(url).openSettings()