cos-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,185 @@
1
+ import { generateCode } from "../utils.js";
2
+ export class CIAIService {
3
+ bucket;
4
+ region;
5
+ cos;
6
+ constructor(bucket, region, cos) {
7
+ this.bucket = bucket;
8
+ this.region = region;
9
+ this.cos = cos;
10
+ }
11
+ // 图片处理-图片超分-云上处理
12
+ async aiSuperResolution(objectKey) {
13
+ try {
14
+ const result = await new Promise((resolve, reject) => {
15
+ const fileName = objectKey.split("/").pop(); // 提取文件名和后缀
16
+ this.cos.request({
17
+ Bucket: this.bucket, // 存储桶,必须字段
18
+ Region: this.region, // 存储桶所在地域,必须字段 如 ap-beijing
19
+ Key: objectKey, // 对象文件名,例如:folder/document.jpg。
20
+ Method: "POST", // 固定值
21
+ Action: "image_process", // 固定值
22
+ Headers: {
23
+ "Pic-Operations": JSON.stringify({
24
+ rules: [
25
+ {
26
+ fileid: `${Date.now()}-${generateCode(6)}-${fileName}`,
27
+ rule: "ci-process=AISuperResolution",
28
+ },
29
+ ],
30
+ }),
31
+ },
32
+ }, function (error, data) {
33
+ if (error) {
34
+ // 处理请求失败
35
+ reject(error);
36
+ }
37
+ else {
38
+ // 处理请求成功
39
+ resolve(data);
40
+ }
41
+ });
42
+ });
43
+ return {
44
+ isSuccess: true,
45
+ message: "图片超分成功",
46
+ data: result,
47
+ };
48
+ }
49
+ catch (error) {
50
+ return {
51
+ isSuccess: false,
52
+ message: "图片超分失败",
53
+ data: error,
54
+ };
55
+ }
56
+ }
57
+ // 图片处理-图片质量评分
58
+ async assessQuality(objectKey) {
59
+ try {
60
+ const result = await this.cos.request({
61
+ Bucket: this.bucket,
62
+ Region: this.region,
63
+ Method: "GET",
64
+ Key: objectKey,
65
+ Query: {
66
+ "ci-process": "AssessQuality",
67
+ },
68
+ });
69
+ return {
70
+ isSuccess: true,
71
+ message: "图片处理成功",
72
+ data: result,
73
+ };
74
+ }
75
+ catch (error) {
76
+ return {
77
+ isSuccess: false,
78
+ message: "图片处理失败",
79
+ data: error,
80
+ };
81
+ }
82
+ }
83
+ // 图片处理-抠图-云上处理
84
+ async aiPicMatting(objectKey, width, height) {
85
+ try {
86
+ const result = await new Promise((resolve, reject) => {
87
+ const fileName = objectKey.split("/").pop(); // 提取文件名和后缀
88
+ this.cos.request({
89
+ Bucket: this.bucket, // 存储桶,必须字段
90
+ Region: this.region, // 存储桶所在地域,必须字段 如 ap-beijing
91
+ Key: objectKey, // 对象文件名,例如:folder/document.jpg。
92
+ Method: "POST", // 固定值
93
+ Action: "image_process", // 固定值
94
+ Headers: {
95
+ "Pic-Operations": JSON.stringify({
96
+ rules: [
97
+ {
98
+ fileid: `${Date.now()}-${generateCode(6)}-${fileName}`,
99
+ rule: "ci-process=AIImageCrop&width=" + width + "&height=" + height,
100
+ },
101
+ ],
102
+ }),
103
+ },
104
+ }, function (error, data) {
105
+ if (error) {
106
+ // 处理请求失败
107
+ reject(error);
108
+ }
109
+ else {
110
+ // 处理请求成功
111
+ resolve(data);
112
+ }
113
+ });
114
+ });
115
+ // const localPath = "结果.png"; // 填写要写入的本地文件路径
116
+ // if (result.Body) {
117
+ // fs.writeFileSync(localPath, result.Body); // 将图片内容保存本地路径
118
+ // } else {
119
+ // throw new Error("Result body is undefined");
120
+ // }
121
+ // if (!result.Body) {
122
+ // throw new Error("Result body is undefined");
123
+ // }
124
+ // const base64Image = `data:image/jpeg;base64,${typeof result.Body === "string" ? Buffer.from(result.Body).toString("base64") : result.Body.toString("base64")}`;
125
+ return {
126
+ isSuccess: true,
127
+ message: "图片处理成功",
128
+ data: result,
129
+ };
130
+ }
131
+ catch (error) {
132
+ return {
133
+ isSuccess: false,
134
+ message: "图片处理失败",
135
+ data: error,
136
+ };
137
+ }
138
+ }
139
+ // 二维码识别-下载时识别
140
+ async aiQrcode(objectKey) {
141
+ try {
142
+ const result = await new Promise((resolve, reject) => {
143
+ const config = {
144
+ // 需要替换成您自己的存储桶信息
145
+ Bucket: this.bucket, // 存储桶,必须,
146
+ Region: this.region, // 存储桶所在地域,必须字段,
147
+ };
148
+ const key = objectKey;
149
+ const host = config.Bucket + '.cos.' + config.Region + '.myqcloud.com/' + key;
150
+ const url = 'https://' + host;
151
+ this.cos.request({
152
+ Method: 'GET',
153
+ Key: key,
154
+ Url: url,
155
+ Query: {
156
+ 'ci-process': 'QRcode', // 数据万象处理能力,二维码识别固定为 QRcode,
157
+ 'cover': 0
158
+ },
159
+ }, function (error, data) {
160
+ if (error) {
161
+ // 处理请求失败
162
+ reject(error);
163
+ }
164
+ else {
165
+ // 处理请求成功
166
+ resolve(data);
167
+ }
168
+ });
169
+ });
170
+ return {
171
+ isSuccess: true,
172
+ message: "二维码识别成功",
173
+ data: result,
174
+ };
175
+ }
176
+ catch (error) {
177
+ return {
178
+ isSuccess: false,
179
+ message: "二维码识别失败",
180
+ data: error,
181
+ };
182
+ }
183
+ }
184
+ }
185
+ //# sourceMappingURL=ai.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.service.js","sourceRoot":"","sources":["../../../src/services/ci/ai.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import COS from "cos-nodejs-sdk-v5";
2
+ import { z } from 'zod';
3
+ import { generateCode } from "../utils.js";
4
+ export const GetSnapshotParamsSchema = z.object({
5
+ objectKey: z.string(),
6
+ time: z.number().optional()
7
+ });
8
+ export class CIDocService {
9
+ bucket;
10
+ region;
11
+ cos;
12
+ constructor(bucket, region, cos) {
13
+ this.bucket = bucket;
14
+ this.region = region;
15
+ this.cos = cos;
16
+ }
17
+ async createDocToPdfJobs(objectKey) {
18
+ try {
19
+ var host = this.bucket + '.ci.' + this.region + '.myqcloud.com/doc_jobs';
20
+ var url = 'https://' + host;
21
+ const lastDotIndex = objectKey.lastIndexOf('.');
22
+ const base = (lastDotIndex === -1)
23
+ ? objectKey
24
+ : objectKey.substring(0, lastDotIndex);
25
+ const now = new Date();
26
+ const formattedDate = [
27
+ now.getFullYear(),
28
+ String(now.getMonth() + 1).padStart(2, '0'), // 月份补零
29
+ String(now.getDate()).padStart(2, '0') // 日期补零
30
+ ].join('');
31
+ const outPutObject = `${formattedDate}_\${SheetID}/${base}_pdf_${generateCode(6)}.pdf`;
32
+ var body = COS.util.json2xml({
33
+ Request: {
34
+ Tag: 'DocProcess',
35
+ Input: {
36
+ Object: objectKey, // 存在cos里的路径
37
+ },
38
+ Operation: {
39
+ DocProcess: {
40
+ TgtType: 'pdf'
41
+ },
42
+ Output: {
43
+ Bucket: this.bucket,
44
+ Region: this.region,
45
+ Object: outPutObject, // 转码后存到cos的路径
46
+ },
47
+ },
48
+ },
49
+ });
50
+ const createResult = await new Promise((resolve, reject) => {
51
+ this.cos.request({
52
+ Key: 'doc_jobs',
53
+ Method: "POST", // 固定值
54
+ Url: url,
55
+ Body: body,
56
+ ContentType: 'application/xml',
57
+ }, (error, data) => error ? reject(error) : resolve(data));
58
+ });
59
+ try {
60
+ const jobsDetail = createResult.Response.JobsDetail;
61
+ const initialCode = jobsDetail.Code;
62
+ const initialState = jobsDetail.State;
63
+ if (initialCode == 'Failed') {
64
+ return { isSuccess: false, message: '文档转pdf失败', data: createResult };
65
+ }
66
+ if (initialState == 'Success') {
67
+ return {
68
+ isSuccess: true,
69
+ message: "文档转pdf成功",
70
+ data: createResult,
71
+ };
72
+ }
73
+ else {
74
+ const jobId = jobsDetail.JobId;
75
+ // 开始轮询
76
+ let pollResult;
77
+ let lastError = null;
78
+ const maxAttempts = 10;
79
+ const interval = 2000;
80
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
81
+ // 首次立即执行,后续等待间隔
82
+ if (attempt > 0)
83
+ await new Promise(r => setTimeout(r, interval));
84
+ try {
85
+ // 查询任务状态
86
+ const { data: getResult } = await this.describeDocProcessJob(jobId);
87
+ const describeJobsDetail = getResult.Response.JobsDetail;
88
+ const describeJobCode = describeJobsDetail.Code;
89
+ const describeJobState = describeJobsDetail.State;
90
+ // 处理终态
91
+ if (describeJobCode === 'Success' && describeJobState == 'Success') {
92
+ pollResult = getResult;
93
+ break;
94
+ }
95
+ else if (describeJobCode === 'Failed') {
96
+ return {
97
+ isSuccess: false,
98
+ message: '文档转换失败',
99
+ data: getResult
100
+ };
101
+ }
102
+ }
103
+ catch (err) {
104
+ lastError = err; // 记录错误继续重试
105
+ }
106
+ }
107
+ if (!pollResult) {
108
+ return {
109
+ isSuccess: false,
110
+ message: `轮询超时(${maxAttempts}次未完成)`,
111
+ data: createResult
112
+ };
113
+ }
114
+ return {
115
+ isSuccess: true,
116
+ message: "文档转码成功",
117
+ data: pollResult
118
+ };
119
+ }
120
+ }
121
+ catch (error) {
122
+ return {
123
+ isSuccess: false,
124
+ message: "文档转pdf失败",
125
+ data: error,
126
+ };
127
+ }
128
+ }
129
+ catch (error) {
130
+ return {
131
+ isSuccess: false,
132
+ message: "文档转pdf失败",
133
+ data: error,
134
+ };
135
+ }
136
+ }
137
+ async describeDocProcessJob(jobId) {
138
+ try {
139
+ let host = this.bucket + '.ci.' + this.region + '.myqcloud.com';
140
+ let url = 'https://' + host + '/doc_jobs/' + jobId;
141
+ const result = await new Promise((resolve, reject) => {
142
+ this.cos.request({
143
+ Bucket: this.bucket, // Bucket 格式:test-1250000000
144
+ Region: this.region,
145
+ Method: 'GET',
146
+ Key: 'doc_jobs/' + jobId,
147
+ Url: url,
148
+ }, function (error, data) {
149
+ if (error) {
150
+ // 处理请求失败
151
+ reject(error);
152
+ }
153
+ else {
154
+ // 处理请求成功
155
+ resolve(data);
156
+ //获取返回的jobid, 去调查询任务接口, 返回具体信息
157
+ }
158
+ });
159
+ });
160
+ return {
161
+ isSuccess: true,
162
+ message: "文档转pdf成功",
163
+ data: result,
164
+ };
165
+ }
166
+ catch (error) {
167
+ return {
168
+ isSuccess: false,
169
+ message: "文档转pdf失败",
170
+ data: error,
171
+ };
172
+ }
173
+ }
174
+ }
175
+ //# sourceMappingURL=doc.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.service.js","sourceRoot":"","sources":["../../../src/services/ci/doc.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ import { z } from "zod";
2
+ export const ImageSearchPicParamsSchema = z.object({
3
+ uri: z.string()
4
+ });
5
+ export const ImageSearchTextParamsSchema = z.object({
6
+ text: z.string()
7
+ });
8
+ export class CIMateInsightService {
9
+ bucket;
10
+ region;
11
+ cos;
12
+ datasetName;
13
+ constructor(bucket, region, datasetName, cos) {
14
+ this.bucket = bucket;
15
+ this.region = region;
16
+ this.datasetName = datasetName;
17
+ this.cos = cos;
18
+ }
19
+ async imageSearchPic(params) {
20
+ // 验证并解析参数
21
+ const validParams = ImageSearchPicParamsSchema.parse(params);
22
+ const { uri } = validParams;
23
+ try {
24
+ const key = 'datasetquery/imagesearch'; // 固定值
25
+ const appid = this.bucket.split('-').pop();
26
+ const host = `${appid}.ci.${this.region}.myqcloud.com`;
27
+ const url = `https://${host}/${key}`;
28
+ const body = JSON.stringify({
29
+ DatasetName: this.datasetName,
30
+ Mode: 'pic',
31
+ URI: uri
32
+ });
33
+ const result = await this.cos.request({
34
+ Method: 'POST', // 固定值,必须
35
+ Key: key, // 必须
36
+ Url: url, // 请求的url,必须
37
+ Body: body, // 请求体参数,必须
38
+ Headers: {
39
+ // 设置请求体为 json,固定值,必须
40
+ 'Content-Type': 'application/json',
41
+ // 设置响应体为json,固定值,必须
42
+ Accept: 'application/json',
43
+ },
44
+ });
45
+ return {
46
+ success: true,
47
+ message: '图像检索成功',
48
+ // data: result.Body.toString()
49
+ data: result
50
+ };
51
+ }
52
+ catch (error) {
53
+ return {
54
+ isSuccess: false,
55
+ message: '图像检索失败',
56
+ data: error,
57
+ };
58
+ }
59
+ }
60
+ async imageSearchText(params) {
61
+ // 验证并解析参数
62
+ const validParams = ImageSearchTextParamsSchema.parse(params);
63
+ const { text } = validParams;
64
+ try {
65
+ const key = 'datasetquery/imagesearch'; // 固定值
66
+ const appid = this.bucket.split('-').pop();
67
+ const host = `${appid}.ci.${this.region}.myqcloud.com`;
68
+ const url = `https://${host}/${key}`;
69
+ const body = JSON.stringify({
70
+ DatasetName: this.datasetName,
71
+ Mode: 'text',
72
+ Text: text
73
+ });
74
+ const result = await this.cos.request({
75
+ Method: 'POST', // 固定值,必须
76
+ Key: key, // 必须
77
+ Url: url, // 请求的url,必须
78
+ Body: body, // 请求体参数,必须
79
+ Headers: {
80
+ // 设置请求体为 json,固定值,必须
81
+ 'Content-Type': 'application/json',
82
+ // 设置响应体为json,固定值,必须
83
+ Accept: 'application/json',
84
+ },
85
+ });
86
+ return {
87
+ isSuccess: true,
88
+ message: '图像检索成功',
89
+ data: result
90
+ };
91
+ }
92
+ catch (error) {
93
+ return {
94
+ isSuccess: false,
95
+ message: '请求异常: ${error.message}',
96
+ data: error,
97
+ };
98
+ }
99
+ }
100
+ }
101
+ //# sourceMappingURL=mateInsight.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mateInsight.service.js","sourceRoot":"","sources":["../../../src/services/ci/mateInsight.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;CAChB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;CACjB,CAAC,CAAC;AAGH,MAAM,OAAO,oBAAoB;IAC/B,MAAM,CAAS;IACf,MAAM,CAAS;IACf,GAAG,CAAM;IACT,WAAW,CAAS;IACpB,YAAY,MAAc,EAAE,MAAa,EAAC,WAAkB,EAAE,GAAQ;QACpE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAA4B;QAC/C,UAAU;QACV,MAAM,WAAW,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,EAAC,GAAG,WAAW,CAAC;QAE3B,IAAI,CAAC;YAEH,MAAM,GAAG,GAAG,0BAA0B,CAAC,CAAC,MAAM;YAC9C,MAAM,KAAK,GAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC,MAAM,eAAe,CAAC;YACvD,MAAM,GAAG,GAAG,WAAW,IAAI,IAAI,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,KAAK;gBACX,GAAG,EAAE,GAAG;aACT,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CACrC;gBACE,MAAM,EAAE,MAAM,EAAE,SAAS;gBACzB,GAAG,EAAE,GAAG,EAAE,KAAK;gBACf,GAAG,EAAE,GAAG,EAAE,YAAY;gBACtB,IAAI,EAAE,IAAI,EAAE,WAAW;gBACvB,OAAO,EAAE;oBACP,qBAAqB;oBACrB,cAAc,EAAE,kBAAkB;oBAClC,oBAAoB;oBACpB,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAA;YAGF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,QAAQ;gBACjB,+BAA+B;gBAC/B,IAAI,EAAE,MAAM;aACb,CAAC;QAEJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE,KAAK;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAA6B;QACjD,UAAU;QACV,MAAM,WAAW,GAAG,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,EAAE,IAAI,EAAC,GAAG,WAAW,CAAC;QAE5B,IAAI,CAAC;YAEH,MAAM,GAAG,GAAG,0BAA0B,CAAC,CAAC,MAAM;YAC9C,MAAM,KAAK,GAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAE5C,MAAM,IAAI,GAAG,GAAG,KAAK,OAAO,IAAI,CAAC,MAAM,eAAe,CAAC;YACvD,MAAM,GAAG,GAAG,WAAW,IAAI,IAAI,GAAG,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI;aACX,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CACrC;gBACE,MAAM,EAAE,MAAM,EAAE,SAAS;gBACzB,GAAG,EAAE,GAAG,EAAE,KAAK;gBACf,GAAG,EAAE,GAAG,EAAE,YAAY;gBACtB,IAAI,EAAE,IAAI,EAAE,WAAW;gBACvB,OAAO,EAAE;oBACP,qBAAqB;oBACrB,cAAc,EAAE,kBAAkB;oBAClC,oBAAoB;oBACpB,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAA;YAEF,OAAO;gBACL,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE,MAAM;aACb,CAAA;QAGH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,wBAAwB;gBACjC,IAAI,EAAE,KAAK;aACZ,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,163 @@
1
+ import COS from "cos-nodejs-sdk-v5";
2
+ export class CIMediaService {
3
+ bucket;
4
+ region;
5
+ cos;
6
+ constructor(bucket, region, cos) {
7
+ this.bucket = bucket;
8
+ this.region = region;
9
+ this.cos = cos;
10
+ }
11
+ async createMediaSmartCoverJob(objectKey) {
12
+ try {
13
+ var host = this.bucket + '.ci.' + this.region + '.myqcloud.com/jobs';
14
+ var url = 'https://' + host;
15
+ const lastDotIndex = objectKey.lastIndexOf('.');
16
+ const base = (lastDotIndex === -1)
17
+ ? objectKey
18
+ : objectKey.substring(0, lastDotIndex);
19
+ const outPutObject = `${base}_\${jobid}_\${number}`;
20
+ var body = COS.util.json2xml({
21
+ Request: {
22
+ Tag: 'SmartCover',
23
+ Input: {
24
+ Object: objectKey, // 存在cos里的路径
25
+ },
26
+ Operation: {
27
+ Output: {
28
+ Bucket: this.bucket,
29
+ Region: this.region,
30
+ Object: outPutObject, // 转码后存到cos的路径
31
+ },
32
+ SmartCover: {
33
+ Count: 1,
34
+ },
35
+ },
36
+ },
37
+ });
38
+ const createResult = await new Promise((resolve, reject) => {
39
+ this.cos.request({
40
+ Key: 'jobs',
41
+ Method: "POST", // 固定值
42
+ Url: url,
43
+ Body: body,
44
+ ContentType: 'application/xml',
45
+ }, (error, data) => error ? reject(error) : resolve(data));
46
+ });
47
+ try {
48
+ const jobsDetail = createResult.Response.JobsDetail;
49
+ const initialCode = jobsDetail.Code;
50
+ const initialState = jobsDetail.State;
51
+ if (initialCode == 'Failed') {
52
+ return { isSuccess: false, message: '智能封面任务失败', data: createResult };
53
+ }
54
+ if (initialState == 'Success') {
55
+ return {
56
+ isSuccess: true,
57
+ message: "智能封面任务成功",
58
+ data: createResult,
59
+ };
60
+ }
61
+ else {
62
+ const jobId = jobsDetail.JobId;
63
+ // 开始轮询
64
+ let pollResult;
65
+ let lastError = null;
66
+ const maxAttempts = 10;
67
+ const interval = 4000;
68
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
69
+ // 首次立即执行,后续等待间隔
70
+ if (attempt > 0)
71
+ await new Promise(r => setTimeout(r, interval));
72
+ try {
73
+ // 查询任务状态
74
+ const { data: getResult } = await this.describeMediaJob(jobId);
75
+ const describeJobsDetail = getResult.Response.JobsDetail;
76
+ const describeJobCode = describeJobsDetail.Code;
77
+ const describeJobState = describeJobsDetail.State;
78
+ // 处理终态
79
+ if (describeJobCode === 'Success' && describeJobState == 'Success') {
80
+ pollResult = getResult;
81
+ break;
82
+ }
83
+ else if (describeJobCode === 'Failed') {
84
+ return {
85
+ isSuccess: false,
86
+ message: '智能封面任务失败',
87
+ data: getResult
88
+ };
89
+ }
90
+ }
91
+ catch (err) {
92
+ lastError = err; // 记录错误继续重试
93
+ }
94
+ }
95
+ if (!pollResult) {
96
+ return {
97
+ isSuccess: false,
98
+ message: `轮询超时(${maxAttempts}次未完成)`,
99
+ data: createResult
100
+ };
101
+ }
102
+ return {
103
+ isSuccess: true,
104
+ message: "智能封面任务成功",
105
+ data: pollResult
106
+ };
107
+ }
108
+ }
109
+ catch (error) {
110
+ return {
111
+ isSuccess: false,
112
+ message: "智能封面任务失败",
113
+ data: error,
114
+ };
115
+ }
116
+ }
117
+ catch (error) {
118
+ return {
119
+ isSuccess: false,
120
+ message: "智能封面任务失败",
121
+ data: error,
122
+ };
123
+ }
124
+ }
125
+ async describeMediaJob(jobId) {
126
+ try {
127
+ let host = this.bucket + '.ci.' + this.region + '.myqcloud.com';
128
+ let url = 'https://' + host + '/doc_jobs/' + jobId;
129
+ const result = await new Promise((resolve, reject) => {
130
+ this.cos.request({
131
+ Bucket: this.bucket, // Bucket 格式:test-1250000000
132
+ Region: this.region,
133
+ Method: 'GET',
134
+ Key: 'doc_jobs/' + jobId,
135
+ Url: url,
136
+ }, function (error, data) {
137
+ if (error) {
138
+ // 处理请求失败
139
+ reject(error);
140
+ }
141
+ else {
142
+ // 处理请求成功
143
+ resolve(data);
144
+ //获取返回的jobid, 去调查询任务接口, 返回具体信息
145
+ }
146
+ });
147
+ });
148
+ return {
149
+ isSuccess: true,
150
+ message: "智能封面任务查询成功",
151
+ data: result,
152
+ };
153
+ }
154
+ catch (error) {
155
+ return {
156
+ isSuccess: false,
157
+ message: "智能封面任务查询失败",
158
+ data: error,
159
+ };
160
+ }
161
+ }
162
+ }
163
+ //# sourceMappingURL=media.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../../src/services/ci/media.service.ts"],"names":[],"mappings":"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"}