fix(login): Enables hot login functionality, as well as proper login failed verification
authorSebastian Golasch <public@asciidisco.com>
Tue, 7 Mar 2017 21:12:58 +0000 (22:12 +0100)
committerSebastian Golasch <public@asciidisco.com>
Tue, 7 Mar 2017 21:12:58 +0000 (22:12 +0100)
addon.xml
resources/language/English/strings.po
resources/language/German/strings.po
resources/lib/Navigation.py
resources/lib/NetflixHttpRequestHandler.py
resources/lib/NetflixHttpSubRessourceHandler.py

index 64944e8474a5f66537746a5589c2abe0fcfa37b0..f60679cd3a5d30a6a2ab487fc250b61aad11cc8a 100644 (file)
--- a/addon.xml
+++ b/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.netflix" name="Netflix" version="0.10.1" provider-name="libdev + jojo + asciidisco">
+<addon id="plugin.video.netflix" name="Netflix" version="0.10.2" provider-name="libdev + jojo + asciidisco">
   <requires>
     <import addon="xbmc.python" version="2.24.0"/>
     <import addon="script.module.beautifulsoup4" version="4.3.2"/>
index 69e8fcbd1d994669ea3590b3574487dbb88d4eb2..7c48394c5fbc239f3c72b72262a75d8aeedeef80 100644 (file)
@@ -1,7 +1,7 @@
 # Kodi Media Center language file
 # Addon Name: Netflix
 # Addon id: plugin.video.netflix
-# Addon version: 0.10.1
+# Addon version: 0.10.2
 # Addon Provider: libdev + jojo + asciidisco
 msgid ""
 msgstr ""
index 7a5184cf7dc6cb6d51fc0ac1efccb2df480d2aeb..0ff4357c546ba74d7f6c6b67b0ac4263abe57bf9 100644 (file)
@@ -1,7 +1,7 @@
 # Kodi Media Center language file
 # Addon Name: Netflix
 # Addon id: plugin.video.netflix
-# Addon version: 0.10.1
+# Addon version: 0.10.2
 # Addon Provider: libdev + jojo + asciidisco
 msgid ""
 msgstr ""
index f36cd29674b49f835a4f5482f3343df79b3801a5..813b6444e11f4a4a936c3bcfdd08a257c21b48f6 100644 (file)
@@ -34,17 +34,6 @@ class Navigation:
         self.base_url = base_url
         self.log = log_fn
 
-    def get_netflix_service_url (self):
-        return 'http://localhost:' + str(self.kodi_helper.addon.getSetting('netflix_service_port'))
-
-    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
@@ -134,7 +123,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)
 
@@ -281,6 +269,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 +374,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):
@@ -425,6 +415,7 @@ class Navigation:
             self.call_netflix_service({'method': 'switch_profile', 'profile_id': params['profile_id']})
         # check login, in case of main menu
         if 'action' not in params:
+            self.kodi_helper.log('ES Called - Zeile 428')
             self.establish_session(account=credentials)
         return options
 
@@ -495,6 +486,7 @@ class Navigation:
         if 'error' in response:
             # check if we do not have a valid session, in case that happens: (re)login
             if self._is_expired_session(response=response):
+                self.kodi_helper.log('ES Called - Zeile 499')
                 if self.establish_session(account=self.kodi_helper.get_credentials()):
                     return True
             message = response['message'] if 'message' in response else ''
@@ -517,3 +509,33 @@ 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)
index 1ab96db23a3a96c94af1439ff2e499cb1625b853..b42b50c4408cd365cbbb96e6974b4bb6f06c7d40 100644 (file)
@@ -1,3 +1,8 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Module: NetflixHttpRequestHandler
+# Created on: 07.03.2017
+
 import BaseHTTPServer
 import json
 from types import FunctionType
index c7626ea053d70fb1abbb755360ba4ad1b31d1860..dd0fa08a608e56e1870327c8ea4fcf137c9d7a57 100644 (file)
@@ -1,23 +1,44 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Module: NetflixHttpSubRessourceHandler
+# Created on: 07.03.2017
+
 class NetflixHttpSubRessourceHandler:
 
     def __init__ (self, kodi_helper, netflix_session):
         self.kodi_helper = kodi_helper
         self.netflix_session = netflix_session
-        credentials = self.kodi_helper.get_credentials()
-
-        if self.netflix_session.is_logged_in(account=credentials):
-            self.netflix_session.refresh_session_data(account=credentials)
+        self.credentials = self.kodi_helper.get_credentials()
+
+        if self.credentials['email'] != '' and self.credentials['password'] != '':
+            if self.netflix_session.is_logged_in(account=self.credentials):
+                self.netflix_session.refresh_session_data(account=self.credentials)
+            else:
+                self.netflix_session.login(account=self.credentials)
+            self.profiles = self.netflix_session.profiles
         else:
-            self.netflix_session.login(account=credentials)
-        self.profiles = self.netflix_session.profiles
+            self.profiles = []
 
     def is_logged_in (self, params):
-        credentials = self.kodi_helper.get_credentials()
-        return self.netflix_session.is_logged_in(account=credentials)
+        if self.credentials['email'] == '' or self.credentials['password'] == '':
+            return False
+        return self.netflix_session.is_logged_in(account=self.credentials)
 
     def logout (self, params):
+        self.profiles = []
+        self.credentials = {'email': '', 'password': ''}
         return self.netflix_session.logout()
 
+    def login (self, params):
+        email = params.get('email', [''])[0]
+        password = params.get('password', [''])[0]
+        if email != '' and password != '':
+            self.credentials = {'email': email, 'password': password}
+            _ret = self.netflix_session.login(account=self.credentials)
+            self.profiles = self.netflix_session.profiles
+            return _ret
+        return None
+
     def list_profiles (self, params):
         return self.profiles
 
@@ -74,9 +95,8 @@ class NetflixHttpSubRessourceHandler:
         return self.netflix_session.fetch_metadata(id=video_id)
 
     def switch_profile (self, params):
-        credentials = self.kodi_helper.get_credentials()
         profile_id = params.get('profile_id', [''])[0]
-        return self.netflix_session.switch_profile(profile_id=profile_id, account=credentials)
+        return self.netflix_session.switch_profile(profile_id=profile_id, account=self.credentials)
 
     def get_user_data (self, params):
         return self.netflix_session.user_data