karin-plugin-kkk 2.27.1 → 2.27.3

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 (94) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/lib/apps/__ready.js +1 -2
  3. package/lib/apps/admin.js +1 -2
  4. package/lib/apps/help.js +1 -2
  5. package/lib/apps/push.js +1 -2
  6. package/lib/apps/qrlogin.js +1 -2
  7. package/lib/apps/statistics.js +1 -2
  8. package/lib/apps/tools.js +1 -2
  9. package/lib/apps/update.js +1 -2
  10. package/lib/build-metadata.json +5 -5
  11. package/lib/core_chunk/ArticleWork-B9VlEbFM.js +2 -0
  12. package/lib/core_chunk/Comment-B1-QWo31.js +2 -0
  13. package/lib/core_chunk/Comment-CsjhEqQE.js +2 -0
  14. package/lib/core_chunk/Comment-DqdTSc8A.js +2 -0
  15. package/lib/core_chunk/Comment-vfsv9BWV.js +2 -0
  16. package/lib/core_chunk/DYNAMIC_TYPE_ARTICLE-DhI4wyiD.js +2 -0
  17. package/lib/core_chunk/DYNAMIC_TYPE_AV-6dOhp5Vb.js +2 -0
  18. package/lib/core_chunk/DYNAMIC_TYPE_DRAW-CyEKe3mQ.js +2 -0
  19. package/lib/core_chunk/DYNAMIC_TYPE_FORWARD-DgwU5r0h.js +2 -0
  20. package/lib/core_chunk/DYNAMIC_TYPE_LIVE_RCMD-v8wYPTDs.js +2 -0
  21. package/lib/core_chunk/DYNAMIC_TYPE_WORD-BhB1tElH.js +2 -0
  22. package/lib/core_chunk/Dynamic-k3p7RKuw.js +2 -0
  23. package/lib/core_chunk/FavoriteList-VfKULbNA.js +2 -0
  24. package/lib/core_chunk/GlobalStatistics-Bc7svC23.js +2 -0
  25. package/lib/core_chunk/GroupStatistics-BIMjUQ01.js +2 -0
  26. package/lib/core_chunk/Help-vD_prhrv.js +2 -0
  27. package/lib/core_chunk/ImageWork-DGp6mxVH.js +2 -0
  28. package/lib/core_chunk/Live-DqlY-h7D.js +2 -0
  29. package/lib/core_chunk/MusicInfo-Ba4wnEpW.js +2 -0
  30. package/lib/core_chunk/RecommendList-Cng4vsUq.js +2 -0
  31. package/lib/core_chunk/UserList-BHq909y3.js +2 -0
  32. package/lib/core_chunk/UserList-Cc-KSITl.js +2 -0
  33. package/lib/core_chunk/UserVideoList-BoX9UYyz.js +2 -0
  34. package/lib/core_chunk/VersionWarning-CIL9fLZa.js +2 -0
  35. package/lib/core_chunk/VideoWork-yO5B3pBL.js +2 -0
  36. package/lib/core_chunk/amagiClient-ekHY-PXh.js +2 -0
  37. package/lib/core_chunk/bangumi-DKQ6q6pC.js +2 -0
  38. package/lib/core_chunk/changelog-CqYNfGVJ.js +2 -0
  39. package/lib/core_chunk/db-CPobc711.js +2 -0
  40. package/lib/core_chunk/dist-uCFspDJu.js +2 -0
  41. package/lib/core_chunk/handlerError-D0W7_FuK.js +2 -0
  42. package/lib/core_chunk/{main-GkRJUnjP.js → main-DpV125vG.js} +198 -120
  43. package/lib/core_chunk/noteInfo-BRi4E8ui.js +2 -0
  44. package/lib/core_chunk/qrcodeImg-B01ESZUL.js +2 -0
  45. package/lib/core_chunk/qrcodeImg-Cy0np3Sk.js +2 -0
  46. package/lib/core_chunk/qrlogin-DcHpe2_c.js +2 -0
  47. package/lib/core_chunk/setup-DPzunDIj.js +2 -0
  48. package/lib/core_chunk/template.d.mts +13 -13
  49. package/lib/core_chunk/template.js +1 -2
  50. package/lib/core_chunk/{vendor-CupLbLdw.js → vendor-CPNFNbMs.js} +3105 -2114
  51. package/lib/core_chunk/videoInfo-ByNoR3t4.js +2 -0
  52. package/lib/core_chunk/videoInfo-DONA7eyd.js +2 -0
  53. package/lib/index.js +1 -1
  54. package/lib/root.js +1 -1
  55. package/lib/web.config.js +1 -2
  56. package/package.json +2 -2
  57. package/lib/core_chunk/ArticleWork-YUXD4J4o.js +0 -3
  58. package/lib/core_chunk/Comment-BlsGb0BJ.js +0 -3
  59. package/lib/core_chunk/Comment-BvaBxBXq.js +0 -3
  60. package/lib/core_chunk/Comment-DAkBYEwQ.js +0 -3
  61. package/lib/core_chunk/Comment-W7yzE3V8.js +0 -3
  62. package/lib/core_chunk/DYNAMIC_TYPE_ARTICLE-C_yXdHL6.js +0 -3
  63. package/lib/core_chunk/DYNAMIC_TYPE_AV-9V_K1fEv.js +0 -3
  64. package/lib/core_chunk/DYNAMIC_TYPE_DRAW-B0nRDWIR.js +0 -3
  65. package/lib/core_chunk/DYNAMIC_TYPE_FORWARD-CQddwMwd.js +0 -3
  66. package/lib/core_chunk/DYNAMIC_TYPE_LIVE_RCMD-Bt_E88wL.js +0 -3
  67. package/lib/core_chunk/DYNAMIC_TYPE_WORD-BDutqdJU.js +0 -3
  68. package/lib/core_chunk/Dynamic-s7ouu-nG.js +0 -3
  69. package/lib/core_chunk/FavoriteList-D0o5nbi4.js +0 -3
  70. package/lib/core_chunk/GlobalStatistics-aqVNKMGM.js +0 -3
  71. package/lib/core_chunk/GroupStatistics-BppQCu9O.js +0 -3
  72. package/lib/core_chunk/Help-BX3TqQaQ.js +0 -3
  73. package/lib/core_chunk/ImageWork-CYelfERx.js +0 -3
  74. package/lib/core_chunk/Live-CQP5OR8Y.js +0 -3
  75. package/lib/core_chunk/MusicInfo-zvwtog_A.js +0 -3
  76. package/lib/core_chunk/RecommendList-CXiPOzIN.js +0 -3
  77. package/lib/core_chunk/UserList-Dp-zNY4Z.js +0 -3
  78. package/lib/core_chunk/UserList-e7qGfWpS.js +0 -3
  79. package/lib/core_chunk/UserVideoList-DsfeY2HS.js +0 -3
  80. package/lib/core_chunk/VersionWarning-mCbREKfz.js +0 -3
  81. package/lib/core_chunk/VideoWork-DWP1x1xo.js +0 -3
  82. package/lib/core_chunk/amagiClient-C_qQFi3I.js +0 -3
  83. package/lib/core_chunk/bangumi-CXz3aPKE.js +0 -3
  84. package/lib/core_chunk/changelog-icKPF2Vh.js +0 -3
  85. package/lib/core_chunk/db-CjI5bW_8.js +0 -3
  86. package/lib/core_chunk/dist-Cx4SNJ6B.js +0 -2
  87. package/lib/core_chunk/handlerError-DIJznuvm.js +0 -3
  88. package/lib/core_chunk/noteInfo-DlLJJaxT.js +0 -3
  89. package/lib/core_chunk/qrcodeImg-C0mEIm5B.js +0 -3
  90. package/lib/core_chunk/qrcodeImg-COPQdgv8.js +0 -3
  91. package/lib/core_chunk/qrlogin-COaceLuZ.js +0 -3
  92. package/lib/core_chunk/setup-FE-bwEzb.js +0 -3
  93. package/lib/core_chunk/videoInfo-7t7_qNts.js +0 -3
  94. package/lib/core_chunk/videoInfo-CWzMOt6K.js +0 -3
@@ -1,5 +1,5 @@
1
1
  import { o as __toESM } from "./rolldown-runtime-8i3BgXHp.js";
