def __call_trakt(self, url, extra_data=None, cache_limit=.25, cached=True): if not cached: cache_limit = 0 data={'username': self.username, 'password': self.sha1password} if extra_data: data.update(extra_data) url = '%s%s%s' % (self.protocol, BASE_URL, url) log_utils.log('Trakt Call: %s, data: %s' % (url, data), xbmc.LOGDEBUG) db_connection = DB_Connection() created, cached_result = db_connection.get_cached_url(url) if cached_result and (time.time() - created) < (60 * 60 * cache_limit): result = cached_result log_utils.log('Returning cached result for: %s' % (url), xbmc.LOGDEBUG) else: try: f=urllib2.urlopen(url, json.dumps(data), self.timeout) result=f.read() db_connection.cache_url(url, result) except (ssl.SSLError,socket.timeout) as e: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), xbmc.LOGWARNING) else: raise TransientTraktError('Temporary Trakt Error: '+str(e)) except urllib2.URLError as e: if isinstance(e, urllib2.HTTPError): if e.code in TEMP_ERRORS: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), xbmc.LOGWARNING) else: raise TransientTraktError('Temporary Trakt Error: '+str(e)) elif e.code == 404: return else: raise elif isinstance(e.reason, socket.timeout) or isinstance(e.reason, ssl.SSLError): if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead' % (str(e)), xbmc.LOGWARNING) else: raise TransientTraktError('Temporary Trakt Error: '+str(e)) else: raise TraktError('Trakt Error: '+str(e)) response=json.loads(result) if 'status' in response and response['status']=='failure': if 'message' in response: raise TraktError(response['message']) if 'error' in response: raise TraktError(response['error']) else: raise TraktError() else: #log_utils.log('Trakt Response: %s' % (response), xbmc.LOGDEBUG) return response
def __init__(self): self.db_connection = DB_Connection()
def __get_cached_url(self, url, cache_limit=8): utils.log('Fetching Cached URL: %s' % url, xbmc.LOGDEBUG) before = time.time() db_connection = DB_Connection() html = db_connection.get_cached_url(url, cache_limit) if html: utils.log('Returning cached result for: %s' % (url), xbmc.LOGDEBUG) return html utils.log('No cached url found for: %s' % url, xbmc.LOGDEBUG) req = urllib2.Request(url) host = re.sub('http://', '', self.base_url) req.add_header('User-Agent', USER_AGENT) req.add_unredirected_header('Host', host) req.add_unredirected_header('Referer', self.base_url) try: body = self.__http_get_with_retry_2(url, req) if '<title>Are You a Robot?</title>' in body: utils.log('bot detection') # download the captcha image and save it to a file for use later captchaimgurl = 'http://' + host + '/CaptchaSecurityImages.php' captcha_save_path = xbmc.translatePath( 'special://userdata/addon_data/plugin.video.1channel/CaptchaSecurityImage.jpg' ) req = urllib2.Request(captchaimgurl) host = re.sub('http://', '', self.base_url) req.add_header('User-Agent', USER_AGENT) req.add_header('Host', host) req.add_header('Referer', self.base_url) response = urllib2.urlopen(req) the_img = response.read() with open(captcha_save_path, 'wb') as f: f.write(the_img) # now pop open dialog for input # TODO: make the size and loc configurable img = xbmcgui.ControlImage(550, 15, 240, 100, captcha_save_path) wdlg = xbmcgui.WindowDialog() wdlg.addControl(img) wdlg.show() kb = xbmc.Keyboard('', 'Type the letters in the image', False) kb.doModal() capcode = kb.getText() if (kb.isConfirmed()): userInput = kb.getText() if userInput != '': # post back user string wdlg.removeControl(img) capcode = kb.getText() data = { 'security_code': capcode, 'not_robot': 'I\'m Human! I Swear!' } data = urllib.urlencode(data) roboturl = 'http://' + host + '/are_you_a_robot.php' req = urllib2.Request(roboturl) host = re.sub('http://', '', self.base_url) req.add_header('User-Agent', USER_AGENT) req.add_header('Host', host) req.add_header('Referer', self.base_url) response = urllib2.urlopen(req, data) body = self.__get_url(url) elif userInput == '': dialog = xbmcgui.Dialog() dialog.ok("Robot Check", "You must enter text in the image to continue") wdlg.close() body = unicode(body, 'windows-1252', 'ignore') parser = HTMLParser.HTMLParser() body = parser.unescape(body) except Exception as e: dialog = xbmcgui.Dialog() dialog.ok("Connection failed", "Failed to connect to url", url) utils.log('Failed to connect to URL %s: %s' % (url, str(e)), xbmc.LOGERROR) return '' db_connection.cache_url(url, body) after = time.time() utils.log('Cached Url Fetch took: %.2f secs' % (after - before), xbmc.LOGDEBUG) return body
SORT_FIELDS = [ (SORT_LIST[int(kodi.get_setting('sort1_field'))], SORT_SIGNS[kodi.get_setting('sort1_order')]), (SORT_LIST[int(kodi.get_setting('sort2_field'))], SORT_SIGNS[kodi.get_setting('sort2_order')]), (SORT_LIST[int(kodi.get_setting('sort3_field'))], SORT_SIGNS[kodi.get_setting('sort3_order')]), (SORT_LIST[int(kodi.get_setting('sort4_field'))], SORT_SIGNS[kodi.get_setting('sort4_order')]), (SORT_LIST[int(kodi.get_setting('sort5_field'))], SORT_SIGNS[kodi.get_setting('sort5_order')]), (SORT_LIST[int(kodi.get_setting('sort6_field'))], SORT_SIGNS[kodi.get_setting('sort6_order')])] last_check = datetime.datetime.fromtimestamp(0) TOKEN = kodi.get_setting('trakt_oauth_token') use_https = kodi.get_setting('use_https') == 'true' trakt_timeout = int(kodi.get_setting('trakt_timeout')) list_size = int(kodi.get_setting('list_size')) trakt_api = Trakt_API(TOKEN, use_https, list_size, trakt_timeout) db_connection = DB_Connection() THEME_LIST = ['Shine', 'Luna_Blue', 'Iconic', 'Simple', 'SALTy', 'SALTy (Blended)', 'SALTy (Blue)', 'SALTy (Frog)', 'SALTy (Green)', 'SALTy (Macaw)', 'SALTier (Green)', 'SALTier (Orange)', 'SALTier (Red)', 'IGDB', 'Simply Elegant', 'IGDB Redux'] THEME = THEME_LIST[int(kodi.get_setting('theme'))] if xbmc.getCondVisibility('System.HasAddon(script.salts.themepak)'): themepak_path = xbmcaddon.Addon('script.salts.themepak').getAddonInfo('path') else: themepak_path = kodi.get_path() THEME_PATH = os.path.join(themepak_path, 'art', 'themes', THEME) PLACE_POSTER = os.path.join(kodi.get_path(), 'resources', 'place_poster.png') def art(name): path = os.path.join(THEME_PATH, name) if not xbmcvfs.exists(path): if name == 'fanart.jpg':
def _get_db_connection(): global _db_connection if _db_connection is None: _db_connection = DB_Connection() return _db_connection
def __get_db_connection(self): worker_id = threading.current_thread().ident if not self.__db_connection or self.__worker_id != worker_id: self.__db_connection = DB_Connection() self.__worker_id = worker_id return self.__db_connection
def __call_trakt(self, url, method=None, data=None, params=None, auth=True, cache_limit=.25, cached=True): res_headers = {} if not cached: cache_limit = 0 db_cache_limit = cache_limit if cache_limit > 8 else 8 json_data = json.dumps(data) if data else None headers = {'Content-Type': 'application/json', 'trakt-api-key': V2_API_KEY, 'trakt-api-version': 2} url = '%s%s%s' % (self.protocol, BASE_URL, url) if params: url = url + '?' + urllib.urlencode(params) db_connection = DB_Connection() created, cached_result = db_connection.get_cached_url(url, json_data, db_cache_limit) if cached_result and (time.time() - created) < (60 * 60 * cache_limit): result = cached_result log_utils.log('Returning cached result for: %s' % (url), log_utils.LOGDEBUG) else: auth_retry = False while True: try: if auth: headers.update({'Authorization': 'Bearer %s' % (self.token)}) log_utils.log('Trakt Call: %s, header: %s, data: %s cache_limit: %s cached: %s' % (url, headers, data, cache_limit, cached), log_utils.LOGDEBUG) request = urllib2.Request(url, data=json_data, headers=headers) if method is not None: request.get_method = lambda: method.upper() response = urllib2.urlopen(request, timeout=self.timeout) result = '' while True: data = response.read() if not data: break result += data res_headers = dict(response.info().items()) db_connection.cache_url(url, result, json_data) break except (ssl.SSLError, socket.timeout) as e: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), log_utils.LOGWARNING) else: raise TransientTraktError('Temporary Trakt Error: ' + str(e)) except urllib2.URLError as e: if isinstance(e, urllib2.HTTPError): if e.code in TEMP_ERRORS: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), log_utils.LOGWARNING) break else: raise TransientTraktError('Temporary Trakt Error: ' + str(e)) elif e.code == 401 or e.code == 405: # token is fine, profile is private if e.info().getheader('X-Private-User') == 'true': raise TraktAuthError('Object is No Longer Available (%s)' % (e.code)) # auth failure retry or a token request elif auth_retry or url.endswith('/token'): self.token = None kodi.set_setting('trakt_oauth_token', '') kodi.set_setting('trakt_refresh_token', '') raise TraktAuthError('Trakt Call Authentication Failed (%s)' % (e.code)) # first try token fail, try to refresh token else: result = self.get_token() self.token = result['access_token'] kodi.set_setting('trakt_oauth_token', result['access_token']) kodi.set_setting('trakt_refresh_token', result['refresh_token']) auth_retry = True elif e.code == 404: raise TraktNotFoundError('Object Not Found (%s)' % (e.code)) else: raise elif isinstance(e.reason, socket.timeout) or isinstance(e.reason, ssl.SSLError): if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead' % (str(e)), log_utils.LOGWARNING) break else: raise TransientTraktError('Temporary Trakt Error: ' + str(e)) else: raise TraktError('Trakt Error: ' + str(e)) except: raise try: js_data = json.loads(result) if 'x-sort-by' in res_headers and 'x-sort-how' in res_headers: js_data = self.__sort_list(res_headers['x-sort-by'], res_headers['x-sort-how'], js_data) except ValueError: js_data = '' if result: log_utils.log('Invalid JSON Trakt API Response: %s - |%s|' % (url, js_data), log_utils.LOGERROR) # log_utils.log('Trakt Response: %s' % (response), xbmc.LOGDEBUG) return js_data
def __call_trakt(self, url, data = None, params=None, auth=True, cache_limit=.25, cached=True): if not cached: cache_limit = 0 db_cache_limit = cache_limit if cache_limit > 8 else 8 json_data=json.dumps(data) if data else None headers = {'Content-Type': 'application/json', 'trakt-api-key': V2_API_KEY, 'trakt-api-version': 2} if auth: headers.update({'trakt-user-login': self.username, 'trakt-user-token': self.token}) url = '%s%s%s' % (self.protocol, BASE_URL, url) if params: url = url + '?' + urllib.urlencode(params) log_utils.log('Trakt Call: %s, header: %s, data: %s' % (url, headers, data), xbmc.LOGDEBUG) db_connection = DB_Connection() created, cached_result = db_connection.get_cached_url(url, db_cache_limit) if cached_result and (time.time() - created) < (60 * 60 * cache_limit): result = cached_result log_utils.log('Returning cached result for: %s' % (url), xbmc.LOGDEBUG) else: login_retry=False while True: try: request = urllib2.Request(url, data = json_data, headers = headers ) f=urllib2.urlopen(request, timeout = self.timeout) result=f.read() db_connection.cache_url(url, result) break except (ssl.SSLError,socket.timeout) as e: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), xbmc.LOGWARNING) else: raise TransientTraktError('Temporary Trakt Error: '+str(e)) except urllib2.URLError as e: if isinstance(e, urllib2.HTTPError): if e.code in TEMP_ERRORS: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), xbmc.LOGWARNING) break else: raise TransientTraktError('Temporary Trakt Error: '+str(e)) elif e.code == 401: if login_retry or url.endswith('login'): raise else: self.token = self.login() xbmcaddon.Addon('plugin.video.salts').setSetting('trakt_token', self.token) login_retry=True else: raise elif isinstance(e.reason, socket.timeout) or isinstance(e.reason, ssl.SSLError): if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead' % (str(e)), xbmc.LOGWARNING) break else: raise TransientTraktError('Temporary Trakt Error: '+str(e)) else: raise TraktError('Trakt Error: '+str(e)) else: raise response=json.loads(result) if 'status' in response and response['status']=='failure': if 'message' in response: raise TraktError(response['message']) if 'error' in response: raise TraktError(response['error']) else: raise TraktError() else: #log_utils.log('Trakt Response: %s' % (response), xbmc.LOGDEBUG) return response
def __call_trakt(self, url, data=None, params=None, auth=True, cache_limit=.25, cached=True): if not cached: cache_limit = 0 db_cache_limit = cache_limit if cache_limit > 8 else 8 json_data = json.dumps(data) if data else None headers = {'Content-Type': 'application/json', 'trakt-api-key': V2_API_KEY, 'trakt-api-version': 2} url = '%s%s%s' % (self.protocol, BASE_URL, url) if params: url = url + '?' + urllib.urlencode(params) db_connection = DB_Connection() created, cached_result = db_connection.get_cached_url(url, db_cache_limit) if cached_result and (time.time() - created) < (60 * 60 * cache_limit): result = cached_result log_utils.log('Returning cached result for: %s' % (url), log_utils.LOGDEBUG) else: auth_retry = False while True: try: if auth: headers.update({'Authorization': 'Bearer %s' % (self.token)}) log_utils.log('Trakt Call: %s, header: %s, data: %s' % (url, headers, data), log_utils.LOGDEBUG) request = urllib2.Request(url, data=json_data, headers=headers) f = urllib2.urlopen(request, timeout=self.timeout) result = '' while True: data = f.read() if not data: break result += data db_connection.cache_url(url, result) break except (ssl.SSLError, socket.timeout) as e: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), log_utils.LOGWARNING) else: raise TransientTraktError('Temporary Trakt Error: ' + str(e)) except urllib2.URLError as e: if isinstance(e, urllib2.HTTPError): if e.code in TEMP_ERRORS: if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead.' % (str(e)), log_utils.LOGWARNING) break else: raise TransientTraktError('Temporary Trakt Error: ' + str(e)) elif e.code == 401 or e.code == 405: if auth_retry or url.endswith('/token'): self.token = None kodi.set_setting('trakt_oauth_token', '') kodi.set_setting('trakt_refresh_token', '') raise TraktError('Trakt Call Authentication Failed (%s)' % (e.code)) else: result = self.get_token() self.token = result['access_token'] kodi.set_setting('trakt_oauth_token', result['access_token']) kodi.set_setting('trakt_refresh_token', result['refresh_token']) auth_retry = True elif e.code == 404: raise TraktNotFoundError() else: raise elif isinstance(e.reason, socket.timeout) or isinstance(e.reason, ssl.SSLError): if cached_result: result = cached_result log_utils.log('Temporary Trakt Error (%s). Using Cached Page Instead' % (str(e)), log_utils.LOGWARNING) break else: raise TransientTraktError('Temporary Trakt Error: ' + str(e)) else: raise TraktError('Trakt Error: ' + str(e)) except: raise response = json.loads(result) if 'status' in response and response['status'] == 'failure': if 'message' in response: raise TraktError(response['message']) if 'error' in response: raise TraktError(response['error']) else: raise TraktError() else: # log_utils.log('Trakt Response: %s' % (response), xbmc.LOGDEBUG) return response