chore(performace): Disable prefetching (temporary)
[plugin.video.netflix.git] / resources / lib / NetflixHttpSubRessourceHandler.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # Module: NetflixHttpSubRessourceHandler
4 # Created on: 07.03.2017
5
6 class NetflixHttpSubRessourceHandler:
7
8     def __init__ (self, kodi_helper, netflix_session):
9         self.kodi_helper = kodi_helper
10         self.netflix_session = netflix_session
11         self.credentials = self.kodi_helper.get_credentials()
12         self.video_list_cache = {}
13
14         if self.credentials['email'] != '' and self.credentials['password'] != '':
15             if self.netflix_session.is_logged_in(account=self.credentials):
16                 self.netflix_session.refresh_session_data(account=self.credentials)
17             else:
18                 self.netflix_session.login(account=self.credentials)
19             self.profiles = self.netflix_session.profiles
20             #self._prefetch_user_video_lists()
21         else:
22             self.profiles = []
23
24     def _prefetch_user_video_lists (self):
25         for profile_id in self.profiles:
26             self.switch_profile({'profile_id': [profile_id]})
27             self.video_list_cache[profile_id] = self.fetch_video_list_ids({})
28
29     def is_logged_in (self, params):
30         if self.credentials['email'] == '' or self.credentials['password'] == '':
31             return False
32         return self.netflix_session.is_logged_in(account=self.credentials)
33
34     def logout (self, params):
35         self.profiles = []
36         self.credentials = {'email': '', 'password': ''}
37         return self.netflix_session.logout()
38
39     def login (self, params):
40         email = params.get('email', [''])[0]
41         password = params.get('password', [''])[0]
42         if email != '' and password != '':
43             self.credentials = {'email': email, 'password': password}
44             _ret = self.netflix_session.login(account=self.credentials)
45             self.profiles = self.netflix_session.profiles
46             return _ret
47         return None
48
49     def list_profiles (self, params):
50         return self.profiles
51
52     def get_esn (self, params):
53         return self.netflix_session.esn
54
55     def fetch_video_list_ids (self, params):
56         cached_list = self.video_list_cache.get(self.netflix_session.user_data['guid'], None)
57         if cached_list != None:
58             self.kodi_helper.log('Serving cached list for user: ' + self.netflix_session.user_data['guid'])
59             return cached_list
60         video_list_ids_raw = self.netflix_session.fetch_video_list_ids()
61         if 'error' in video_list_ids_raw:
62             return video_list_ids_raw
63         return self.netflix_session.parse_video_list_ids(response_data=video_list_ids_raw)
64
65     def fetch_video_list (self, params):
66         list_id = params.get('list_id', [''])[0]
67         raw_video_list = self.netflix_session.fetch_video_list(list_id=list_id)
68         if 'error' in raw_video_list:
69             return raw_video_list
70         # parse the video list ids
71         if 'videos' in raw_video_list.get('value', {}).keys():
72             return self.netflix_session.parse_video_list(response_data=raw_video_list)
73         return []
74
75     def fetch_episodes_by_season (self, params):
76         raw_episode_list = self.netflix_session.fetch_episodes_by_season(season_id=params.get('season_id')[0])
77         if 'error' in raw_episode_list:
78             return raw_episode_list
79         return self.netflix_session.parse_episodes_by_season(response_data=raw_episode_list)
80
81     def fetch_seasons_for_show (self, params):
82         show_id = params.get('show_id', [''])[0]
83         raw_season_list = self.netflix_session.fetch_seasons_for_show(id=show_id)
84         if 'error' in raw_season_list:
85             return raw_season_list
86         # check if we have sesons, announced shows that are not available yet have none
87         if 'seasons' not in raw_season_list.get('value', {}):
88               return []
89         return self.netflix_session.parse_seasons(id=show_id, response_data=raw_season_list)
90
91     def rate_video (self, params):
92         video_id = params.get('video_id', [''])[0]
93         rating = params.get('rating', [''])[0]
94         return self.netflix_session.rate_video(video_id=video_id, rating=rating)
95
96     def remove_from_list (self, params):
97         video_id = params.get('video_id', [''])[0]
98         return self.netflix_session.remove_from_list(video_id=video_id)
99
100     def add_to_list (self, params):
101         video_id = params.get('video_id', [''])[0]
102         return self.netflix_session.add_to_list(video_id=video_id)
103
104     def fetch_metadata (self, params):
105         video_id = params.get('video_id', [''])[0]
106         return self.netflix_session.fetch_metadata(id=video_id)
107
108     def switch_profile (self, params):
109         profile_id = params.get('profile_id', [''])[0]
110         return self.netflix_session.switch_profile(profile_id=profile_id, account=self.credentials)
111
112     def get_user_data (self, params):
113         return self.netflix_session.user_data
114
115     def search (self, params):
116         term = params.get('term', [''])[0]
117         has_search_results = False
118         raw_search_results = self.netflix_session.fetch_search_results(search_str=term)
119         # check for any errors
120         if 'error' in raw_search_results:
121             return raw_search_results
122
123         # determine if we found something
124         if 'search' in raw_search_results['value']:
125             for key in raw_search_results['value']['search'].keys():
126                 if self.netflix_session._is_size_key(key=key) == False:
127                     has_search_results = raw_search_results['value']['search'][key]['titles']['length'] > 0
128                     if has_search_results == False:
129                         if raw_search_results['value']['search'][key].get('suggestions', False) != False:
130                             for entry in raw_search_results['value']['search'][key]['suggestions']:
131                                 if self.netflix_session._is_size_key(key=entry) == False:
132                                     if raw_search_results['value']['search'][key]['suggestions'][entry]['relatedvideos']['length'] > 0:
133                                         has_search_results = True
134
135         # display that we haven't found a thing
136         if has_search_results == False:
137             return []
138
139         # list the search results
140         search_results = self.netflix_session.parse_search_results(response_data=raw_search_results)
141         # add more menaingful data to the search results
142         raw_search_contents = self.netflix_session.fetch_video_list_information(video_ids=search_results.keys())
143         # check for any errors
144         if 'error' in raw_search_contents:
145             return raw_search_contents
146         return self.netflix_session.parse_video_list(response_data=raw_search_contents)