karin-plugin-kkk 2.24.0 → 2.25.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  # Changelog
4
4
 
5
+ ## [2.25.0](https://github.com/ikenxuan/karin-plugin-kkk/compare/v2.24.0...v2.25.0) (2026-03-11)
6
+
7
+
8
+ ### ✨ 新功能
9
+
10
+ * **core:** 解析动图作品时,实验性将合并转发消息中的静态图片魔改成 Google Motion 标准的 Live Photo ([5e789e3](https://github.com/ikenxuan/karin-plugin-kkk/commit/5e789e351eebfaca84e26c326ddf7c16e253a20f))
11
+
12
+
13
+ ### 🐛 错误修复
14
+
15
+ * 取消注释 ([921bf95](https://github.com/ikenxuan/karin-plugin-kkk/commit/921bf95ad05d8ac17a2540ac9aa3014beed3b6e5))
16
+
5
17
  ## [2.24.0](https://github.com/ikenxuan/karin-plugin-kkk/compare/v2.23.2...v2.24.0) (2026-03-10)
6
18
 
7
19
 
package/lib/apps/admin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "../core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { C as biLogin, E as task, T as removeOldFiles, w as dylogin } from "../core_chunk/main-1eljaHiz.js";
3
- import "../core_chunk/vendor-DxfKHvj-.js";
4
- import "../core_chunk/template-DekmxKd7.js";
2
+ import { C as biLogin, E as task, T as removeOldFiles, w as dylogin } from "../core_chunk/main-DjlCg9e5.js";
3
+ import "../core_chunk/vendor-9pKTNH6x.js";
4
+ import "../core_chunk/template-CsOboAFj.js";
5
5
  export { biLogin, dylogin, removeOldFiles, task };
package/lib/apps/help.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "../core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { S as version, x as help } from "../core_chunk/main-1eljaHiz.js";
3
- import "../core_chunk/vendor-DxfKHvj-.js";
4
- import "../core_chunk/template-DekmxKd7.js";
2
+ import { S as version, x as help } from "../core_chunk/main-DjlCg9e5.js";
3
+ import "../core_chunk/vendor-9pKTNH6x.js";
4
+ import "../core_chunk/template-CsOboAFj.js";
5
5
  export { help, version };
package/lib/apps/push.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "../core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { _ as forcePush, b as testDouyinPush, f as bilibiliPush, g as douyinPushList, h as douyinPush, m as changeBotID, p as bilibiliPushList, v as setbiliPush, y as setdyPush } from "../core_chunk/main-1eljaHiz.js";
3
- import "../core_chunk/vendor-DxfKHvj-.js";
4
- import "../core_chunk/template-DekmxKd7.js";
2
+ import { _ as forcePush, b as testDouyinPush, f as bilibiliPush, g as douyinPushList, h as douyinPush, m as changeBotID, p as bilibiliPushList, v as setbiliPush, y as setdyPush } from "../core_chunk/main-DjlCg9e5.js";
3
+ import "../core_chunk/vendor-9pKTNH6x.js";
4
+ import "../core_chunk/template-CsOboAFj.js";
5
5
  export { bilibiliPush, bilibiliPushList, changeBotID, douyinPush, douyinPushList, forcePush, setbiliPush, setdyPush, testDouyinPush };
@@ -1,5 +1,5 @@
1
1
  import "../core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { d as qrLogin } from "../core_chunk/main-1eljaHiz.js";
3
- import "../core_chunk/vendor-DxfKHvj-.js";
4
- import "../core_chunk/template-DekmxKd7.js";
2
+ import { d as qrLogin } from "../core_chunk/main-DjlCg9e5.js";
3
+ import "../core_chunk/vendor-9pKTNH6x.js";
4
+ import "../core_chunk/template-CsOboAFj.js";
5
5
  export { qrLogin };
@@ -1,5 +1,5 @@
1
1
  import "../core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { l as globalStatistics, u as groupStatistics } from "../core_chunk/main-1eljaHiz.js";
3
- import "../core_chunk/vendor-DxfKHvj-.js";
4
- import "../core_chunk/template-DekmxKd7.js";
2
+ import { l as globalStatistics, u as groupStatistics } from "../core_chunk/main-DjlCg9e5.js";
3
+ import "../core_chunk/vendor-9pKTNH6x.js";
4
+ import "../core_chunk/template-CsOboAFj.js";
5
5
  export { globalStatistics, groupStatistics };
package/lib/apps/tools.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "../core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { a as douyinAPP, c as xiaohongshuAPP, i as bilibiliAPP, o as kuaishouAPP, s as prefix } from "../core_chunk/main-1eljaHiz.js";
3
- import "../core_chunk/vendor-DxfKHvj-.js";
4
- import "../core_chunk/template-DekmxKd7.js";
2
+ import { a as douyinAPP, c as xiaohongshuAPP, i as bilibiliAPP, o as kuaishouAPP, s as prefix } from "../core_chunk/main-DjlCg9e5.js";
3
+ import "../core_chunk/vendor-9pKTNH6x.js";
4
+ import "../core_chunk/template-CsOboAFj.js";
5
5
  export { bilibiliAPP, douyinAPP, kuaishouAPP, prefix, xiaohongshuAPP };
@@ -1,5 +1,5 @@
1
1
  import "../core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { n as kkkUpdateCommand, r as update, t as kkkUpdate } from "../core_chunk/main-1eljaHiz.js";
3
- import "../core_chunk/vendor-DxfKHvj-.js";
4
- import "../core_chunk/template-DekmxKd7.js";
2
+ import { n as kkkUpdateCommand, r as update, t as kkkUpdate } from "../core_chunk/main-DjlCg9e5.js";
3
+ import "../core_chunk/vendor-9pKTNH6x.js";
4
+ import "../core_chunk/template-CsOboAFj.js";
5
5
  export { kkkUpdate, kkkUpdateCommand, update };
@@ -1,10 +1,10 @@
1
1
  {
2
- "version": "2.24.0",
3
- "buildTime": "2026-03-10T21:34:33.429Z",
4
- "buildTimestamp": 1773178473429,
2
+ "version": "2.25.0",
3
+ "buildTime": "2026-03-11T00:26:59.339Z",
4
+ "buildTimestamp": 1773188819339,
5
5
  "name": "karin-plugin-kkk",
6
6
  "description": "Karin 的「抖音」「B 站」视频解析/动态推送插件",
7
7
  "homepage": "https://github.com/ikenxuan/karin-plugin-kkk",
8
- "commitHash": "2d382ab276694e9bed2c1b785e937e32934380eb",
9
- "shortCommitHash": "2d382ab2"
8
+ "commitHash": "4b896c643cd81be8e8e0b46dc398af4b168de084",
9
+ "shortCommitHash": "4b896c64"
10
10
  }
@@ -1,6 +1,6 @@
1
1
  import { n as __esmMin, o as __toESM, r as __export } from "./rolldown-runtime-BMXAG3ag.js";
2
- import { A as init_locale, An as init_zod, Cn as Chalk, Dn as axios_default, En as init_axios, On as Xhshow, Sn as require_protobufjs, Tn as AxiosError$1, _n as require_png, a as Window, bn as require_heic_decode, dt as init_date_fns, ft as fromUnixTime, ht as differenceInSeconds, i as init_lib, j as zhCN, jn as zod_default, kn as init_dist, mt as format, n as require_lib, pt as formatDistanceToNow, r as require_qr_code_styling, t as require_dist, vn as require_jsQR, wn as init_source, xn as require_express, yn as require_jpeg_js } from "./vendor-DxfKHvj-.js";
3
- import { n as init_client, r as reactServerRender } from "./template-DekmxKd7.js";
2
+ import { A as init_locale, An as init_zod, Cn as Chalk, Dn as axios_default, En as init_axios, On as Xhshow, Sn as require_protobufjs, Tn as AxiosError$1, _n as require_png, a as Window, bn as require_heic_decode, dt as init_date_fns, ft as fromUnixTime, ht as differenceInSeconds, i as init_lib, j as zhCN, jn as zod_default, kn as init_dist, mt as format, n as require_lib, pt as formatDistanceToNow, r as require_qr_code_styling, t as require_dist, vn as require_jsQR, wn as init_source, xn as require_express, yn as require_jpeg_js } from "./vendor-9pKTNH6x.js";
3
+ import { n as init_client, r as reactServerRender } from "./template-CsOboAFj.js";
4
4
  import { createRequire } from "node:module";
5
5
  import karin$1, { BOT_CONNECT, app, authMiddleware, checkPkgUpdate, checkPort, common, components, config, copyConfigSync, createBadRequestResponse, createNotFoundResponse, createServerErrorResponse, createSuccessResponse, db, defineConfig, ffmpeg, ffprobe, filesByExt, getBot, hooks, karin, karinPathHtml, karinPathTemp, logger, logs, mkdirSync, range, render, requireFileSync, restart, segment, updatePkg, watch } from "node-karin";
6
6
  import fs from "node:fs";
@@ -7123,7 +7123,7 @@ async function getMediaDuration(path$1) {
7123
7123
  }
7124
7124
  async function mergeVideoAudio(videoPath, audioPath, resultPath) {
7125
7125
  const result = await ffmpeg(`-y -i "${videoPath}" -i "${audioPath}" -c copy "${resultPath}"`);
7126
- if (result.status) logger.mark(`视频合成成功: ${resultPath}`);
7126
+ if (result.status) logger.debug(`视频合成成功: ${resultPath}`);
7127
7127
  else logger.error("视频合成失败", result);
7128
7128
  return result.status;
7129
7129
  }
@@ -7131,12 +7131,12 @@ async function compressVideo(options) {
7131
7131
  const { inputPath, outputPath, targetBitrate, maxRate = targetBitrate * 1.5, bufSize = targetBitrate * 2, crf = 35, removeSource = true } = options;
7132
7132
  const result = await ffmpeg(`-y -i "${inputPath}" -b:v ${targetBitrate}k -maxrate ${maxRate}k -bufsize ${bufSize}k -crf ${crf} -preset medium -c:v libx264 -vf "scale='if(gte(iw/ih,16/9),1280,-1)':'if(gte(iw/ih,16/9),-1,720)',scale=ceil(iw/2)*2:ceil(ih/2)*2" "${outputPath}"`);
7133
7133
  if (result.status) {
7134
- logger.mark(`视频压缩成功: ${outputPath}`);
7134
+ logger.debug(`视频压缩成功: ${outputPath}`);
7135
7135
  if (removeSource) Common.removeFile(inputPath);
7136
7136
  } else logger.error(`视频压缩失败: ${inputPath}`, result);
7137
7137
  return result.status;
7138
7138
  }
7139
- var getMediaFrameRate, loopVideoWithTransition;
7139
+ var getMediaFrameRate, loopVideoWithTransition, xmpHeaderBuffer, isJpegBuffer, buildMotionPhotoXmp, injectXmpToJpeg, readOrConvertToJpeg, buildGoogleMotionPhoto;
7140
7140
  var init_FFmpeg = __esmMin(async () => {
7141
7141
  await init_utils$1();
7142
7142
  getMediaFrameRate = async (path$1) => {
@@ -7214,7 +7214,7 @@ var init_FFmpeg = __esmMin(async () => {
7214
7214
  else bgmInputArgs = `-stream_loop ${Math.ceil(totalDuration / baseContext.bgmDuration) + 1} -ss ${bgmStartTime} -i "${bgmPath}"`;
7215
7215
  } else if (bgmNeedLoop) bgmInputArgs = `-stream_loop ${Math.max(0, Math.ceil(totalDuration / baseContext.bgmDuration) - 1)} -i "${bgmPath}"`;
7216
7216
  const result$1 = await ffmpeg(`-y ${inputArgs} ${bgmInputArgs} -filter_complex "${filterComplex};[0:a][${bgmInputIndex}:a]amix=inputs=2:duration=longest:dropout_transition=3[aout]" -map "[outv]" -map "[aout]" -c:v libx264 -c:a aac -b:a 192k -pix_fmt yuv420p -shortest "${outputPath}"`);
7217
- if (result$1.status) logger.mark(`Live Photo 效果视频重放成功: ${outputPath}`);
7217
+ if (result$1.status) logger.debug(`Live Photo 效果视频重放成功: ${outputPath}`);
7218
7218
  else logger.error("Live Photo 效果视频重放失败", result$1);
7219
7219
  if (mergeMode === "continuous") {
7220
7220
  const outputDuration = result$1.status ? await getMediaDuration(outputPath) : totalDuration;
@@ -7230,10 +7230,75 @@ var init_FFmpeg = __esmMin(async () => {
7230
7230
  };
7231
7231
  }
7232
7232
  const result = await ffmpeg(`-y ${inputArgs} -filter_complex "${filterComplex}" -map "[outv]" -c:v libx264 -pix_fmt yuv420p "${outputPath}"`);
7233
- if (result.status) logger.mark(`Live Photo 效果视频重放成功: ${outputPath}`);
7233
+ if (result.status) logger.debug(`Live Photo 效果视频重放成功: ${outputPath}`);
7234
7234
  else logger.error("Live Photo 效果视频重放失败", result);
7235
7235
  return { success: result.status };
7236
7236
  };
7237
+ xmpHeaderBuffer = Buffer.from("http://ns.adobe.com/xap/1.0/\0", "utf8");
7238
+ isJpegBuffer = (fileBuffer) => fileBuffer.length > 2 && fileBuffer[0] === 255 && fileBuffer[1] === 216;
7239
+ buildMotionPhotoXmp = (videoLength, presentationTimestampUs) => `<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.1.0-jc003"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" ${[
7240
+ "xmlns:GCamera=\"http://ns.google.com/photos/1.0/camera/\"",
7241
+ "xmlns:MiCamera=\"http://ns.xiaomi.com/photos/1.0/camera/\"",
7242
+ "xmlns:Container=\"http://ns.google.com/photos/1.0/container/\"",
7243
+ "xmlns:Item=\"http://ns.google.com/photos/1.0/container/item/\"",
7244
+ `GCamera:MotionPhoto="1" GCamera:MotionPhotoVersion="1" GCamera:MotionPhotoPresentationTimestampUs="${presentationTimestampUs}"`,
7245
+ `GCamera:MicroVideo="1" GCamera:MicroVideoVersion="1" GCamera:MicroVideoOffset="${videoLength}"`,
7246
+ `GCamera:MicroVideoPresentationTimestampUs="${presentationTimestampUs}"`,
7247
+ "MiCamera:XMPMeta=\"&lt;?xml version=&apos;1.0&apos; encoding=&apos;UTF-8&apos; standalone=&apos;yes&apos; ?&gt;\"",
7248
+ "xmlns:OpCamera=\"http://ns.oplus.com/photos/1.0/camera/\"",
7249
+ `OpCamera:MotionPhotoPrimaryPresentationTimestampUs="${presentationTimestampUs}"`,
7250
+ "OpCamera:MotionPhotoOwner=\"oplus\"",
7251
+ "OpCamera:OLivePhotoVersion=\"2\"",
7252
+ `OpCamera:VideoLength="${videoLength}"`
7253
+ ].join(" ")}><Container:Directory><rdf:Seq><rdf:li rdf:parseType="Resource"><Container:Item Item:Mime="image/jpeg" Item:Semantic="Primary" Item:Length="0" Item:Padding="0" /></rdf:li><rdf:li rdf:parseType="Resource"><Container:Item Item:Mime="video/mp4" Item:Semantic="MotionPhoto" Item:Length="${videoLength}" Item:Padding="0" /></rdf:li></rdf:Seq></Container:Directory></rdf:Description></rdf:RDF></x:xmpmeta>`;
7254
+ injectXmpToJpeg = (jpegBuffer, xmpPacket) => {
7255
+ if (!isJpegBuffer(jpegBuffer)) throw new Error("输入图片不是 JPEG 格式");
7256
+ const xmpPayload = Buffer.concat([xmpHeaderBuffer, Buffer.from(xmpPacket, "utf8")]);
7257
+ const app1Length = xmpPayload.length + 2;
7258
+ if (app1Length > 65535) throw new Error("XMP 数据过大,无法写入 JPEG APP1");
7259
+ const app1Segment = Buffer.alloc(4);
7260
+ app1Segment[0] = 255;
7261
+ app1Segment[1] = 225;
7262
+ app1Segment.writeUInt16BE(app1Length, 2);
7263
+ return Buffer.concat([
7264
+ jpegBuffer.subarray(0, 2),
7265
+ app1Segment,
7266
+ xmpPayload,
7267
+ jpegBuffer.subarray(2)
7268
+ ]);
7269
+ };
7270
+ readOrConvertToJpeg = async (imagePath) => {
7271
+ const sourceBuffer = fs.readFileSync(imagePath);
7272
+ if (isJpegBuffer(sourceBuffer)) return sourceBuffer;
7273
+ const tempJpegPath = path.join(Common.tempDri.images, `MotionPhoto_${Date.now()}_${Math.random().toString(36).slice(2)}.jpg`);
7274
+ if (!(await ffmpeg(`-y -i "${imagePath}" -frames:v 1 -q:v 2 "${tempJpegPath}"`)).status) throw new Error(`图片转换 JPEG 失败: ${imagePath}`);
7275
+ try {
7276
+ return fs.readFileSync(tempJpegPath);
7277
+ } finally {
7278
+ fs.rmSync(tempJpegPath, { force: true });
7279
+ }
7280
+ };
7281
+ buildGoogleMotionPhoto = async (options) => {
7282
+ const { imagePath, videoPath, outputPath, presentationTimestampUs } = options;
7283
+ try {
7284
+ const imageBuffer = await readOrConvertToJpeg(imagePath);
7285
+ const videoBuffer = fs.readFileSync(videoPath);
7286
+ let resolvedPresentationTimestampUs = presentationTimestampUs;
7287
+ if (resolvedPresentationTimestampUs === void 0 || resolvedPresentationTimestampUs < 0) {
7288
+ const videoDurationSeconds = await getMediaDuration(videoPath);
7289
+ if (Number.isFinite(videoDurationSeconds) && videoDurationSeconds > 0) resolvedPresentationTimestampUs = Math.round(videoDurationSeconds * 5e5);
7290
+ else resolvedPresentationTimestampUs = 15e5;
7291
+ }
7292
+ const jpegWithXmp = injectXmpToJpeg(imageBuffer, buildMotionPhotoXmp(videoBuffer.length, resolvedPresentationTimestampUs));
7293
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
7294
+ fs.writeFileSync(outputPath, Buffer.concat([jpegWithXmp, videoBuffer]));
7295
+ logger.debug(`Google Motion Photo 封面生成成功: ${outputPath}`);
7296
+ return true;
7297
+ } catch (error) {
7298
+ logger.error("Google Motion Photo 封面生成失败", error);
7299
+ return false;
7300
+ }
7301
+ };
7237
7302
  });
7238
7303
  var ERROR_CODE_MAP, RECOVERABLE_ERROR_CODES, RECOVERABLE_KEYWORDS, BASE_HEADERS;
7239
7304
  var init_constants = __esmMin(() => {
@@ -15792,6 +15857,10 @@ var Bilibili = class extends Base {
15792
15857
  headers: BASE_HEADERS,
15793
15858
  filepath: Common.tempDri.images + `Bilibili_static_${Date.now()}_${index}.jpg`
15794
15859
  });
15860
+ if (staticImg.filepath) temp.push({
15861
+ filepath: staticImg.filepath,
15862
+ totalBytes: 0
15863
+ });
15795
15864
  const loopCount = 3;
15796
15865
  if (!staticImg.filepath) {
15797
15866
  await Common.removeFile(livePhoto.filepath, true);
@@ -15808,16 +15877,35 @@ var Bilibili = class extends Base {
15808
15877
  const filePath = Common.tempDri.video + `tmp_${Date.now()}.mp4`;
15809
15878
  fs.renameSync(outputPath, filePath);
15810
15879
  logger.mark(`视频文件重命名完成: ${outputPath.split("/").pop()} -> ${filePath.split("/").pop()}`);
15811
- logger.mark("正在尝试删除缓存文件");
15812
- await Common.removeFile(livePhoto.filepath, true);
15813
15880
  temp.push({
15814
15881
  filepath: filePath,
15815
15882
  totalBytes: 0
15816
15883
  });
15817
15884
  const videoPath = Config.upload.videoSendMode === "base64" ? `base64://${fs.readFileSync(filePath).toString("base64")}` : `file://${filePath}`;
15818
15885
  imgArray.push(segment.video(videoPath));
15819
- const imageUrl = await processImageUrl(img$2.url, title, index);
15820
- imgArray.push(segment.image(imageUrl));
15886
+ let hasPushedMotionPhotoCover = false;
15887
+ if (staticImg.filepath) {
15888
+ const motionPhotoCoverPath = Common.tempDri.images + `MVIMG_${format(/* @__PURE__ */ new Date(), "yyyyMMdd_HHmmss_SSS")}_${index}.jpg`;
15889
+ if (await buildGoogleMotionPhoto({
15890
+ imagePath: staticImg.filepath,
15891
+ videoPath: livePhoto.filepath,
15892
+ outputPath: motionPhotoCoverPath
15893
+ })) {
15894
+ temp.push({
15895
+ filepath: motionPhotoCoverPath,
15896
+ totalBytes: 0
15897
+ });
15898
+ const motionPhotoCover = Config.upload.imageSendMode === "base64" ? `base64://${fs.readFileSync(motionPhotoCoverPath).toString("base64")}` : `file://${motionPhotoCoverPath}`;
15899
+ imgArray.push(segment.image(motionPhotoCover));
15900
+ hasPushedMotionPhotoCover = true;
15901
+ }
15902
+ }
15903
+ if (!hasPushedMotionPhotoCover) {
15904
+ const imageUrl = await processImageUrl(img$2.url, title, index);
15905
+ imgArray.push(segment.image(imageUrl));
15906
+ }
15907
+ logger.mark("正在尝试删除缓存文件");
15908
+ await Common.removeFile(livePhoto.filepath, true);
15821
15909
  } else await Common.removeFile(livePhoto.filepath, true);
15822
15910
  }
15823
15911
  } else {
@@ -17602,6 +17690,10 @@ var Bilibilipush = class extends Base {
17602
17690
  headers: bilibiliBaseHeaders,
17603
17691
  filepath: Common.tempDri.images + `Bilibili_static_${Date.now()}_${index}.jpg`
17604
17692
  });
17693
+ if (staticImg.filepath) temp.push({
17694
+ filepath: staticImg.filepath,
17695
+ totalBytes: 0
17696
+ });
17605
17697
  const loopCount = 3;
17606
17698
  if (!staticImg.filepath) {
17607
17699
  await Common.removeFile(livePhoto.filepath, true);
@@ -17617,16 +17709,35 @@ var Bilibilipush = class extends Base {
17617
17709
  const filePath = Common.tempDri.video + `tmp_${Date.now()}.mp4`;
17618
17710
  fs.renameSync(outputPath, filePath);
17619
17711
  logger.mark(`视频文件重命名完成: ${outputPath.split("/").pop()} -> ${filePath.split("/").pop()}`);
17620
- logger.mark("正在尝试删除缓存文件");
17621
- await Common.removeFile(staticImg.filepath, true);
17622
17712
  temp.push({
17623
17713
  filepath: filePath,
17624
17714
  totalBytes: 0
17625
17715
  });
17626
17716
  const videoPath = Config.upload.videoSendMode === "base64" ? `base64://${fs.readFileSync(filePath).toString("base64")}` : `file://${filePath}`;
17627
17717
  imgArray.push(segment.video(videoPath));
17628
- const imageUrl = await processImageUrl(imageSrc, title, index);
17629
- imgArray.push(segment.image(imageUrl));
17718
+ let hasPushedMotionPhotoCover = false;
17719
+ if (staticImg.filepath) {
17720
+ const motionPhotoCoverPath = Common.tempDri.images + `MVIMG_${Date.now()}_${index}.jpg`;
17721
+ if (await buildGoogleMotionPhoto({
17722
+ imagePath: staticImg.filepath,
17723
+ videoPath: livePhoto.filepath,
17724
+ outputPath: motionPhotoCoverPath
17725
+ })) {
17726
+ temp.push({
17727
+ filepath: motionPhotoCoverPath,
17728
+ totalBytes: 0
17729
+ });
17730
+ const motionPhotoCover = Config.upload.imageSendMode === "base64" ? `base64://${fs.readFileSync(motionPhotoCoverPath).toString("base64")}` : `file://${motionPhotoCoverPath}`;
17731
+ imgArray.push(segment.image(motionPhotoCover));
17732
+ hasPushedMotionPhotoCover = true;
17733
+ }
17734
+ }
17735
+ if (!hasPushedMotionPhotoCover) {
17736
+ const imageUrl = await processImageUrl(imageSrc, title, index);
17737
+ imgArray.push(segment.image(imageUrl));
17738
+ }
17739
+ logger.mark("正在尝试删除缓存文件");
17740
+ await Common.removeFile(livePhoto.filepath, true);
17630
17741
  continue;
17631
17742
  }
17632
17743
  await Common.removeFile(livePhoto.filepath, true);
@@ -18498,11 +18609,18 @@ var DouYin = class extends Base {
18498
18609
  const outputPath = Common.tempDri.video + `Douyin_Result_${Date.now()}.mp4`;
18499
18610
  const loopCount = imageItem.clip_type === 4 ? 1 : 3;
18500
18611
  let staticImgPath = "";
18501
- if (imageItem.url_list?.[0]) staticImgPath = (await downloadFile(imageItem.url_list[0], {
18502
- title: `Douyin_static_${Date.now()}_${index}.jpg`,
18503
- headers: this.headers,
18504
- filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
18505
- })).filepath ?? "";
18612
+ if (imageItem.url_list?.[0]) {
18613
+ const staticImg = await downloadFile(imageItem.url_list[0], {
18614
+ title: `Douyin_static_${Date.now()}_${index}.jpg`,
18615
+ headers: this.headers,
18616
+ filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
18617
+ });
18618
+ temp.push({
18619
+ filepath: staticImg.filepath,
18620
+ totalBytes: 0
18621
+ });
18622
+ staticImgPath = staticImg.filepath ?? "";
18623
+ }
18506
18624
  const transitionEnabled = loopCount > 1 && Boolean(staticImgPath);
18507
18625
  const safeStaticPath = staticImgPath || liveimg.filepath;
18508
18626
  const result = await loopVideoWithTransition({
@@ -18521,8 +18639,6 @@ var DouYin = class extends Base {
18521
18639
  const filePath = Common.tempDri.video + `tmp_${Date.now()}.mp4`;
18522
18640
  fs.renameSync(outputPath, filePath);
18523
18641
  logger.mark(`视频文件重命名完成: ${outputPath.split("/").pop()} -> ${filePath.split("/").pop()}`);
18524
- logger.mark("正在尝试删除缓存文件");
18525
- await Common.removeFile(liveimg.filepath, true);
18526
18642
  temp.push({
18527
18643
  filepath: filePath,
18528
18644
  totalBytes: 0
@@ -18530,9 +18646,30 @@ var DouYin = class extends Base {
18530
18646
  const videoPath = Config.upload.videoSendMode === "base64" ? `base64://${fs.readFileSync(filePath).toString("base64")}` : `file://${filePath}`;
18531
18647
  processedImages.push(segment.video(videoPath));
18532
18648
  if (imageItem.clip_type === 5 && imageItem.url_list?.[0]) {
18533
- const imageUrl = await processImageUrl(imageItem.url_list[0], g_title, index);
18534
- processedImages.push(segment.image(imageUrl));
18649
+ let hasPushedMotionPhotoCover = false;
18650
+ if (staticImgPath) {
18651
+ const motionPhotoCoverPath = Common.tempDri.images + `MVIMG_${format(/* @__PURE__ */ new Date(), "yyyyMMdd_HHmmss_SSS")}_${index}.jpg`;
18652
+ if (await buildGoogleMotionPhoto({
18653
+ imagePath: staticImgPath,
18654
+ videoPath: liveimg.filepath,
18655
+ outputPath: motionPhotoCoverPath
18656
+ })) {
18657
+ temp.push({
18658
+ filepath: motionPhotoCoverPath,
18659
+ totalBytes: 0
18660
+ });
18661
+ const motionPhotoCover = Config.upload.imageSendMode === "base64" ? `base64://${fs.readFileSync(motionPhotoCoverPath).toString("base64")}` : `file://${motionPhotoCoverPath}`;
18662
+ processedImages.push(segment.image(motionPhotoCover));
18663
+ hasPushedMotionPhotoCover = true;
18664
+ }
18665
+ }
18666
+ if (!hasPushedMotionPhotoCover) {
18667
+ const imageUrl = await processImageUrl(imageItem.url_list[0], g_title, index);
18668
+ processedImages.push(segment.image(imageUrl));
18669
+ }
18535
18670
  }
18671
+ logger.mark("正在尝试删除缓存文件");
18672
+ await Common.removeFile(liveimg.filepath, true);
18536
18673
  } else await Common.removeFile(liveimg.filepath, true);
18537
18674
  }
18538
18675
  }
@@ -18612,11 +18749,18 @@ var DouYin = class extends Base {
18612
18749
  const outputPath = Common.tempDri.video + `Douyin_Result_${Date.now()}.mp4`;
18613
18750
  const loopCount = item.clip_type === 4 ? 1 : 3;
18614
18751
  let staticImgPath = "";
18615
- if (item.url_list?.[0]) staticImgPath = (await downloadFile(item.url_list[0], {
18616
- title: `Douyin_static_${Date.now()}_${index}.jpg`,
18617
- headers: this.headers,
18618
- filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
18619
- })).filepath ?? "";
18752
+ if (item.url_list?.[0]) {
18753
+ const staticImg = await downloadFile(item.url_list[0], {
18754
+ title: `Douyin_static_${Date.now()}_${index}.jpg`,
18755
+ headers: this.headers,
18756
+ filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
18757
+ });
18758
+ temp.push({
18759
+ filepath: staticImg.filepath,
18760
+ totalBytes: 0
18761
+ });
18762
+ staticImgPath = staticImg.filepath ?? "";
18763
+ }
18620
18764
  const transitionEnabled = loopCount > 1 && Boolean(staticImgPath);
18621
18765
  const safeStaticPath = staticImgPath || livePhoto.filepath;
18622
18766
  const result = await loopVideoWithTransition({
@@ -18635,8 +18779,6 @@ var DouYin = class extends Base {
18635
18779
  const filePath = Common.tempDri.video + `tmp_${Date.now()}.mp4`;
18636
18780
  fs.renameSync(outputPath, filePath);
18637
18781
  logger.mark(`视频文件重命名完成: ${outputPath.split("/").pop()} -> ${filePath.split("/").pop()}`);
18638
- logger.mark("正在尝试删除缓存文件");
18639
- await Common.removeFile(livePhoto.filepath, true);
18640
18782
  temp.push({
18641
18783
  filepath: filePath,
18642
18784
  totalBytes: 0
@@ -18644,9 +18786,30 @@ var DouYin = class extends Base {
18644
18786
  const videoPath = Config.upload.videoSendMode === "base64" ? `base64://${fs.readFileSync(filePath).toString("base64")}` : `file://${filePath}`;
18645
18787
  images.push(segment.video(videoPath));
18646
18788
  if (item.clip_type === 5 && item.url_list?.[0]) {
18647
- const imageUrl = await processImageUrl(item.url_list[0], g_title, index);
18648
- images.push(segment.image(imageUrl));
18789
+ let hasPushedMotionPhotoCover = false;
18790
+ if (staticImgPath) {
18791
+ const motionPhotoCoverPath = Common.tempDri.images + `MVIMG_${format(/* @__PURE__ */ new Date(), "yyyyMMdd_HHmmss_SSS")}_${index}.jpg`;
18792
+ if (await buildGoogleMotionPhoto({
18793
+ imagePath: staticImgPath,
18794
+ videoPath: livePhoto.filepath,
18795
+ outputPath: motionPhotoCoverPath
18796
+ })) {
18797
+ temp.push({
18798
+ filepath: motionPhotoCoverPath,
18799
+ totalBytes: 0
18800
+ });
18801
+ const motionPhotoCover = Config.upload.imageSendMode === "base64" ? `base64://${fs.readFileSync(motionPhotoCoverPath).toString("base64")}` : `file://${motionPhotoCoverPath}`;
18802
+ images.push(segment.image(motionPhotoCover));
18803
+ hasPushedMotionPhotoCover = true;
18804
+ }
18805
+ }
18806
+ if (!hasPushedMotionPhotoCover) {
18807
+ const imageUrl = await processImageUrl(item.url_list[0], g_title, index);
18808
+ images.push(segment.image(imageUrl));
18809
+ }
18649
18810
  }
18811
+ logger.mark("正在尝试删除缓存文件");
18812
+ await Common.removeFile(livePhoto.filepath, true);
18650
18813
  } else await Common.removeFile(livePhoto.filepath, true);
18651
18814
  }
18652
18815
  }
@@ -19739,11 +19902,18 @@ var DouYinpush = class extends Base {
19739
19902
  const outputPath = Common.tempDri.video + `Douyin_Result_${Date.now()}.mp4`;
19740
19903
  const loopCount = item.clip_type === 4 ? 1 : 3;
19741
19904
  let staticImgPath = "";
19742
- if (item.url_list?.[0]) staticImgPath = (await downloadFile(item.url_list[0], {
19743
- title: `Douyin_static_${Date.now()}_${index}.jpg`,
19744
- headers: douyinBaseHeaders,
19745
- filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
19746
- })).filepath ?? "";
19905
+ if (item.url_list?.[0]) {
19906
+ const staticImg = await downloadFile(item.url_list[0], {
19907
+ title: `Douyin_static_${Date.now()}_${index}.jpg`,
19908
+ headers: douyinBaseHeaders,
19909
+ filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
19910
+ });
19911
+ if (staticImg.filepath) temp.push({
19912
+ filepath: staticImg.filepath,
19913
+ totalBytes: 0
19914
+ });
19915
+ staticImgPath = staticImg.filepath ?? "";
19916
+ }
19747
19917
  const transitionEnabled = loopCount > 1 && Boolean(staticImgPath);
19748
19918
  const safeStaticPath = staticImgPath || liveimg.filepath;
19749
19919
  const result = await loopVideoWithTransition({
@@ -19762,8 +19932,6 @@ var DouYinpush = class extends Base {
19762
19932
  const filePath = Common.tempDri.video + `tmp_${Date.now()}.mp4`;
19763
19933
  fs.renameSync(outputPath, filePath);
19764
19934
  logger.mark(`视频文件重命名完成: ${outputPath.split("/").pop()} -> ${filePath.split("/").pop()}`);
19765
- logger.mark("正在尝试删除缓存文件");
19766
- await Common.removeFile(liveimg.filepath, true);
19767
19935
  temp.push({
19768
19936
  filepath: filePath,
19769
19937
  totalBytes: 0
@@ -19771,9 +19939,30 @@ var DouYinpush = class extends Base {
19771
19939
  const videoPath = Config.upload.videoSendMode === "base64" ? `base64://${fs.readFileSync(filePath).toString("base64")}` : `file://${filePath}`;
19772
19940
  images.push(segment.video(videoPath));
19773
19941
  if (item.clip_type === 5 && item.url_list?.[0]) {
19774
- const imageUrl = await processImageUrl(item.url_list[0], Detail_Data.desc, index);
19775
- images.push(segment.image(imageUrl));
19942
+ let hasPushedMotionPhotoCover = false;
19943
+ if (staticImgPath) {
19944
+ const motionPhotoCoverPath = Common.tempDri.images + `MVIMG_${format(/* @__PURE__ */ new Date(), "yyyyMMdd_HHmmss_SSS")}_${index}.jpg`;
19945
+ if (await buildGoogleMotionPhoto({
19946
+ imagePath: staticImgPath,
19947
+ videoPath: liveimg.filepath,
19948
+ outputPath: motionPhotoCoverPath
19949
+ })) {
19950
+ temp.push({
19951
+ filepath: motionPhotoCoverPath,
19952
+ totalBytes: 0
19953
+ });
19954
+ const motionPhotoCover = Config.upload.imageSendMode === "base64" ? `base64://${fs.readFileSync(motionPhotoCoverPath).toString("base64")}` : `file://${motionPhotoCoverPath}`;
19955
+ images.push(segment.image(motionPhotoCover));
19956
+ hasPushedMotionPhotoCover = true;
19957
+ }
19958
+ }
19959
+ if (!hasPushedMotionPhotoCover) {
19960
+ const imageUrl = await processImageUrl(item.url_list[0], Detail_Data.desc, index);
19961
+ images.push(segment.image(imageUrl));
19962
+ }
19776
19963
  }
19964
+ logger.mark("正在尝试删除缓存文件");
19965
+ await Common.removeFile(liveimg.filepath, true);
19777
19966
  } else await Common.removeFile(liveimg.filepath, true);
19778
19967
  }
19779
19968
  }
@@ -19821,11 +20010,18 @@ var DouYinpush = class extends Base {
19821
20010
  const outputPath = Common.tempDri.video + `Douyin_Result_${Date.now()}.mp4`;
19822
20011
  const loopCount = item.clip_type === 4 ? 1 : 3;
19823
20012
  let staticImgPath = "";
19824
- if (item.url_list?.[0]) staticImgPath = (await downloadFile(item.url_list[0], {
19825
- title: `Douyin_static_${Date.now()}_${index}.jpg`,
19826
- headers: douyinBaseHeaders,
19827
- filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
19828
- })).filepath ?? "";
20013
+ if (item.url_list?.[0]) {
20014
+ const staticImg = await downloadFile(item.url_list[0], {
20015
+ title: `Douyin_static_${Date.now()}_${index}.jpg`,
20016
+ headers: douyinBaseHeaders,
20017
+ filepath: Common.tempDri.images + `Douyin_static_${Date.now()}_${index}.jpg`
20018
+ });
20019
+ if (staticImg.filepath) temp.push({
20020
+ filepath: staticImg.filepath,
20021
+ totalBytes: 0
20022
+ });
20023
+ staticImgPath = staticImg.filepath ?? "";
20024
+ }
19829
20025
  const transitionEnabled = loopCount > 1 && Boolean(staticImgPath);
19830
20026
  const safeStaticPath = staticImgPath || liveimg.filepath;
19831
20027
  const result = await loopVideoWithTransition({
@@ -19844,8 +20040,6 @@ var DouYinpush = class extends Base {
19844
20040
  const filePath = Common.tempDri.video + `tmp_${Date.now()}.mp4`;
19845
20041
  fs.renameSync(outputPath, filePath);
19846
20042
  logger.mark(`视频文件重命名完成: ${outputPath.split("/").pop()} -> ${filePath.split("/").pop()}`);
19847
- logger.mark("正在尝试删除缓存文件");
19848
- await Common.removeFile(liveimg.filepath, true);
19849
20043
  temp.push({
19850
20044
  filepath: filePath,
19851
20045
  totalBytes: 0
@@ -19853,9 +20047,30 @@ var DouYinpush = class extends Base {
19853
20047
  const videoPath = Config.upload.videoSendMode === "base64" ? `base64://${fs.readFileSync(filePath).toString("base64")}` : `file://${filePath}`;
19854
20048
  processedImages.push(segment.video(videoPath));
19855
20049
  if (item.clip_type === 5 && item.url_list?.[0]) {
19856
- const imageUrl = await processImageUrl(item.url_list[0], Detail_Data.desc, index);
19857
- processedImages.push(segment.image(imageUrl));
20050
+ let hasPushedMotionPhotoCover = false;
20051
+ if (staticImgPath) {
20052
+ const motionPhotoCoverPath = Common.tempDri.images + `MVIMG_${format(/* @__PURE__ */ new Date(), "yyyyMMdd_HHmmss_SSS")}_${index}.jpg`;
20053
+ if (await buildGoogleMotionPhoto({
20054
+ imagePath: staticImgPath,
20055
+ videoPath: liveimg.filepath,
20056
+ outputPath: motionPhotoCoverPath
20057
+ })) {
20058
+ temp.push({
20059
+ filepath: motionPhotoCoverPath,
20060
+ totalBytes: 0
20061
+ });
20062
+ const motionPhotoCover = Config.upload.imageSendMode === "base64" ? `base64://${fs.readFileSync(motionPhotoCoverPath).toString("base64")}` : `file://${motionPhotoCoverPath}`;
20063
+ processedImages.push(segment.image(motionPhotoCover));
20064
+ hasPushedMotionPhotoCover = true;
20065
+ }
20066
+ }
20067
+ if (!hasPushedMotionPhotoCover) {
20068
+ const imageUrl = await processImageUrl(item.url_list[0], Detail_Data.desc, index);
20069
+ processedImages.push(segment.image(imageUrl));
20070
+ }
19858
20071
  }
20072
+ logger.mark("正在尝试删除缓存文件");
20073
+ await Common.removeFile(liveimg.filepath, true);
19859
20074
  } else await Common.removeFile(liveimg.filepath, true);
19860
20075
  }
19861
20076
  }
@@ -1,5 +1,5 @@
1
1
  import { n as __esmMin, o as __toESM, r as __export } from "./rolldown-runtime-BMXAG3ag.js";
2
- import { $ as RiStarFill, $t as ExternalLink, A as init_locale, At as ThumbsUp, B as RiLineChartFill, Bt as QrCode, C as init_hi, Ct as init_io5, D as AiFillHeart, Dt as User, E as init_fa6, Et as Users, F as RiGroupLine, Ft as ShieldCheck, G as RiMessage3Fill, Gt as MapPin, H as RiListCheck2, Ht as Play, I as RiHashtag, It as Share2, J as RiRefreshLine, Jt as Hash, K as RiPieChart2Fill, Kt as Info, L as RiHeart2Line, Lt as ScanLine, M as RiArrowRightFill, Mt as Star, N as RiBarChartFill, Nt as Smartphone, O as AiFillStar, Ot as UserPlus, P as RiBellFill, Pt as Shield, Q as RiSparkling2Fill, Qt as Eye, R as RiHeart3Fill, Rt as Radio, S as HiOutlineMenuAlt2, St as IoSearch, T as FaCommentDots, Tt as Zap, U as RiLiveLine, Ut as Music, V as RiLinkM, Vt as Plug2, W as RiLoginCircleFill, Wt as MessageCircle, X as RiSendPlaneFill, Xt as Gamepad2, Y as RiRobot2Fill, Yt as Gift, Z as RiShareForwardFill, Zt as FileText, _ as init_md, _t as code_default, an as CircleEllipsis, at as RiVideoLine, b as TbScan, bt as HeroUIProvider, c as VictoryPie, cn as ChartColumn, ct as Markdown, d as VictoryAxis, dn as BookOpen, dt as init_date_fns, en as Crown, et as RiStarLine, f as VictoryLabel, fn as Bell, g as MdAccessTime, gn as require_react, gt as init_dist, h as rehypeHighlight, hn as require_server_node, in as CircleFadingArrowUp, it as RiUserFollowLine, j as zhCN, jt as Terminal, k as init_ai, kt as TriangleAlert, l as VictoryLine, ln as Calendar, lt as LuFullscreen, m as init_rehype_highlight, mn as init_clsx, mt as format, nn as Coins, nt as RiTiktokFill, o as init_es, on as CircleCheckBig, ot as init_ri, p as VictoryTheme, pn as clsx_default, pt as formatDistanceToNow, q as RiQuestionFill, qt as Heart, rn as Clock, rt as RiTrophyFill, s as VictoryScatter, sn as CircleAlert, st as init_react_markdown, tn as CornerDownLeft, tt as RiThumbUpFill, u as VictoryChart, un as Bookmark, ut as init_lu, v as SiBilibili, vt as chip_default, w as FaCodeBranch, wt as init_lucide_react, x as init_tb, xt as require_jsx_runtime, y as init_si, yt as button_default, z as RiHeart3Line, zt as Quote } from "./vendor-DxfKHvj-.js";
2
+ import { $ as RiStarFill, $t as ExternalLink, A as init_locale, At as ThumbsUp, B as RiLineChartFill, Bt as QrCode, C as init_hi, Ct as init_io5, D as AiFillHeart, Dt as User, E as init_fa6, Et as Users, F as RiGroupLine, Ft as ShieldCheck, G as RiMessage3Fill, Gt as MapPin, H as RiListCheck2, Ht as Play, I as RiHashtag, It as Share2, J as RiRefreshLine, Jt as Hash, K as RiPieChart2Fill, Kt as Info, L as RiHeart2Line, Lt as ScanLine, M as RiArrowRightFill, Mt as Star, N as RiBarChartFill, Nt as Smartphone, O as AiFillStar, Ot as UserPlus, P as RiBellFill, Pt as Shield, Q as RiSparkling2Fill, Qt as Eye, R as RiHeart3Fill, Rt as Radio, S as HiOutlineMenuAlt2, St as IoSearch, T as FaCommentDots, Tt as Zap, U as RiLiveLine, Ut as Music, V as RiLinkM, Vt as Plug2, W as RiLoginCircleFill, Wt as MessageCircle, X as RiSendPlaneFill, Xt as Gamepad2, Y as RiRobot2Fill, Yt as Gift, Z as RiShareForwardFill, Zt as FileText, _ as init_md, _t as code_default, an as CircleEllipsis, at as RiVideoLine, b as TbScan, bt as HeroUIProvider, c as VictoryPie, cn as ChartColumn, ct as Markdown, d as VictoryAxis, dn as BookOpen, dt as init_date_fns, en as Crown, et as RiStarLine, f as VictoryLabel, fn as Bell, g as MdAccessTime, gn as require_react, gt as init_dist, h as rehypeHighlight, hn as require_server_node, in as CircleFadingArrowUp, it as RiUserFollowLine, j as zhCN, jt as Terminal, k as init_ai, kt as TriangleAlert, l as VictoryLine, ln as Calendar, lt as LuFullscreen, m as init_rehype_highlight, mn as init_clsx, mt as format, nn as Coins, nt as RiTiktokFill, o as init_es, on as CircleCheckBig, ot as init_ri, p as VictoryTheme, pn as clsx_default, pt as formatDistanceToNow, q as RiQuestionFill, qt as Heart, rn as Clock, rt as RiTrophyFill, s as VictoryScatter, sn as CircleAlert, st as init_react_markdown, tn as CornerDownLeft, tt as RiThumbUpFill, u as VictoryChart, un as Bookmark, ut as init_lu, v as SiBilibili, vt as chip_default, w as FaCodeBranch, wt as init_lucide_react, x as init_tb, xt as require_jsx_runtime, y as init_si, yt as button_default, z as RiHeart3Line, zt as Quote } from "./vendor-9pKTNH6x.js";
3
3
  import { logger as logger$1 } from "node-karin";
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
@@ -1,4 +1,4 @@
1
1
  import "./rolldown-runtime-BMXAG3ag.js";
2
- import "./vendor-DxfKHvj-.js";
3
- import { r as reactServerRender, t as template_default } from "./template-DekmxKd7.js";
2
+ import "./vendor-9pKTNH6x.js";
3
+ import { r as reactServerRender, t as template_default } from "./template-CsOboAFj.js";
4
4
  export { template_default as default, reactServerRender };
@@ -144568,7 +144568,6 @@ var init_victory_brush_line = __esmMin(() => {
144568
144568
  __toESM(require_react());
144569
144569
  __toESM(require_defaults());
144570
144570
  __toESM(require_pick());
144571
- init_es$27();
144572
144571
  __toESM(require_react_fast_compare());
144573
144572
  1 / Number.MAX_SAFE_INTEGER;
144574
144573
  });
@@ -145161,7 +145160,6 @@ var init_use_canvas_context = __esmMin(() => {
145161
145160
  var import_react$32;
145162
145161
  var init_canvas_bar = __esmMin(() => {
145163
145162
  __toESM(require_react());
145164
- init_es$24();
145165
145163
  });
145166
145164
  var import_react$31, CanvasGroup;
145167
145165
  var init_canvas_group = __esmMin(() => {
@@ -145202,12 +145200,10 @@ var init_canvas_group = __esmMin(() => {
145202
145200
  var import_react$30;
145203
145201
  var init_canvas_curve = __esmMin(() => {
145204
145202
  __toESM(require_react());
145205
- init_es$27();
145206
145203
  });
145207
145204
  var import_react$29;
145208
145205
  var init_canvas_point = __esmMin(() => {
145209
145206
  __toESM(require_react());
145210
- init_es$27();
145211
145207
  });
145212
145208
  var init_es$19 = __esmMin(() => {
145213
145209
  init_canvas_bar();
package/lib/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import "./core_chunk/main-1eljaHiz.js";
3
- import "./core_chunk/vendor-DxfKHvj-.js";
4
- import "./core_chunk/template-DekmxKd7.js";
2
+ import "./core_chunk/main-DjlCg9e5.js";
3
+ import "./core_chunk/vendor-9pKTNH6x.js";
4
+ import "./core_chunk/template-CsOboAFj.js";
5
5
  export {};
package/lib/root.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import "./core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { A as init_root, k as Root } from "./core_chunk/main-1eljaHiz.js";
2
+ import { A as init_root, k as Root } from "./core_chunk/main-DjlCg9e5.js";
3
3
  init_root();
4
4
  export { Root };
package/lib/web.config.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./core_chunk/rolldown-runtime-BMXAG3ag.js";
2
- import { D as webConfig, O as web_config_default } from "./core_chunk/main-1eljaHiz.js";
3
- import "./core_chunk/vendor-DxfKHvj-.js";
4
- import "./core_chunk/template-DekmxKd7.js";
2
+ import { D as webConfig, O as web_config_default } from "./core_chunk/main-DjlCg9e5.js";
3
+ import "./core_chunk/vendor-9pKTNH6x.js";
4
+ import "./core_chunk/template-CsOboAFj.js";
5
5
  export { web_config_default as default, webConfig };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "karin-plugin-kkk",
3
- "version": "2.24.0",
3
+ "version": "2.25.0",
4
4
  "description": "Karin 的「抖音」「B 站」视频解析/动态推送插件",
5
5
  "keywords": [
6
6
  "karin-plugin",