2
- import { $ as RiTrophyFill, $t as require_qr_code_styling, A as RiBellFill, At as Eye, B as RiLoginCircleFill, Bt as ChartColumn, C as AiOutlineVideoCamera, Ct as MapPin, D as LuFullscreen, Dt as Gift, E as SiBilibili, Et as Hash, F as RiHeart3Line, Ft as Clock, G as RiRobot2Fill, Gt as require_dist, H as RiPieChart2Fill, Ht as Bookmark, I as RiLineChartFill, It as CircleFadingArrowUp, J as RiSparkling2Fill, Jt as zhCN, K as RiSendPlaneFill, Kt as require_lib, L as RiLinkM, Lt as CircleEllipsis, M as RiHashtag, Mt as Crown, N as RiHeart2Line, Nt as CornerDownLeft, O as RiArrowRightFill, Ot as Gamepad2, P as RiHeart3Fill, Pt as Coins, Q as RiTiktokFill, Qt as differenceInSeconds, R as RiListCheck2, Rt as CircleCheckBig, S as AiFillStar, St as MessageCircle, T as Markdown, Tt as Heart, U as RiQuestionFill, Ut as BookOpen, V as RiMessage3Fill, Vt as Calendar, W as RiRefreshLine, Wt as Bell, X as RiStarLine, Xt as formatDistanceToNow, Y as RiStarFill, Yt as fromUnixTime, Z as RiThumbUpFill, Zt as format, _ as FaTiktok, _n as axios$1, _t as Quote, a as VictoryChart, an as HeroUIProvider, at as User, b as AiFillHeart, bt as Play, c as VictoryTheme, cn as require_react, ct as ThumbsUp, d as MdAccessTime, dn as require_jpeg_js, dt as Smartphone, en as Window, et as RiUserFollowLine, f as MdLocationOn, fn as require_heic_decode, ft as Shield, g as FaMusic, gn as AxiosError$1, gt as Radio, h as FaCommentDots, hn as Chalk, ht as ScanLine, i as VictoryLine, in as button_default, it as Users, j as RiGroupLine, jt as ExternalLink, k as RiBarChartFill, kt as FileText, l as TbScan, ln as require_png, lt as Terminal, m as FaCodeBranch, mn as require_protobufjs, mt as Share2, n as VictoryScatter, nn as code_default, nt as RiVideoLine, o as VictoryAxis, on as require_jsx_runtime, ot as UserPlus, p as MdOutlineLightbulb, pn as require_express, pt as ShieldCheck, q as RiShareForwardFill, r as VictoryPie, rn as chip_default, rt as Zap, s as VictoryLabel, sn as clsx, st as TriangleAlert, t as rehypeHighlight, tn as require_server_node, tt as RiVerifiedBadgeFill, u as HiOutlineMenuAlt2, un as require_jsQR, ut as Star, v as FaUserGroup, vn as Xhshow, vt as QrCode, w as IoSearch, wt as Info, x as AiFillPushpin, xt as Music, y as BsImage, yn as zod_default, yt as Plug2, z as RiLiveLine, zt as CircleAlert } from "./vendor-CupLbLdw.js";
2
+ import { $ as RiTrophyFill, $t as differenceInSeconds, A as RiBellFill, At as Eye, B as RiLoginCircleFill, Bt as ChartColumn, C as AiOutlineVideoCamera, Ct as MapPin, D as LuFullscreen, Dt as Gift, E as SiBilibili, Et as Hash, F as RiHeart3Line, Ft as Clock, G as RiRobot2Fill, Gt as purify, H as RiPieChart2Fill, Ht as Bookmark, I as RiLineChartFill, It as CircleFadingArrowUp, J as RiSparkling2Fill, K as RiSendPlaneFill, Kt as require_dist, L as RiLinkM, Lt as CircleEllipsis, M as RiHashtag, Mt as Crown, N as RiHeart2Line, Nt as CornerDownLeft, O as RiArrowRightFill, Ot as Gamepad2, P as RiHeart3Fill, Pt as Coins, Q as RiTiktokFill, Qt as format, R as RiListCheck2, Rt as CircleCheckBig, S as AiFillStar, St as MessageCircle, T as Markdown, Tt as Heart, U as RiQuestionFill, Ut as BookOpen, V as RiMessage3Fill, Vt as Calendar, W as RiRefreshLine, Wt as Bell, X as RiStarLine, Xt as fromUnixTime, Y as RiStarFill, Yt as zhCN, Z as RiThumbUpFill, Zt as formatDistanceToNow, _ as FaTiktok, _n as AxiosError$1, _t as Quote, a as VictoryChart, an as button_default, at as User, b as AiFillHeart, bn as zod_default, bt as Play, c as VictoryTheme, cn as clsx, ct as ThumbsUp, d as MdAccessTime, dn as require_jsQR, dt as Smartphone, en as require_qr_code_styling, et as RiUserFollowLine, f as MdLocationOn, fn as require_jpeg_js, ft as Shield, g as FaMusic, gn as Chalk, gt as Radio, h as FaCommentDots, hn as require_protobufjs, ht as ScanLine, i as VictoryLine, in as chip_default, it as Users, j as RiGroupLine, jt as ExternalLink, k as RiBarChartFill, kt as FileText, l as TbScan, ln as require_react, lt as Terminal, m as FaCodeBranch, mn as require_express, mt as Share2, n as VictoryScatter, nn as require_server_node, nt as RiVideoLine, o as VictoryAxis, on as HeroUIProvider, ot as UserPlus, p as MdOutlineLightbulb, pn as require_heic_decode, pt as ShieldCheck, q as RiShareForwardFill, qt as require_lib, r as VictoryPie, rn as code_default, rt as Zap, s as VictoryLabel, sn as require_jsx_runtime, st as TriangleAlert, t as rehypeHighlight, tn as Window, tt as RiVerifiedBadgeFill, u as HiOutlineMenuAlt2, un as require_png, ut as Star, v as FaUserGroup, vn as axios$1, vt as QrCode, w as IoSearch, wt as Info, x as AiFillPushpin, xt as Music, y as BsImage, yn as Xhshow, yt as Plug2, z as RiLiveLine, zt as CircleAlert } from "./vendor-CPNFNbMs.js";
3
3
  import "node:module";
4
4
  import fs from "node:fs";
5
5
  import path, { resolve } from "node:path";
@@ -21,7 +21,7 @@ import { snapka } from "@snapka/puppeteer";
21
21
  import { newInjectedPage } from "fingerprint-injector";
22
22
  import express from "node-karin/express";
23
23
  globalThis.__kkkLoadStart ??= process.hrtime.bigint();
