jimeng-cli 0.3.0 → 0.3.2

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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/jimeng-cli.svg)](https://www.npmjs.com/package/jimeng-cli)
4
4
 
5
- 即梦/CapCut 图像与视频生成工具集,提供 CLI 与 MCP Server(stdio)。
5
+ 即梦/CapCut 图像与视频生成工具集,提供 CLI 与 MCP Server. 不需要VIP账号,普通账号即可
6
6
 
7
7
  ## 要求
8
8
 
@@ -5621,6 +5621,17 @@ import mime from "mime";
5621
5621
  import axios from "axios";
5622
5622
  import { v4 as uuidv4 } from "uuid";
5623
5623
  import { format as dateFormat } from "date-fns";
5624
+ var CRC32_TABLE = (() => {
5625
+ const table = [];
5626
+ for (let i = 0; i < 256; i++) {
5627
+ let crc = i;
5628
+ for (let j = 0; j < 8; j++) {
5629
+ crc = crc & 1 ? 3988292384 ^ crc >>> 1 : crc >>> 1;
5630
+ }
5631
+ table[i] = crc;
5632
+ }
5633
+ return table;
5634
+ })();
5624
5635
  var util = {
5625
5636
  uuid: (separator = true) => separator ? uuidv4() : uuidv4().replace(/-/g, ""),
5626
5637
  getDateString(format = "yyyy-MM-dd", date = /* @__PURE__ */ new Date()) {
@@ -5666,18 +5677,10 @@ var util = {
5666
5677
  * @returns CRC32 十六进制字符串
5667
5678
  */
5668
5679
  calculateCRC32(buffer) {
5669
- const crcTable = [];
5670
- for (let i = 0; i < 256; i++) {
5671
- let crc2 = i;
5672
- for (let j = 0; j < 8; j++) {
5673
- crc2 = crc2 & 1 ? 3988292384 ^ crc2 >>> 1 : crc2 >>> 1;
5674
- }
5675
- crcTable[i] = crc2;
5676
- }
5677
5680
  let crc = 0 ^ -1;
5678
5681
  const bytes = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength);
5679
5682
  for (let i = 0; i < bytes.length; i++) {
5680
- crc = crc >>> 8 ^ crcTable[(crc ^ bytes[i]) & 255];
5683
+ crc = crc >>> 8 ^ CRC32_TABLE[(crc ^ bytes[i]) & 255];
5681
5684
  }
5682
5685
  return ((crc ^ -1) >>> 0).toString(16).padStart(8, "0");
5683
5686
  }
@@ -5986,16 +5989,18 @@ var JimengErrorHandler = class {
5986
5989
  * 处理轮询超时错误
5987
5990
  * @returns 如果有部分结果,返回 void 而不抛出异常
5988
5991
  */
5989
- static handlePollingTimeout(pollCount, maxPollCount, elapsedTime, status, itemCount, historyId) {
5990
- const message = `\u8F6E\u8BE2\u8D85\u65F6: \u5DF2\u8F6E\u8BE2 ${pollCount} \u6B21\uFF0C\u8017\u65F6 ${elapsedTime} \u79D2\uFF0C\u6700\u7EC8\u72B6\u6001: ${status}\uFF0C\u56FE\u7247\u6570\u91CF: ${itemCount}`;
5992
+ static handlePollingTimeout(pollCount, maxPollCount, elapsedTime, status, itemCount, historyId, type = "image") {
5993
+ const typeText = type === "image" ? "\u56FE\u7247" : "\u89C6\u9891";
5994
+ const message = `\u8F6E\u8BE2\u8D85\u65F6: \u5DF2\u8F6E\u8BE2 ${pollCount} \u6B21\uFF0C\u8017\u65F6 ${elapsedTime} \u79D2\uFF0C\u6700\u7EC8\u72B6\u6001: ${status}\uFF0C${typeText}\u6570\u91CF: ${itemCount}`;
5991
5995
  logger_default.warn(message + (historyId ? `\uFF0C\u5386\u53F2ID: ${historyId}` : ""));
5992
5996
  if (itemCount === 0) {
5997
+ const exception = type === "image" ? exceptions_default.API_IMAGE_GENERATION_FAILED : exceptions_default.API_VIDEO_GENERATION_FAILED;
5993
5998
  throw new APIException(
5994
- exceptions_default.API_IMAGE_GENERATION_FAILED,
5995
- `\u751F\u6210\u8D85\u65F6\u4E14\u65E0\u7ED3\u679C\uFF0C\u72B6\u6001\u7801: ${status}${historyId ? `\uFF0C\u5386\u53F2ID: ${historyId}` : ""}`
5999
+ exception,
6000
+ `${typeText}\u751F\u6210\u8D85\u65F6\u4E14\u65E0\u7ED3\u679C\uFF0C\u72B6\u6001\u7801: ${status}${historyId ? `\uFF0C\u5386\u53F2ID: ${historyId}` : ""}`
5996
6001
  );
5997
6002
  }
5998
- logger_default.info(`\u8F6E\u8BE2\u8D85\u65F6\u4F46\u5DF2\u83B7\u5F97 ${itemCount} \u5F20\u56FE\u7247\uFF0C\u5C06\u8FD4\u56DE\u73B0\u6709\u7ED3\u679C`);
6003
+ logger_default.info(`\u8F6E\u8BE2\u8D85\u65F6\u4F46\u5DF2\u83B7\u5F97 ${itemCount} \u4E2A${typeText}\uFF0C\u5C06\u8FD4\u56DE\u73B0\u6709\u7ED3\u679C`);
5999
6004
  }
6000
6005
  /**
6001
6006
  * 处理生成失败错误
@@ -6060,7 +6065,7 @@ var BASE_URL_IMAGEX_US = "https://imagex16-normal-us-ttp.capcutapi.us";
6060
6065
  var BASE_URL_DREAMINA_HK = "https://mweb-api-sg.capcut.com";
6061
6066
  var BASE_URL_IMAGEX_HK = "https://imagex-normal-sg.capcutapi.com";
6062
6067
  var WEB_VERSION = "7.5.0";
6063
- var DA_VERSION = "3.3.8";
6068
+ var DA_VERSION = "3.3.12";
6064
6069
 
6065
6070
  // src/api/consts/common.ts
6066
6071
  var BASE_URL_CN = "https://jimeng.jianying.com";
@@ -6081,7 +6086,7 @@ var VERSION_CODE = "8.4.0";
6081
6086
  var DEFAULT_IMAGE_MODEL = "jimeng-4.5";
6082
6087
  var DEFAULT_IMAGE_MODEL_US = "jimeng-4.5";
6083
6088
  var DEFAULT_VIDEO_MODEL = "jimeng-video-3.5-pro";
6084
- var DRAFT_VERSION = "3.3.8";
6089
+ var DRAFT_VERSION = "3.3.9";
6085
6090
  var DRAFT_MIN_VERSION = "3.0.2";
6086
6091
  var DRAFT_VERSION_OMNI = "3.3.9";
6087
6092
  var OMNI_BENEFIT_TYPE = "dreamina_video_seedance_20_video_add";
@@ -6594,6 +6599,9 @@ function checkResult(result) {
6594
6599
  }
6595
6600
  async function getTokenLiveStatus(refreshToken, regionInfo) {
6596
6601
  try {
6602
+ if (regionInfo.isInternational) {
6603
+ return await checkInternationalTokenLive(refreshToken, regionInfo);
6604
+ }
6597
6605
  const result = await request(
6598
6606
  "POST",
6599
6607
  "/passport/account/info/v2",
@@ -6612,6 +6620,44 @@ async function getTokenLiveStatus(refreshToken, regionInfo) {
6612
6620
  return false;
6613
6621
  }
6614
6622
  }
6623
+ async function checkInternationalTokenLive(refreshToken, regionInfo) {
6624
+ const aid = getAssistantId(regionInfo);
6625
+ const countryCode = regionInfo.isUS ? "us" : regionInfo.isJP ? "jp" : regionInfo.isHK ? "hk" : "sg";
6626
+ const cookie = generateCookie(refreshToken);
6627
+ try {
6628
+ const response = await axios2.get(
6629
+ "https://dreamina.capcut.com/passport/web/account/info/",
6630
+ {
6631
+ params: {
6632
+ aid,
6633
+ account_sdk_source: "web",
6634
+ sdk_version: "2.1.10-tiktok",
6635
+ language: countryCode === "jp" ? "ja" : "en"
6636
+ },
6637
+ headers: {
6638
+ ...FAKE_HEADERS,
6639
+ Cookie: cookie,
6640
+ Referer: "https://dreamina.capcut.com/ai-tool/home/",
6641
+ Origin: "https://dreamina.capcut.com",
6642
+ Appid: String(aid),
6643
+ "store-country-code": countryCode,
6644
+ "store-country-code-src": "uid"
6645
+ },
6646
+ timeout: 15e3
6647
+ }
6648
+ );
6649
+ const data = response.data;
6650
+ if (data && typeof data === "object") {
6651
+ const obj = data;
6652
+ if (obj.user_id || obj.email || obj.data) {
6653
+ return true;
6654
+ }
6655
+ }
6656
+ return false;
6657
+ } catch {
6658
+ return false;
6659
+ }
6660
+ }
6615
6661
 
6616
6662
  // src/lib/session-pool.ts
6617
6663
  import path4 from "path";
@@ -7428,7 +7474,7 @@ var SmartPoller = class {
7428
7474
  /**
7429
7475
  * 根据状态码计算智能轮询间隔
7430
7476
  */
7431
- getSmartInterval(status, itemCount) {
7477
+ getSmartInterval(status, _itemCount) {
7432
7478
  const baseInterval = this.options.pollInterval;
7433
7479
  switch (status) {
7434
7480
  case 20:
@@ -7465,9 +7511,6 @@ var SmartPoller = class {
7465
7511
  if (status === 30) {
7466
7512
  return { shouldExit: true, reason: "\u4EFB\u52A1\u5931\u8D25" };
7467
7513
  }
7468
- if (itemCount >= this.options.expectedItemCount && (status === 10 || status === 50)) {
7469
- return { shouldExit: true, reason: `\u5DF2\u83B7\u5F97\u5B8C\u6574\u7ED3\u679C\u96C6(${itemCount}/${this.options.expectedItemCount})` };
7470
- }
7471
7514
  if (this.pollCount >= this.options.maxPollCount) {
7472
7515
  return { shouldExit: true, reason: "\u8F6E\u8BE2\u6B21\u6570\u8D85\u9650" };
7473
7516
  }
@@ -7484,6 +7527,7 @@ var SmartPoller = class {
7484
7527
  logger_default.info(`\u5F00\u59CB\u667A\u80FD\u8F6E\u8BE2: historyId=${historyId || "N/A"}, \u6700\u5927\u8F6E\u8BE2\u6B21\u6570=${this.options.maxPollCount}, \u671F\u671B\u7ED3\u679C\u6570=${this.options.expectedItemCount}`);
7485
7528
  let lastData;
7486
7529
  let lastStatus = { status: 20, itemCount: 0 };
7530
+ let exitReason = "";
7487
7531
  while (true) {
7488
7532
  this.pollCount++;
7489
7533
  const elapsedTime = Math.round((Date.now() - this.startTime) / 1e3);
@@ -7497,6 +7541,7 @@ var SmartPoller = class {
7497
7541
  }
7498
7542
  const { shouldExit, reason } = this.shouldExitPolling(status);
7499
7543
  if (shouldExit) {
7544
+ exitReason = reason;
7500
7545
  logger_default.info(`\u9000\u51FA\u8F6E\u8BE2: ${reason}, \u6700\u7EC8${this.options.type === "image" ? "\u56FE\u7247" : "\u89C6\u9891"}\u6570\u91CF=${status.itemCount}`);
7501
7546
  if (status.status === 30) {
7502
7547
  handleGenerationFailure(status.status, status.failCode, historyId, this.options.type, status.itemCount);
@@ -7508,7 +7553,8 @@ var SmartPoller = class {
7508
7553
  elapsedTime,
7509
7554
  status.status,
7510
7555
  status.itemCount,
7511
- historyId
7556
+ historyId,
7557
+ this.options.type
7512
7558
  );
7513
7559
  }
7514
7560
  break;
@@ -7552,7 +7598,7 @@ var SmartPoller = class {
7552
7598
  itemCount: lastStatus.itemCount,
7553
7599
  elapsedTime: finalElapsedTime,
7554
7600
  pollCount: this.pollCount,
7555
- exitReason: this.shouldExitPolling(lastStatus).reason
7601
+ exitReason
7556
7602
  };
7557
7603
  logger_default.info(`${this.options.type === "image" ? "\u56FE\u50CF" : "\u89C6\u9891"}\u751F\u6210\u5B8C\u6210: \u6210\u529F\u751F\u6210 ${lastStatus.itemCount} \u4E2A\u7ED3\u679C\uFF0C\u603B\u8017\u65F6 ${finalElapsedTime} \u79D2\uFF0C\u6700\u7EC8\u72B6\u6001: ${this.getStatusName(lastStatus.status)}`);
7558
7604
  return { result, data: lastData };
@@ -7598,17 +7644,20 @@ function extractImageUrls(itemList) {
7598
7644
  return itemList.map((item, index) => extractImageUrl(item, index)).filter((url) => url !== null);
7599
7645
  }
7600
7646
  function extractVideoUrl(item) {
7601
- var _a, _b, _c, _d, _e, _f;
7602
- if ((_c = (_b = (_a = item == null ? void 0 : item.video) == null ? void 0 : _a.transcoded_video) == null ? void 0 : _b.origin) == null ? void 0 : _c.video_url) {
7647
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
7648
+ if ((_c = (_b = (_a = item == null ? void 0 : item.common_attr) == null ? void 0 : _a.transcoded_video) == null ? void 0 : _b.origin) == null ? void 0 : _c.video_url) {
7649
+ return item.common_attr.transcoded_video.origin.video_url;
7650
+ }
7651
+ if ((_f = (_e = (_d = item == null ? void 0 : item.video) == null ? void 0 : _d.transcoded_video) == null ? void 0 : _e.origin) == null ? void 0 : _f.video_url) {
7603
7652
  return item.video.transcoded_video.origin.video_url;
7604
7653
  }
7605
- if ((_d = item == null ? void 0 : item.video) == null ? void 0 : _d.play_url) {
7654
+ if ((_g = item == null ? void 0 : item.video) == null ? void 0 : _g.play_url) {
7606
7655
  return item.video.play_url;
7607
7656
  }
7608
- if ((_e = item == null ? void 0 : item.video) == null ? void 0 : _e.download_url) {
7657
+ if ((_h = item == null ? void 0 : item.video) == null ? void 0 : _h.download_url) {
7609
7658
  return item.video.download_url;
7610
7659
  }
7611
- if ((_f = item == null ? void 0 : item.video) == null ? void 0 : _f.url) {
7660
+ if ((_i = item == null ? void 0 : item.video) == null ? void 0 : _i.url) {
7612
7661
  return item.video.url;
7613
7662
  }
7614
7663
  return null;
@@ -7638,20 +7687,15 @@ async function fetchHighQualityVideoUrl(itemId, refreshToken, regionInfo) {
7638
7687
  return videoUrl;
7639
7688
  }
7640
7689
  }
7641
- const hqUrlMatch = responseStr.match(/https:\/\/v[0-9]+-dreamnia\.jimeng\.com\/[^"\s\\]+/);
7642
- if (hqUrlMatch && hqUrlMatch[0]) {
7643
- logger_default.info(`\u6B63\u5219\u63D0\u53D6\u5230\u9AD8\u8D28\u91CF\u89C6\u9891URL (dreamnia): ${hqUrlMatch[0]}`);
7644
- return hqUrlMatch[0];
7690
+ const cdnUrlMatch = responseStr.match(/https:\/\/v[0-9]+-[^"\\]*\.(jimeng|capcut|dreamina)\.com\/[^"\s\\]+/);
7691
+ if (cdnUrlMatch && cdnUrlMatch[0]) {
7692
+ logger_default.info(`\u6B63\u5219\u63D0\u53D6\u5230\u89C6\u9891URL: ${cdnUrlMatch[0]}`);
7693
+ return cdnUrlMatch[0];
7645
7694
  }
7646
- const jimengUrlMatch = responseStr.match(/https:\/\/v[0-9]+-[^"\\]*\.jimeng\.com\/[^"\s\\]+/);
7647
- if (jimengUrlMatch && jimengUrlMatch[0]) {
7648
- logger_default.info(`\u6B63\u5219\u63D0\u53D6\u5230jimeng\u89C6\u9891URL: ${jimengUrlMatch[0]}`);
7649
- return jimengUrlMatch[0];
7650
- }
7651
- const anyVideoUrlMatch = responseStr.match(/https:\/\/v[0-9]+-[^"\\]*\.(vlabvod|jimeng)\.com\/[^"\s\\]+/);
7652
- if (anyVideoUrlMatch && anyVideoUrlMatch[0]) {
7653
- logger_default.info(`\u4ECEget_local_item_list\u63D0\u53D6\u5230\u89C6\u9891URL: ${anyVideoUrlMatch[0]}`);
7654
- return anyVideoUrlMatch[0];
7695
+ const vlabUrlMatch = responseStr.match(/https:\/\/v[0-9]+-[^"\\]*\.vlabvod\.com\/[^"\s\\]+/);
7696
+ if (vlabUrlMatch && vlabUrlMatch[0]) {
7697
+ logger_default.info(`\u6B63\u5219\u63D0\u53D6\u5230\u89C6\u9891URL: ${vlabUrlMatch[0]}`);
7698
+ return vlabUrlMatch[0];
7655
7699
  }
7656
7700
  logger_default.warn(`\u672A\u80FD\u4ECEget_local_item_list\u54CD\u5E94\u4E2D\u63D0\u53D6\u5230\u89C6\u9891URL`);
7657
7701
  return null;
@@ -8052,7 +8096,7 @@ async function uploadImageBuffer(imageBuffer, refreshToken, regionInfo) {
8052
8096
  "Authorization": auth,
8053
8097
  "Connection": "keep-alive",
8054
8098
  "Content-CRC32": crc32,
8055
- "Content-Disposition": 'attachment; filename="undefined"',
8099
+ "Content-Disposition": 'attachment; filename="upload.bin"',
8056
8100
  "Content-Type": "application/octet-stream",
8057
8101
  "Origin": origin,
8058
8102
  "Referer": RegionUtils.getRefererPath(regionInfo),
@@ -10000,7 +10044,8 @@ async function generateVideo(_model, prompt, {
10000
10044
  isDefaultSeed: 1,
10001
10045
  originSubmitId,
10002
10046
  isRegenerate: false,
10003
- enterFrom: "click",
10047
+ enterFrom: "use_bgimage_prompt",
10048
+ position: "page_bottom_box",
10004
10049
  functionMode: flFunctionMode,
10005
10050
  sceneOptions: JSON.stringify([sceneOption])
10006
10051
  });
@@ -10125,7 +10170,7 @@ async function generateVideo(_model, prompt, {
10125
10170
  timeoutSeconds: pollerOptions.timeoutSeconds
10126
10171
  });
10127
10172
  const { result: pollingResult, data: finalHistoryData } = await poller.poll(async () => {
10128
- var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2;
10173
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l, _m, _n, _o;
10129
10174
  pollAttempts++;
10130
10175
  const result = await request("post", "/mweb/v1/get_history_by_ids", refreshToken, regionInfo, {
10131
10176
  data: {
@@ -10150,7 +10195,7 @@ async function generateVideo(_model, prompt, {
10150
10195
  const currentItemList = historyData.item_list || [];
10151
10196
  const finishTime = ((_a2 = historyData.task) == null ? void 0 : _a2.finish_time) || 0;
10152
10197
  if (currentItemList.length > 0) {
10153
- const tempVideoUrl = ((_e2 = (_d2 = (_c2 = (_b2 = currentItemList[0]) == null ? void 0 : _b2.video) == null ? void 0 : _c2.transcoded_video) == null ? void 0 : _d2.origin) == null ? void 0 : _e2.video_url) || ((_g2 = (_f2 = currentItemList[0]) == null ? void 0 : _f2.video) == null ? void 0 : _g2.play_url) || ((_i2 = (_h2 = currentItemList[0]) == null ? void 0 : _h2.video) == null ? void 0 : _i2.download_url) || ((_k2 = (_j2 = currentItemList[0]) == null ? void 0 : _j2.video) == null ? void 0 : _k2.url);
10198
+ const tempVideoUrl = ((_e2 = (_d2 = (_c2 = (_b2 = currentItemList[0]) == null ? void 0 : _b2.common_attr) == null ? void 0 : _c2.transcoded_video) == null ? void 0 : _d2.origin) == null ? void 0 : _e2.video_url) || ((_i2 = (_h2 = (_g2 = (_f2 = currentItemList[0]) == null ? void 0 : _f2.video) == null ? void 0 : _g2.transcoded_video) == null ? void 0 : _h2.origin) == null ? void 0 : _i2.video_url) || ((_k2 = (_j2 = currentItemList[0]) == null ? void 0 : _j2.video) == null ? void 0 : _k2.play_url) || ((_m = (_l = currentItemList[0]) == null ? void 0 : _l.video) == null ? void 0 : _m.download_url) || ((_o = (_n = currentItemList[0]) == null ? void 0 : _n.video) == null ? void 0 : _o.url);
10154
10199
  if (tempVideoUrl) {
10155
10200
  logger_default.info(`\u68C0\u6D4B\u5230\u89C6\u9891URL: ${tempVideoUrl}`);
10156
10201
  }
@@ -10225,4 +10270,4 @@ lodash/lodash.js:
10225
10270
  * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
10226
10271
  *)
10227
10272
  */
10228
- //# sourceMappingURL=chunk-2IIK4X7C.js.map
10273
+ //# sourceMappingURL=chunk-FAXTAAQO.js.map