@dofe/infra-shared-services 0.1.16 → 0.1.18

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.
Files changed (267) hide show
  1. package/dist/agentx/agentx-client.module.d.ts.map +1 -1
  2. package/dist/agentx/agentx-client.module.js.map +1 -1
  3. package/dist/agentx/agentx-client.service.d.ts.map +1 -1
  4. package/dist/agentx/agentx-client.service.js.map +1 -1
  5. package/dist/agentx/agentx-file-client.service.d.ts.map +1 -1
  6. package/dist/agentx/agentx-file-client.service.js.map +1 -1
  7. package/dist/agentx/index.d.ts.map +1 -1
  8. package/dist/agentx/index.js.map +1 -1
  9. package/dist/agentx/interfaces/file.interface.d.ts.map +1 -1
  10. package/dist/agentx/interfaces/file.interface.js.map +1 -1
  11. package/dist/agentx/interfaces/task.interface.d.ts.map +1 -1
  12. package/dist/agentx/interfaces/task.interface.js.map +1 -1
  13. package/dist/email/dto/email.dto.d.ts +70 -0
  14. package/dist/email/dto/email.dto.d.ts.map +1 -0
  15. package/dist/email/dto/email.dto.js +58 -0
  16. package/dist/email/dto/email.dto.js.map +1 -0
  17. package/dist/email/email.module.d.ts.map +1 -1
  18. package/dist/email/email.module.js.map +1 -1
  19. package/dist/email/email.service.d.ts.map +1 -1
  20. package/dist/email/email.service.js.map +1 -1
  21. package/dist/email/index.d.ts +5 -0
  22. package/dist/email/index.d.ts.map +1 -0
  23. package/dist/email/index.js +26 -0
  24. package/dist/email/index.js.map +1 -0
  25. package/dist/file-cdn/dto/file-cdn.dto.d.ts.map +1 -1
  26. package/dist/file-cdn/dto/file-cdn.dto.js.map +1 -1
  27. package/dist/file-cdn/file-cdn.client.d.ts +1 -1
  28. package/dist/file-cdn/file-cdn.client.d.ts.map +1 -1
  29. package/dist/file-cdn/file-cdn.client.js +2 -2
  30. package/dist/file-cdn/file-cdn.client.js.map +1 -1
  31. package/dist/file-cdn/file-cdn.module.d.ts.map +1 -1
  32. package/dist/file-cdn/file-cdn.module.js +2 -2
  33. package/dist/file-cdn/file-cdn.module.js.map +1 -1
  34. package/dist/file-cdn/index.d.ts.map +1 -1
  35. package/dist/file-cdn/index.js.map +1 -1
  36. package/dist/file-storage/bucket-resolver.d.ts +1 -1
  37. package/dist/file-storage/bucket-resolver.d.ts.map +1 -1
  38. package/dist/file-storage/bucket-resolver.js.map +1 -1
  39. package/dist/file-storage/file-storage.factory.d.ts +1 -1
  40. package/dist/file-storage/file-storage.factory.d.ts.map +1 -1
  41. package/dist/file-storage/file-storage.factory.js +7 -7
  42. package/dist/file-storage/file-storage.factory.js.map +1 -1
  43. package/dist/file-storage/file-storage.module.d.ts.map +1 -1
  44. package/dist/file-storage/file-storage.module.js.map +1 -1
  45. package/dist/file-storage/file-storage.service.d.ts +1 -1
  46. package/dist/file-storage/file-storage.service.d.ts.map +1 -1
  47. package/dist/file-storage/file-storage.service.js.map +1 -1
  48. package/dist/file-storage/index.d.ts +1 -1
  49. package/dist/file-storage/index.d.ts.map +1 -1
  50. package/dist/file-storage/index.js.map +1 -1
  51. package/dist/file-storage/types.d.ts +1 -1
  52. package/dist/file-storage/types.d.ts.map +1 -1
  53. package/dist/file-storage/types.js.map +1 -1
  54. package/dist/index.d.ts +3 -0
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +3 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/ip-geo/continent-mapping.d.ts.map +1 -1
  59. package/dist/ip-geo/continent-mapping.js.map +1 -1
  60. package/dist/ip-geo/index.d.ts +33 -0
  61. package/dist/ip-geo/index.d.ts.map +1 -0
  62. package/dist/ip-geo/index.js +41 -0
  63. package/dist/ip-geo/index.js.map +1 -0
  64. package/dist/ip-geo/ip-geo.module.d.ts.map +1 -1
  65. package/dist/ip-geo/ip-geo.module.js.map +1 -1
  66. package/dist/ip-geo/ip-geo.service.d.ts.map +1 -1
  67. package/dist/ip-geo/ip-geo.service.js.map +1 -1
  68. package/dist/ip-info/index.d.ts +7 -0
  69. package/dist/ip-info/index.d.ts.map +1 -0
  70. package/dist/ip-info/index.js +13 -0
  71. package/dist/ip-info/index.js.map +1 -0
  72. package/dist/ip-info/ip-info.client.d.ts.map +1 -1
  73. package/dist/ip-info/ip-info.client.js.map +1 -1
  74. package/dist/ip-info/ip-info.module.d.ts.map +1 -1
  75. package/dist/ip-info/ip-info.module.js.map +1 -1
  76. package/dist/ip-info/ip-info.service.d.ts.map +1 -1
  77. package/dist/ip-info/ip-info.service.js +2 -3
  78. package/dist/ip-info/ip-info.service.js.map +1 -1
  79. package/dist/ip-info-client/dto/ip-info.dto.d.ts.map +1 -1
  80. package/dist/ip-info-client/dto/ip-info.dto.js.map +1 -1
  81. package/dist/ip-info-client/index.d.ts.map +1 -1
  82. package/dist/ip-info-client/index.js.map +1 -1
  83. package/dist/ip-info-client/ip-info.client.d.ts.map +1 -1
  84. package/dist/ip-info-client/ip-info.client.js.map +1 -1
  85. package/dist/ip-info-client/ip-info.module.d.ts.map +1 -1
  86. package/dist/ip-info-client/ip-info.module.js.map +1 -1
  87. package/dist/notification/index.d.ts.map +1 -1
  88. package/dist/notification/index.js.map +1 -1
  89. package/dist/notification/notification.module.d.ts.map +1 -1
  90. package/dist/notification/notification.module.js.map +1 -1
  91. package/dist/notification/notification.service.d.ts.map +1 -1
  92. package/dist/notification/notification.service.js.map +1 -1
  93. package/dist/notification/notification.types.d.ts.map +1 -1
  94. package/dist/notification/notification.types.js.map +1 -1
  95. package/dist/ocr/index.d.ts +33 -0
  96. package/dist/ocr/index.d.ts.map +1 -0
  97. package/dist/ocr/index.js +53 -0
  98. package/dist/ocr/index.js.map +1 -0
  99. package/dist/ocr/ocr.module.d.ts.map +1 -1
  100. package/dist/ocr/ocr.module.js.map +1 -1
  101. package/dist/ocr/ocr.service.d.ts.map +1 -1
  102. package/dist/ocr/ocr.service.js.map +1 -1
  103. package/dist/openspeech/index.d.ts +35 -0
  104. package/dist/openspeech/index.d.ts.map +1 -0
  105. package/dist/openspeech/index.js +56 -0
  106. package/dist/openspeech/index.js.map +1 -0
  107. package/dist/openspeech/openspeech.client.d.ts +304 -0
  108. package/dist/openspeech/openspeech.client.d.ts.map +1 -0
  109. package/dist/openspeech/openspeech.client.js +405 -0
  110. package/dist/openspeech/openspeech.client.js.map +1 -0
  111. package/dist/openspeech/openspeech.factory.d.ts +247 -0
  112. package/dist/openspeech/openspeech.factory.d.ts.map +1 -0
  113. package/dist/openspeech/openspeech.factory.js +406 -0
  114. package/dist/openspeech/openspeech.factory.js.map +1 -0
  115. package/dist/openspeech/openspeech.module.d.ts +45 -0
  116. package/dist/openspeech/openspeech.module.d.ts.map +1 -0
  117. package/dist/openspeech/openspeech.module.js +68 -0
  118. package/dist/openspeech/openspeech.module.js.map +1 -0
  119. package/dist/openspeech/providers/aliyun.provider.d.ts +125 -0
  120. package/dist/openspeech/providers/aliyun.provider.d.ts.map +1 -0
  121. package/dist/openspeech/providers/aliyun.provider.js +274 -0
  122. package/dist/openspeech/providers/aliyun.provider.js.map +1 -0
  123. package/dist/openspeech/providers/base.provider.d.ts +98 -0
  124. package/dist/openspeech/providers/base.provider.d.ts.map +1 -0
  125. package/dist/openspeech/providers/base.provider.js +87 -0
  126. package/dist/openspeech/providers/base.provider.js.map +1 -0
  127. package/dist/openspeech/providers/index.d.ts +10 -0
  128. package/dist/openspeech/providers/index.d.ts.map +1 -0
  129. package/dist/openspeech/providers/index.js +26 -0
  130. package/dist/openspeech/providers/index.js.map +1 -0
  131. package/dist/openspeech/providers/volcengine-streaming.provider.d.ts +291 -0
  132. package/dist/openspeech/providers/volcengine-streaming.provider.d.ts.map +1 -0
  133. package/dist/openspeech/providers/volcengine-streaming.provider.js +1358 -0
  134. package/dist/openspeech/providers/volcengine-streaming.provider.js.map +1 -0
  135. package/dist/openspeech/providers/volcengine.provider.d.ts +144 -0
  136. package/dist/openspeech/providers/volcengine.provider.d.ts.map +1 -0
  137. package/dist/openspeech/providers/volcengine.provider.js +337 -0
  138. package/dist/openspeech/providers/volcengine.provider.js.map +1 -0
  139. package/dist/openspeech/types.d.ts +408 -0
  140. package/dist/openspeech/types.d.ts.map +1 -0
  141. package/dist/openspeech/types.js +11 -0
  142. package/dist/openspeech/types.js.map +1 -0
  143. package/dist/sms/index.d.ts +5 -0
  144. package/dist/sms/index.d.ts.map +1 -0
  145. package/dist/sms/index.js +29 -0
  146. package/dist/sms/index.js.map +1 -0
  147. package/dist/sms/sms.factory.d.ts.map +1 -1
  148. package/dist/sms/sms.factory.js +6 -6
  149. package/dist/sms/sms.factory.js.map +1 -1
  150. package/dist/sms/sms.module.d.ts.map +1 -1
  151. package/dist/sms/sms.module.js.map +1 -1
  152. package/dist/sms/sms.service.d.ts.map +1 -1
  153. package/dist/sms/sms.service.js.map +1 -1
  154. package/dist/sms/types.d.ts.map +1 -1
  155. package/dist/sms/types.js.map +1 -1
  156. package/dist/streaming-asr/index.d.ts +45 -0
  157. package/dist/streaming-asr/index.d.ts.map +1 -0
  158. package/dist/streaming-asr/index.js +66 -0
  159. package/dist/streaming-asr/index.js.map +1 -0
  160. package/dist/streaming-asr/streaming-asr.module.d.ts.map +1 -1
  161. package/dist/streaming-asr/streaming-asr.module.js.map +1 -1
  162. package/dist/streaming-asr/streaming-asr.service.d.ts.map +1 -1
  163. package/dist/streaming-asr/streaming-asr.service.js.map +1 -1
  164. package/dist/streaming-asr/types.d.ts.map +1 -1
  165. package/dist/streaming-asr/types.js.map +1 -1
  166. package/dist/system-health/index.d.ts +7 -0
  167. package/dist/system-health/index.d.ts.map +1 -0
  168. package/dist/system-health/index.js +25 -0
  169. package/dist/system-health/index.js.map +1 -0
  170. package/dist/system-health/system-health.controller.d.ts.map +1 -1
  171. package/dist/system-health/system-health.controller.js.map +1 -1
  172. package/dist/system-health/system-health.module.d.ts.map +1 -1
  173. package/dist/system-health/system-health.module.js.map +1 -1
  174. package/dist/system-health/system-health.service.d.ts.map +1 -1
  175. package/dist/system-health/system-health.service.js.map +1 -1
  176. package/dist/transcode/config/aliyun-oss.config.d.ts +14 -0
  177. package/dist/transcode/config/aliyun-oss.config.d.ts.map +1 -0
  178. package/dist/transcode/config/aliyun-oss.config.js +3 -0
  179. package/dist/transcode/config/aliyun-oss.config.js.map +1 -0
  180. package/dist/transcode/config/transcode.config.d.ts +55 -0
  181. package/dist/transcode/config/transcode.config.d.ts.map +1 -0
  182. package/dist/transcode/config/transcode.config.js +97 -0
  183. package/dist/transcode/config/transcode.config.js.map +1 -0
  184. package/dist/transcode/index.d.ts +27 -0
  185. package/dist/transcode/index.d.ts.map +1 -0
  186. package/dist/transcode/index.js +55 -0
  187. package/dist/transcode/index.js.map +1 -0
  188. package/dist/transcode/modules/aliyun-imm/aliyun-imm.client.d.ts +157 -0
  189. package/dist/transcode/modules/aliyun-imm/aliyun-imm.client.d.ts.map +1 -0
  190. package/dist/transcode/modules/aliyun-imm/aliyun-imm.client.js +879 -0
  191. package/dist/transcode/modules/aliyun-imm/aliyun-imm.client.js.map +1 -0
  192. package/dist/transcode/modules/aliyun-imm/aliyun-imm.module.d.ts +3 -0
  193. package/dist/transcode/modules/aliyun-imm/aliyun-imm.module.d.ts.map +1 -0
  194. package/dist/transcode/modules/aliyun-imm/aliyun-imm.module.js +23 -0
  195. package/dist/transcode/modules/aliyun-imm/aliyun-imm.module.js.map +1 -0
  196. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.client.d.ts +252 -0
  197. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.client.d.ts.map +1 -0
  198. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.client.js +1368 -0
  199. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.client.js.map +1 -0
  200. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.module.d.ts +3 -0
  201. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.module.d.ts.map +1 -0
  202. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.module.js +25 -0
  203. package/dist/transcode/modules/aliyun-oss/aliyun-oss-transcode.module.js.map +1 -0
  204. package/dist/transcode/modules/transcode-strategy/transcode-strategy.client.d.ts +118 -0
  205. package/dist/transcode/modules/transcode-strategy/transcode-strategy.client.d.ts.map +1 -0
  206. package/dist/transcode/modules/transcode-strategy/transcode-strategy.client.js +565 -0
  207. package/dist/transcode/modules/transcode-strategy/transcode-strategy.client.js.map +1 -0
  208. package/dist/transcode/modules/transcode-strategy/transcode-strategy.module.d.ts +3 -0
  209. package/dist/transcode/modules/transcode-strategy/transcode-strategy.module.d.ts.map +1 -0
  210. package/dist/transcode/modules/transcode-strategy/transcode-strategy.module.js +33 -0
  211. package/dist/transcode/modules/transcode-strategy/transcode-strategy.module.js.map +1 -0
  212. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.client.d.ts +93 -0
  213. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.client.d.ts.map +1 -0
  214. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.client.js +487 -0
  215. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.client.js.map +1 -0
  216. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.dto.d.ts +505 -0
  217. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.dto.d.ts.map +1 -0
  218. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.dto.js +10 -0
  219. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.dto.js.map +1 -0
  220. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.module.d.ts +3 -0
  221. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.module.d.ts.map +1 -0
  222. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.module.js +31 -0
  223. package/dist/transcode/modules/volcengine-tos/volcengine-tos-transcode.module.js.map +1 -0
  224. package/dist/transcode/types/transcode.types.d.ts +93 -0
  225. package/dist/transcode/types/transcode.types.d.ts.map +1 -0
  226. package/dist/transcode/types/transcode.types.js +3 -0
  227. package/dist/transcode/types/transcode.types.js.map +1 -0
  228. package/dist/transcode/utils/file.validator.d.ts +43 -0
  229. package/dist/transcode/utils/file.validator.d.ts.map +1 -0
  230. package/dist/transcode/utils/file.validator.js +126 -0
  231. package/dist/transcode/utils/file.validator.js.map +1 -0
  232. package/dist/transcode/utils/transcode.helper.d.ts +42 -0
  233. package/dist/transcode/utils/transcode.helper.d.ts.map +1 -0
  234. package/dist/transcode/utils/transcode.helper.js +221 -0
  235. package/dist/transcode/utils/transcode.helper.js.map +1 -0
  236. package/dist/uploader/index.d.ts +3 -0
  237. package/dist/uploader/index.d.ts.map +1 -0
  238. package/dist/uploader/index.js +8 -0
  239. package/dist/uploader/index.js.map +1 -0
  240. package/dist/uploader/uploader.module.d.ts.map +1 -1
  241. package/dist/uploader/uploader.module.js.map +1 -1
  242. package/dist/uploader/uploader.service.d.ts +1 -1
  243. package/dist/uploader/uploader.service.d.ts.map +1 -1
  244. package/dist/uploader/uploader.service.js.map +1 -1
  245. package/dist/verify/index.d.ts.map +1 -1
  246. package/dist/verify/index.js.map +1 -1
  247. package/dist/verify/verify.client.d.ts.map +1 -1
  248. package/dist/verify/verify.client.js.map +1 -1
  249. package/dist/verify/verify.module.d.ts.map +1 -1
  250. package/dist/verify/verify.module.js.map +1 -1
  251. package/dist/volcengine-tts/dto/tts.dto.d.ts +52 -0
  252. package/dist/volcengine-tts/dto/tts.dto.d.ts.map +1 -0
  253. package/dist/volcengine-tts/dto/tts.dto.js +59 -0
  254. package/dist/volcengine-tts/dto/tts.dto.js.map +1 -0
  255. package/dist/volcengine-tts/index.d.ts +4 -0
  256. package/dist/volcengine-tts/index.d.ts.map +1 -0
  257. package/dist/volcengine-tts/index.js +20 -0
  258. package/dist/volcengine-tts/index.js.map +1 -0
  259. package/dist/volcengine-tts/volcengine-tts.client.d.ts +104 -0
  260. package/dist/volcengine-tts/volcengine-tts.client.d.ts.map +1 -0
  261. package/dist/volcengine-tts/volcengine-tts.client.js +690 -0
  262. package/dist/volcengine-tts/volcengine-tts.client.js.map +1 -0
  263. package/dist/volcengine-tts/volcengine-tts.module.d.ts +3 -0
  264. package/dist/volcengine-tts/volcengine-tts.module.d.ts.map +1 -0
  265. package/dist/volcengine-tts/volcengine-tts.module.js +34 -0
  266. package/dist/volcengine-tts/volcengine-tts.module.js.map +1 -0
  267. package/package.json +83 -9
