def validate_login(content): react_context = extract_json(content, 'reactContext') path_code_list = [ path_item for path_item in PAGE_ITEM_ERROR_CODE_LIST.split('\\') ] path_error_code = [ path_item for path_item in PAGE_ITEM_ERROR_CODE.split('/') ] if common.check_path_exists(path_error_code, react_context): # If the path exists, a login error occurs try: error_code_list = common.get_path(path_code_list, react_context) error_code = common.get_path(path_error_code, react_context) common.debug('Login not valid, error code {}'.format(error_code)) error_description = common.get_local_string(30102) + error_code if error_code in error_code_list: error_description = error_code_list[error_code] if 'email_' + error_code in error_code_list: error_description = error_code_list['email_' + error_code] if 'login_' + error_code in error_code_list: error_description = error_code_list['login_' + error_code] return common.remove_html_tags(error_description) except (AttributeError, KeyError): common.error( 'Something is wrong in PAGE_ITEM_ERROR_CODE or PAGE_ITEM_ERROR_CODE_LIST paths.' 'react_context data may have changed.') raise LoginValidateError return None
def validate_login(react_context): path_code_list = PAGE_ITEM_ERROR_CODE_LIST.split('\\') path_error_code = PAGE_ITEM_ERROR_CODE.split('/') if common.check_path_exists(path_error_code, react_context): # If the path exists, a login error occurs try: error_code_list = common.get_path(path_code_list, react_context) error_code = common.get_path(path_error_code, react_context) LOG.error('Login not valid, error code {}', error_code) error_description = common.get_local_string(30102) + error_code if error_code in error_code_list: error_description = error_code_list[error_code] if 'email_' + error_code in error_code_list: error_description = error_code_list['email_' + error_code] if 'login_' + error_code in error_code_list: error_description = error_code_list['login_' + error_code] raise LoginValidateError(common.remove_html_tags(error_description)) except (AttributeError, KeyError) as exc: import traceback LOG.error(G.py2_decode(traceback.format_exc(), 'latin-1')) error_msg = ( 'Something is wrong in PAGE_ITEM_ERROR_CODE or PAGE_ITEM_ERROR_CODE_LIST paths.' 'react_context data may have changed.') LOG.error(error_msg) raise_from(WebsiteParsingError(error_msg), exc)
def validate_login(react_context): path_code_list = PAGE_ITEM_ERROR_CODE_LIST.split('\\') path_error_code = PAGE_ITEM_ERROR_CODE.split('/') if common.check_path_exists(path_error_code, react_context): # If the path exists, a login error occurs try: error_code_list = common.get_path(path_code_list, react_context) error_code = common.get_path(path_error_code, react_context) common.error('Login not valid, error code {}', error_code) error_description = common.get_local_string(30102) + error_code if error_code in error_code_list: error_description = error_code_list[error_code] if 'email_' + error_code in error_code_list: error_description = error_code_list['email_' + error_code] if 'login_' + error_code in error_code_list: error_description = error_code_list['login_' + error_code] if 'incorrect_password' in error_code: raise LoginValidateErrorIncorrectPassword(common.remove_html_tags(error_description)) raise LoginValidateError(common.remove_html_tags(error_description)) except (AttributeError, KeyError): import traceback common.error(traceback.format_exc()) error_msg = ( 'Something is wrong in PAGE_ITEM_ERROR_CODE or PAGE_ITEM_ERROR_CODE_LIST paths.' 'react_context data may have changed.') common.error(error_msg) raise LoginValidateError(error_msg)
def _perpetual_path_request(self, paths, length_params, perpetual_range_start=None, no_limit_req=False): """Perform a perpetual path request against the Shakti API to retrieve a possibly large video list. If the requested video list's size is larger than MAX_PATH_REQUEST_SIZE, multiple path requests will be executed with forward shifting range selectors and the results will be combined into one path response.""" response_type, length_args = length_params context_name = length_args[0] response_length = apipaths.LENGTH_ATTRIBUTES[response_type] request_size = apipaths.MAX_PATH_REQUEST_SIZE response_size = request_size + 1 # Note: when the request is made with 'genres' or 'seasons' context, # the response strangely does not respect the number of objects # requested, returning 1 more item, i couldn't understand why if context_name in ['genres', 'seasons']: response_size += 1 number_of_requests = 100 if no_limit_req else 2 perpetual_range_start = int(perpetual_range_start) if perpetual_range_start else 0 range_start = perpetual_range_start range_end = range_start + request_size merged_response = {} for n_req in range(number_of_requests): path_response = self._path_request( _set_range_selector(paths, range_start, range_end)) if not path_response: break if not common.check_path_exists(length_args, path_response): # It may happen that the number of items to be received # is equal to the number of the response_size # so a second round will be performed, which will return an empty list break common.merge_dicts(path_response, merged_response) response_count = response_length(path_response, *length_args) if response_count < response_size: # There are no other elements to request break range_start += response_size if n_req == (number_of_requests - 1): merged_response['_perpetual_range_selector'] = {'next_start': range_start} common.debug('{} has other elements, added _perpetual_range_selector item', response_type) else: range_end = range_start + request_size if perpetual_range_start > 0: previous_start = perpetual_range_start - (response_size * number_of_requests) if '_perpetual_range_selector' in merged_response: merged_response['_perpetual_range_selector']['previous_start'] = previous_start else: merged_response['_perpetual_range_selector'] = { 'previous_start': previous_start} return merged_response
def perpetual_path_request( self, paths, length_params, perpetual_range_start=None, request_size=apipaths.PATH_REQUEST_SIZE_PAGINATED, no_limit_req=False): """ Perform a perpetual path request against the Shakti API to retrieve a possibly large video list. :param paths: The paths that compose the request :param length_params: A list of two values, e.g. ['stdlist', [...]]: 1: A key of LENGTH_ATTRIBUTES that define where read the total number of objects 2: A list of keys used to get the list of objects in the JSON data of received response :param perpetual_range_start: defines the starting point of the range of objects to be requested :param request_size: defines the size of the range, the total number of objects that will be received :param no_limit_req: if True, the perpetual cycle of requests will be 'unlimited' :return: Union of all JSON raw data received """ # When the requested video list's size is larger than 'request_size', # multiple path requests will be executed with forward shifting range selectors # and the results will be combined into one path response. response_type, length_args = length_params context_name = length_args[0] response_length = apipaths.LENGTH_ATTRIBUTES[response_type] # Note: when the request is made with 'genres' or 'seasons' context, # the response strangely does not respect the number of objects # requested, returning 1 more item, i couldn't understand why if context_name in ['genres', 'seasons']: request_size -= 1 response_size = request_size + 1 if context_name in ['genres', 'seasons']: response_size += 1 number_of_requests = 100 if no_limit_req else int( G.ADDON.getSettingInt('page_results') / 45) perpetual_range_start = int( perpetual_range_start) if perpetual_range_start else 0 range_start = perpetual_range_start range_end = range_start + request_size merged_response = {} for n_req in range(number_of_requests): path_response = self.path_request( _set_range_selector(paths, range_start, range_end)) if not path_response: break if not common.check_path_exists(length_args, path_response): # It may happen that the number of items to be received # is equal to the number of the response_size # so a second round will be performed, which will return an empty list break common.merge_dicts(path_response, merged_response) response_count = response_length(path_response, *length_args) if response_count < response_size: # There are no other elements to request break range_start += response_size if n_req == (number_of_requests - 1): merged_response['_perpetual_range_selector'] = { 'next_start': range_start } common.debug( '{} has other elements, added _perpetual_range_selector item', response_type) else: range_end = range_start + request_size if perpetual_range_start > 0: previous_start = perpetual_range_start - (response_size * number_of_requests) if '_perpetual_range_selector' in merged_response: merged_response['_perpetual_range_selector'][ 'previous_start'] = previous_start else: merged_response['_perpetual_range_selector'] = { 'previous_start': previous_start } return merged_response