From 5e9d7b58639df7cf9b8b091b54ee64147aa051dd Mon Sep 17 00:00:00 2001 From: flynnzzhang Date: Tue, 25 Jul 2023 17:38:50 +0800 Subject: [PATCH] Update ci sdk demo and add workflow base sdk --- demo/ci_file_process.py | 158 +++++++++++++++---- demo/ci_media.py | 332 ++++++++++++++++++++++++++++++++++++++- qcloud_cos/cos_client.py | 283 ++++++++++++++++++++++++++++++++- 3 files changed, 740 insertions(+), 33 deletions(-) diff --git a/demo/ci_file_process.py b/demo/ci_file_process.py index 4de3a980..109d3559 100644 --- a/demo/ci_file_process.py +++ b/demo/ci_file_process.py @@ -1,4 +1,5 @@ # -*- coding=utf-8 +import base64 from qcloud_cos import CosConfig from qcloud_cos import CosS3Client @@ -13,10 +14,6 @@ logging.basicConfig(level=logging.INFO, stream=sys.stdout) -# 设置用户属性, 包括 secret_id, secret_key, region等。Appid 已在CosConfig中移除,请在参数 Bucket 中带上 Appid。Bucket 由 BucketName-Appid 组成 -# secret_id = os.environ["SECRETID"] # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi -# secret_key = os.environ["SECRETKEY"] # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi - secret_id = os.environ["SECRETID"] # 替换为用户的 SecretId,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi secret_key = os.environ["SECRETKEY"] # 替换为用户的 SecretKey,请登录访问管理控制台进行查看和管理,https://console.cloud.tencent.com/cam/capi region = 'ap-chongqing' # 替换为用户的 region,已创建桶归属的region可以在控制台查看,https://console.cloud.tencent.com/cos5/bucket @@ -31,69 +28,176 @@ def ci_get_file_hash(): - response = client.file_hash(Bucket=bucket_name, Key="mytest.mp4", Type='md5') + # 同步获取文件哈希值 + response = client.file_hash( + Bucket=bucket_name, # 文件所在的桶名称 + Key="mytest.mp4", # 需要获取哈希值的文件名 + Type='md5', # 哈希算法类型,有效值:md5、sha1、sha256. + AddToHeader=True # 是否将计算得到的哈希值,自动添加至文件的自定义header. 格式为:x-cos-meta-md5/sha1/sha256; 有效值: True、False,不填则默认为False. + ) print(response) return response def ci_create_file_hash_job(): + # 创建获取文件哈希值异步任务 body = { + # 获取文件哈希值配置详情 + + # 哈希值的算法类型 + # 必选,有效值:MD5、SHA1、SHA256。 'Type': 'MD5', + # 是否将计算得到的哈希值添加至文件自定义header,自定义header根据Type的值变化,例如Type值为MD5时,自定义header为 x-cos-meta-md5。 + # 非必选,有效值:true、false,默认值为 false。 + 'AddToHeader': 'true' + } + mq_config = { + # 消息队列所属园区 + # 必选。目前支持园区 sh(上海)、bj(北京)、gz(广州)、cd(成都)、hk(中国香港) + 'MqRegion': 'bj', + # 消息队列使用模式 + # 必选。主题订阅:Topic 队列服务: Queue + 'MqMode': 'Queue', + # TDMQ 主题名称 必选。 + 'MqName': 'queueName' } response = client.ci_create_file_hash_job( - Bucket=bucket_name, - InputObject="mytest.mp4", - FileHashCodeConfig=body + Bucket=bucket_name, # 文件所在的桶名称 + InputObject="mytest.mp4", # 需要获取哈希值的文件名 + FileHashCodeConfig=body, # 获取文件哈希值配置详情 + CallBack="http://www.callback.com", # 回调url地址,当 CallBackType 参数值为 Url 时有效 + CallBackFormat="JSON", # 回调信息格式 JSON 或 XML,默认 XML + CallBackType="Url", # 回调类型,Url 或 TDMQ,默认 Url + CallBackMqConfig=mq_config, # 任务回调TDMQ配置,当 CallBackType 为 TDMQ 时必填 + UserData="this is my user data" # 透传用户信息, 可打印的 ASCII 码, 长度不超过1024 ) print(response) return response def ci_create_file_uncompress_job(): + # 创建获取文件解压异步任务 body = { - 'Prefix': 'output/', + # 文件解压配置详情 + + # 指定解压后输出文件的前缀,不填则默认保存在存储桶根路径,非必选 + 'Prefix': 'zip/', + # 解压密钥,传入时需先经过 base64 编码。非必选 + 'UnCompressKey': base64.b64encode("123456".encode("utf-8")).decode('utf-8'), + # 指定解压后的文件路径是否需要替换前缀,有效值: + # - 0:不添加额外的前缀,解压缩将保存在Prefix指定的路径下(不会保留压缩包的名称,仅将压缩包内的文件保存至指定的路径)。 + # - 1:以压缩包本身的名称作为前缀,解压缩将保存在Prefix指定的路径下。 + # - 2:以压缩包完整路径作为前缀,此时如果不指定Prefix,就是解压到压缩包所在的当前路径(包含压缩包本身名称)。 + # - 非必选,默认值为0 + 'PrefixReplaced': '0' + } + mq_config = { + # 消息队列所属园区 + # 必选。目前支持园区 sh(上海)、bj(北京)、gz(广州)、cd(成都)、hk(中国香港) + 'MqRegion': 'bj', + # 消息队列使用模式 + # 必选。主题订阅:Topic 队列服务: Queue + 'MqMode': 'Queue', + # TDMQ 主题名称 必选。 + 'MqName': 'queueName' } response = client.ci_create_file_uncompress_job( - Bucket=bucket_name, - InputObject='test.zip', - FileUncompressConfig=body + Bucket=bucket_name, # 文件所在的桶名称 + InputObject='zip/testmi.zip', # 需要解压的文件名 + OutputBucket=bucket_name, # 指定输出文件所在的桶名称 + OutputRegion=region, # 指定输出文件所在的地域 + FileUncompressConfig=body, # 文件解压配置详情 + CallBack="http://www.callback.com", # 回调url地址,当 CallBackType 参数值为 Url 时有效 + CallBackFormat="JSON", # 回调信息格式 JSON 或 XML,默认 XML + CallBackType="Url", # 回调类型,Url 或 TDMQ,默认 Url + CallBackMqConfig=mq_config, # 任务回调TDMQ配置,当 CallBackType 为 TDMQ 时必填 + UserData="this is my user data" # 透传用户信息, 可打印的 ASCII 码, 长度不超过1024 ) print(response) return response def ci_create_file_compress_job(): + # 创建获取文件压缩异步任务 body = { + # 文件打包时,是否需要去除源文件已有的目录结构 + # 必选,有效值: + # 0:不需要去除目录结构,打包后压缩包中的文件会保留原有的目录结构 + # 1:需要,打包后压缩包内的文件会去除原有的目录结构,所有文件都在同一层级 + # 例如:源文件 URL 为 https://domain/source/test.mp4, 则源文件路径为 source/test.mp4 + # 如果为 1,则 ZIP 包中该文件路径为 test.mp4 + # 如果为 0,ZIP 包中该文件路径为 source/test.mp4 'Flatten': '0', + # 打包压缩的类型 + # 必选,有效值:zip、tar、tar.gz。 'Format': 'zip', - 'Prefix': '/', + # 压缩类型,仅在Format为tar.gz或zip时有效。 + # faster:压缩速度较快 + # better:压缩质量较高,体积较小 + # default:适中的压缩方式 + # 非必选,默认值为default + 'Type': 'faster', + # 压缩包密钥,传入时需先经过 base64 编码, 编码后长度不能超过128。当 Format 为 zip 时生效 + # 非必选 + 'CompressKey': base64.b64encode("123456".encode("utf-8")).decode('utf-8'), + + # 下列参数UrlList、Prefix、Key 三者仅能选择一个,不能都为空,也不会同时生效。如果填了多个,会按优先级 UrlList > Prefix > Key 取最高优先级执行。 + + # UrlList 支持将需要打包的文件整理成索引文件,后台将根据索引文件内提供的文件 url,打包为一个压缩包文件。 + # 索引文件需要保存在当前存储桶中,本字段需要提供索引文件的对象地址,例如:/test/index.csv。 + # 索引文件格式:仅支持 CSV 文件,一行一条 URL(仅支持本存储桶文件),如有多列字段,默认取第一列作为URL。最多不超过10000个文件,总大小不超过50G + # 非必选 + 'UrlList': '', + # 支持对存储桶中的某个前缀进行打包,如果需要对某个目录进行打包,需要加/, + # 例如test目录打包,则值为:test/。最多不超过10000个文件,总大小不超过50G,否则会导致任务失败。 + # 非必选 + 'Prefix': 'zip/', + # 支持对存储桶中的多个文件进行打包,个数不能超过 1000。 + # 非必选 + 'Key': ['zip/1.png', 'zip/2.png', 'zip/3.png'] + } + mq_config = { + # 消息队列所属园区 + # 必选。目前支持园区 sh(上海)、bj(北京)、gz(广州)、cd(成都)、hk(中国香港) + 'MqRegion': 'bj', + # 消息队列使用模式 + # 必选。主题订阅:Topic 队列服务: Queue + 'MqMode': 'Queue', + # TDMQ 主题名称 必选。 + 'MqName': 'queueName' } response = client.ci_create_file_compress_job( - Bucket=bucket_name, - OutputBucket=bucket_name, - OutputRegion='ap-guangzhou', - OutputObject='result.zip', - FileCompressConfig=body, - CallBack="http://www.callback.com", - CallBackType="Url", - CallBackFormat="XML", - UserData="my data" + Bucket=bucket_name, # 文件所在的桶名称 + OutputBucket=bucket_name, # 指定输出文件所在的桶名称 + OutputRegion=region, # 指定输出文件所在的地域 + OutputObject='zip/result.zip', # 指定输出文件名 + FileCompressConfig=body, # 指定压缩配置 + CallBack="http://www.callback.com", # 回调url地址,当 CallBackType 参数值为 Url 时有效 + CallBackFormat="JSON", # 回调信息格式 JSON 或 XML,默认 XML + CallBackType="Url", # 回调类型,Url 或 TDMQ,默认 Url + CallBackMqConfig=mq_config, # 任务回调TDMQ配置,当 CallBackType 为 TDMQ 时必填 + UserData="this is my user data" # 透传用户信息, 可打印的 ASCII 码, 长度不超过1024 ) print(response) return response def ci_get_file_process_jobs(): + # 获取文件处理异步任务结果详情 response = client.ci_get_file_process_jobs( - Bucket=bucket_name, - JobIDs='fcb9a9f90e57611ed9************', + Bucket=bucket_name, # 任务所在桶名称 + JobIDs='f7325938a256611xxxxxxxxxxx', # 文件处理异步任务ID ) print(response) return response def ci_get_zip_preview(): - response = client.ci_file_zip_preview(Bucket=bucket_name, Key="result.zip") + # 压缩包预览同步请求 + response = client.ci_file_zip_preview( + Bucket=bucket_name, # 压缩文件所在桶名称 + Key="zip/test.zip" # 需要预览的压缩文件名 + ) print(response) return response @@ -103,5 +207,5 @@ def ci_get_zip_preview(): # ci_create_file_hash_job() # ci_create_file_uncompress_job() # ci_create_file_compress_job() - # ci_get_zip_preview() - ci_get_file_process_jobs() + ci_get_zip_preview() + # ci_get_file_process_jobs() diff --git a/demo/ci_media.py b/demo/ci_media.py index de5d99bc..b2a44771 100644 --- a/demo/ci_media.py +++ b/demo/ci_media.py @@ -980,7 +980,7 @@ def ci_trigger_workflow(): response = client.ci_trigger_workflow( Bucket=bucket_name, WorkflowId='w1b4ffd6900a343c3a2fe5b92b1fb7ff6', - Key='117374C.mp4' + Key='test.mp4' ) print(response) return response @@ -1172,6 +1172,328 @@ def ci_cancel_jobs(): return response +def ci_create_workflow_image_inspect(): + # 创建异常图片检测工作流 + + # 工作流配置详情 + body = { + # 工作流节点 固定值传入即可 + 'MediaWorkflow': { + # 创建的工作流名称,可自定义输入名称 + # 支持中文、英文、数字、—和_,长度限制128字符 + # 必传参数 + 'Name': 'image-inspect', + # 工作流状态,表示创建时是否开启COS上传对象事件通知 + # 支持 Active / Paused + # 非必选,默认Paused 不开启 + 'State': 'Active', + # 工作流拓扑结构 + # 必传参数 + 'Topology': { + # 工作流节点依赖关系 + # 必传参数 + 'Dependencies': { + # Start 工作流开始节点,用于存储工作流回调,前缀,后缀等配置信息,只有一个开始节点 + # End 工作流结束节点 + # ImageInspectNode 异常图片检测节点信息 + # 此示例表示 Start -> ImageInspectNode -> End 的依赖关系 + 'Start': 'ImageInspectNode', + 'ImageInspectNode': 'End', + }, + # 工作流各节点的详细配置信息 + # 必传参数 + 'Nodes': { + # 工作流开始节点配置信息 + 'Start': { + # 节点类型,开始节点固定为 Start + # 必传参数 + 'Type': 'Start', + # 工作流的输入信息 + # 必传参数 + 'Input': { + # Object 前缀,COS上传对象的前缀,只有当前缀匹配时,才会触发该工作流 + # 如该示例,会触发以test为前缀的对象 + # 必传参数 + 'ObjectPrefix': 'test', + # 工作流自定义回调配置信息,当配置了该项后,当工作流执行完成或工作流中的子节点中的任务执行完成,会发送回调给指定Url或tdmq + # 非必传配置 + 'NotifyConfig': { + # 回调类型,支持Url TDMQ两种类型 + 'Type': 'Url', + # 回调地址,当回调类型为Url时有效 + 'Url': 'http://www.callback.com', + # 回调事件 支持多种事件,以逗号分割 + 'Event': 'WorkflowFinish,TaskFinish', + # 回调信息格式,支持XML JSON两种格式,非必传,默认为XML + 'ResultFormat': '', + # TDMQ 所属园区,当回调类型为TDMQ时有效,支持园区详见https://cloud.tencent.com/document/product/406/12667 + 'MqRegion': '', + # TDMQ 使用模式,当回调类型为TDMQ时有效 + # Topic:主题订阅 + # Queue:队列服务 + 'MqMode': '', + # TDMQ 主题名称,当回调类型为TDMQ时有效 + 'MqName': '', + }, + # 文件后缀过滤器,当需要只处理部分后缀文件时,可配置此项 + # 非必传配置 + 'ExtFilter': { + # 是否开始后缀过滤,On/Off,非必选,默认为Off + 'State': '', + # 打开视频后缀限制,false/true,非必选,默认为false + 'Video': '', + # 打开音频后缀限制,false/true,非必选,默认为false + 'Audio': '', + # 打开图片后缀限制,false/true,非必选,默认为false + 'Image': '', + # 打开 ContentType 限制,false/true,非必选,默认为false + 'ContentType': '', + # 打开自定义后缀限制,false/true,非必选,默认为false + 'Custom': '', + # 自定义后缀,当Custom为true时有效,多种文件后缀以/分隔,后缀个数不超过10个 + 'CustomExts': 'jpg/png', + # 所有文件,false/true,非必选,默认为false + 'AllFile': '', + } + } + }, + # 异常图片检测节点配置信息 + 'ImageInspectNode': { + # 节点类型,异常图片检测固定为ImageInspect + 'Type': 'ImageInspect', + # 节点执行操作集合 + # 非必选配置 + 'Operation': { + # 异常图片检测配置详情 + 'ImageInspect': { + # 是否开启检测到异常图片检测后自动对图片进行处理的动作,false/true,非必选,默认false + 'AutoProcess': 'true', + # 在检测到为异常图片后的处理动作,有效值为: + # BackupObject:移动图片到固定目录下,目录名为abnormal_images_backup/,由后台自动创建 + # SwitchObjectToPrivate:将图片权限设置为私有 + # DeleteObject:删除图片 + # 非必选参数,默认值为BackupObject + 'ProcessType': 'BackupObject' + } + } + }, + }, + }, + }, + } + response = client.ci_create_workflow( + Bucket=bucket_name, # 桶名称 + Body=body, # 工作流配置信息 + ContentType='application/xml' + ) + print(response) + print("workflowId is: " + response['MediaWorkflow']['WorkflowId']) + return response + + +def ci_update_workflow(): + # 更新工作流配置信息,仅当工作流状态为Paused时支持更新配置信息,故在更新信息前,需要将工作流状态为Paused + + # 工作流配置详情 + body = { + # 工作流节点 固定值传入即可 + 'MediaWorkflow': { + # 工作流名称,可自定义输入名称 + # 支持中文、英文、数字、—和_,长度限制128字符 + # 必传参数 + 'Name': 'image-inspect', + # 工作流状态,表示创建时是否开启COS上传对象事件通知 + # 支持 Active / Paused + # 非必选,默认Paused 不开启 + 'State': 'Active', + # 工作流拓扑结构 + # 必传参数 + 'Topology': { + # 工作流节点依赖关系 + # 必传参数 + 'Dependencies': { + # Start 工作流开始节点,用于存储工作流回调,前缀,后缀等配置信息,只有一个开始节点 + # End 工作流结束节点 + # ImageInspectNode 异常图片检测节点信息 + # 此示例表示 Start -> ImageInspectNode -> End 的依赖关系 + 'Start': 'ImageInspectNode', + 'ImageInspectNode': 'End', + }, + # 工作流各节点的详细配置信息 + # 必传参数 + 'Nodes': { + # 工作流开始节点配置信息 + 'Start': { + # 节点类型,开始节点固定为 Start + # 必传参数 + 'Type': 'Start', + # 工作流的输入信息 + # 必传参数 + 'Input': { + # Object 前缀,COS上传对象的前缀,只有当前缀匹配时,才会触发该工作流 + # 如该示例,会触发以test为前缀的对象 + # 必传参数 + 'ObjectPrefix': 'test', + # 工作流自定义回调配置信息,当配置了该项后,当工作流执行完成或工作流中的子节点中的任务执行完成,会发送回调给指定Url或tdmq + # 非必传配置 + 'NotifyConfig': { + # 回调类型,支持Url TDMQ两种类型 + 'Type': 'Url', + # 回调地址,当回调类型为Url时有效 + 'Url': 'http://www.callback.com', + # 回调事件 支持多种事件,以逗号分割 + 'Event': 'WorkflowFinish,TaskFinish', + # 回调信息格式,支持XML JSON两种格式,非必传,默认为XML + 'ResultFormat': '', + # TDMQ 所属园区,当回调类型为TDMQ时有效,支持园区详见https://cloud.tencent.com/document/product/406/12667 + 'MqRegion': '', + # TDMQ 使用模式,当回调类型为TDMQ时有效 + # Topic:主题订阅 + # Queue:队列服务 + 'MqMode': '', + # TDMQ 主题名称,当回调类型为TDMQ时有效 + 'MqName': '', + }, + # 文件后缀过滤器,当需要只处理部分后缀文件时,可配置此项 + # 非必传配置 + 'ExtFilter': { + # 是否开始后缀过滤,On/Off,非必选,默认为Off + 'State': 'On', + # 打开视频后缀限制,false/true,非必选,默认为false + 'Video': '', + # 打开音频后缀限制,false/true,非必选,默认为false + 'Audio': '', + # 打开图片后缀限制,false/true,非必选,默认为false + 'Image': 'true', + # 打开 ContentType 限制,false/true,非必选,默认为false + 'ContentType': '', + # 打开自定义后缀限制,false/true,非必选,默认为false + 'Custom': '', + # 自定义后缀,当Custom为true时有效,多种文件后缀以/分隔,后缀个数不超过10个 + 'CustomExts': 'jpg/png', + # 所有文件,false/true,非必选,默认为false + 'AllFile': '', + } + } + }, + # 异常图片检测节点配置信息 + 'ImageInspectNode': { + # 节点类型,异常图片检测固定为ImageInspect + 'Type': 'ImageInspect', + # 节点执行操作集合 + # 非必选配置 + 'Operation': { + # 异常图片检测配置详情 + 'ImageInspect': { + # 是否开启检测到异常图片检测后自动对图片进行处理的动作,false/true,非必选,默认false + 'AutoProcess': 'true', + # 在检测到为异常图片后的处理动作,有效值为: + # BackupObject:移动图片到固定目录下,目录名为abnormal_images_backup/,由后台自动创建 + # SwitchObjectToPrivate:将图片权限设置为私有 + # DeleteObject:删除图片 + # 非必选参数,默认值为BackupObject + 'ProcessType': 'SwitchObjectToPrivate' + } + } + }, + }, + }, + }, + } + response = client.ci_update_workflow( + Bucket=bucket_name, # 桶名称 + WorkflowId='wd34ca394909xxxxxxxxxxxx4d', # 需要更新的工作流ID + Body=body, # 工作流配置详情 + ContentType='application/xml' + ) + print(response) + print("workflowId is: " + response['MediaWorkflow']['WorkflowId']) + return response + + +def ci_update_workflow_state(): + # 更新工作流状态 + + response = client.ci_update_workflow_state( + Bucket=bucket_name, # 桶名称 + WorkflowId='wd34ca3949090xxxxxxxxxx44d', # 需要更新的工作流ID + UpdateState='paused', # 需要更新至的工作流状态,支持 active 开启 / paused 关闭 + ContentType='application/xml' + ) + print(response) + return response + + +def ci_get_workflow(): + # 获取工作流配置详情 + + response = client.ci_get_workflow( + Bucket=bucket_name, # 桶名称 + Ids='wd34ca394909xxxxxxxxxxxx4d', # 需要查询的工作流ID,支持传入多个,以","分隔 + Name='image-inspect', # 需要查询的工作流名称 + # PageNumber='6', # 分页查询使用,第几页 + # PageSize='3', # 分页查询使用,每页个数 + ContentType='application/xml' + ) + print(response) + return response + + +def ci_delete_workflow(): + # 删除指定的工作流 + + response = client.ci_delete_workflow( + Bucket=bucket_name, # 桶名称 + WorkflowId='wd34ca39490904xxxxxxxxxx744d', # 需要删除的工作流ID + ) + print(response) + return response + + +def ci_create_image_inspect_jobs(): + # 创建异常图片检测任务 + + body = { + # 待操作的对象信息 + 'Input': { + # 输入文件路径 + 'Object': 'heichan.png' + }, + # 任务类型,固定值 ImageInspect + 'Tag': 'ImageInspect', + # 操作规则 + # 非必选 + 'Operation': { + # 异常图片检测配置 + # 非必选 + 'ImageInspect': { + # 是否开启检测到异常图片检测后自动对图片进行处理的动作,false/true,非必选,默认false + 'AutoProcess': 'true', + # 在检测到为异常图片后的处理动作,有效值为: + # BackupObject:移动图片到固定目录下,目录名为abnormal_images_backup/,由后台自动创建 + # SwitchObjectToPrivate:将图片权限设置为私有 + # DeleteObject:删除图片 + # 非必选参数,默认值为BackupObject + 'ProcessType': 'SwitchObjectToPrivate' + }, + # 非必选 + "UserData": "This is my data", + }, + # 非必选 回调URL + # 'CallBack': 'http://callback.demo.com', + # 非必选 回调信息格式 支持JSON/XML + # 'CallBackFormat': 'JSON' + } + response = client.ci_create_media_jobs( + Bucket=bucket_name, + Jobs=body, + Lst={}, + ContentType='application/xml' + ) + print(response) + return response + + if __name__ == "__main__": # ci_get_media_queue() # ci_get_media_transcode_jobs() @@ -1210,5 +1532,11 @@ def ci_cancel_jobs(): # ci_put_media_pic_queue() # ci_create_quality_estimate_jobs() # ci_create_segment_video_body_jobs() - ci_create_and_get_live_recognition_jobs() + # ci_create_and_get_live_recognition_jobs() # ci_cancel_jobs() + # ci_create_workflow_image_inspect() + # ci_get_workflow() + # ci_update_workflow() + # ci_update_workflow_state() + # ci_delete_workflow() + ci_create_image_inspect_jobs() diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 4a93e782..71397af0 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -6905,6 +6905,274 @@ def ci_list_media_jobs(self, Bucket, Tag, QueueId=None, StartCreationTime=None, format_dict(data, ['JobsDetail']) return data + def ci_create_workflow(self, Bucket, Body, **kwargs): + """ 创建工作流接口 https://cloud.tencent.com/document/product/460/76856 + + :param Bucket(string): 存储桶名称. + :param Body(dict): 创建工作流的配置信息. + :param kwargs(dict): 设置请求的headers. + :return(dict): 查询成功返回的结果,dict类型. + + .. code-block:: python + + config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 + client = CosS3Client(config) + # 创建工作流接口 + response = client.ci_create_workflow( + Bucket='bucket' + Body={}, + ) + print response + """ + headers = mapped(kwargs) + final_headers = {} + params = {} + for key in headers: + if key.startswith("response"): + params[key] = headers[key] + else: + final_headers[key] = headers[key] + headers = final_headers + + params = format_values(params) + xml_config = format_xml(data=Body, root='Request') + path = "/workflow" + url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci) + logger.info("ci_create_workflow result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format( + url=url, + headers=headers, + params=params, + xml_config=xml_config)) + rt = self.send_request( + method='POST', + url=url, + bucket=Bucket, + data=xml_config, + auth=CosS3Auth(self._conf, path, params=params), + params=params, + headers=headers, + ci_request=True) + + data = xml_to_dict(rt.content) + return data + + def ci_update_workflow_state(self, Bucket, WorkflowId, UpdateState, **kwargs): + """ 更新工作流接口 https://cloud.tencent.com/document/product/460/76861 + + :param Bucket(string): 存储桶名称. + :param WorkflowId(string): 需要更新状态的工作流ID. + :param UpdateState(string): 更新工作流的状态,有效值为active、paused + :param kwargs(dict): 设置请求的headers. + :return(dict): 查询成功返回的结果,dict类型. + + .. code-block:: python + + config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 + client = CosS3Client(config) + # 更新工作流状态接口 + response = client.ci_update_workflow_state( + Bucket='bucket' + WorkflowId='', + UpdateState='active' + ) + print response + """ + headers = mapped(kwargs) + final_headers = {} + params = {} + for key in headers: + if key.startswith("response"): + params[key] = headers[key] + else: + final_headers[key] = headers[key] + headers = final_headers + + params = format_values(params) + + path = "/workflow/" + WorkflowId + url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci) + url = url + '?' + UpdateState + logger.info("ci_update_workflow_state result, url=:{url} ,headers=:{headers}, params=:{params}".format( + url=url, + headers=headers, + params=params)) + rt = self.send_request( + method='PUT', + url=url, + bucket=Bucket, + auth=CosS3Auth(self._conf, path, params=params), + params=params, + headers=headers, + ci_request=True) + + data = xml_to_dict(rt.content) + # 单个元素时将dict转为list + return data + + def ci_update_workflow(self, Bucket, WorkflowId, Body, **kwargs): + """ 更新工作流接口 https://cloud.tencent.com/document/product/460/76861 + + :param Bucket(string): 存储桶名称. + :param WorkflowId(string): 需要更新状态的工作流ID. + :param Body(dict): 更新工作流的配置信息. + :param kwargs(dict): 设置请求的headers. + :return(dict): 查询成功返回的结果,dict类型. + + .. code-block:: python + + config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 + client = CosS3Client(config) + # 创建任务接口 + response = client.ci_update_workflow( + Bucket='bucket' + Body={}, + ) + print response + """ + headers = mapped(kwargs) + final_headers = {} + params = {} + for key in headers: + if key.startswith("response"): + params[key] = headers[key] + else: + final_headers[key] = headers[key] + headers = final_headers + + params = format_values(params) + xml_config = format_xml(data=Body, root='Request') + path = "/workflow/" + WorkflowId + url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci) + logger.info("ci_update_workflow result, url=:{url} ,headers=:{headers}, params=:{params}, xml_config=:{xml_config}".format( + url=url, + headers=headers, + params=params, + xml_config=xml_config)) + rt = self.send_request( + method='PUT', + url=url, + bucket=Bucket, + data=xml_config, + auth=CosS3Auth(self._conf, path, params=params), + params=params, + headers=headers, + ci_request=True) + + data = xml_to_dict(rt.content) + return data + + def ci_get_workflow(self, Bucket, Ids='', Name='', PageNumber='', PageSize='', **kwargs): + """ 获取工作流详情接口 https://cloud.tencent.com/document/product/460/76857 + + :param Bucket(string): 存储桶名称. + :param Ids(string): 需要查询的工作流 ID,可传入多个,以,符号分割字符串. + :param Name(string): 需要查询的工作流名称. + :param PageNumber(string): 第几页. + :param PageSize(string): 每页个数. + :param kwargs(dict): 设置请求的headers. + :return(dict): 查询成功返回的结果,dict类型. + + .. code-block:: python + + config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 + client = CosS3Client(config) + # 创建任务接口 + response = client.ci_get_workflow( + Bucket='bucket' + Body={}, + ) + print response + """ + headers = mapped(kwargs) + final_headers = {} + params = {} + for key in headers: + if key.startswith("response"): + params[key] = headers[key] + else: + final_headers[key] = headers[key] + headers = final_headers + + params = format_values(params) + + path = "/workflow" + url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci) + url = u"{url}?{ids}&{name}&{pageNumber}&{pageSize}".format( + url=to_unicode(url), + ids=to_unicode('ids='+Ids), + name=to_unicode('name='+Name), + pageNumber=to_unicode('pageNumber='+str(PageNumber)), + pageSize=to_unicode('pageSize='+str(PageSize)), + ) + logger.info("ci_get_workflow result, url=:{url} ,headers=:{headers}, params=:{params}".format( + url=url, + headers=headers, + params=params)) + rt = self.send_request( + method='GET', + url=url, + bucket=Bucket, + auth=CosS3Auth(self._conf, path, params=params), + params=params, + headers=headers, + ci_request=True) + + data = xml_to_dict(rt.content) + # 单个元素时将dict转为list + format_dict(data, ['MediaWorkflowList']) + return data + + def ci_delete_workflow(self, Bucket, WorkflowId, **kwargs): + """ 删除工作流接口 https://cloud.tencent.com/document/product/460/76860 + + :param Bucket(string): 存储桶名称. + :param WorkflowId(string): 需要删除的工作流ID. + :param kwargs(dict): 设置请求的headers. + :return(dict): 查询成功返回的结果,dict类型. + + .. code-block:: python + + config = CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key, Token=token) # 获取配置对象 + client = CosS3Client(config) + # 删除指定工作流 + response = client.ci_delete_workflow( + Bucket=bucket_name, + WorkflowId='w1bdxxxxxxxxxxxxxxxxx94a9', + ) + print(response) + return response + """ + headers = mapped(kwargs) + final_headers = {} + params = {} + for key in headers: + if key.startswith("response"): + params[key] = headers[key] + else: + final_headers[key] = headers[key] + headers = final_headers + + params = format_values(params) + + path = "/workflow/" + WorkflowId + url = self._conf.uri(bucket=Bucket, path=path, endpoint=self._conf._endpoint_ci) + + logger.info("ci_delete_workflow result, url=:{url} ,headers=:{headers}, params=:{params}".format( + url=url, + headers=headers, + params=params)) + rt = self.send_request( + method='DELETE', + url=url, + bucket=Bucket, + auth=CosS3Auth(self._conf, path, params=params), + params=params, + headers=headers, + ci_request=True) + + data = xml_to_dict(rt.content) + return data + def ci_trigger_workflow(self, Bucket, WorkflowId, Key, **kwargs): """ 触发工作流接口 https://cloud.tencent.com/document/product/436/54641 @@ -8706,14 +8974,17 @@ def ci_create_file_hash_job(self, Bucket, InputObject, return self._ci_create_file_process_job(Bucket, Body=body, **kwargs) - def ci_create_file_uncompress_job(self, Bucket, InputObject, - FileUncompressConfig, QueueId=None, CallBack=None, CallBackFormat=None, - CallBackType=None, CallBackMqConfig=None, UserData=None, **kwargs): + def ci_create_file_uncompress_job(self, Bucket, InputObject, OutputBucket, + OutputRegion, FileUncompressConfig, QueueId=None, CallBack=None, + CallBackFormat=None, CallBackType=None, CallBackMqConfig=None, + UserData=None, **kwargs): """ 创建文件解压任务接口 https://cloud.tencent.com/document/product/436/83110 :param Bucket(string): 存储桶名称. :param QueueId(string): 任务所在的队列 ID. :param InputObject(string): 文件在 COS 上的文件路径,Bucket 由 Host 指定. + :param OutputBucket(string): 存储结果的存储桶. + :param OutputRegion(string): 存储结果的存储桶的地域. :param FileUncompressConfig(dict): 指定文件解压的处理规则. :param CallBack(string): 任务结束回调,回调Url :param CallBackFormat(string): 任务回调格式,JSON 或 XML,默认 XML,优先级高于队列的回调格式 @@ -8745,6 +9016,10 @@ def ci_create_file_uncompress_job(self, Bucket, InputObject, 'Tag': 'FileUncompress', 'Operation': { 'FileUncompressConfig': FileUncompressConfig, + 'Output': { + 'Bucket': OutputBucket, + 'Region': OutputRegion, + } } } if QueueId: @@ -8880,7 +9155,7 @@ def ci_get_file_process_jobs(self, Bucket, JobIDs, **kwargs): return data def ci_file_zip_preview(self, Bucket, Key, **kwargs): - """ci_file_zip_preview 压缩文件预览接口 + """ci_file_zip_preview 压缩文件预览接口 https://cloud.tencent.com/document/product/436/93032 :param Bucket(string): 存储桶名称. :param Key(string): COS路径.