24
- import("./setup-FE-bwEzb.js");
24
+ import("./setup-DPzunDIj.js");
25
25
  var resolvePluginRoot = (startUrl) => {
26
26
  let dir = path.dirname(startUrl);
27
27
  for (let i = 0; i < 8; i++) {
@@ -5213,7 +5213,7 @@ var Cfg = class {
5213
5213
  const fileName = path.basename(file, ".yaml");
5214
5214
  if (fileName === "cookies" || fileName === "request") {
5215
5215
  logger.debug(`[Config] 检测到 ${fileName} 配置变化,正在重载 Amagi Client...`);
5216
- import("./amagiClient-C_qQFi3I.js").then(({ reloadAmagiConfig }) => {
5216
+ import("./amagiClient-ekHY-PXh.js").then(({ reloadAmagiConfig }) => {
5217
5217
  reloadAmagiConfig();
5218
5218
  }).catch((error) => {
5219
5219
  logger.error(`[Config] 重载 Amagi Client 失败: ${error}`);
@@ -5232,7 +5232,7 @@ var Cfg = class {
5232
5232
  };
5233
5233
  }
5234
5234
  async All() {
5235
- const { getDouyinDB, getBilibiliDB } = await import("./db-CjI5bW_8.js");
5235
+ const { getDouyinDB, getBilibiliDB } = await import("./db-CPobc711.js");
5236
5236
  const douyinDB = await getDouyinDB();
5237
5237
  const bilibiliDB = await getBilibiliDB();
5238
5238
  const allConfig = {};
@@ -5274,7 +5274,7 @@ var Cfg = class {
5274
5274
  fs.writeFileSync(path, yamlData.toString({ lineWidth: -1 }), "utf8");
5275
5275
  }
5276
5276
  async ModifyPro(name, config, type = "config") {
5277
- const { getDouyinDB, getBilibiliDB } = await import("./db-CjI5bW_8.js");
5277
+ const { getDouyinDB, getBilibiliDB } = await import("./db-CPobc711.js");
5278
5278
  const douyinDB = await getDouyinDB();
5279
5279
  const bilibiliDB = await getBilibiliDB();
5280
5280
  const filePath = type === "config" ? `${this.dirCfgPath}/${name}.yaml` : `${this.defCfgPath}/${name}.yaml`;
@@ -5379,7 +5379,7 @@ var Cfg = class {
5379
5379
  }
5380
5380
  async syncConfigToDatabase() {
5381
5381
  try {
5382
- const { getDouyinDB, getBilibiliDB } = await import("./db-CjI5bW_8.js");
5382
+ const { getDouyinDB, getBilibiliDB } = await import("./db-CPobc711.js");
5383
5383
  const douyinDB = await getDouyinDB();
5384
5384
  const bilibiliDB = await getBilibiliDB();
5385
5385
  const pushCfg = this.getYaml("config", "pushlist");
@@ -5494,8 +5494,15 @@ var AmagiBase = class {
5494
5494
  return createProxy(client);
5495
5495
  };
5496
5496
  };
5497
+ var createLiveProxy = (getter) => new Proxy({}, { get(_target, prop) {
5498
+ const current = getter();
5499
+ const value = Reflect.get(current, prop);
5500
+ if (typeof value === "function") return value.bind(current);
5501
+ if (value && typeof value === "object") return createLiveProxy(() => Reflect.get(getter(), prop));
5502
+ return value;
5503
+ } });
5497
5504
  var amagiClientInstance = new AmagiBase();
5498
- var amagiClient = amagiClientInstance.amagi;
5505
+ var amagiClient = createLiveProxy(() => amagiClientInstance.amagi);
5499
5506
  var reloadAmagiConfig = () => {
5500
5507
  amagiClientInstance.reloadConfig();
5501
5508
  };
@@ -8023,47 +8030,47 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
8023
8030
  switch (baseComponent.id) {
8024
8031
  case "comment": return createComponentConfig(baseComponent, {
8025
8032
  validateData: (data) => data && typeof data.share_url === "string",
8026
- lazyComponent: () => import("./Comment-BvaBxBXq.js").then((module) => ({ default: module.DouyinComment }))
8033
+ lazyComponent: () => import("./Comment-vfsv9BWV.js").then((module) => ({ default: module.DouyinComment }))
8027
8034
  });
8028
8035
  case "dynamic": return createComponentConfig(baseComponent, {
8029
8036
  validateData: (data) => data && typeof data.share_url === "string",
8030
- lazyComponent: () => import("./Dynamic-s7ouu-nG.js").then((module) => ({ default: module.DouyinDynamic }))
8037
+ lazyComponent: () => import("./Dynamic-k3p7RKuw.js").then((module) => ({ default: module.DouyinDynamic }))
8031
8038
  });
8032
8039
  case "video-work": return createComponentConfig(baseComponent, {
8033
8040
  validateData: (data) => data && typeof data.share_url === "string",
8034
- lazyComponent: () => import("./VideoWork-DWP1x1xo.js").then((module) => ({ default: module.DouyinVideoWork }))
8041
+ lazyComponent: () => import("./VideoWork-yO5B3pBL.js").then((module) => ({ default: module.DouyinVideoWork }))
8035
8042
  });
8036
8043
  case "image-work": return createComponentConfig(baseComponent, {
8037
8044
  validateData: (data) => data && typeof data.share_url === "string",
8038
- lazyComponent: () => import("./ImageWork-CYelfERx.js").then((module) => ({ default: module.DouyinImageWork }))
8045
+ lazyComponent: () => import("./ImageWork-DGp6mxVH.js").then((module) => ({ default: module.DouyinImageWork }))
8039
8046
  });
8040
8047
  case "article-work": return createComponentConfig(baseComponent, {
8041
8048
  validateData: (data) => data && typeof data.share_url === "string",
8042
- lazyComponent: () => import("./ArticleWork-YUXD4J4o.js").then((module) => ({ default: module.DouyinArticleWork }))
8049
+ lazyComponent: () => import("./ArticleWork-B9VlEbFM.js").then((module) => ({ default: module.DouyinArticleWork }))
8043
8050
  });
8044
8051
  case "favorite-list": return createComponentConfig(baseComponent, {
8045
8052
  validateData: (data) => data && typeof data.share_url === "string",
8046
- lazyComponent: () => import("./FavoriteList-D0o5nbi4.js").then((module) => ({ default: module.DouyinFavoriteList }))
8053
+ lazyComponent: () => import("./FavoriteList-VfKULbNA.js").then((module) => ({ default: module.DouyinFavoriteList }))
8047
8054
  });
8048
8055
  case "recommend-list": return createComponentConfig(baseComponent, {
8049
8056
  validateData: (data) => data && typeof data.share_url === "string",
8050
- lazyComponent: () => import("./RecommendList-CXiPOzIN.js").then((module) => ({ default: module.DouyinRecommendList }))
8057
+ lazyComponent: () => import("./RecommendList-Cng4vsUq.js").then((module) => ({ default: module.DouyinRecommendList }))
8051
8058
  });
8052
8059
  case "live": return createComponentConfig(baseComponent, {
8053
8060
  validateData: (data) => data && typeof data.share_url === "string",
8054
- lazyComponent: () => import("./Live-CQP5OR8Y.js").then((module) => ({ default: module.DouyinLive }))
8061
+ lazyComponent: () => import("./Live-DqlY-h7D.js").then((module) => ({ default: module.DouyinLive }))
8055
8062
  });
8056
8063
  case "musicinfo": return createComponentConfig(baseComponent, {
8057
8064
  validateData: (data) => data && typeof data.share_url === "string",
8058
- lazyComponent: () => import("./MusicInfo-zvwtog_A.js").then((module) => ({ default: module.DouyinMusicInfo }))
8065
+ lazyComponent: () => import("./MusicInfo-Ba4wnEpW.js").then((module) => ({ default: module.DouyinMusicInfo }))
8059
8066
  });
8060
- case "user_profile": return createComponentConfig(baseComponent, { lazyComponent: () => import("./UserVideoList-DsfeY2HS.js").then((module) => ({ default: module.DouyinUserVideoList })) });
8067
+ case "user_profile": return createComponentConfig(baseComponent, { lazyComponent: () => import("./UserVideoList-BoX9UYyz.js").then((module) => ({ default: module.DouyinUserVideoList })) });
8061
8068
  case "userlist": return createComponentConfig(baseComponent, {
8062
8069
  validateData: (data) => data && Array.isArray(data.renderOpt),
8063
- lazyComponent: () => import("./UserList-e7qGfWpS.js").then((module) => ({ default: module.default }))
8070
+ lazyComponent: () => import("./UserList-Cc-KSITl.js").then((module) => ({ default: module.default }))
8064
8071
  });
8065
- case "videoInfo": return createComponentConfig(baseComponent, { lazyComponent: () => import("./videoInfo-7t7_qNts.js").then((module) => ({ default: module.DouyinVideoInfo })) });
8066
- case "qrcodeImg": return createComponentConfig(baseComponent, { lazyComponent: () => import("./qrcodeImg-COPQdgv8.js").then((module) => ({ default: module.DouyinQrcodeImg })) });
8072
+ case "videoInfo": return createComponentConfig(baseComponent, { lazyComponent: () => import("./videoInfo-ByNoR3t4.js").then((module) => ({ default: module.DouyinVideoInfo })) });
8073
+ case "qrcodeImg": return createComponentConfig(baseComponent, { lazyComponent: () => import("./qrcodeImg-B01ESZUL.js").then((module) => ({ default: module.DouyinQrcodeImg })) });
8067
8074
  default: return createComponentConfig(baseComponent);
8068
8075
  }
8069
8076
  });
@@ -8073,42 +8080,42 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
8073
8080
  switch (baseComponent.id) {
8074
8081
  case "comment": return createComponentConfig(baseComponent, {
8075
8082
  validateData: (data) => data && typeof data.share_url === "string",
8076
- lazyComponent: () => import("./Comment-W7yzE3V8.js").then((module) => ({ default: module.BilibiliComment }))
8083
+ lazyComponent: () => import("./Comment-CsjhEqQE.js").then((module) => ({ default: module.BilibiliComment }))
8077
8084
  });
8078
8085
  case "userlist": return createComponentConfig(baseComponent, {
8079
8086
  validateData: (data) => data && Array.isArray(data.renderOpt),
8080
- lazyComponent: () => import("./UserList-Dp-zNY4Z.js").then((module) => ({ default: module.default }))
8087
+ lazyComponent: () => import("./UserList-BHq909y3.js").then((module) => ({ default: module.default }))
8081
8088
  });
8082
- case "bangumi": return createComponentConfig(baseComponent, { lazyComponent: () => import("./bangumi-CXz3aPKE.js").then((module) => ({ default: module.default })) });
8089
+ case "bangumi": return createComponentConfig(baseComponent, { lazyComponent: () => import("./bangumi-DKQ6q6pC.js").then((module) => ({ default: module.default })) });
8083
8090
  case "dynamic/DYNAMIC_TYPE_DRAW": return createComponentConfig(baseComponent, {
8084
8091
  validateData: (data) => data && typeof data.share_url === "string",
8085
- lazyComponent: () => import("./DYNAMIC_TYPE_DRAW-B0nRDWIR.js").then((module) => ({ default: module.BilibiliDrawDynamic }))
8092
+ lazyComponent: () => import("./DYNAMIC_TYPE_DRAW-CyEKe3mQ.js").then((module) => ({ default: module.BilibiliDrawDynamic }))
8086
8093
  });
8087
8094
  case "dynamic/DYNAMIC_TYPE_WORD": return createComponentConfig(baseComponent, {
8088
8095
  validateData: (data) => data && typeof data.share_url === "string",
8089
- lazyComponent: () => import("./DYNAMIC_TYPE_WORD-BDutqdJU.js").then((module) => ({ default: module.BilibiliWordDynamic }))
8096
+ lazyComponent: () => import("./DYNAMIC_TYPE_WORD-BhB1tElH.js").then((module) => ({ default: module.BilibiliWordDynamic }))
8090
8097
  });
8091
8098
  case "dynamic/DYNAMIC_TYPE_AV": return createComponentConfig(baseComponent, {
8092
8099
  validateData: (data) => data && typeof data.share_url === "string",
8093
- lazyComponent: () => import("./DYNAMIC_TYPE_AV-9V_K1fEv.js").then((module) => ({ default: module.BilibiliVideoDynamic }))
8100
+ lazyComponent: () => import("./DYNAMIC_TYPE_AV-6dOhp5Vb.js").then((module) => ({ default: module.BilibiliVideoDynamic }))
8094
8101
  });
8095
8102
  case "dynamic/DYNAMIC_TYPE_FORWARD": return createComponentConfig(baseComponent, {
8096
8103
  validateData: (data) => data && typeof data.share_url === "string",
8097
- lazyComponent: () => import("./DYNAMIC_TYPE_FORWARD-CQddwMwd.js").then((module) => ({ default: module.BilibiliForwardDynamic }))
8104
+ lazyComponent: () => import("./DYNAMIC_TYPE_FORWARD-DgwU5r0h.js").then((module) => ({ default: module.BilibiliForwardDynamic }))
8098
8105
  });
8099
8106
  case "dynamic/DYNAMIC_TYPE_LIVE_RCMD": return createComponentConfig(baseComponent, {
8100
8107
  validateData: (data) => data && typeof data.share_url === "string",
8101
- lazyComponent: () => import("./DYNAMIC_TYPE_LIVE_RCMD-Bt_E88wL.js").then((module) => ({ default: module.BilibiliLiveDynamic }))
8108
+ lazyComponent: () => import("./DYNAMIC_TYPE_LIVE_RCMD-v8wYPTDs.js").then((module) => ({ default: module.BilibiliLiveDynamic }))
8102
8109
  });
8103
8110
  case "dynamic/DYNAMIC_TYPE_WORD": return createComponentConfig(baseComponent, { validateData: (data) => data && typeof data.share_url === "string" });
8104
- case "dynamic/DYNAMIC_TYPE_ARTICLE": return createComponentConfig(baseComponent, { lazyComponent: () => import("./DYNAMIC_TYPE_ARTICLE-C_yXdHL6.js").then((module) => ({ default: module.BilibiliArticleDynamic })) });
8111
+ case "dynamic/DYNAMIC_TYPE_ARTICLE": return createComponentConfig(baseComponent, { lazyComponent: () => import("./DYNAMIC_TYPE_ARTICLE-DhI4wyiD.js").then((module) => ({ default: module.BilibiliArticleDynamic })) });
8105
8112
  case "videoInfo": return createComponentConfig(baseComponent, {
8106
8113
  validateData: (data) => data && typeof data.share_url === "string",
8107
- lazyComponent: () => import("./videoInfo-CWzMOt6K.js").then((module) => ({ default: module.BilibiliVideoInfo }))
8114
+ lazyComponent: () => import("./videoInfo-DONA7eyd.js").then((module) => ({ default: module.BilibiliVideoInfo }))
8108
8115
  });
8109
8116
  case "qrcodeImg": return createComponentConfig(baseComponent, {
8110
8117
  validateData: (data) => data && typeof data.share_url === "string",
8111
- lazyComponent: () => import("./qrcodeImg-C0mEIm5B.js").then((module) => ({ default: module.BilibiliQrcodeImg }))
8118
+ lazyComponent: () => import("./qrcodeImg-Cy0np3Sk.js").then((module) => ({ default: module.BilibiliQrcodeImg }))
8112
8119
  });
8113
8120
  default: return createComponentConfig(baseComponent);
8114
8121
  }
@@ -8119,7 +8126,7 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
8119
8126
  switch (baseComponent.id) {
8120
8127
  case "comment": return createComponentConfig(baseComponent, {
8121
8128
  validateData: (data) => data && typeof data.share_url === "string",
8122
- lazyComponent: () => import("./Comment-BlsGb0BJ.js").then((module) => ({ default: module.KuaishouComment }))
8129
+ lazyComponent: () => import("./Comment-DqdTSc8A.js").then((module) => ({ default: module.KuaishouComment }))
8123
8130
  });
8124
8131
  default: return createComponentConfig(baseComponent);
8125
8132
  }
@@ -8128,8 +8135,8 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
8128
8135
  case PlatformType.XIAOHONGSHU:
8129
8136
  platform.components = basePlatform.components.map((baseComponent) => {
8130
8137
  switch (baseComponent.id) {
8131
- case "noteInfo": return createComponentConfig(baseComponent, { lazyComponent: () => import("./noteInfo-DlLJJaxT.js").then((module) => ({ default: module.XiaohongshuNoteInfo })) });
8132
- case "comment": return createComponentConfig(baseComponent, { lazyComponent: () => import("./Comment-DAkBYEwQ.js").then((module) => ({ default: module.XiaohongshuComment })) });
8138
+ case "noteInfo": return createComponentConfig(baseComponent, { lazyComponent: () => import("./noteInfo-BRi4E8ui.js").then((module) => ({ default: module.XiaohongshuNoteInfo })) });
8139
+ case "comment": return createComponentConfig(baseComponent, { lazyComponent: () => import("./Comment-B1-QWo31.js").then((module) => ({ default: module.XiaohongshuComment })) });
8133
8140
  default: return createComponentConfig(baseComponent);
8134
8141
  }
8135
8142
  });
@@ -8137,11 +8144,11 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
8137
8144
  case PlatformType.OTHER:
8138
8145
  platform.components = basePlatform.components.map((baseComponent) => {
8139
8146
  switch (baseComponent.id) {
8140
- case "help": return createComponentConfig(baseComponent, { lazyComponent: () => import("./Help-BX3TqQaQ.js").then((module) => ({ default: module.default })) });
8141
- case "handlerError": return createComponentConfig(baseComponent, { lazyComponent: () => import("./handlerError-DIJznuvm.js").then((module) => ({ default: module.handlerError })) });
8142
- case "changelog": return createComponentConfig(baseComponent, { lazyComponent: () => import("./changelog-icKPF2Vh.js").then((module) => ({ default: module.Changelog })) });
8143
- case "version_warning": return createComponentConfig(baseComponent, { lazyComponent: () => import("./VersionWarning-mCbREKfz.js").then((module) => ({ default: module.VersionWarning })) });
8144
- case "qrlogin": return createComponentConfig(baseComponent, { lazyComponent: () => import("./qrlogin-COaceLuZ.js").then((module) => ({ default: module.QrLogin })) });
8147
+ case "help": return createComponentConfig(baseComponent, { lazyComponent: () => import("./Help-vD_prhrv.js").then((module) => ({ default: module.default })) });
8148
+ case "handlerError": return createComponentConfig(baseComponent, { lazyComponent: () => import("./handlerError-D0W7_FuK.js").then((module) => ({ default: module.handlerError })) });
8149
+ case "changelog": return createComponentConfig(baseComponent, { lazyComponent: () => import("./changelog-CqYNfGVJ.js").then((module) => ({ default: module.Changelog })) });
8150
+ case "version_warning": return createComponentConfig(baseComponent, { lazyComponent: () => import("./VersionWarning-CIL9fLZa.js").then((module) => ({ default: module.VersionWarning })) });
8151
+ case "qrlogin": return createComponentConfig(baseComponent, { lazyComponent: () => import("./qrlogin-DcHpe2_c.js").then((module) => ({ default: module.QrLogin })) });
8145
8152
  default: return createComponentConfig(baseComponent);
8146
8153
  }
8147
8154
  });
@@ -8149,8 +8156,8 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
8149
8156
  case PlatformType.STATISTICS:
8150
8157
  platform.components = basePlatform.components.map((baseComponent) => {
8151
8158
  switch (baseComponent.id) {
8152
- case "group": return createComponentConfig(baseComponent, { lazyComponent: () => import("./GroupStatistics-BppQCu9O.js").then((module) => ({ default: module.GroupStatistics })) });
8153
- case "global": return createComponentConfig(baseComponent, { lazyComponent: () => import("./GlobalStatistics-aqVNKMGM.js").then((module) => ({ default: module.GlobalStatistics })) });
8159
+ case "group": return createComponentConfig(baseComponent, { lazyComponent: () => import("./GroupStatistics-BIMjUQ01.js").then((module) => ({ default: module.GroupStatistics })) });
8160
+ case "global": return createComponentConfig(baseComponent, { lazyComponent: () => import("./GlobalStatistics-Bc7svC23.js").then((module) => ({ default: module.GlobalStatistics })) });
8154
8161
  default: return createComponentConfig(baseComponent);
8155
8162
  }
8156
8163
  });
@@ -8609,18 +8616,58 @@ var HtmlWrapper = class {
8609
8616
  constructor(resourceManager) {
8610
8617
  this.resourceManager = resourceManager;
8611
8618
  }
8619
+ getAssetMimeType(assetPath) {
8620
+ switch (path.extname(assetPath).toLowerCase()) {
8621
+ case ".woff2": return "font/woff2";
8622
+ case ".woff": return "font/woff";
8623
+ case ".ttf": return "font/ttf";
8624
+ case ".otf": return "font/otf";
8625
+ case ".eot": return "application/vnd.ms-fontobject";
8626
+ case ".svg": return "image/svg+xml";
8627
+ case ".png": return "image/png";
8628
+ case ".jpg":
8629
+ case ".jpeg": return "image/jpeg";
8630
+ case ".gif": return "image/gif";
8631
+ case ".webp": return "image/webp";
8632
+ case ".avif": return "image/avif";
8633
+ default: return "application/octet-stream";
8634
+ }
8635
+ }
8636
+ toDataUri(assetPath) {
8637
+ if (!fs.existsSync(assetPath)) {
8638
+ logger$1.warn("未找到静态资源文件,跳过内联:", assetPath);
8639
+ return null;
8640
+ }
8641
+ return `data:${this.getAssetMimeType(assetPath)};base64,${fs.readFileSync(assetPath).toString("base64")}`;
8642
+ }
8643
+ loadInlineCss(cssFilePath) {
8644
+ if (!fs.existsSync(cssFilePath)) {
8645
+ logger$1.warn("未找到 CSS 文件,跳过内联:", cssFilePath);
8646
+ return "";
8647
+ }
8648
+ const cssDir = path.dirname(cssFilePath);
8649
+ return fs.readFileSync(cssFilePath, "utf-8").replace(/url\((['"]?)(?!data:|https?:|file:|#)([^)'"]+)\1\)/g, (_match, quote, assetPath) => {
8650
+ const normalizedAssetPath = assetPath.trim();
8651
+ if (!normalizedAssetPath || normalizedAssetPath.startsWith("/")) return `url(${quote}${normalizedAssetPath}${quote})`;
8652
+ const absoluteAssetPath = path.resolve(cssDir, normalizedAssetPath);
8653
+ const dataUri = this.toDataUri(absoluteAssetPath);
8654
+ return dataUri ? `url(${quote}${dataUri}${quote})` : `url(${quote}${normalizedAssetPath}${quote})`;
8655
+ });
8656
+ }
8657
+ getInlineStyles(_htmlFilePath, includeFonts = true) {
8658
+ const { cssDir, imageDir } = this.resourceManager.getResourcePaths();
8659
+ const fontDir = path.join(path.dirname(imageDir), "font");
8660
+ const styleFiles = [path.join(cssDir, "karin-plugin-kkk.css")];
8661
+ if (includeFonts) styleFiles.unshift(path.join(fontDir, "bilifont", "font.css"), path.join(fontDir, "mono", "font.css"));
8662
+ return styleFiles.map((filePath) => this.loadInlineCss(filePath)).filter(Boolean).join("\n");
8663
+ }
8612
8664
  wrapContent(htmlContent, htmlFilePath, isDark = false) {
8613
8665
  const htmlDir = path.dirname(htmlFilePath);
8614
- const { cssDir, imageDir } = this.resourceManager.getResourcePaths();
8615
- const cssRelativePath = path.relative(htmlDir, cssDir).replace(/\\/g, "/");
8666
+ const { imageDir } = this.resourceManager.getResourcePaths();
8667
+ const inlineStyles = this.getInlineStyles(htmlFilePath);
8616
8668
  const imageRelativePath = path.relative(htmlDir, imageDir).replace(/\\/g, "/");
8617
- const cssUrl = path.join(cssRelativePath, "karin-plugin-kkk.css").replace(/\\/g, "/");
8618
- const fontDir = path.join(path.dirname(imageDir), "font");
8619
- const fontRelativePath = path.relative(htmlDir, fontDir).replace(/\\/g, "/");
8620
- const bilifontUrl = path.join(fontRelativePath, "bilifont/font.css").replace(/\\/g, "/");
8621
- const monoFontUrl = path.join(fontRelativePath, "mono/font.css").replace(/\\/g, "/");
8622
8669
  let processedHtml = htmlContent.replace(/src="\/image\//g, `src="${imageRelativePath}/`).replace(/src='\/image\//g, `src='${imageRelativePath}/`).replace(/src="image\//g, `src="${imageRelativePath}/`);
8623
- return `\n <!DOCTYPE html>\n <html lang="zh-CN">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width">\n <link rel="stylesheet" href="${bilifontUrl}">\n <link rel="stylesheet" href="${monoFontUrl}">\n <link rel="stylesheet" href="${cssUrl}">\n <style>\n html, body {\n margin: 0;\n padding: 0;\n background: transparent !important;\n }\n body {\n display: flex;\n align-items: flex-start;\n justify-content: flex-start;\n }\n #container {\n border-radius: 3rem;\n overflow: hidden;\n background-clip: padding-box;\n }\n </style>\n </head>\n <body class="${isDark ? "dark" : ""}">\n ${processedHtml}\n </body>\n </html>\n `;
8670
+ return `\n <!DOCTYPE html>\n <html lang="zh-CN">\n <head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width">\n <style>${inlineStyles}</style>\n <style>\n html, body {\n margin: 0;\n padding: 0;\n background: transparent !important;\n }\n body {\n display: flex;\n align-items: flex-start;\n justify-content: flex-start;\n }\n #container {\n border-radius: 3rem;\n overflow: hidden;\n background-clip: padding-box;\n }\n </style>\n </head>\n <body class="${isDark ? "dark" : ""}">\n ${processedHtml}\n </body>\n </html>\n `;
8624
8671
  }
8625
8672
  };
8626
8673
  var SSRRender = class {
@@ -8698,9 +8745,7 @@ var renderVideoPreviewPage = (options) => {
8698
8745
  };
8699
8746
  const appHtml = (0, import_server_node.renderToString)(import_react.createElement(VideoPreviewApp, { state }));
8700
8747
  const serializedState = escapeVideoPreviewJson(state);
8701
- const { cssDir } = new ResourcePathManager().getResourcePaths();
8702
- const cssFilePath = path.join(cssDir, "karin-plugin-kkk.css");
8703
- return `<!DOCTYPE html>\n<html lang="zh-CN">\n<head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title>临时预览</title>\n <style>\n * { box-sizing: border-box; }\n :root { --preview-bg: #ffffff; --preview-fg: #0f172a; --preview-muted: #64748b; }\n @media (prefers-color-scheme: dark) {\n :root { --preview-bg: #050505; --preview-fg: #e2e8f0; --preview-muted: #94a3b8; }\n }\n body { margin: 0; font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; background: var(--preview-bg); color: var(--preview-fg); }\n .preview-noise { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.25'/%3E%3C/svg%3E"); mix-blend-mode: soft-light; opacity: 0.8; }\n @media (max-width: 720px) {\n .max-w-6xl { padding-left: 16px; padding-right: 16px; }\n }\n </style>\n <style>${fs.existsSync(cssFilePath) ? fs.readFileSync(cssFilePath, "utf-8") : ""}</style>\n</head>\n<body>\n <div id="app">${appHtml}</div>\n <script>\n window.__VIDEO_PREVIEW__=${serializedState};\n (() => {\n const state = window.__VIDEO_PREVIEW__ || {};\n const countdownEl = document.getElementById('preview-countdown');\n if (!countdownEl) return;\n const format = (ms) => {\n const totalSeconds = Math.max(Math.floor(ms / 1000), 0);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const pad = (value) => String(value).padStart(2, '0');\n return hours > 0 ? pad(hours) + ':' + pad(minutes) + ':' + pad(seconds) : pad(minutes) + ':' + pad(seconds);\n };\n const update = (payload) => {\n if (!payload.removeCache) {\n countdownEl.textContent = '不删除';\n return;\n }\n if (payload.removed) {\n countdownEl.textContent = '00:00';\n return;\n }\n const remainingMs = typeof payload.remainingMs === 'number'\n ? payload.remainingMs\n : (payload.expireAt ? Math.max(payload.expireAt - (payload.serverNow || Date.now()), 0) : null);\n if (remainingMs === null) {\n countdownEl.textContent = '--:--';\n return;\n }\n countdownEl.textContent = format(remainingMs);\n };\n update(state);\n if (state.eventsUrl) {\n const source = new EventSource(state.eventsUrl);\n source.onmessage = (event) => {\n try {\n update(JSON.parse(event.data));\n } catch {}\n };\n }\n })();\n <\/script>\n</body>\n</html>`;
8748
+ return `<!DOCTYPE html>\n<html lang="zh-CN">\n<head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title>临时预览</title>\n <style>\n * { box-sizing: border-box; }\n :root { --preview-bg: #ffffff; --preview-fg: #0f172a; --preview-muted: #64748b; }\n @media (prefers-color-scheme: dark) {\n :root { --preview-bg: #050505; --preview-fg: #e2e8f0; --preview-muted: #94a3b8; }\n }\n body { margin: 0; font-family: "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif; background: var(--preview-bg); color: var(--preview-fg); }\n .preview-noise { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)' opacity='0.25'/%3E%3C/svg%3E"); mix-blend-mode: soft-light; opacity: 0.8; }\n @media (max-width: 720px) {\n .max-w-6xl { padding-left: 16px; padding-right: 16px; }\n }\n </style>\n <style>${new HtmlWrapper(new ResourcePathManager()).getInlineStyles(path.join(process.cwd(), "video-preview.html"), false)}</style>\n</head>\n<body>\n <div id="app">${appHtml}</div>\n <script>\n window.__VIDEO_PREVIEW__=${serializedState};\n (() => {\n const state = window.__VIDEO_PREVIEW__ || {};\n const countdownEl = document.getElementById('preview-countdown');\n if (!countdownEl) return;\n const format = (ms) => {\n const totalSeconds = Math.max(Math.floor(ms / 1000), 0);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const pad = (value) => String(value).padStart(2, '0');\n return hours > 0 ? pad(hours) + ':' + pad(minutes) + ':' + pad(seconds) : pad(minutes) + ':' + pad(seconds);\n };\n const update = (payload) => {\n if (!payload.removeCache) {\n countdownEl.textContent = '不删除';\n return;\n }\n if (payload.removed) {\n countdownEl.textContent = '00:00';\n return;\n }\n const remainingMs = typeof payload.remainingMs === 'number'\n ? payload.remainingMs\n : (payload.expireAt ? Math.max(payload.expireAt - (payload.serverNow || Date.now()), 0) : null);\n if (remainingMs === null) {\n countdownEl.textContent = '--:--';\n return;\n }\n countdownEl.textContent = format(remainingMs);\n };\n update(state);\n if (state.eventsUrl) {\n const source = new EventSource(state.eventsUrl);\n source.onmessage = (event) => {\n try {\n update(JSON.parse(event.data));\n } catch {}\n };\n }\n })();\n <\/script>\n</body>\n</html>`;
8704
8749
  };
8705
8750
  var isSemverGreater = (remote, local) => {
8706
8751
  if (!remote || !local) return false;
@@ -8856,7 +8901,7 @@ var Render = async (event, path$1, data) => {
8856
8901
  throw new Error(`SSR渲染失败: ${err.message || "未知错误"}`);
8857
8902
  });
8858
8903
  const renderResult = await render.render({
8859
- name: `${Root.pluginName}/${templateType}/${templateName}`,
8904
+ name: `${Root.pluginName}/${templateType}`,
8860
8905
  file: result.htmlPath,
8861
8906
  multiPage: Config.app.multiPageRender ? Config.app.multiPageHeight : false,
8862
8907
  selector: "#container",
@@ -8888,7 +8933,8 @@ var Render = async (event, path$1, data) => {
8888
8933
  });
8889
8934
  ret.push(segment.image("base64://" + finalImageBuffer.toString("base64")));
8890
8935
  }
8891
- logger.debug(`[Render] 图片处理完成,准备入队发送: ${JSON.stringify(imageStats)}`);
8936
+ const statsText = imageStats.map((stat, i) => ` [${i + 1}] 类型: ${stat.type}, 大小: ${stat.sizeMb}MB, 尺寸: ${stat.dimensions}`).join("\n");
8937
+ logger.debug(`[Render] 图片处理完成,准备入队发送:\n共 ${imageStats.length} 张图片:\n${statsText}`);
8892
8938
  return ret;
8893
8939
  };
8894
8940
  var getImageMetadata = (buffer) => {
@@ -16601,18 +16647,42 @@ var DouYin = class DouYin extends Base {
16601
16647
  timeoutSeconds
16602
16648
  });
16603
16649
  await this.e.reply(img);
16650
+ logger.debug(`等待用户选择视频,开始计时,${timeoutSeconds}秒后终止等待...`);
16604
16651
  const context = await karin$1.ctx(this.e, {
16605
- reply: true,
16652
+ throwOnTimeout: false,
16606
16653
  time: timeoutSeconds
16607
16654
  });
16655
+ if (!context) {
16656
+ await this.e.reply(`${timeoutSeconds} 秒内没收到作品序号,已取消后续操作`);
16657
+ return true;
16658
+ }
16608
16659
  if (context) {
16609
16660
  const num = parseInt(context.msg.trim());
16610
16661
  if (!isNaN(num) && num >= 1 && num <= displayVideos.length) {
16611
- const targetData = {
16612
- type: "one_work",
16613
- aweme_id: displayVideos[num - 1].aweme_id
16614
- };
16615
- await new DouYin(context, targetData).DouyinHandler(targetData);
16662
+ const emojiManager = new EmojiReactionManager(context);
16663
+ let processingTimer = null;
16664
+ let successTimer = null;
16665
+ await emojiManager.add("EYES");
16666
+ processingTimer = setTimeout(() => {
16667
+ emojiManager.add("PROCESSING").catch(() => {});
16668
+ }, 1500);
16669
+ try {
16670
+ const targetData = {
16671
+ type: "one_work",
16672
+ aweme_id: displayVideos[num - 1].aweme_id
16673
+ };
16674
+ await new DouYin(context, targetData).DouyinHandler(targetData);
16675
+ successTimer = setTimeout(() => {
16676
+ emojiManager.replace("PROCESSING", "SUCCESS").catch(() => {});
16677
+ }, 1500);
16678
+ } catch (error) {
16679
+ if (processingTimer) clearTimeout(processingTimer);
16680
+ if (successTimer) clearTimeout(successTimer);
16681
+ const processingEmojiId = getEmojiId(context, "PROCESSING");
16682
+ if (emojiManager.has(processingEmojiId)) await emojiManager.remove("PROCESSING");
16683
+ await emojiManager.add("ERROR");
16684
+ throw error;
16685
+ }
16616
16686
  }
16617
16687
  }
16618
16688
  return true;
@@ -16681,7 +16751,7 @@ var DouYin = class DouYin extends Base {
16681
16751
  text: live_data.data.data[0].title,
16682
16752
  liveinf: `${live_data.data.partition_road_map.partition.title} | 房间号: ${room_data.owner.web_rid}`,
16683
16753
  "在线观众": Count(Number(live_data.data.data[0].room_view_stats?.display_value)),
16684
- "总观看次数": Count(Number(live_data.data.data[0].stats?.total_user_str)),
16754
+ "总观看次数": live_data.data.data[0].stats?.total_user_str ? Count(Number(live_data.data.data[0].stats?.total_user_str)) : "刚开播无法获取",
16685
16755
  username: UserInfoData.data.user.nickname,
16686
16756
  avater_url: UserInfoData.data.user.avatar_larger.url_list[0],
16687
16757
  fans: Count(UserInfoData.data.user.follower_count),
@@ -16938,7 +17008,7 @@ var getDouyinID = async (event, url, log = true) => {
16938
17008
  };
16939
17009
  break;
16940
17010
  }
16941
- case /https:\/\/(?:www\.douyin\.com|www\.iesdouyin\.com)\/share\/user\/(\S+)/.test(longLink): {
17011
+ case /https:\/\/(?:www\.douyin\.com|www\.iesdouyin\.com)\/(?:share\/)?user\/(\S+)/.test(longLink): {
16942
17012
  const userMatch = /user\/([a-zA-Z0-9_-]+)/.exec(longLink);
16943
17013
  result = {
16944
17014
  type: "user_dynamic",
@@ -17245,19 +17315,21 @@ var DouYinpush = class extends Base {
17245
17315
  let iddata = { type: "one_work" };
17246
17316
  this.injectBotToEventForRender(pushItem.targets);
17247
17317
  if (!skip) iddata = await getDouyinID(this.e, Detail_Data.share_url ?? "https://live.douyin.com/" + Detail_Data.room_data?.owner.web_rid, false);
17248
- if (!skip) if (pushItem.pushType === "live" && "room_data" in pushItem.Detail_Data && Detail_Data.live_data) img = await Render(this.e, "douyin/live", {
17249
- image_url: Detail_Data.live_data.data.data.data[0]?.cover?.url_list[0] ?? Detail_Data.live_data.data.data.qrcode_url,
17250
- text: Detail_Data.live_data.data.data.data[0]?.title ?? "",
17251
- liveinf: `${Detail_Data.live_data.data.data.partition_road_map?.partition?.title ?? Detail_Data.live_data.data.data.data[0]?.title ?? "获取失败"} | 房间号: ${Detail_Data.room_data.owner.web_rid}`,
17252
- "在线观众": Detail_Data.live_data.data.data.data.length > 0 && Detail_Data.live_data.data.data.data[0].room_view_stats?.display_value ? this.count(Detail_Data.live_data.data.data.data[0].room_view_stats.display_value) : ":语音直播或刚开播获取失败。",
17253
- "总观看次数": Detail_Data.live_data.data.data.data.length > 0 ? this.count(Number(Detail_Data.live_data.data.data.data[0].stats.total_user_str)) : ":语音直播不支持",
17254
- username: Detail_Data.user_info.data.user.nickname,
17255
- avater_url: "https://p3-pc.douyinpic.com/aweme/1080x1080/" + Detail_Data.user_info.data.user.avatar_larger.uri,
17256
- fans: this.count(Detail_Data.user_info.data.user.follower_count),
17257
- share_url: "https://live.douyin.com/" + Detail_Data.room_data.owner.web_rid,
17258
- dynamicTYPE: "直播动态推送"
17259
- });
17260
- else {
17318
+ if (!skip) if (pushItem.pushType === "live" && "room_data" in pushItem.Detail_Data && Detail_Data.live_data) {
17319
+ const hasData = Detail_Data.live_data.data && Detail_Data.live_data.data.data && Detail_Data.live_data.data.data.length > 0;
17320
+ img = await Render(this.e, "douyin/live", {
17321
+ image_url: Detail_Data.live_data.data.data.data[0]?.cover?.url_list[0] ?? Detail_Data.live_data.data.data.qrcode_url,
17322
+ text: Detail_Data.live_data.data.data.data[0]?.title ?? "",
17323
+ liveinf: `${Detail_Data.live_data.data.data.partition_road_map?.partition?.title ?? Detail_Data.live_data.data.data.data[0]?.title ?? "获取失败"} | 房间号: ${Detail_Data.room_data.owner.web_rid}`,
17324
+ "在线观众": hasData && Detail_Data.live_data.data.data.data[0].room_view_stats?.display_value ? this.count(Detail_Data.live_data.data.data.data[0].room_view_stats.display_value) : ":语音直播或刚开播获取失败。",
17325
+ "总观看次数": hasData ? Detail_Data.live_data.data.data.data[0].stats?.total_user_str ? this.count(Number(Detail_Data.live_data.data.data.data[0].stats.total_user_str)) : "刚开播无法获取" : ":语音直播不支持",
17326
+ username: Detail_Data.user_info.data.user.nickname,
17327
+ avater_url: "https://p3-pc.douyinpic.com/aweme/1080x1080/" + Detail_Data.user_info.data.user.avatar_larger.uri,
17328
+ fans: this.count(Detail_Data.user_info.data.user.follower_count),
17329
+ share_url: "https://live.douyin.com/" + Detail_Data.room_data.owner.web_rid,
17330
+ dynamicTYPE: "直播动态推送"
17331
+ });
17332
+ } else {
17261
17333
  const realUrl = Config.douyin.push.shareType === "web" && await new Network({
17262
17334
  url: Detail_Data.share_url,
17263
17335
  headers: {
@@ -18462,7 +18534,7 @@ var handleCacheCleanup = wrapWithErrorHandler(async () => {
18462
18534
  logger.mark(`${Common.tempDri.images} 目录下已删除 ${imageDeleted} 个文件`);
18463
18535
  }
18464
18536
  }, { businessName: "缓存自动删除" });
18465
- var task = Config.app.removeCache && karin$1.task("[kkk-缓存自动删除]", "0 */4 * * *", handleCacheCleanup);
18537
+ var task = Config.app.removeCache && karin$1.task("[kkk-缓存自动删除]", "*/30 * * * *", handleCacheCleanup);
18466
18538
  var handleBilibiliLogin = wrapWithErrorHandler(async (e) => {
18467
18539
  await bilibiliLogin(e);
18468
18540
  return true;
@@ -18488,7 +18560,7 @@ var removeOldFiles = (dir, beforeTimestamp) => {
18488
18560
  if (stats.isDirectory()) {
18489
18561
  deletedCount += removeOldFiles(filePath, beforeTimestamp);
18490
18562
  if (fs.readdirSync(filePath).length === 0) fs.rmdirSync(filePath);
18491
- } else if (stats.mtimeMs < beforeTimestamp) {
18563
+ } else if (stats.birthtimeMs < beforeTimestamp) {
18492
18564
  fs.unlinkSync(filePath);
18493
18565
  deletedCount++;
18494
18566
  }
@@ -23067,7 +23139,7 @@ app$1.get("/video/:filename", getVideoRouter);
23067
23139
  app$1.get("/video/:filename/events", videoPreviewEventsRouter);
23068
23140
  app$1.use("/v1", apiRouter);
23069
23141
  app.use("/api/kkk", app$1);
23070
- var requireVersion = "1.15.0";
23142
+ var requireVersion = "1.15.2";
23071
23143
  if (process.env.NODE_ENV !== "development" && isSemverGreater(requireVersion, Root.karinVersion)) {
23072
23144
  const msg = `[karin-plugin-kkk] 插件构建时的 karin 版本 (${requireVersion}) 高于当前运行版本 (${Root.karinVersion}),可能会出现兼容性问题!`;
23073
23145
  logger.warn(msg);
@@ -24407,7 +24479,7 @@ var CommentItemComponent$2 = ({ isLast = false, ...props }) => (0, import_jsx_ru
24407
24479
  children: [
24408
24480
  (0, import_jsx_runtime.jsx)("div", {
24409
24481
  className: "[&>span]:inline-block [&>span]:leading-[1.2] [&>svg]:inline-block [&>svg]:w-25 [&>svg]:h-25 [&>svg]:align-middle [&>svg]:shrink-0",
24410
- dangerouslySetInnerHTML: { __html: props.uname }
24482
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.uname) }
24411
24483
  }),
24412
24484
  props.level !== void 0 && props.level >= 0 && props.level <= 7 && (0, import_jsx_runtime.jsx)("img", {
24413
24485
  src: `/image/bilibili/level/lv${props.level}.svg`,
@@ -24471,7 +24543,7 @@ var CommentItemComponent$2 = ({ isLast = false, ...props }) => (0, import_jsx_ru
24471
24543
  wordBreak: "break-word",
24472
24544
  overflowWrap: "break-word"
24473
24545
  },
24474
- children: [props.isTop && (0, import_jsx_runtime.jsx)(TopBadge, {}), (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: processCommentHTML$1(props.message) } })]
24546
+ children: [props.isTop && (0, import_jsx_runtime.jsx)(TopBadge, {}), (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(processCommentHTML$1(props.message)) } })]
24475
24547
  }),
24476
24548
  props.pictures && props.pictures.length > 0 && (0, import_jsx_runtime.jsx)("div", {
24477
24549
  className: "flex gap-5 my-5 w-[95%]",
@@ -24571,7 +24643,7 @@ var CommentItemComponent$2 = ({ isLast = false, ...props }) => (0, import_jsx_ru
24571
24643
  children: [
24572
24644
  (0, import_jsx_runtime.jsx)("div", {
24573
24645
  className: "[&>span]:inline-block [&>span]:leading-[1.2]",
24574
- dangerouslySetInnerHTML: { __html: subReply.uname }
24646
+ dangerouslySetInnerHTML: { __html: purify.sanitize(subReply.uname) }
24575
24647
  }),
24576
24648
  subReply.level !== void 0 && subReply.level >= 0 && subReply.level <= 7 && (0, import_jsx_runtime.jsx)("img", {
24577
24649
  src: `/image/bilibili/level/lv${subReply.level}.svg`,
@@ -24625,7 +24697,7 @@ var CommentItemComponent$2 = ({ isLast = false, ...props }) => (0, import_jsx_ru
24625
24697
  wordBreak: "break-word",
24626
24698
  overflowWrap: "break-word"
24627
24699
  },
24628
- dangerouslySetInnerHTML: { __html: processCommentHTML$1(subReply.message) }
24700
+ dangerouslySetInnerHTML: { __html: purify.sanitize(processCommentHTML$1(subReply.message)) }
24629
24701
  }),
24630
24702
  subReply.pictures && subReply.pictures.length > 0 && (0, import_jsx_runtime.jsx)("div", {
24631
24703
  className: "flex gap-5 my-5 w-[95%]",
@@ -24751,11 +24823,14 @@ var processCommentHTML = (htmlContent) => {
24751
24823
  processed = processed.replace(/¨/g, "•");
24752
24824
  return processed;
24753
24825
  };
24754
- var CommentText = ({ content, className, style }) => (0, import_jsx_runtime.jsx)("div", {
24755
- className,
24756
- style,
24757
- dangerouslySetInnerHTML: { __html: processCommentHTML(content) }
24758
- });
24826
+ var CommentText = ({ content, className, style }) => {
24827
+ const processedContent = processCommentHTML(content);
24828
+ return (0, import_jsx_runtime.jsx)("div", {
24829
+ className,
24830
+ style,
24831
+ dangerouslySetInnerHTML: { __html: purify.sanitize(processedContent) }
24832
+ });
24833
+ };
24759
24834
  var EnhancedImage = ({ src, alt, className = "", placeholder, isCircular = false }) => {
24760
24835
  const [hasError, setHasError] = (0, import_react.useState)(false);
24761
24836
  const handleError = () => {
@@ -24787,10 +24862,13 @@ var processHtmlImages = (html) => {
24787
24862
  processed = processed.replace(/<img([^>]*?)src=['"]?(https?:\/\/[^'">\s]+)['"]?([^>]*?)>/gi, (match, before, url, after) => `<img${before}src="${proxyImageUrl(url)}"${after} referrerpolicy="no-referrer" crossorigin="anonymous">`);
24788
24863
  return processed;
24789
24864
  };
24790
- var DecorationCard = ({ html }) => (0, import_jsx_runtime.jsx)("div", {
24791
- className: "font-bilifont",
24792
- dangerouslySetInnerHTML: { __html: processHtmlImages(html) }
24793
- });
24865
+ var DecorationCard = ({ html }) => {
24866
+ const processedHtml = processHtmlImages(html);
24867
+ return (0, import_jsx_runtime.jsx)("div", {
24868
+ className: "font-bilifont",
24869
+ dangerouslySetInnerHTML: { __html: purify.sanitize(processedHtml) }
24870
+ });
24871
+ };
24794
24872
  var BilibiliUserItem = (props) => (0, import_jsx_runtime.jsxs)("li", {
24795
24873
  className: "relative group overflow-hidden rounded-4xl bg-content1/60 border border-default-200/50 backdrop-blur-xl shadow-xl",
24796
24874
  children: [
@@ -25731,7 +25809,7 @@ var BilibiliArticleUserInfo = import_react.memo((props) => (0, import_jsx_runtim
25731
25809
  className: "flex flex-col gap-8 text-7xl",
25732
25810
  children: [(0, import_jsx_runtime.jsx)("div", {
25733
25811
  className: "text-6xl font-bold select-text text-foreground",
25734
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.data.username } })
25812
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.username) } })
25735
25813
  }), (0, import_jsx_runtime.jsxs)("div", {
25736
25814
  className: "flex gap-2 items-center text-4xl font-normal whitespace-nowrap text-foreground-500",
25737
25815
  children: [(0, import_jsx_runtime.jsx)(Clock, {
@@ -25793,7 +25871,7 @@ var BilibiliArticleContent = import_react.memo((props) => {
25793
25871
  }),
25794
25872
  sanitizedHtmlContent && (0, import_jsx_runtime.jsx)("div", {
25795
25873
  className: "flex-col items-center mb-8 select-text",
25796
- dangerouslySetInnerHTML: { __html: sanitizedHtmlContent }
25874
+ dangerouslySetInnerHTML: { __html: purify.sanitize(sanitizedHtmlContent) }
25797
25875
  })
25798
25876
  ]
25799
25877
  });
@@ -25925,7 +26003,7 @@ var BilibiliArticleFooter = import_react.memo((props) => (0, import_jsx_runtime.
25925
26003
  className: "flex flex-col gap-5",
25926
26004
  children: [(0, import_jsx_runtime.jsx)("div", {
25927
26005
  className: "text-7xl font-bold select-text text-foreground",
25928
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.data.username } })
26006
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.username) } })
25929
26007
  }), (0, import_jsx_runtime.jsxs)("div", {
25930
26008
  className: "flex gap-2 items-center text-4xl text-default-500",
25931
26009
  children: [(0, import_jsx_runtime.jsx)(Hash, {
@@ -26296,7 +26374,7 @@ var BilibiliVideoDynamicFooter = (props) => {
26296
26374
  className: "flex flex-col gap-5",
26297
26375
  children: [(0, import_jsx_runtime.jsx)("div", {
26298
26376
  className: "text-7xl font-bold select-text text-foreground",
26299
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.data.username } })
26377
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.username) } })
26300
26378
  }), (0, import_jsx_runtime.jsxs)("div", {
26301
26379
  className: "flex gap-2 items-center text-4xl text-default-500",
26302
26380
  children: [
@@ -26607,7 +26685,7 @@ var BilibiliDynamicUserInfo$1 = (props) => (0, import_jsx_runtime.jsxs)("div", {
26607
26685
  className: "flex flex-col gap-8 text-7xl",
26608
26686
  children: [(0, import_jsx_runtime.jsx)("div", {
26609
26687
  className: "text-6xl font-bold select-text text-foreground",
26610
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.username } })
26688
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.username) } })
26611
26689
  }), (0, import_jsx_runtime.jsxs)("div", {
26612
26690
  className: "flex gap-2 items-center text-4xl font-normal whitespace-nowrap text-foreground-500",
26613
26691
  children: [(0, import_jsx_runtime.jsx)(Clock, {
@@ -26801,7 +26879,7 @@ var BilibiliDynamicFooter$1 = (props) => (0, import_jsx_runtime.jsxs)("div", {
26801
26879
  className: "flex flex-col gap-5",
26802
26880
  children: [(0, import_jsx_runtime.jsx)("div", {
26803
26881
  className: "text-7xl font-bold select-text text-foreground",
26804
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.username } })
26882
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.username) } })
26805
26883
  }), (0, import_jsx_runtime.jsxs)("div", {
26806
26884
  className: "flex gap-2 items-center text-4xl text-default-500",
26807
26885
  children: [(0, import_jsx_runtime.jsx)(Hash, {
@@ -26957,7 +27035,7 @@ var BilibiliForwardUserInfo = (props) => (0, import_jsx_runtime.jsxs)("div", {
26957
27035
  className: "flex flex-col gap-8 text-7xl",
26958
27036
  children: [(0, import_jsx_runtime.jsx)("div", {
26959
27037
  className: "text-6xl font-bold select-text text-foreground",
26960
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.username } })
27038
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.username) } })
26961
27039
  }), (0, import_jsx_runtime.jsxs)("div", {
26962
27040
  className: "flex gap-2 items-center text-4xl font-normal whitespace-nowrap text-foreground-500",
26963
27041
  children: [(0, import_jsx_runtime.jsx)(Clock, {
@@ -26991,7 +27069,7 @@ var OriginalUserInfo = (props) => (0, import_jsx_runtime.jsxs)("div", {
26991
27069
  className: "flex flex-col gap-4 text-7xl",
26992
27070
  children: [(0, import_jsx_runtime.jsx)("div", {
26993
27071
  className: "text-5xl font-normal select-text text-foreground",
26994
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.username } })
27072
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.username) } })
26995
27073
  }), (0, import_jsx_runtime.jsxs)("div", {
26996
27074
  className: "flex gap-2 items-center text-4xl font-normal whitespace-nowrap text-foreground-500",
26997
27075
  children: [(0, import_jsx_runtime.jsx)(Clock, {
@@ -27044,7 +27122,7 @@ var OriginalAVContent = ({ content }) => (0, import_jsx_runtime.jsxs)("div", {
27044
27122
  }),
27045
27123
  (0, import_jsx_runtime.jsx)("div", {
27046
27124
  className: "pb-10 pl-8 text-6xl font-bold select-text leading-20 text-foreground",
27047
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: content.title } })
27125
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(content.title) } })
27048
27126
  })
27049
27127
  ]
27050
27128
  });
@@ -27156,7 +27234,7 @@ var OriginalLiveRcmdContent = ({ content }) => (0, import_jsx_runtime.jsxs)("div
27156
27234
  }),
27157
27235
  (0, import_jsx_runtime.jsx)("div", {
27158
27236
  className: "pl-8 text-6xl font-bold select-text text-foreground",
27159
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: content.title } })
27237
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(content.title) } })
27160
27238
  })
27161
27239
  ]
27162
27240
  });
@@ -27275,7 +27353,7 @@ var BilibiliForwardFooter = (props) => (0, import_jsx_runtime.jsxs)("div", {
27275
27353
  className: "flex flex-col gap-5",
27276
27354
  children: [(0, import_jsx_runtime.jsx)("div", {
27277
27355
  className: "text-7xl font-bold select-text text-foreground",
27278
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.username } })
27356
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.username) } })
27279
27357
  }), (0, import_jsx_runtime.jsxs)("div", {
27280
27358
  className: "flex gap-2 items-center text-4xl text-default-500",
27281
27359
  children: [(0, import_jsx_runtime.jsx)(Hash, {
@@ -27591,7 +27669,7 @@ var BilibiliDynamicUserInfo = (props) => (0, import_jsx_runtime.jsxs)("div", {
27591
27669
  className: "flex flex-col gap-8 text-7xl",
27592
27670
  children: [(0, import_jsx_runtime.jsx)("div", {
27593
27671
  className: "text-6xl font-bold select-text text-foreground",
27594
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.username } })
27672
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.username) } })
27595
27673
  }), (0, import_jsx_runtime.jsxs)("div", {
27596
27674
  className: "flex gap-2 items-center text-4xl font-normal whitespace-nowrap text-foreground-500",
27597
27675
  children: [(0, import_jsx_runtime.jsx)(Clock, {
@@ -27699,7 +27777,7 @@ var BilibiliDynamicFooter = (props) => (0, import_jsx_runtime.jsxs)("div", {
27699
27777
  className: "flex flex-col gap-5",
27700
27778
  children: [(0, import_jsx_runtime.jsx)("div", {
27701
27779
  className: "text-7xl font-bold select-text text-foreground",
27702
- children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: props.username } })
27780
+ children: (0, import_jsx_runtime.jsx)("span", { dangerouslySetInnerHTML: { __html: purify.sanitize(props.username) } })
27703
27781
  }), (0, import_jsx_runtime.jsxs)("div", {
27704
27782
  className: "flex gap-2 items-center text-4xl text-default-500",
27705
27783
  children: [(0, import_jsx_runtime.jsx)(Hash, {
@@ -28737,7 +28815,7 @@ var ReplyItemComponent = ({ reply, depth = 0, isLast, maxDepth = 6 }) => {
28737
28815
  className: "py-2",
28738
28816
  children: [(0, import_jsx_runtime.jsx)("div", {
28739
28817
  className: "text-5xl text-foreground leading-normal whitespace-pre-wrap select-text [&_img]:mb-2 [&_img]:inline [&_img]:h-[1.3em] [&_img]:w-auto [&_img]:align-middle [&_img]:mx-1 [&_img]:max-w-[1.7em]",
28740
- dangerouslySetInnerHTML: { __html: reply.text },
28818
+ dangerouslySetInnerHTML: { __html: purify.sanitize(reply.text) },
28741
28819
  style: {
28742
28820
  wordBreak: "break-word",
28743
28821
  overflowWrap: "break-word"
@@ -28837,7 +28915,7 @@ var CommentItemComponent$1 = (props) => (0, import_jsx_runtime.jsx)("div", {
28837
28915
  }),
28838
28916
  (0, import_jsx_runtime.jsx)("div", {
28839
28917
  className: "text-5xl text-foreground leading-normal mb-4 whitespace-pre-wrap select-text [&_img]:mb-2 [&_img]:inline [&_img]:h-[1.3em] [&_img]:w-auto [&_img]:align-middle [&_img]:mx-1 [&_img]:max-w-[1.7em]",
28840
- dangerouslySetInnerHTML: { __html: props.text },
28918
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.text) },
28841
28919
  style: {
28842
28920
  wordBreak: "break-word",
28843
28921
  overflowWrap: "break-word"
@@ -28979,7 +29057,7 @@ var InfoSection$2 = (props) => (0, import_jsx_runtime.jsxs)("div", {
28979
29057
  letterSpacing: "1.5px",
28980
29058
  wordWrap: "break-word"
28981
29059
  },
28982
- dangerouslySetInnerHTML: { __html: props.data.desc }
29060
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.desc) }
28983
29061
  }),
28984
29062
  (0, import_jsx_runtime.jsxs)("div", {
28985
29063
  className: "flex items-center gap-6 text-[45px] text-foreground-500 font-light mb-2.5 select-text",
@@ -29441,7 +29519,7 @@ var DouyinFavoriteList = (props) => {
29441
29519
  className: "text-rose-500/90 shrink-0 rotate-180 mt-2"
29442
29520
  }), (0, import_jsx_runtime.jsx)("div", {
29443
29521
  className: "text-white text-4xl font-medium leading-relaxed line-clamp-3 drop-shadow-lg tracking-wide",
29444
- dangerouslySetInnerHTML: { __html: props.data.desc || "分享视频" }
29522
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.desc) || "分享视频" }
29445
29523
  })]
29446
29524
  })
29447
29525
  })]
@@ -29520,7 +29598,7 @@ var InfoSection$1 = (props) => (0, import_jsx_runtime.jsxs)("div", {
29520
29598
  letterSpacing: "1.5px",
29521
29599
  wordWrap: "break-word"
29522
29600
  },
29523
- dangerouslySetInnerHTML: { __html: props.data.desc }
29601
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.desc) }
29524
29602
  }),
29525
29603
  (0, import_jsx_runtime.jsxs)("div", {
29526
29604
  className: "flex items-center gap-6 text-[45px] text-foreground-500 font-light mb-2.5 select-text",
@@ -29937,7 +30015,7 @@ var MusicInfoSection = ({ desc, musicId, userCount, createTime }) => (0, import_
29937
30015
  letterSpacing: "1.5px",
29938
30016
  wordWrap: "break-word"
29939
30017
  },
29940
- dangerouslySetInnerHTML: { __html: desc }
30018
+ dangerouslySetInnerHTML: { __html: purify.sanitize(desc) }
29941
30019
  }),
29942
30020
  (0, import_jsx_runtime.jsxs)("div", {
29943
30021
  className: "flex flex-col gap-2 text-[45px] text-default-500 font-light mb-2.5",
@@ -30258,7 +30336,7 @@ var DouyinRecommendList = (props) => {
30258
30336
  className: "text-emerald-500/90 shrink-0 rotate-180 mt-2"
30259
30337
  }), (0, import_jsx_runtime.jsx)("div", {
30260
30338
  className: "text-white text-4xl font-medium leading-relaxed line-clamp-3 drop-shadow-lg tracking-wide",
30261
- dangerouslySetInnerHTML: { __html: props.data.desc || "分享视频" }
30339
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.desc) || "分享视频" }
30262
30340
  })]
30263
30341
  })
30264
30342
  })]
@@ -30885,7 +30963,7 @@ var InfoSection = (props) => (0, import_jsx_runtime.jsxs)("div", {
30885
30963
  letterSpacing: "1.5px",
30886
30964
  wordWrap: "break-word"
30887
30965
  },
30888
- dangerouslySetInnerHTML: { __html: props.data.desc }
30966
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.desc) }
30889
30967
  }),
30890
30968
  (0, import_jsx_runtime.jsxs)("div", {
30891
30969
  className: "flex items-center gap-6 text-[45px] text-foreground-500 font-light mb-2.5 select-text",
@@ -31670,7 +31748,7 @@ var KuaishouCommentItemComponent = ({ comment, isLast = false }) => (0, import_j
31670
31748
  }),
31671
31749
  (0, import_jsx_runtime.jsx)("div", {
31672
31750
  className: "text-[60px] text-foreground leading-relaxed mb-2 whitespace-pre-wrap [&_img]:mb-3 [&_img]:inline [&_img]:h-[1.4em] [&_img]:w-auto [&_img]:align-middle [&_img]:mx-1 [&_img]:max-w-[1.7em] select-text",
31673
- dangerouslySetInnerHTML: { __html: comment.text },
31751
+ dangerouslySetInnerHTML: { __html: purify.sanitize(comment.text) },
31674
31752
  style: {
31675
31753
  wordBreak: "break-word",
31676
31754
  overflowWrap: "break-word"
@@ -34629,7 +34707,7 @@ var handlerError = (props) => {
34629
34707
  children: (0, import_jsx_runtime.jsx)("pre", {
34630
34708
  className: "text-3xl leading-relaxed whitespace-pre-wrap break-all font-mono",
34631
34709
  style: { color: accentColor },
34632
- dangerouslySetInnerHTML: { __html: convertAnsiToHtml(data.triggerCommand) }
34710
+ dangerouslySetInnerHTML: { __html: purify.sanitize(convertAnsiToHtml(data.triggerCommand)) }
34633
34711
  })
34634
34712
  })]
34635
34713
  }),
@@ -34654,7 +34732,7 @@ var handlerError = (props) => {
34654
34732
  children: (0, import_jsx_runtime.jsx)("pre", {
34655
34733
  className: "text-2xl leading-relaxed whitespace-pre-wrap break-all font-mono",
34656
34734
  style: { color: isDark ? "rgba(255,255,255,0.85)" : "rgba(127,29,29,0.9)" },
34657
- dangerouslySetInnerHTML: { __html: convertAnsiToHtml(String(businessError?.stack || data.error?.stack || "")) }
34735
+ dangerouslySetInnerHTML: { __html: purify.sanitize(convertAnsiToHtml(String(businessError?.stack || data.error?.stack || ""))) }
34658
34736
  })
34659
34737
  })]