@@ -0,0 +1,879 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.AliyunImmClient = exports.ImmTaskType = void 0;
49
+ const common_1 = require("@nestjs/common");
50
+ const config_1 = require("@nestjs/config");
51
+ const winston_1 = require("winston");
52
+ const nest_winston_1 = require("nest-winston");
53
+ const client_1 = require("@prisma/client");
54
+ const $dara = __importStar(require("@darabonba/typescript"));
55
+ const imm20200930_1 = __importStar(require("@alicloud/imm20200930")), $imm = imm20200930_1;
56
+ const openapi_core_1 = require("@alicloud/openapi-core");
57
+ const infra_utils_1 = require("@dofe/infra-utils");
58
+ const infra_common_1 = require("@dofe/infra-common");
59
+ const infra_utils_2 = require("@dofe/infra-utils");
60
+ var ImmTaskType;
61
+ (function (ImmTaskType) {
62
+ ImmTaskType["CreateVideoLabelClassificationTask"] = "VideoLabelClassification";
63
+ ImmTaskType["CreateFigureClusteringTask"] = "FaceClustering";
64
+ ImmTaskType["CreateOfficeConversionTask"] = "OfficeConversion";
65
+ ImmTaskType["CreateImageModerationTask"] = "ImageModeration";
66
+ ImmTaskType["CreateVideoModerationTask"] = "VideoModeration";
67
+ ImmTaskType["CreateMediaConvertTask"] = "MediaConvert";
68
+ ImmTaskType["CreateFileCompressionTask"] = "FileCompression";
69
+ ImmTaskType["CreateArchiveFileInspectionTask"] = "ArchiveFileInspection";
70
+ ImmTaskType["CreateFileUncompressionTask"] = "FileUncompression";
71
+ ImmTaskType["CreateCompressPointCloudTask"] = "PointCloudCompress";
72
+ ImmTaskType["CreateImageToPDFTask"] = "ImageToPDF";
73
+ ImmTaskType["CreateStory"] = "StoryCreation";
74
+ ImmTaskType["CreateLocationDateClusteringTask"] = "LocationDateClustering";
75
+ ImmTaskType["CreateImageSplicingTask"] = "ImageSplicing";
76
+ ImmTaskType["CreateFacesSearchingTask"] = "FacesSearching";
77
+ })(ImmTaskType || (exports.ImmTaskType = ImmTaskType = {}));
78
+ let AliyunImmClient = class AliyunImmClient {
79
+ logger;
80
+ configService;
81
+ config;
82
+ appConfig;
83
+ constructor(logger, configService) {
84
+ this.logger = logger;
85
+ this.configService = configService;
86
+ this.config = this.getAliyunImmConfig('oss', 'pardx-files');
87
+ this.appConfig = this.configService.getOrThrow('app');
88
+ }
89
+ /**
90
+ * 获取阿里云 OSS 配置
91
+ */
92
+ getAliyunImmConfig(vendor, bucket) {
93
+ if (vendor !== 'oss') {
94
+ throw new Error(`Unsupported vendor: ${vendor}`);
95
+ }
96
+ const bucketConfigs = this.configService.getOrThrow('buckets');
97
+ const bucketConfig = infra_utils_1.arrayUtil.findOne(bucketConfigs, {
98
+ bucket,
99
+ vendor,
100
+ });
101
+ if (!bucketConfig) {
102
+ throw new Error(`Bucket config not found: ${bucket}`);
103
+ }
104
+ // 从配置中获取阿里云 OSS 配置
105
+ const ossConfig = (0, infra_common_1.getKeysConfig)()?.storage?.[vendor];
106
+ if (!ossConfig) {
107
+ throw new Error('Aliyun OSS configuration not found');
108
+ }
109
+ // IMM 需要使用 IMM 的 endpoint,而不是 OSS 的 endpoint
110
+ const region = bucketConfig?.region || 'cn-shanghai';
111
+ const immEndpointEnv = `imm.${region}.aliyuncs.com`;
112
+ // 规范化 endpoint,去掉协议前缀与结尾斜杠
113
+ const immEndpoint = immEndpointEnv
114
+ .replace(/^https?:\/\//i, '')
115
+ .replace(/\/$/, '');
116
+ if (!immEndpoint) {
117
+ throw new Error('ALIYUN_IMM_ENDPOINT is invalid or empty');
118
+ }
119
+ return {
120
+ endpoint: immEndpoint,
121
+ accessKeyId: ossConfig.accessKey,
122
+ accessKeySecret: ossConfig.secretKey,
123
+ bucket,
124
+ region,
125
+ };
126
+ }
127
+ /**
128
+ * 创建 IMM 客户端
129
+ */
130
+ createClient() {
131
+ try {
132
+ // 使用规范化后的 IMM endpoint 构建客户端配置
133
+ const config = new openapi_core_1.$OpenApiUtil.Config({
134
+ ...this.config,
135
+ protocol: 'https',
136
+ regionId: this.config.region,
137
+ });
138
+ return new imm20200930_1.default(config);
139
+ }
140
+ catch (error) {
141
+ this.logger.error('Failed to create IMM client', {
142
+ error: error.message,
143
+ config: this.config,
144
+ });
145
+ throw new Error(`Failed to create IMM client: ${error.message}`);
146
+ }
147
+ }
148
+ /**
149
+ * 检测媒体文件元信息
150
+ */
151
+ async detectMediaMeta(vendor, bucket, key, type) {
152
+ try {
153
+ const client = this.createClient();
154
+ const projectName = this.getProjectName(vendor, bucket);
155
+ const sourceURI = infra_utils_2.fileUtil.buildStorageUri(vendor, bucket, key);
156
+ const request = new $imm.DetectMediaMetaRequest({
157
+ projectName,
158
+ sourceURI,
159
+ });
160
+ const runtime = new $dara.RuntimeOptions({});
161
+ const response = await client.detectMediaMetaWithOptions(request, runtime);
162
+ this.logger.info('Media meta detection completed', {
163
+ vendor,
164
+ bucket,
165
+ key,
166
+ response: response.body,
167
+ });
168
+ return this.parseMediaMetaResponse(response.body, type);
169
+ }
170
+ catch (error) {
171
+ this.logger.error('Failed to detect media meta', {
172
+ vendor,
173
+ bucket,
174
+ key,
175
+ error: error.message,
176
+ });
177
+ throw error;
178
+ }
179
+ }
180
+ /**
181
+ * 构建输出文件的key
182
+ */
183
+ buildOutputKey(originalKey, quality, index = 0) {
184
+ const pathParts = originalKey.split('/');
185
+ const fileName = pathParts.pop() || '';
186
+ const basePath = pathParts.join('/');
187
+ // 移除原文件扩展名
188
+ const nameWithoutExt = fileName.replace(/\.[^/.]+$/, '');
189
+ // 根据质量等级生成后缀
190
+ const qualitySuffix = quality.toLowerCase().replace('video_', '');
191
+ const outputFileName = `${nameWithoutExt}_${qualitySuffix}.mp4`;
192
+ return basePath ? `${basePath}/${outputFileName}` : outputFileName;
193
+ }
194
+ /**
195
+ * 创建媒体转码任务
196
+ * 根据阿里云IMM API规范优化
197
+ */
198
+ async createMediaConvertTask(vendor, bucket, key, qualities = [
199
+ client_1.VideoQuality.VIDEO_4K,
200
+ client_1.VideoQuality.VIDEO_1080P,
201
+ client_1.VideoQuality.VIDEO_720P,
202
+ client_1.VideoQuality.VIDEO_360P,
203
+ ], index = 0) {
204
+ try {
205
+ const client = this.createClient();
206
+ const projectName = this.getProjectName(vendor, bucket);
207
+ const sourceUri = infra_utils_2.fileUtil.buildStorageUri(vendor, bucket, key);
208
+ const targetUri = this.buildTargetUri(vendor, bucket, key, qualities);
209
+ // 添加调试日志,检查URI值
210
+ console.log('URI values check', {
211
+ sourceUri,
212
+ targetUri,
213
+ });
214
+ // 验证URI值不为空
215
+ if (!sourceUri || sourceUri.trim() === '') {
216
+ throw new Error(`Source URI is empty or invalid: ${sourceUri}`);
217
+ }
218
+ if (!targetUri || targetUri.trim() === '') {
219
+ throw new Error(`Target URI is empty or invalid: ${targetUri}`);
220
+ }
221
+ console.log('Creating media convert task', {
222
+ vendor,
223
+ bucket,
224
+ key,
225
+ projectName,
226
+ sourceUri,
227
+ targetUri,
228
+ qualities,
229
+ });
230
+ // 构建源文件配置
231
+ const sources = [
232
+ {
233
+ URI: sourceUri, // 使用小写的URI,符合API类型定义
234
+ },
235
+ ];
236
+ qualities = Array.isArray(qualities) ? qualities : [qualities];
237
+ // 构建目标配置
238
+ const targets = qualities.map((quality) => {
239
+ // 为每个质量等级构建独立的目标URI
240
+ const qualityTargetUri = this.buildTargetUri(vendor, bucket, key, quality);
241
+ console.log('buildTarget', {
242
+ video: this.buildTargetVideo(quality),
243
+ audio: this.buildTargetAudio(quality),
244
+ });
245
+ return {
246
+ URI: qualityTargetUri, // 使用特定质量的URI
247
+ // 添加必需的container配置 - 应该是小写,符合API类型定义
248
+ container: 'mp4',
249
+ video: {
250
+ transcodeVideo: this.buildTargetVideo(quality),
251
+ },
252
+ audio: {
253
+ transcodeAudio: this.buildTargetAudio(quality),
254
+ },
255
+ };
256
+ });
257
+ // 构建通知配置
258
+ const notification = {
259
+ MNS: {
260
+ topicName: 'pardx-transcode-topic',
261
+ endpoint: `https://1270749538583939.mns.cn-shanghai.aliyuncs.com`, // 如果需要webhook通知,可以配置endpoint
262
+ },
263
+ };
264
+ // 创建请求对象,使用正确的参数名称
265
+ const request = new $imm.CreateMediaConvertTaskRequest({
266
+ projectName,
267
+ sources,
268
+ targets,
269
+ notification,
270
+ // 添加用户自定义数据,便于后续追踪
271
+ userData: JSON.stringify({
272
+ vendor,
273
+ bucket,
274
+ key,
275
+ index,
276
+ timestamp: new Date().toISOString(),
277
+ qualities,
278
+ }),
279
+ // 添加标签,便于分类和查询
280
+ tags: {
281
+ vendor,
282
+ bucket,
283
+ type: 'transcode',
284
+ source: key,
285
+ },
286
+ });
287
+ const runtime = new $dara.RuntimeOptions({});
288
+ this.logger.debug('Sending IMM API request', {
289
+ request: JSON.stringify(request, null, 2),
290
+ });
291
+ const response = await client.createMediaConvertTaskWithOptions(request, runtime);
292
+ if (!response?.body?.taskId) {
293
+ throw new Error('Invalid response from IMM API: missing taskId');
294
+ }
295
+ const result = {
296
+ taskId: response.body.taskId,
297
+ eventId: response.body.eventId,
298
+ requestId: response.body.requestId,
299
+ };
300
+ console.log('Media convert task created successfully 111', response?.body);
301
+ return result;
302
+ }
303
+ catch (error) {
304
+ const errorMessage = error instanceof Error ? error.message : String(error);
305
+ const errorDetails = {
306
+ vendor,
307
+ bucket,
308
+ key,
309
+ qualities,
310
+ error: errorMessage,
311
+ stack: error instanceof Error ? error.stack : undefined,
312
+ };
313
+ this.logger.error('Failed to create media convert task', errorDetails);
314
+ // 重新抛出错误,保持原始错误信息
315
+ if (error instanceof Error) {
316
+ throw error;
317
+ }
318
+ else {
319
+ throw new Error(`Failed to create media convert task: ${errorMessage}`);
320
+ }
321
+ }
322
+ }
323
+ /**
324
+ * 获取任务状态
325
+ */
326
+ async getTask(vendor, bucket, taskId, taskType = ImmTaskType.CreateMediaConvertTask) {
327
+ try {
328
+ const client = this.createClient();
329
+ const projectName = this.getProjectName(vendor, bucket);
330
+ const request = new $imm.GetTaskRequest({
331
+ taskId,
332
+ projectName,
333
+ requestDefinition: true,
334
+ taskType: taskType,
335
+ });
336
+ const runtime = new $dara.RuntimeOptions({});
337
+ const response = await client.getTaskWithOptions(request, runtime);
338
+ this.logger.info('Task status retrieved', {
339
+ taskId,
340
+ status: response.body.status,
341
+ });
342
+ return this.parseTaskStatus(response.body);
343
+ }
344
+ catch (error) {
345
+ this.logger.error('Failed to get task status', {
346
+ taskId,
347
+ error: error.message,
348
+ });
349
+ throw error;
350
+ }
351
+ }
352
+ /**
353
+ * 获取项目名称(基于 vendor 和 bucket)
354
+ */
355
+ getProjectName(vendor, bucket) {
356
+ // 可以根据需要配置项目名称映射
357
+ return 'pardx-ai-imm';
358
+ }
359
+ /**
360
+ * 构建目标文件 URI
361
+ */
362
+ buildTargetUri(vendor, bucket, key, qualities) {
363
+ // 参数验证
364
+ if (!bucket || bucket.trim() === '') {
365
+ throw new Error('Bucket cannot be empty for target URI');
366
+ }
367
+ if (!key || key.trim() === '') {
368
+ throw new Error('Key cannot be empty for target URI');
369
+ }
370
+ if (!vendor || vendor.trim() === '') {
371
+ throw new Error('Vendor cannot be empty for target URI');
372
+ }
373
+ // 清理参数
374
+ const cleanBucket = bucket.trim();
375
+ const cleanKey = key.trim();
376
+ const cleanVendor = vendor.trim();
377
+ // 构建目标文件名 - 使用第一个质量等级作为默认
378
+ const quality = Array.isArray(qualities) ? qualities[0] : qualities;
379
+ const qualitySuffix = quality.toLowerCase().replace('video_', '');
380
+ const targetKey = cleanKey.replace(/\.[^/.]+$/, `_${qualitySuffix}.mp4`);
381
+ // 使用通用构建函数构建完整的URI
382
+ return infra_utils_2.fileUtil.buildStorageUri(cleanVendor, cleanBucket, targetKey);
383
+ }
384
+ /**
385
+ * 构建目标文件 URL
386
+ */
387
+ buildTargetUrl(vendor, bucket, key, qualities) {
388
+ // 使用第一个质量等级作为默认
389
+ const quality = Array.isArray(qualities) ? qualities[0] : qualities;
390
+ const qualitySuffix = quality.toLowerCase().replace('video_', '');
391
+ const targetKey = key.replace(/\.[^/.]+$/, `_${qualitySuffix}.mp4`);
392
+ // 根据 vendor 构建不同的访问 URL
393
+ switch (vendor) {
394
+ case 'oss':
395
+ return `https://${bucket}.oss-${this.config.region}.aliyuncs.com/${targetKey}`;
396
+ default:
397
+ return `https://${bucket}.oss-${this.config.region}.aliyuncs.com/${targetKey}`;
398
+ }
399
+ }
400
+ /**
401
+ * 构建媒体元数据
402
+ * 根据阿里云IMM API规范优化
403
+ */
404
+ buildMediaMetadata(options) {
405
+ const { format = 'mp4', resolution = '720p', bitrate = '1000k', frameRate = '25', quality = 'medium', videoCodec = 'h264', audioCodec = 'aac', audioBitrate = '100000', } = options;
406
+ // 解析分辨率
407
+ const resolutionMap = {
408
+ '480p': { width: 854, height: 480 },
409
+ '720p': { width: 1280, height: 720 },
410
+ '1080p': { width: 1920, height: 1080 },
411
+ '2k': { width: 2560, height: 1440 },
412
+ '4k': { width: 3840, height: 2160 },
413
+ };
414
+ const size = resolutionMap[resolution] || resolutionMap['720p'];
415
+ // 根据阿里云IMM API规范构建媒体元数据
416
+ const mediaMetadata = {
417
+ // 基础格式信息
418
+ format: format.toLowerCase(),
419
+ // 视频配置
420
+ video: {
421
+ codec: videoCodec.toLowerCase(),
422
+ width: size.width,
423
+ height: size.height,
424
+ bitrate: this.normalizeBitrate(bitrate),
425
+ frameRate: this.normalizeFrameRate(frameRate),
426
+ quality: quality.toLowerCase(),
427
+ // 添加更多视频参数
428
+ gop: '250', // GOP大小,影响编码效率
429
+ profile: 'main', // H.264 profile
430
+ level: '4.1', // H.264 level
431
+ preset: 'medium', // 编码预设
432
+ arotate: '1',
433
+ },
434
+ // 音频配置
435
+ audio: {
436
+ codec: audioCodec.toLowerCase(),
437
+ bitrate: this.normalizeAudioBitrate(audioBitrate),
438
+ channels: 2, // 立体声
439
+ sampleRate: 44100, // 采样率
440
+ profile: 'aac_low', // AAC profile
441
+ },
442
+ // 容器配置
443
+ container: {
444
+ format: format.toLowerCase(),
445
+ segmentDuration: 10, // 分片时长(秒)
446
+ segmentFormat: 'm3u8', // 分片格式(HLS)
447
+ },
448
+ };
449
+ // 根据格式调整配置
450
+ if (format.toLowerCase() === 'hls') {
451
+ mediaMetadata.container.segmentFormat = 'm3u8';
452
+ mediaMetadata.container.segmentDuration = 10;
453
+ }
454
+ else if (format.toLowerCase() === 'dash') {
455
+ mediaMetadata.container.segmentFormat = 'mpd';
456
+ mediaMetadata.container.segmentDuration = 6;
457
+ }
458
+ // 添加转码策略
459
+ mediaMetadata.strategy = {
460
+ priority: 'normal', // 任务优先级
461
+ retryCount: 3, // 重试次数
462
+ timeout: 3600, // 超时时间(秒)
463
+ };
464
+ return mediaMetadata;
465
+ }
466
+ /**
467
+ * 标准化比特率格式
468
+ */
469
+ normalizeBitrate(bitrate) {
470
+ if (typeof bitrate === 'string') {
471
+ // 确保比特率格式正确
472
+ if (bitrate.endsWith('k')) {
473
+ return bitrate;
474
+ }
475
+ else if (bitrate.endsWith('m')) {
476
+ return bitrate;
477
+ }
478
+ else if (bitrate.endsWith('K')) {
479
+ return bitrate.toLowerCase();
480
+ }
481
+ else if (bitrate.endsWith('M')) {
482
+ return bitrate.toLowerCase();
483
+ }
484
+ else {
485
+ // 如果没有单位,假设是kbps
486
+ return `${bitrate}k`;
487
+ }
488
+ }
489
+ return '1000k';
490
+ }
491
+ /**
492
+ * 标准化帧率格式
493
+ */
494
+ normalizeFrameRate(frameRate) {
495
+ if (typeof frameRate === 'string') {
496
+ // 确保帧率格式正确
497
+ if (frameRate.includes('/')) {
498
+ return frameRate; // 保持分数格式
499
+ }
500
+ else if (frameRate.endsWith('fps')) {
501
+ return frameRate;
502
+ }
503
+ else if (frameRate.endsWith('FPS')) {
504
+ return frameRate.toLowerCase();
505
+ }
506
+ else {
507
+ // 如果没有单位,假设是fps
508
+ return `${frameRate}fps`;
509
+ }
510
+ }
511
+ return '25fps';
512
+ }
513
+ /**
514
+ * 标准化音频比特率格式
515
+ */
516
+ normalizeAudioBitrate(audioBitrate) {
517
+ if (typeof audioBitrate === 'string') {
518
+ // 确保音频比特率格式正确
519
+ if (audioBitrate.endsWith('k')) {
520
+ return audioBitrate;
521
+ }
522
+ else if (audioBitrate.endsWith('K')) {
523
+ return audioBitrate.toLowerCase();
524
+ }
525
+ else {
526
+ // 如果没有单位,假设是kbps
527
+ return `${audioBitrate}k`;
528
+ }
529
+ }
530
+ return '128k';
531
+ }
532
+ /**
533
+ * 解析媒体元信息响应
534
+ */
535
+ parseMediaMetaResponse(mediaMetadata, type) {
536
+ if (!mediaMetadata) {
537
+ throw new Error('No media metadata found in response');
538
+ }
539
+ const { duration, formatName, videoStreams, audioStreams, videoWidth, videoHeight, } = mediaMetadata;
540
+ type =
541
+ type !== 'else'
542
+ ? type
543
+ : infra_utils_2.fileUtil.isVideoFile(formatName) || formatName.includes('mov')
544
+ ? 'video'
545
+ : infra_utils_2.fileUtil.isAudioFile(formatName) ||
546
+ formatName.includes('audio')
547
+ ? 'audio'
548
+ : infra_utils_2.fileUtil.isImageFile(formatName) ||
549
+ formatName.includes('image')
550
+ ? 'image'
551
+ : 'else';
552
+ if (type === 'video' && videoStreams && videoStreams.length > 0) {
553
+ const videoInfo = {
554
+ width: videoWidth,
555
+ height: videoHeight,
556
+ duration: duration,
557
+ streamDuration: videoStreams[0]?.streamDuration,
558
+ sar: videoStreams[0]?.sampleAspectRatio,
559
+ dar: videoStreams[0]?.displayAspectRatio,
560
+ rFrameRate: videoStreams[0]?.frameRate,
561
+ ffmpegInfo: JSON.parse(JSON.stringify(mediaMetadata)), // 确保序列化
562
+ };
563
+ return {
564
+ type,
565
+ info: videoInfo,
566
+ rawData: mediaMetadata,
567
+ };
568
+ }
569
+ if (type === 'audio' && audioStreams && audioStreams.length > 0) {
570
+ const audioInfo = {
571
+ duration: duration,
572
+ streamDuration: audioStreams[0]?.streamDuration,
573
+ channels: audioStreams[0]?.channels,
574
+ channelLayout: audioStreams[0]?.channelLayout,
575
+ sampleRate: audioStreams[0]?.sampleRate?.toString(),
576
+ bitRate: audioStreams[0]?.bitRate,
577
+ ffmpegInfo: JSON.parse(JSON.stringify(mediaMetadata)), // 确保序列化
578
+ };
579
+ return {
580
+ type,
581
+ info: audioInfo,
582
+ rawData: mediaMetadata,
583
+ };
584
+ }
585
+ if (type === 'image' && videoStreams && videoStreams.length > 0) {
586
+ const imageInfo = {
587
+ width: videoWidth,
588
+ height: videoHeight,
589
+ sar: videoStreams[0]?.sampleAspectRatio,
590
+ dar: videoStreams[0]?.displayAspectRatio,
591
+ ffmpegInfo: JSON.parse(JSON.stringify(mediaMetadata)), // 确保序列化
592
+ };
593
+ return {
594
+ type,
595
+ info: imageInfo,
596
+ rawData: mediaMetadata,
597
+ };
598
+ }
599
+ // 如果无法确定类型或没有流信息,返回原始数据
600
+ return {
601
+ type: 'else',
602
+ info: {
603
+ ffmpegInfo: JSON.parse(JSON.stringify(mediaMetadata)), // 确保序列化
604
+ },
605
+ rawData: mediaMetadata,
606
+ };
607
+ }
608
+ /**
609
+ * 解析任务状态响应
610
+ */
611
+ parseTaskStatus(response) {
612
+ const { status, progress, result, error } = response;
613
+ return {
614
+ status: status || 'unknown',
615
+ progress: progress || 0,
616
+ result: result || null,
617
+ error: error || null,
618
+ };
619
+ }
620
+ /**
621
+ * 获取分辨率宽度
622
+ */
623
+ getResolutionWidth(resolution) {
624
+ const resolutionMap = {
625
+ '480p': 854,
626
+ '720p': 1280,
627
+ '1080p': 1920,
628
+ '2k': 2560,
629
+ '4k': 3840,
630
+ };
631
+ return resolutionMap[resolution] || 1280; // 默认值
632
+ }
633
+ /**
634
+ * 获取分辨率高度
635
+ */
636
+ getResolutionHeight(resolution) {
637
+ const resolutionMap = {
638
+ '480p': 480,
639
+ '720p': 720,
640
+ '1080p': 1080,
641
+ '2k': 1440,
642
+ '4k': 2160,
643
+ };
644
+ return resolutionMap[resolution] || 720; // 默认值
645
+ }
646
+ /**
647
+ * 构建视频转码配置
648
+ * 根据阿里云IMM API文档:https://help.aliyun.com/zh/imm/developer-reference/api-imm-2020-09-30-createmediaconverttask
649
+ */
650
+ buildTargetVideo(quality) {
651
+ // VideoQuality到分辨率的映射
652
+ const qualityToResolution = {
653
+ [client_1.VideoQuality.VIDEO_4K]: { width: 3840, height: 2160 },
654
+ [client_1.VideoQuality.VIDEO_1080P]: { width: 1920, height: 1080 },
655
+ [client_1.VideoQuality.VIDEO_720P]: { width: 1280, height: 720 },
656
+ [client_1.VideoQuality.VIDEO_360P]: { width: 640, height: 360 },
657
+ [client_1.VideoQuality.VIDEO_ORIGIN]: { width: 0, height: 0 }, // 原画质,保持原尺寸
658
+ };
659
+ const resolution = qualityToResolution[quality];
660
+ const qualityToCodec = {
661
+ [client_1.VideoQuality.VIDEO_4K]: 'h264',
662
+ [client_1.VideoQuality.VIDEO_1080P]: 'h264',
663
+ [client_1.VideoQuality.VIDEO_720P]: 'h264',
664
+ [client_1.VideoQuality.VIDEO_360P]: 'h264',
665
+ [client_1.VideoQuality.VIDEO_ORIGIN]: 'h264', // 原画质,保持原码率
666
+ };
667
+ const codec = qualityToCodec[quality];
668
+ // 根据阿里云IMM API文档构建transcodeVideo配置
669
+ const transcodeVideo = {
670
+ codec: codec, // 视频编码格式
671
+ frameRate: 30,
672
+ frameRateOption: 'adaptive',
673
+ pixelFormat: 'yuv420p', // 像素格式
674
+ scaleType: 'fit',
675
+ CRF: 24, // 恒定质量因子,值越小质量越高
676
+ adaptiveResolutionDirection: true,
677
+ resolution: `${resolution.width}x${resolution.height}`,
678
+ resolutionOption: 'adaptive',
679
+ };
680
+ return transcodeVideo;
681
+ }
682
+ /**
683
+ * 构建音频转码配置
684
+ * 根据阿里云IMM API文档
685
+ */
686
+ buildTargetAudio(quality) {
687
+ // 根据视频质量调整音频码率
688
+ const qualityToAudioBitrate = {
689
+ [client_1.VideoQuality.VIDEO_4K]: 256, // 4K视频使用256kbps音频
690
+ [client_1.VideoQuality.VIDEO_1080P]: 192, // 1080P视频使用192kbps音频
691
+ [client_1.VideoQuality.VIDEO_720P]: 128, // 720P视频使用128kbps音频
692
+ [client_1.VideoQuality.VIDEO_360P]: 96, // 360P视频使用96kbps音频
693
+ [client_1.VideoQuality.VIDEO_ORIGIN]: 128, // 原画质使用128kbps音频
694
+ };
695
+ const audioBitrate = qualityToAudioBitrate[quality] * 1000;
696
+ // 根据阿里云IMM API文档构建transcodeAudio配置
697
+ const transcodeAudio = {
698
+ codec: 'aac', // 音频编码格式
699
+ bitrate: audioBitrate, // 音频码率
700
+ channel: 2, // 声道数,立体声
701
+ sampleRate: 44100, // 采样率
702
+ };
703
+ return transcodeAudio;
704
+ }
705
+ /**
706
+ * 规范化采样率,确保符合阿里云语音识别要求(8000 或 16000 Hz)
707
+ * 如果采样率不符合要求,选择最接近的合规值
708
+ * @param sampleRate 原始采样率
709
+ * @returns 规范化后的采样率(8000 或 16000)
710
+ */
711
+ normalizeSampleRateForSpeechRecognition(sampleRate) {
712
+ // 阿里云语音识别要求采样率为 8000 或 16000 Hz
713
+ return sampleRate || 16000;
714
+ }
715
+ /**
716
+ * 从视频中提取音频
717
+ * 参考:https://help.aliyun.com/zh/imm/user-guide/audio-transcoding
718
+ * 注意:默认采样率设置为 16000 Hz,符合阿里云语音识别要求
719
+ */
720
+ async extractAudioFromVideo(vendor, bucket, key, options = {}) {
721
+ try {
722
+ const client = this.createClient();
723
+ const projectName = this.getProjectName(vendor, bucket);
724
+ const sourceUri = infra_utils_2.fileUtil.buildStorageUri(vendor, bucket, key);
725
+ // 验证源URI
726
+ if (!sourceUri || sourceUri.trim() === '') {
727
+ throw new Error(`Source URI is empty or invalid: ${sourceUri}`);
728
+ }
729
+ // 构建目标音频文件URI
730
+ // 默认采样率设置为 16000 Hz,符合阿里云语音识别要求(8000 或 16000 Hz)
731
+ const { format = 'mp3', bitrate = 128000, sampleRate: rawSampleRate = 44100, channels = 2, } = options;
732
+ // 规范化采样率,确保符合阿里云语音识别要求
733
+ const sampleRate = this.normalizeSampleRateForSpeechRecognition(rawSampleRate);
734
+ // 生成目标文件key
735
+ const targetKey = infra_utils_2.fileUtil.buildAudioKeyFromVideoKey(key, format);
736
+ const targetUri = infra_utils_2.fileUtil.buildStorageUri(vendor, bucket, targetKey);
737
+ // 如果采样率被规范化,记录警告
738
+ if (rawSampleRate !== sampleRate) {
739
+ this.logger.warn('Sample rate normalized for Aliyun speech recognition', {
740
+ originalSampleRate: rawSampleRate,
741
+ normalizedSampleRate: sampleRate,
742
+ note: 'Aliyun speech recognition requires 8000 or 16000 Hz',
743
+ });
744
+ }
745
+ this.logger.info('Extracting audio from video', {
746
+ vendor,
747
+ bucket,
748
+ key,
749
+ sourceUri,
750
+ targetUri,
751
+ options: {
752
+ ...options,
753
+ sampleRate, // 使用规范化后的采样率
754
+ },
755
+ });
756
+ // 构建源文件配置
757
+ const sources = [
758
+ {
759
+ URI: sourceUri,
760
+ },
761
+ ];
762
+ // 构建目标配置 - 只转码音频,不转码视频
763
+ const targets = [
764
+ {
765
+ URI: targetUri,
766
+ container: format, // 音频容器格式
767
+ audio: {
768
+ transcodeAudio: {
769
+ codec: this.getAudioCodec(format), // 根据格式选择编码器
770
+ bitrate: bitrate, // 音频码率(bps)
771
+ channel: channels, // 声道数
772
+ sampleRate: sampleRate, // 采样率
773
+ },
774
+ },
775
+ // 不包含video配置,表示只提取音频
776
+ },
777
+ ];
778
+ // 构建通知配置
779
+ const notification = {
780
+ MNS: {
781
+ topicName: 'pardx-transcode-topic',
782
+ endpoint: `https://1270749538583939.mns.cn-shanghai.aliyuncs.com`,
783
+ },
784
+ };
785
+ // 创建请求对象
786
+ const request = new $imm.CreateMediaConvertTaskRequest({
787
+ projectName,
788
+ sources,
789
+ targets,
790
+ notification,
791
+ userData: JSON.stringify({
792
+ vendor,
793
+ bucket,
794
+ key,
795
+ targetKey,
796
+ type: 'audio_extract',
797
+ format,
798
+ timestamp: new Date().toISOString(),
799
+ }),
800
+ tags: {
801
+ vendor,
802
+ bucket,
803
+ type: 'transcode',
804
+ source: key,
805
+ format,
806
+ },
807
+ });
808
+ const runtime = new $dara.RuntimeOptions({});
809
+ this.logger.debug('Sending IMM audio extract request', {
810
+ request: JSON.stringify(request, null, 2),
811
+ });
812
+ const response = await client.createMediaConvertTaskWithOptions(request, runtime);
813
+ if (!response?.body?.taskId) {
814
+ throw new Error('Invalid response from IMM API: missing taskId');
815
+ }
816
+ const result = {
817
+ taskId: response.body.taskId,
818
+ eventId: response.body.eventId,
819
+ requestId: response.body.requestId,
820
+ };
821
+ this.logger.info('Audio extract task created successfully', {
822
+ taskId: result.taskId,
823
+ targetKey,
824
+ });
825
+ return result;
826
+ }
827
+ catch (error) {
828
+ const errorMessage = error instanceof Error ? error.message : String(error);
829
+ const errorDetails = {
830
+ vendor,
831
+ bucket,
832
+ key,
833
+ options,
834
+ error: errorMessage,
835
+ stack: error instanceof Error ? error.stack : undefined,
836
+ };
837
+ this.logger.error('Failed to extract audio from video', errorDetails);
838
+ if (error instanceof Error) {
839
+ throw error;
840
+ }
841
+ else {
842
+ throw new Error(`Failed to extract audio from video: ${errorMessage}`);
843
+ }
844
+ }
845
+ }
846
+ /**
847
+ * 构建音频提取的目标文件key
848
+ */
849
+ buildAudioExtractKey(originalKey, format) {
850
+ const pathParts = originalKey.split('/');
851
+ const fileName = pathParts.pop() || '';
852
+ const basePath = pathParts.join('/');
853
+ // 移除原文件扩展名
854
+ const nameWithoutExt = fileName.replace(/\.[^/.]+$/, '');
855
+ // 生成音频文件名
856
+ const audioFileName = `${nameWithoutExt}_audio.${format}`;
857
+ return basePath ? `${basePath}/${audioFileName}` : audioFileName;
858
+ }
859
+ /**
860
+ * 根据音频格式获取编码器
861
+ */
862
+ getAudioCodec(format) {
863
+ const codecMap = {
864
+ mp3: 'mp3',
865
+ aac: 'aac',
866
+ flac: 'flac',
867
+ wav: 'pcm', // WAV格式通常使用PCM编码
868
+ };
869
+ return codecMap[format.toLowerCase()] || 'aac';
870
+ }
871
+ };
872
+ exports.AliyunImmClient = AliyunImmClient;
873
+ exports.AliyunImmClient = AliyunImmClient = __decorate([
874
+ (0, common_1.Injectable)(),
875
+ __param(0, (0, common_1.Inject)(nest_winston_1.WINSTON_MODULE_PROVIDER)),
876
+ __metadata("design:paramtypes", [winston_1.Logger,
877
+ config_1.ConfigService])
878
+ ], AliyunImmClient);
879
+ //# sourceMappingURL=aliyun-imm.client.js.map