# coding:utf-8 import json import os from six.moves import queue import threading from volcengine.ApiInfo import ApiInfo from volcengine.Credentials import Credentials from volcengine.ServiceInfo import ServiceInfo from volcengine.base.Service import Service from volcengine.const.Const import * from volcengine.util.Util import * from volcengine.Policy import * from volcengine.imagex.ImageXConfig import * from retry import retry class Uploader: def __init__(self, imagex_service, host, store_infos=None, file_paths_or_bytes=None): if store_infos is None: store_infos = [] if file_paths_or_bytes is None: file_paths_or_bytes = [] self.imagex_service = imagex_service self.host = host self.store_infos = store_infos self.file_paths_or_bytes = file_paths_or_bytes self.queue = queue.Queue() self.queue_lock = threading.Lock() self.successOids = [] self.results = [] for i in range(len(store_infos)): self.queue.put(i) def async_upload(self): while not self.queue.empty(): self.queue_lock.acquire() if self.queue.empty(): self.queue_lock.release() break idx = self.queue.get() self.queue_lock.release() store_info = self.store_infos[idx] file_paths_or_bytes = self.file_paths_or_bytes[idx] try: if isinstance(file_paths_or_bytes, bytes): self.upload_by_host(store_info, file_paths_or_bytes) elif isinstance(file_paths_or_bytes, str): file_path = file_paths_or_bytes file_size = os.path.getsize(file_path) data = open(file_path, "rb") if file_size < MinChunkSize: self.upload_by_host(store_info, data.read()) elif file_size > LargeFileSize: self.chunk_upload(store_info, data, file_size, True) else: self.chunk_upload(store_info, data, file_size, False) data.close() else: raise Exception("Uploader only accept bytes or path data") self.successOids.append(store_info['StoreUri']) self.results.append({ 'Uri': store_info['StoreUri'], 'UriStatus': 2000, }) except Exception as e: self.results.append({ 'Uri': store_info['StoreUri'], 'UriStatus': 2001, 'Error': e, }) @retry(tries=3, delay=1, backoff=2) def upload_by_host(self, store_info, img_data): url = 'https://{}/{}'.format(self.host, store_info['StoreUri']) check_sum = crc32(img_data) & 0xFFFFFFFF check_sum = "%08x" % check_sum headers = {'Content-CRC32': check_sum, 'Authorization': store_info['Auth']} upload_status, resp = self.imagex_service.put_data(url, img_data, headers) if not upload_status: raise Exception('upload by host: upload url %s status false, resp: %s' % (url, resp)) def chunk_upload(self, store_info, f, size, is_large_file): upload_id = self.init_upload_part(store_info, is_large_file) n = size // MinChunkSize last_num = n - 1 parts = [] for i in range(0, last_num): data = f.read(MinChunkSize) part_number = i if is_large_file: part_number = i + 1 part = self.upload_part(store_info, upload_id, part_number, data, is_large_file) parts.append(part) data = f.read() if is_large_file: last_num = last_num + 1 part = self.upload_part(store_info, upload_id, last_num, data, is_large_file) parts.append(part) return self.upload_merge_part(store_info, upload_id, parts, is_large_file) @retry(tries=3, delay=1, backoff=2) def init_upload_part(self, store_info, is_large_file): url = 'https://{}/{}?uploads'.format(self.host, store_info['StoreUri']) headers = {'Authorization': store_info['Auth']} if is_large_file: headers['X-Storage-Mode'] = 'gateway' upload_status, resp = self.imagex_service.put_data(url, None, headers) resp = json.loads(resp) if not upload_status: raise Exception("init upload error") if resp.get('success') is None or resp['success'] != 0: raise Exception("init upload error") return resp['payload']['uploadID'] @retry(tries=3, delay=1, backoff=2) def upload_part(self, store_info, upload_id, part_number, data, is_large_file): url = 'https://{}/{}?partNumber={}&uploadID={}'.format(self.host, store_info['StoreUri'], part_number, upload_id) check_sum = crc32(data) & 0xFFFFFFFF check_sum = "%08x" % check_sum headers = {'Content-CRC32': check_sum, 'Authorization': store_info['Auth']} if is_large_file: headers['X-Storage-Mode'] = 'gateway' upload_status, resp = self.imagex_service.put_data(url, data, headers) if not upload_status: raise Exception(url + json.dumps(resp)) resp = json.loads(resp) if resp.get('success') is None or resp['success'] != 0: raise Exception("upload part error") return check_sum # noinspection DuplicatedCode @staticmethod def generate_merge_body(check_sum_list): if len(check_sum_list) == 0: raise Exception('crc32 list empty') s = [] for i in range(len(check_sum_list)): s.append('{}:{}'.format(i, check_sum_list[i])) comma = ',' return comma.join(s) @retry(tries=3, delay=1, backoff=2) def upload_merge_part(self, store_info, upload_id, check_sum_list, is_large_file): url = 'https://{}/{}?uploadID={}'.format(self.host, store_info['StoreUri'], upload_id) data = self.generate_merge_body(check_sum_list) headers = {'Authorization': store_info['Auth']} if is_large_file: headers['X-Storage-Mode'] = 'gateway' upload_status, resp = self.imagex_service.put_data(url, data, headers) resp = json.loads(resp) if not upload_status: raise Exception("init upload error") if resp.get('success') is None or resp['success'] != 0: raise Exception("init upload error") class ImageXService(Service): def __init__(self, region=REGION_CN_NORTH1): self.service_info = ImageXService.get_service_info(region) self.api_info = ImageXService.get_api_info() super(ImageXService, self).__init__(self.service_info, self.api_info) @staticmethod def get_service_info(region): service_info = service_info_map.get(region, None) if not service_info: raise Exception('ImageX not support region %s' % region) return service_info @staticmethod def get_api_info(): return api_info # upload def apply_upload(self, params): res = self.get('ApplyImageUpload', params, doseq=1) if res == '': raise Exception("ApplyImageUpload: empty response") res_json = json.loads(res) return res_json def commit_upload(self, params, body): res = self.json('CommitImageUpload', params, body) if res == '': raise Exception("CommitImageUpload: empty response") res_json = json.loads(res) return res_json # upload local image file # noinspection DuplicatedCode def upload_image(self, params, file_paths): for p in file_paths: if not os.path.isfile(p): raise Exception("no such file on file path %s" % p) apply_upload_request = { 'ServiceId': params['ServiceId'], 'SessionKey': params.get('SessionKey', ''), 'UploadNum': len(file_paths), 'StoreKeys': params.get('StoreKeys', []), 'Overwrite': str(params.get('Overwrite', False)), } resp = self.apply_upload(apply_upload_request) if 'Error' in resp['ResponseMetadata']: raise Exception(resp['ResponseMetadata']) result = resp['Result'] reqid = result['RequestId'] addr = result['UploadAddress'] if len(addr['UploadHosts']) == 0: raise Exception("no upload host found, reqid %s" % reqid) elif len(addr['StoreInfos']) != len(file_paths): raise Exception("store info len %d != upload num %d, reqid %s" % ( len(result['StoreInfos']), len(file_paths), reqid)) session_key = addr['SessionKey'] host = addr['UploadHosts'][0] uploader = self.do_upload(file_paths, host, addr['StoreInfos']) if len(uploader.successOids) == 0: raise Exception("no file uploaded") if params.get('SkipCommit', False): return {'Results': uploader.results} commit_upload_request = { 'ServiceId': params['ServiceId'], 'SkipMeta': params.get('SkipMeta', False) } commit_upload_body = { 'SessionKey': session_key, 'SuccessOids': uploader.successOids, 'Functions': params.get('Functions', []), 'OptionInfos': params.get('OptionInfos', []) } resp = self.commit_upload( commit_upload_request, json.dumps(commit_upload_body)) if 'Error' in resp['ResponseMetadata']: raise Exception(resp['ResponseMetadata']) return resp['Result'] # upload image data # noinspection DuplicatedCode def upload_image_data(self, params, img_datas): for data in img_datas: if not isinstance(data, bytes): raise Exception("upload of non-bytes not supported") apply_upload_request = { 'ServiceId': params['ServiceId'], 'SessionKey': params.get('SessionKey', ''), 'UploadNum': len(img_datas), 'StoreKeys': params.get('StoreKeys', []), 'Overwrite': str(params.get('Overwrite', False)), } resp = self.apply_upload(apply_upload_request) if 'Error' in resp['ResponseMetadata']: raise Exception(resp['ResponseMetadata']) result = resp['Result'] reqid = result['RequestId'] addr = result['UploadAddress'] if len(addr['UploadHosts']) == 0: raise Exception("no upload host found, reqid %s" % reqid) elif len(addr['StoreInfos']) != len(img_datas): raise Exception("store info len %d != upload num %d, reqid %s" % ( len(result['StoreInfos']), len(img_datas), reqid)) session_key = addr['SessionKey'] host = addr['UploadHosts'][0] uploader = self.do_upload(img_datas, host, addr['StoreInfos']) if len(uploader.successOids) == 0: raise Exception("no file uploaded") if params.get('SkipCommit', False): return {'Results': uploader.results} commit_upload_request = { 'ServiceId': params['ServiceId'], 'SkipMeta': params.get('SkipMeta', False) } commit_upload_body = { 'SessionKey': session_key, 'SuccessOids': uploader.successOids, 'Functions': params.get('Functions', []), 'OptionInfos': params.get('OptionInfos', []) } resp = self.commit_upload( commit_upload_request, json.dumps(commit_upload_body)) if 'Error' in resp['ResponseMetadata']: raise Exception(resp['ResponseMetadata']) return resp['Result'] def do_upload(self, file_paths_or_bytes, host, store_infos): threads = [] uploader = Uploader(self, host, store_infos, file_paths_or_bytes) for i in range(UPLOAD_THREADS): thread = threading.Thread(target=uploader.async_upload) thread.start() threads.append(thread) for i in range(UPLOAD_THREADS): threads[i].join() return uploader def get_upload_auth_token(self, params): apply_token = self.get_sign_url('ApplyImageUpload', params) commit_token = self.get_sign_url('CommitImageUpload', params) ret = {'Version': 'v1', 'ApplyUploadToken': apply_token, 'CommitUploadToken': commit_token} data = json.dumps(ret) if sys.version_info[0] == 3: return base64.b64encode(data.encode('utf-8')).decode('utf-8') else: return base64.b64encode(data.decode('utf-8')) # tag 字段如下,可选择所需字段传入 # upload_policy_dict = { # "FileSizeUpLimit": "xxx", # "FileSizeBottomLimit": "xxx", # "ContentTypeBlackList":[ # "xxx" # ], # "ContentTypeWhiteList":[ # "xxx" # ] # } # policy_str = json.dumps(upload_policy_dict) # # tag = { # "UploadOverwrite": "true", # "UploadPolicy": policy_str, # } def get_upload_auth(self, service_ids, expire=60 * 60, key_ptn='', tag=dict): apply_res = [] commit_res = [] if len(service_ids) == 0: apply_res.append(ResourceServiceIdTRN % '*') commit_res.append(ResourceServiceIdTRN % '*') else: for sid in service_ids: apply_res.append(ResourceServiceIdTRN % sid) commit_res.append(ResourceServiceIdTRN % sid) apply_res.append(ResourceStoreKeyTRN % key_ptn) inline_policy = Policy([ Statement.new_allow_statement( ['ImageX:ApplyImageUpload'], apply_res), Statement.new_allow_statement( ['ImageX:CommitImageUpload'], commit_res) ]) for k, v in tag.items(): inline_policy.statements.append(Statement.new_allow_statement([k], [str(v)])) return self.sign_sts2(inline_policy, expire) def delete_images(self, service_id, uris): query = { 'ServiceId': service_id } body = { 'StoreUris': uris } res = self.json('DeleteImageUploadFiles', query, json.dumps(body)) if res == '': raise Exception("DeleteImageUploadFiles: empty response") res_json = json.loads(res) if 'Error' in res_json['ResponseMetadata']: raise Exception(res_json['ResponseMetadata']) return res_json['Result'] def create_image_content_task(self, args): query = { 'ServiceId': args['ServiceId'] } res = self.imagex_post('CreateImageContentTask', query, json.dumps(args)) if res == '': raise Exception("%s: empty response" % 'CreateImageContentTask') res_json = json.loads(res) return res_json def get_image_content_task_detail(self, args): query = { 'ServiceId': args['ServiceId'] } res = self.imagex_post('GetImageContentTaskDetail', query, json.dumps(args)) if res == '': raise Exception("%s: empty response" % 'CreateImageContentTask') res_json = json.loads(res) return res_json def get_image_content_block_list(self, args): query = { 'ServiceId': args['ServiceId'] } res = self.imagex_post('GetImageContentBlockList', query, json.dumps(args)) if res == '': raise Exception("%s: empty response" % 'CreateImageContentTask') res_json = json.loads(res) return res_json def get_image_info(self, service_id, store_uri): query = { 'ServiceId': service_id, 'StoreUri': store_uri, } res = self.get('PreviewImageUploadFile', query) if res == '': raise Exception("empty response") res_json = json.loads(res) if 'Error' in res_json['ResponseMetadata']: raise Exception(res_json['ResponseMetadata']) return res_json['Result'] def imagex_get(self, action, params, doseq=0): res = self.get(action, params, doseq) if res == '': raise Exception("%s: empty response" % action) res_json = json.loads(json.dumps(res)) return res_json def imagex_post(self, action, params, body): res = self.json(action, params, body) if res == '': raise Exception("%s: empty response" % action) res_json = json.loads(json.dumps(res)) return res_json def imagex_request(self, action, params, body, files): res = self.request(action, params, body, files) if res == '': raise Exception("%s: empty response" % action) res_json = json.loads(json.dumps(res)) return res_json def fetch_image_url(self, request): res = self.imagex_post('FetchImageUrl', request, json.dumps(request)) if res == '': raise Exception("empty response") res_json = json.loads(res) if 'Error' in res_json['ResponseMetadata']: raise Exception(res_json['ResponseMetadata']) return res_json['Result'] def get_url_fetch_task(self, query): res = self.imagex_get('GetUrlFetchTask', query) if res == '': raise Exception("empty response") res_json = json.loads(res) if 'Error' in res_json['ResponseMetadata']: raise Exception(res_json['ResponseMetadata']) return res_json['Result'] def update_image_storage_ttl(self, request): res = self.imagex_post('UpdateImageStorageTTL', {}, json.dumps(request)) if res == '': raise Exception("empty response") res_json = json.loads(res) if 'Error' in res_json['ResponseMetadata']: raise Exception(res_json['ResponseMetadata']) return res_json['Result'] def get_image_ocr_v2(self, params): query = { 'ServiceId': params['ServiceId'] } body = { 'Scene': params['Scene'], 'StoreUri': params.get('StoreUri', None), 'ImageUrl': params.get('ImageUrl', None), 'InstrumentName': params.get('InstrumentName', None) } res = self.imagex_post('GetImageOCRV2', query, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageOCR') res_json = json.loads(res) return res_json def get_image_segment(self, params): res = self.post('GetSegmentImage', params, {}) if res == '': raise Exception("%s: empty response" % 'GetSegmentImage') res_json = json.loads(res) return res_json def get_image_quality(self, params): body = { 'ImageUrl': params['ImageUrl'], 'VqType': params.get('VqType', None) } res = self.imagex_post('GetImageQuality', params, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageQuality') res_json = json.loads(res) return res_json def get_image_erase_models(self, params): res = self.imagex_get('GetImageEraseModels', params) if res == '': raise Exception("%s: empty response" % 'GetImageEraseModels') res_json = json.loads(res) return res_json def get_image_erase_result(self, params): body = { 'ServiceId': params['ServiceId'], 'StoreUri': params['StoreUri'], 'Model': params['Model'], 'BBox': params.get('BBox', None) } res = self.imagex_post('GetImageEraseResult', params, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageEraseResult') res_json = json.loads(res) return res_json def get_image_enhance_result(self, params): body = { 'ServiceId': params['ServiceId'], 'StoreUri': params['StoreUri'], 'Model': params['Model'], 'DisableAr': params.get('DisableAr', None), 'DisableSharp': params.get('DisableSharp', None), 'Resolution': params.get('Resolution', None) } res = self.imagex_post('GetImageEnhanceResult', params, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageEnhanceResult') res_json = json.loads(res) return res_json def get_image_enhance_result_with_data(self, input, data): params = { "ServiceId": input["ServiceId"] } res = self.imagex_request('GetImageEnhanceResultWithData', params, body={ 'Input': json.dumps(input), }, files={ 'Data': ('img', data), }) if res == '': raise Exception("%s: empty response" % 'GetImageEnhanceResult') res_json = json.loads(res) return res_json def get_image_bg_fill_result(self, params): body = { 'ServiceId': params['ServiceId'], 'StoreUri': params['StoreUri'], 'Model': params['Model'], 'Top': params.get('Top', None), 'Bottom': params.get('Bottom', None), 'Left': params.get('Left', None), 'Right': params.get('Right', None) } res = self.imagex_post('GetImageBgFillResult', params, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageBgFillResult') res_json = json.loads(res) return res_json def get_image_duplicate_detection(self, body): query = { 'ServiceId': body['ServiceId'], } res = self.imagex_post('GetImageDuplicateDetection', query, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageDuplicateDetection') res_json = json.loads(res) return res_json def get_image_duplicate_task_status(self, query): res = self.imagex_get('GetDedupTaskStatus', query) if res == '': raise Exception("%s: empty response" % 'GetDedupTaskStatus') res_json = json.loads(res) return res_json def get_image_comic_result(self, params): body = { 'ServiceId': params['ServiceId'], 'StoreUri': params['StoreUri'] } res = self.imagex_post('GetImageComicResult', params, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageComicResult') res_json = json.loads(res) return res_json def get_image_super_resolution_result(self, params): body = { 'ServiceId': params['ServiceId'], 'StoreUri': params['StoreUri'], 'Multiple': params.get('Multiple', None) } res = self.imagex_post('GetImageSuperResolutionResult', params, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetImageSuperResolutionResult') res_json = json.loads(res) return res_json def get_license_plate_detection(self, params): body = { 'ImageUri': params['ImageUri'] } res = self.imagex_post('GetLicensePlateDetection', params, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'GetLicensePlateDetection') res_json = json.loads(res) return res_json def get_image_style_result(self, args): query = { 'ServiceId': args['ServiceId'], } res = self.imagex_post('GetImageStyleResult', query, json.dumps(args)) if res == '': raise Exception("%s: empty response" % 'GetImageStyleResult') res_json = json.loads(res) return res_json def describe_imagex_domain_traffic_data(self, query): res = self.imagex_get('DescribeImageXDomainTrafficData', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXDomainTrafficData') res_json = json.loads(res) return res_json def describe_imagex_domain_bandwidth_data(self, query): res = self.imagex_get('DescribeImageXDomainBandwidthData', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXDomainBandwidthData') res_json = json.loads(res) return res_json def describe_imagex_bucket_usage(self, query): res = self.imagex_get('DescribeImageXBucketUsage', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXBucketUsage') res_json = json.loads(res) return res_json def describe_imagex_request_cnt_usage(self, query): res = self.imagex_get('DescribeImageXRequestCntUsage', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXRequestCntUsage') res_json = json.loads(res) return res_json def describe_imagex_base_op_usage(self, query): res = self.imagex_get('DescribeImageXBaseOpUsage', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXBaseOpUsage') res_json = json.loads(res) return res_json def describe_imagex_compress_usage(self, query): res = self.imagex_get('DescribeImageXCompressUsage', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCompressUsage') res_json = json.loads(res) return res_json def describe_imagex_edge_request(self, query): res = self.imagex_get('DescribeImageXEdgeRequest', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXEdgeRequest') res_json = json.loads(res) return res_json def describe_imagex_hit_rate_traffic_data(self, query): res = self.imagex_get('DescribeImageXHitRateTrafficData', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXHitRateTrafficData') res_json = json.loads(res) return res_json def describe_imagex_hit_rate_request_data(self, query): res = self.imagex_get('DescribeImageXHitRateRequestData', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXHitRateRequestData') res_json = json.loads(res) return res_json def describe_imagex_cdntop_request_data(self, query): res = self.imagex_get('DescribeImageXCDNTopRequestData', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCDNTopRequestData') res_json = json.loads(res) return res_json def describe_imagex_summary(self, query): res = self.imagex_get('DescribeImageXSummary', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXSummary') res_json = json.loads(res) return res_json def describe_imagex_edge_request_bandwidth(self, query): res = self.imagex_get('DescribeImageXEdgeRequestBandwidth', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXEdgeRequestBandwidth') res_json = json.loads(res) return res_json def describe_imagex_edge_request_traffic(self, query): res = self.imagex_get('DescribeImageXEdgeRequestTraffic', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXEdgeRequestTraffic') res_json = json.loads(res) return res_json def describe_imagex_edge_request_regions(self, query): res = self.imagex_get('DescribeImageXEdgeRequestRegions', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXEdgeRequestRegions') res_json = json.loads(res) return res_json def describe_imagex_mirror_request_traffic(self, body): res = self.imagex_post('DescribeImageXMirrorRequestTraffic', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXMirrorRequestTraffic') res_json = json.loads(res) return res_json def describe_imagex_mirror_request_bandwidth(self, body): res = self.imagex_post('DescribeImageXMirrorRequestBandwidth', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXMirrorRequestBandwidth') res_json = json.loads(res) return res_json def describe_imagex_mirror_request_http_code_by_time(self, body): res = self.imagex_post('DescribeImageXMirrorRequestHttpCodeByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXMirrorRequestHttpCodeByTime') res_json = json.loads(res) return res_json def describe_imagex_mirror_request_http_code_overview(self, body): res = self.imagex_post('DescribeImageXMirrorRequestHttpCodeOverview', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXMirrorRequestHttpCodeOverview') res_json = json.loads(res) return res_json def describe_imagex_service_quality(self, query): res = self.imagex_get('DescribeImageXServiceQuality', query) if res == '': raise Exception("%s: empty response" % 'DescribeImageXServiceQuality') res_json = json.loads(res) return res_json def get_imagex_query_apps(self, query): res = self.imagex_get('GetImageXQueryApps', query) if res == '': raise Exception("%s: empty response" % 'GetImageXQueryApps') res_json = json.loads(res) return res_json def get_imagex_query_regions(self, query): res = self.imagex_get('GetImageXQueryRegions', query) if res == '': raise Exception("%s: empty response" % 'GetImageXQueryRegions') res_json = json.loads(res) return res_json def get_imagex_query_dims(self, query): res = self.imagex_get('GetImageXQueryDims', query) if res == '': raise Exception("%s: empty response" % 'GetImageXQueryDims') res_json = json.loads(res) return res_json def get_imagex_query_vals(self, query): res = self.imagex_get('GetImageXQueryVals', query) if res == '': raise Exception("%s: empty response" % 'GetImageXQueryVals') res_json = json.loads(res) return res_json def describe_imagex_upload_success_rate_by_time(self, body): res = self.imagex_post('DescribeImageXUploadSuccessRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadSuccessRateByTime') res_json = json.loads(res) return res_json def describe_imagex_upload_error_code_all(self, body): res = self.imagex_post('DescribeImageXUploadErrorCodeAll', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadErrorCodeAll') res_json = json.loads(res) return res_json def describe_imagex_upload_error_code_by_time(self, body): res = self.imagex_post('DescribeImageXUploadErrorCodeByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadErrorCodeByTime') res_json = json.loads(res) return res_json def describe_imagex_upload_count_by_time(self, body): res = self.imagex_post('DescribeImageXUploadCountByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadCountByTime') res_json = json.loads(res) return res_json def describe_imagex_upload_file_size(self, body): res = self.imagex_post('DescribeImageXUploadFileSize', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadFileSize') res_json = json.loads(res) return res_json def describe_imagex_upload_speed(self, body): res = self.imagex_post('DescribeImageXUploadSpeed', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadSpeed') res_json = json.loads(res) return res_json def describe_imagex_upload_duration(self, body): res = self.imagex_post('DescribeImageXUploadDuration', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadDuration') res_json = json.loads(res) return res_json def describe_imagex_upload_segment_speed_by_time(self, body): res = self.imagex_post('DescribeImageXUploadSegmentSpeedByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXUploadSegmentSpeedByTime') res_json = json.loads(res) return res_json def describe_imagex_cdn_success_rate_by_time(self, body): res = self.imagex_post('DescribeImageXCdnSuccessRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnSuccessRateByTime') res_json = json.loads(res) return res_json def describe_imagex_cdn_success_rate_all(self, body): res = self.imagex_post('DescribeImageXCdnSuccessRateAll', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnSuccessRateAll') res_json = json.loads(res) return res_json def describe_imagex_cdn_error_code_by_time(self, body): res = self.imagex_post('DescribeImageXCdnErrorCodeByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnErrorCodeByTime') res_json = json.loads(res) return res_json def describe_imagex_cdn_error_code_all(self, body): res = self.imagex_post('DescribeImageXCdnErrorCodeAll', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnErrorCodeAll') res_json = json.loads(res) return res_json def describe_imagex_cdn_duration_detail_by_time(self, body): res = self.imagex_post('DescribeImageXCdnDurationDetailByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnDurationDetailByTime') res_json = json.loads(res) return res_json def describe_imagex_cdn_duration_all(self, body): res = self.imagex_post('DescribeImageXCdnDurationAll', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnDurationAll') res_json = json.loads(res) return res_json def describe_imagex_cdn_reuse_rate_by_time(self, body): res = self.imagex_post('DescribeImageXCdnReuseRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnReuseRateByTime') res_json = json.loads(res) return res_json def describe_imagex_cdn_reuse_rate_all(self, body): res = self.imagex_post('DescribeImageXCdnReuseRateAll', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnReuseRateAll') res_json = json.loads(res) return res_json def describe_imagex_cdn_protocol_rate_by_time(self, body): res = self.imagex_post('DescribeImageXCdnProtocolRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXCdnProtocolRateByTime') res_json = json.loads(res) return res_json def describe_imagex_client_error_code_all(self, body): res = self.imagex_post('DescribeImageXClientErrorCodeAll', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientErrorCodeAll') res_json = json.loads(res) return res_json def describe_imagex_client_error_code_by_time(self, body): res = self.imagex_post('DescribeImageXClientErrorCodeByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientErrorCodeByTime') res_json = json.loads(res) return res_json def describe_imagex_client_decode_success_rate_by_time(self, body): res = self.imagex_post('DescribeImageXClientDecodeSuccessRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientDecodeSuccessRateByTime') res_json = json.loads(res) return res_json def describe_imagex_client_decode_duration_by_time(self, body): res = self.imagex_post('DescribeImageXClientDecodeDurationByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientDecodeDurationByTime') res_json = json.loads(res) return res_json def describe_imagex_client_queue_duration_by_time(self, body): res = self.imagex_post('DescribeImageXClientQueueDurationByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientQueueDurationByTime') res_json = json.loads(res) return res_json def describe_imagex_client_load_duration_all(self, body): res = self.imagex_post('DescribeImageXClientLoadDurationAll', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientLoadDurationAll') res_json = json.loads(res) return res_json def describe_imagex_client_load_duration(self, body): res = self.imagex_post('DescribeImageXClientLoadDuration', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientLoadDuration') res_json = json.loads(res) return res_json def describe_imagex_client_failure_rate(self, body): res = self.imagex_post('DescribeImageXClientFailureRate', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientFailureRate') res_json = json.loads(res) return res_json def describe_imagex_client_sdk_ver_by_time(self, body): res = self.imagex_post('DescribeImageXClientSdkVerByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientSdkVerByTime') res_json = json.loads(res) return res_json def describe_imagex_client_file_size(self, body): res = self.imagex_post('DescribeImageXClientFileSize', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientFileSize') res_json = json.loads(res) return res_json def describe_imagex_client_top_file_size(self, body): res = self.imagex_post('DescribeImageXClientTopFileSize', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientTopFileSize') res_json = json.loads(res) return res_json def describe_imagex_client_count_by_time(self, body): res = self.imagex_post('DescribeImageXClientCountByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientCountByTime') res_json = json.loads(res) return res_json def describe_imagex_client_score_by_time(self, body): res = self.imagex_post('DescribeImageXClientScoreByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientScoreByTime') res_json = json.loads(res) return res_json def describe_imagex_client_demotion_rate_by_time(self, body): res = self.imagex_post('DescribeImageXClientDemotionRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientDemotionRateByTime') res_json = json.loads(res) return res_json def describe_imagex_client_top_demotion_url(self, body): res = self.imagex_post('DescribeImageXClientTopDemotionURL', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientTopDemotionURL') res_json = json.loads(res) return res_json def describe_imagex_client_quality_rate_by_time(self, body): res = self.imagex_post('DescribeImageXClientQualityRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientQualityRateByTime') res_json = json.loads(res) return res_json def describe_imagex_client_top_quality_url(self, body): res = self.imagex_post('DescribeImageXClientTopQualityURL', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXClientTopQualityURL') res_json = json.loads(res) return res_json def describe_imagex_sensible_count_by_time(self, body): res = self.imagex_post('DescribeImageXSensibleCountByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXSensibleCountByTime') res_json = json.loads(res) return res_json def describe_imagex_sensible_cache_hit_rate_by_time(self, body): res = self.imagex_post('DescribeImageXSensibleCacheHitRateByTime', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXSensibleCacheHitRateByTime') res_json = json.loads(res) return res_json def describe_imagex_sensible_top_size_url(self, body): res = self.imagex_post('DescribeImageXSensibleTopSizeURL', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXSensibleTopSizeURL') res_json = json.loads(res) return res_json def describe_imagex_sensible_top_ram_url(self, body): res = self.imagex_post('DescribeImageXSensibleTopRamURL', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXSensibleTopRamURL') res_json = json.loads(res) return res_json def describe_imagex_sensible_top_resolution_url(self, body): res = self.imagex_post('DescribeImageXSensibleTopResolutionURL', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXSensibleTopResolutionURL') res_json = json.loads(res) return res_json def describe_imagex_sensible_top_unknown_url(self, body): res = self.imagex_post('DescribeImageXSensibleTopUnknownURL', [], json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageXSensibleTopUnknownURL') res_json = json.loads(res) return res_json def describeImageVolcCdnAccessLog(self, query, body): res = self.imagex_post('DescribeImageVolcCdnAccessLog', query, json.dumps(body)) if res == '': raise Exception("%s: empty response" % 'DescribeImageVolcCdnAccessLog') res_json = json.loads(res) return res_json