34660
34738
  }),
@@ -34714,7 +34792,7 @@ var handlerError = (props) => {
34714
34792
  (0, import_jsx_runtime.jsx)("div", {
34715
34793
  className: "relative z-1 text-2xl font-mono whitespace-pre-wrap break-all leading-relaxed",
34716
34794
  style: { color: isDark ? "rgba(255,255,255,0.88)" : "rgba(0,0,0,0.82)" },
34717
- dangerouslySetInnerHTML: { __html: convertAnsiToHtml(log.message) }
34795
+ dangerouslySetInnerHTML: { __html: purify.sanitize(convertAnsiToHtml(log.message)) }
34718
34796
  })
34719
34797
  ]
34720
34798
  }, index);
@@ -35366,7 +35444,7 @@ var CommentItemComponent = ({ comment, isLast = false }) => (0, import_jsx_runti
35366
35444
  }),
35367
35445
  (0, import_jsx_runtime.jsx)("div", {
35368
35446
  className: "text-[60px] text-foreground leading-relaxed mb-2 whitespace-pre-wrap select-text [&_img]:mb-3 [&_img]:inline [&_img]:h-[1.4em] [&_img]:w-auto [&_img]:align-middle [&_img]:mx-1 [&_img]:max-w-[1.7em] [&_span]:inline",
35369
- dangerouslySetInnerHTML: { __html: comment.content },
35447
+ dangerouslySetInnerHTML: { __html: purify.sanitize(comment.content) },
35370
35448
  style: {
35371
35449
  wordBreak: "break-word",
35372
35450
  overflowWrap: "break-word"
@@ -35450,7 +35528,7 @@ var CommentItemComponent = ({ comment, isLast = false }) => (0, import_jsx_runti
35450
35528
  }),
35451
35529
  (0, import_jsx_runtime.jsx)("div", {
35452
35530
  className: "text-[45px] text-foreground leading-relaxed mb-2 select-text [&_img]:mb-2 [&_img]:inline [&_img]:h-[1.2em] [&_img]:w-auto [&_img]:align-middle [&_img]:mx-1 [&_img]:max-w-[1.5em] [&_span]:inline",
35453
- dangerouslySetInnerHTML: { __html: subComment.content },
35531
+ dangerouslySetInnerHTML: { __html: purify.sanitize(subComment.content) },
35454
35532
  style: {
35455
35533
  wordBreak: "break-word",
35456
35534
  overflowWrap: "break-word"
@@ -35592,7 +35670,7 @@ var XiaohongshuNoteInfo = import_react.memo((props) => {
35592
35670
  }),
35593
35671
  (0, import_jsx_runtime.jsx)("div", {
35594
35672
  className: "text-5xl text-foreground-700 leading-relaxed mb-8 whitespace-pre-wrap select-text [&_img]:mb-3 [&_img]:inline [&_img]:h-[1.4em] [&_img]:w-auto [&_img]:align-middle [&_img]:mx-1 [&_img]:max-w-[1.7em]",
35595
- dangerouslySetInnerHTML: { __html: props.data.desc }
35673
+ dangerouslySetInnerHTML: { __html: purify.sanitize(props.data.desc) }
35596
35674
  }),
35597
35675
  (0, import_jsx_runtime.jsxs)("div", {
35598
35676
  className: "flex gap-8 items-center text-5xl text-foreground-500",
@@ -35675,4 +35753,4 @@ var XiaohongshuNoteInfo = import_react.memo((props) => {
35675
35753
  });
35676
35754
  });
35677
35755
  XiaohongshuNoteInfo.displayName = "XiaohongshuNoteInfo";
35678
- export { setdyPush as $, BilibiliVideoDynamic as A, kuaishouAPP as B, DouyinArticleWork as C, bilibiliFetcher as Ct, BilibiliLiveDynamic as D, Root as Dt, BilibiliWordDynamic as E, reloadAmagiConfig as Et, kkkUpdate as F, qrLogin as G, xiaohongshuAPP as H, kkkUpdateCommand as I, changeBotID as J, bilibiliPush as K, update as L, BangumiBilibili as M, BilibiliUserList as N, BilibiliForwardDynamic as O, BilibiliComment as P, setbiliPush as Q, bilibiliAPP as R, DouyinComment as S, AmagiError as St, BilibiliQrcodeImg as T, kuaishouFetcher as Tt, globalStatistics as U, prefix as V, groupStatistics as W, douyinPushList as X, douyinPush as Y, forcePush as Z, DouyinMusicInfo as _, DouyinDBBase as _t, Changelog as a, removeOldFiles as at, DouyinFavoriteList as b, renderVideoPreviewPage as bt, GroupStatistics as c, webConfig as ct, DouyinVideoInfo as d, douyinDBInstance as dt, testDouyinPush as et, DouyinQrcodeImg as f, getBilibiliDB as ft, DouyinRecommendList as g, StatisticsDBBase as gt, DouyinUserList as h, initAllDatabases as ht, handlerError as i, dylogin as it, BilibiliArticleDynamic as j, BilibiliDrawDynamic as k, GlobalStatistics as l, bilibiliDBInstance as lt, DouyinUserVideoList as m, getStatisticsDB as mt, XiaohongshuComment as n, version as nt, VersionWarning as o, task as ot, DouyinVideoWork as p, getDouyinDB as pt, bilibiliPushList as q, QrLogin as r, biLogin as rt, Help as s, template_default as st, XiaohongshuNoteInfo as t, help as tt, KuaishouComment as u, cleanOldDynamicCache as ut, DouyinLive as v, BilibiliDBBase as vt, BilibiliVideoInfo as w, douyinFetcher as wt, DouyinDynamic as x, AmagiBase as xt, DouyinImageWork as y, reactServerRender as yt, douyinAPP as z };
35756
+ export { setdyPush as $, BilibiliVideoDynamic as A, kuaishouAPP as B, DouyinArticleWork as C, amagiClient as Ct, BilibiliLiveDynamic as D, reloadAmagiConfig as Dt, BilibiliWordDynamic as E, kuaishouFetcher as Et, kkkUpdate as F, qrLogin as G, xiaohongshuAPP as H, kkkUpdateCommand as I, changeBotID as J, bilibiliPush as K, update as L, BangumiBilibili as M, BilibiliUserList as N, BilibiliForwardDynamic as O, Root as Ot, BilibiliComment as P, setbiliPush as Q, bilibiliAPP as R, DouyinComment as S, AmagiError as St, BilibiliQrcodeImg as T, douyinFetcher as Tt, globalStatistics as U, prefix as V, groupStatistics as W, douyinPushList as X, douyinPush as Y, forcePush as Z, DouyinMusicInfo as _, DouyinDBBase as _t, Changelog as a, removeOldFiles as at, DouyinFavoriteList as b, renderVideoPreviewPage as bt, GroupStatistics as c, webConfig as ct, DouyinVideoInfo as d, douyinDBInstance as dt, testDouyinPush as et, DouyinQrcodeImg as f, getBilibiliDB as ft, DouyinRecommendList as g, StatisticsDBBase as gt, DouyinUserList as h, initAllDatabases as ht, handlerError as i, dylogin as it, BilibiliArticleDynamic as j, BilibiliDrawDynamic as k, GlobalStatistics as l, bilibiliDBInstance as lt, DouyinUserVideoList as m, getStatisticsDB as mt, XiaohongshuComment as n, version as nt, VersionWarning as o, task as ot, DouyinVideoWork as p, getDouyinDB as pt, bilibiliPushList as q, QrLogin as r, biLogin as rt, Help as s, template_default as st, XiaohongshuNoteInfo as t, help as tt, KuaishouComment as u, cleanOldDynamicCache as ut, DouyinLive as v, BilibiliDBBase as vt, BilibiliVideoInfo as w, bilibiliFetcher as wt, DouyinDynamic as x, AmagiBase as xt, DouyinImageWork as y, reactServerRender as yt, douyinAPP as z };