koishi-plugin-kkk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (702) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +674 -0
  3. package/README.md +98 -0
  4. package/assets/web/assets/CronEditor-CYgFpX-g.js +1 -0
  5. package/assets/web/assets/DesktopLayout-iI43ij11.js +1 -0
  6. package/assets/web/assets/MobileLayout-CziU8MCR.js +1 -0
  7. package/assets/web/assets/ThemeSwitch-DFohhwd9.js +1 -0
  8. package/assets/web/assets/index-BRROK0vh.js +47 -0
  9. package/assets/web/assets/index-Dj-StEiS.css +2 -0
  10. package/assets/web/assets/separator-CxcFlCzz.js +1 -0
  11. package/assets/web/favicon.svg +1 -0
  12. package/assets/web/icons.svg +24 -0
  13. package/assets/web/index.html +15 -0
  14. package/assets/webui.html +115 -0
  15. package/client/index.ts +63 -0
  16. package/config/default_config/app.yaml +64 -0
  17. package/config/default_config/bilibili.yaml +116 -0
  18. package/config/default_config/config.json +157 -0
  19. package/config/default_config/cookies.yaml +11 -0
  20. package/config/default_config/douyin.yaml +99 -0
  21. package/config/default_config/kuaishou.yaml +8 -0
  22. package/config/default_config/pushlist.yaml +37 -0
  23. package/config/default_config/request.yaml +22 -0
  24. package/config/default_config/upload.yaml +50 -0
  25. package/config/default_config/xiaohongshu.yaml +23 -0
  26. package/dist/index.js +1 -0
  27. package/lib/compat/axios.js +23 -0
  28. package/lib/compat/cron.js +77 -0
  29. package/lib/compat/esm.js +15 -0
  30. package/lib/compat/express.js +23 -0
  31. package/lib/compat/heroui.js +12 -0
  32. package/lib/compat/lodash.js +33 -0
  33. package/lib/compat/logger.js +118 -0
  34. package/lib/compat/node-karin.js +1053 -0
  35. package/lib/compat/phosphor-icons.js +27 -0
  36. package/lib/compat/qqcard.js +256 -0
  37. package/lib/compat/root.js +44 -0
  38. package/lib/compat/runtime.js +87 -0
  39. package/lib/compat/segment.js +167 -0
  40. package/lib/compat/sqlite3.js +117 -0
  41. package/lib/compat/start.js +7 -0
  42. package/lib/compat/syncConfig.js +65 -0
  43. package/lib/compat/template-react.js +30 -0
  44. package/lib/compat/text.js +65 -0
  45. package/lib/compat/yaml.js +13 -0
  46. package/lib/configBridge.js +91 -0
  47. package/lib/index.js +775 -0
  48. package/lib/karin/app.js +34 -0
  49. package/lib/karin/apps/__ready.js +9 -0
  50. package/lib/karin/apps/admin.js +136 -0
  51. package/lib/karin/apps/help.js +233 -0
  52. package/lib/karin/apps/push.js +291 -0
  53. package/lib/karin/apps/qrlogin.js +176 -0
  54. package/lib/karin/apps/statistics.js +209 -0
  55. package/lib/karin/apps/testPush.js +247 -0
  56. package/lib/karin/apps/tools.js +473 -0
  57. package/lib/karin/apps/update.js +252 -0
  58. package/lib/karin/index.js +37 -0
  59. package/lib/karin/module/db/bilibili.js +831 -0
  60. package/lib/karin/module/db/douyin.js +918 -0
  61. package/lib/karin/module/db/index.js +165 -0
  62. package/lib/karin/module/db/migration.js +199 -0
  63. package/lib/karin/module/db/statistics.js +559 -0
  64. package/lib/karin/module/index.js +94 -0
  65. package/lib/karin/module/server/constants/routes.js +48 -0
  66. package/lib/karin/module/server/controllers/bots.js +230 -0
  67. package/lib/karin/module/server/controllers/config.js +75 -0
  68. package/lib/karin/module/server/controllers/video.js +208 -0
  69. package/lib/karin/module/server/index.js +26 -0
  70. package/lib/karin/module/server/middlewares/auth.js +133 -0
  71. package/lib/karin/module/server/routes/amagi.js +57 -0
  72. package/lib/karin/module/server/routes/api.js +40 -0
  73. package/lib/karin/module/server/routes/index.js +97 -0
  74. package/lib/karin/module/server/routes/ssr.js +16 -0
  75. package/lib/karin/module/server/routes/static.js +43 -0
  76. package/lib/karin/module/utils/Base.js +403 -0
  77. package/lib/karin/module/utils/CardParser.js +487 -0
  78. package/lib/karin/module/utils/Common.js +418 -0
  79. package/lib/karin/module/utils/Config.js +434 -0
  80. package/lib/karin/module/utils/EmojiReaction.js +242 -0
  81. package/lib/karin/module/utils/ErrorHandler/handler.js +114 -0
  82. package/lib/karin/module/utils/ErrorHandler/index.js +55 -0
  83. package/lib/karin/module/utils/ErrorHandler/render.js +182 -0
  84. package/lib/karin/module/utils/ErrorHandler/sender.js +206 -0
  85. package/lib/karin/module/utils/ErrorHandler/strategy.js +41 -0
  86. package/lib/karin/module/utils/ErrorHandler/types.js +2 -0
  87. package/lib/karin/module/utils/ErrorHandler/utils.js +108 -0
  88. package/lib/karin/module/utils/FFmpeg.js +298 -0
  89. package/lib/karin/module/utils/ImageHelper.js +91 -0
  90. package/lib/karin/module/utils/ImageSlice.js +429 -0
  91. package/lib/karin/module/utils/MotionPhoto.js +250 -0
  92. package/lib/karin/module/utils/Network/Downloader.js +413 -0
  93. package/lib/karin/module/utils/Network/ImageDownloader.js +250 -0
  94. package/lib/karin/module/utils/Network/Network.js +332 -0
  95. package/lib/karin/module/utils/Network/ThrottleStream.js +71 -0
  96. package/lib/karin/module/utils/Network/constants.js +129 -0
  97. package/lib/karin/module/utils/Network/helpers.js +174 -0
  98. package/lib/karin/module/utils/Network/index.js +34 -0
  99. package/lib/karin/module/utils/Network/types.js +12 -0
  100. package/lib/karin/module/utils/Networks.js +17 -0
  101. package/lib/karin/module/utils/ParseLock.js +34 -0
  102. package/lib/karin/module/utils/ParseOverride.js +88 -0
  103. package/lib/karin/module/utils/QqCardResolve.js +114 -0
  104. package/lib/karin/module/utils/QqPanel.js +879 -0
  105. package/lib/karin/module/utils/Render/coverTheme.js +256 -0
  106. package/lib/karin/module/utils/Render/index.js +582 -0
  107. package/lib/karin/module/utils/amagiClient.js +338 -0
  108. package/lib/karin/module/utils/avatar.js +201 -0
  109. package/lib/karin/module/utils/bot.js +141 -0
  110. package/lib/karin/module/utils/build-metadata.js +50 -0
  111. package/lib/karin/module/utils/changelog.js +166 -0
  112. package/lib/karin/module/utils/index.js +26 -0
  113. package/lib/karin/module/utils/loginSession.js +259 -0
  114. package/lib/karin/module/utils/parseTip.js +93 -0
  115. package/lib/karin/module/utils/runtime-report.js +140 -0
  116. package/lib/karin/module/utils/semver.js +72 -0
  117. package/lib/karin/module/utils/statisticsAggregate.js +415 -0
  118. package/lib/karin/platform/bilibili/bilibili.js +1805 -0
  119. package/lib/karin/platform/bilibili/comments.js +294 -0
  120. package/lib/karin/platform/bilibili/danmaku.js +555 -0
  121. package/lib/karin/platform/bilibili/dynamic-text.js +827 -0
  122. package/lib/karin/platform/bilibili/genParams.js +37 -0
  123. package/lib/karin/platform/bilibili/getID.js +159 -0
  124. package/lib/karin/platform/bilibili/index.js +24 -0
  125. package/lib/karin/platform/bilibili/live-status.js +40 -0
  126. package/lib/karin/platform/bilibili/login.js +132 -0
  127. package/lib/karin/platform/bilibili/push.js +1397 -0
  128. package/lib/karin/platform/bilibili/riskControl.js +133 -0
  129. package/lib/karin/platform/bilibili/search.js +299 -0
  130. package/lib/karin/platform/common/danmaku-types.js +12 -0
  131. package/lib/karin/platform/douyin/comments.js +310 -0
  132. package/lib/karin/platform/douyin/danmaku.js +893 -0
  133. package/lib/karin/platform/douyin/douyin.js +1145 -0
  134. package/lib/karin/platform/douyin/getID.js +94 -0
  135. package/lib/karin/platform/douyin/index.js +24 -0
  136. package/lib/karin/platform/douyin/login.js +230 -0
  137. package/lib/karin/platform/douyin/push/favorite.js +75 -0
  138. package/lib/karin/platform/douyin/push/index.js +21 -0
  139. package/lib/karin/platform/douyin/push/live.js +69 -0
  140. package/lib/karin/platform/douyin/push/post.js +60 -0
  141. package/lib/karin/platform/douyin/push/recommend.js +74 -0
  142. package/lib/karin/platform/douyin/push/render.js +621 -0
  143. package/lib/karin/platform/douyin/push/types.js +2 -0
  144. package/lib/karin/platform/douyin/push.js +1128 -0
  145. package/lib/karin/platform/douyin/types.js +13 -0
  146. package/lib/karin/platform/douyin/videoQuality.js +222 -0
  147. package/lib/karin/platform/douyin/workType.js +182 -0
  148. package/lib/karin/platform/index.js +20 -0
  149. package/lib/karin/platform/kuaishou/comments.js +91 -0
  150. package/lib/karin/platform/kuaishou/getID.js +43 -0
  151. package/lib/karin/platform/kuaishou/getdata.js +41 -0
  152. package/lib/karin/platform/kuaishou/index.js +20 -0
  153. package/lib/karin/platform/kuaishou/kuaishou.js +122 -0
  154. package/lib/karin/platform/xiaohongshu/comments.js +162 -0
  155. package/lib/karin/platform/xiaohongshu/getID.js +129 -0
  156. package/lib/karin/platform/xiaohongshu/index.js +18 -0
  157. package/lib/karin/platform/xiaohongshu/xiaohongshu.js +643 -0
  158. package/lib/karin/root.js +73 -0
  159. package/lib/karin/setup.js +99 -0
  160. package/lib/karin/types/config/amagi.js +2 -0
  161. package/lib/karin/types/config/app.js +2 -0
  162. package/lib/karin/types/config/bilibili.js +2 -0
  163. package/lib/karin/types/config/cookies.js +2 -0
  164. package/lib/karin/types/config/douyin.js +2 -0
  165. package/lib/karin/types/config/index.js +2 -0
  166. package/lib/karin/types/config/kuaishou.js +2 -0
  167. package/lib/karin/types/config/pushlist.js +2 -0
  168. package/lib/karin/types/config/request.js +2 -0
  169. package/lib/karin/types/config/upload.js +2 -0
  170. package/lib/karin/types/config/xiaohongshu.js +2 -0
  171. package/lib/karin/types/datatypes.js +2 -0
  172. package/lib/karin/types/index.js +18 -0
  173. package/lib/karin/types/netrorks/NetworksConfigType.js +2 -0
  174. package/lib/karin/types/netrorks/index.js +17 -0
  175. package/lib/karin/web.config.js +49 -0
  176. package/lib/ktr/registry.js +82 -0
  177. package/lib/ktr/template/_preview/components/PreviewInfoCard.js +10 -0
  178. package/lib/ktr/template/_preview/components/PreviewLayout.js +10 -0
  179. package/lib/ktr/template/_preview/components/PreviewVideoCard.js +8 -0
  180. package/lib/ktr/template/_preview/render.js +142 -0
  181. package/lib/ktr/template/_preview/types.js +2 -0
  182. package/lib/ktr/template/_preview/utils/status.js +31 -0
  183. package/lib/ktr/template/_preview/utils/time.js +12 -0
  184. package/lib/ktr/template/bilibili/bangumi/components/bangumi.js +127 -0
  185. package/lib/ktr/template/bilibili/bangumi/components/types.js +2 -0
  186. package/lib/ktr/template/bilibili/bangumi/index.js +12 -0
  187. package/lib/ktr/template/bilibili/comment/components/Comment.js +193 -0
  188. package/lib/ktr/template/bilibili/comment/components/types.js +2 -0
  189. package/lib/ktr/template/bilibili/comment/index.js +10 -0
  190. package/lib/ktr/template/bilibili/components/Icons.js +66 -0
  191. package/lib/ktr/template/bilibili/components/shared.js +93 -0
  192. package/lib/ktr/template/bilibili/components/types.js +2 -0
  193. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/DYNAMIC_TYPE_ARTICLE.js +66 -0
  194. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/types.js +2 -0
  195. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/index.js +10 -0
  196. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/DYNAMIC_TYPE_AV.js +87 -0
  197. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/types.js +2 -0
  198. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/index.js +10 -0
  199. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/DYNAMIC_TYPE_DRAW.js +93 -0
  200. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/types.js +2 -0
  201. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/index.js +10 -0
  202. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/DYNAMIC_TYPE_FORWARD.js +132 -0
  203. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/types.js +2 -0
  204. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/index.js +10 -0
  205. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/DYNAMIC_TYPE_LIVE_RCMD.js +84 -0
  206. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/types.js +2 -0
  207. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/index.js +10 -0
  208. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/DYNAMIC_TYPE_WORD.js +38 -0
  209. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/types.js +2 -0
  210. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/index.js +10 -0
  211. package/lib/ktr/template/bilibili/dynamic/components/AdditionalCard.js +59 -0
  212. package/lib/ktr/template/bilibili/dynamic/components/CommonComponents.js +30 -0
  213. package/lib/ktr/template/bilibili/dynamic/types.js +2 -0
  214. package/lib/ktr/template/bilibili/qrcodeImg/components/qrcodeImg.js +48 -0
  215. package/lib/ktr/template/bilibili/qrcodeImg/components/types.js +3 -0
  216. package/lib/ktr/template/bilibili/qrcodeImg/index.js +10 -0
  217. package/lib/ktr/template/bilibili/userlist/components/UserList.js +53 -0
  218. package/lib/ktr/template/bilibili/userlist/components/types.js +3 -0
  219. package/lib/ktr/template/bilibili/userlist/index.js +13 -0
  220. package/lib/ktr/template/bilibili/videoInfo/components/types.js +2 -0
  221. package/lib/ktr/template/bilibili/videoInfo/components/videoInfo.js +62 -0
  222. package/lib/ktr/template/bilibili/videoInfo/index.js +10 -0
  223. package/lib/ktr/template/components/AmbientCover.js +36 -0
  224. package/lib/ktr/template/components/DefaultLayout.js +33 -0
  225. package/lib/ktr/template/components/GlowImage.js +276 -0
  226. package/lib/ktr/template/components/QRCodeWithAvatar.js +34 -0
  227. package/lib/ktr/template/components/RolldownLogo.js +6 -0
  228. package/lib/ktr/template/components/ViteLogo.js +6 -0
  229. package/lib/ktr/template/components/iconRegistry.js +173 -0
  230. package/lib/ktr/template/douyin/article-work/components/ArticleWork.js +99 -0
  231. package/lib/ktr/template/douyin/article-work/components/types.js +3 -0
  232. package/lib/ktr/template/douyin/article-work/index.js +10 -0
  233. package/lib/ktr/template/douyin/comment/components/Comment.js +189 -0
  234. package/lib/ktr/template/douyin/comment/components/types.js +2 -0
  235. package/lib/ktr/template/douyin/comment/index.js +10 -0
  236. package/lib/ktr/template/douyin/components/Icons.js +29 -0
  237. package/lib/ktr/template/douyin/components/types.js +3 -0
  238. package/lib/ktr/template/douyin/dynamic/components/Dynamic.js +90 -0
  239. package/lib/ktr/template/douyin/dynamic/components/types.js +3 -0
  240. package/lib/ktr/template/douyin/dynamic/index.js +10 -0
  241. package/lib/ktr/template/douyin/favorite-list/components/FavoriteList.js +30 -0
  242. package/lib/ktr/template/douyin/favorite-list/components/types.js +3 -0
  243. package/lib/ktr/template/douyin/favorite-list/index.js +10 -0
  244. package/lib/ktr/template/douyin/image-work/components/ImageWork.js +136 -0
  245. package/lib/ktr/template/douyin/image-work/components/types.js +2 -0
  246. package/lib/ktr/template/douyin/image-work/index.js +10 -0
  247. package/lib/ktr/template/douyin/live/components/Live.js +51 -0
  248. package/lib/ktr/template/douyin/live/components/types.js +3 -0
  249. package/lib/ktr/template/douyin/live/index.js +10 -0
  250. package/lib/ktr/template/douyin/musicinfo/components/MusicInfo.js +60 -0
  251. package/lib/ktr/template/douyin/musicinfo/components/types.js +3 -0
  252. package/lib/ktr/template/douyin/musicinfo/index.js +10 -0
  253. package/lib/ktr/template/douyin/qrcodeImg/components/qrcodeImg.js +39 -0
  254. package/lib/ktr/template/douyin/qrcodeImg/components/types.js +3 -0
  255. package/lib/ktr/template/douyin/qrcodeImg/index.js +9 -0
  256. package/lib/ktr/template/douyin/recommend-list/components/RecommendList.js +30 -0
  257. package/lib/ktr/template/douyin/recommend-list/components/types.js +3 -0
  258. package/lib/ktr/template/douyin/recommend-list/index.js +10 -0
  259. package/lib/ktr/template/douyin/user_profile/components/UserVideoList.js +54 -0
  260. package/lib/ktr/template/douyin/user_profile/components/types.js +3 -0
  261. package/lib/ktr/template/douyin/user_profile/index.js +9 -0
  262. package/lib/ktr/template/douyin/userlist/components/UserList.js +50 -0
  263. package/lib/ktr/template/douyin/userlist/components/types.js +3 -0
  264. package/lib/ktr/template/douyin/userlist/index.js +13 -0
  265. package/lib/ktr/template/douyin/video-work/components/VideoWork.js +127 -0
  266. package/lib/ktr/template/douyin/video-work/components/types.js +2 -0
  267. package/lib/ktr/template/douyin/video-work/index.js +10 -0
  268. package/lib/ktr/template/kuaishou/comment/components/Comment.js +88 -0
  269. package/lib/ktr/template/kuaishou/comment/components/types.js +2 -0
  270. package/lib/ktr/template/kuaishou/comment/index.js +10 -0
  271. package/lib/ktr/template/other/changelog/components/changelog.js +117 -0
  272. package/lib/ktr/template/other/changelog/components/types.js +3 -0
  273. package/lib/ktr/template/other/changelog/index.js +9 -0
  274. package/lib/ktr/template/other/handlerError/components/errorTitles.js +227 -0
  275. package/lib/ktr/template/other/handlerError/components/handlerError.js +392 -0
  276. package/lib/ktr/template/other/handlerError/components/stackHighlight.js +109 -0
  277. package/lib/ktr/template/other/handlerError/components/types.js +2 -0
  278. package/lib/ktr/template/other/handlerError/index.js +9 -0
  279. package/lib/ktr/template/other/help/components/Help.js +79 -0
  280. package/lib/ktr/template/other/help/components/types.js +3 -0
  281. package/lib/ktr/template/other/help/index.js +12 -0
  282. package/lib/ktr/template/other/live-photo-tip/components/LivePhotoTip.js +80 -0
  283. package/lib/ktr/template/other/live-photo-tip/components/types.js +3 -0
  284. package/lib/ktr/template/other/live-photo-tip/index.js +9 -0
  285. package/lib/ktr/template/other/qrlogin/components/qrlogin.js +58 -0
  286. package/lib/ktr/template/other/qrlogin/components/types.js +3 -0
  287. package/lib/ktr/template/other/qrlogin/index.js +9 -0
  288. package/lib/ktr/template/other/runtime/components/runtime.js +101 -0
  289. package/lib/ktr/template/other/runtime/components/types.js +3 -0
  290. package/lib/ktr/template/other/runtime/index.js +9 -0
  291. package/lib/ktr/template/other/version_warning/components/VersionWarning.js +38 -0
  292. package/lib/ktr/template/other/version_warning/components/types.js +3 -0
  293. package/lib/ktr/template/other/version_warning/index.js +9 -0
  294. package/lib/ktr/template/statistics/components/BoxplotGuide.js +17 -0
  295. package/lib/ktr/template/statistics/components/ChartCard.js +15 -0
  296. package/lib/ktr/template/statistics/components/KpiCard.js +14 -0
  297. package/lib/ktr/template/statistics/components/PlatformTable.js +20 -0
  298. package/lib/ktr/template/statistics/components/RankList.js +61 -0
  299. package/lib/ktr/template/statistics/components/SSRChart.js +22 -0
  300. package/lib/ktr/template/statistics/components/chartPresets.js +630 -0
  301. package/lib/ktr/template/statistics/components/chartTheme.js +226 -0
  302. package/lib/ktr/template/statistics/components/format.js +38 -0
  303. package/lib/ktr/template/statistics/components/types.js +9 -0
  304. package/lib/ktr/template/statistics/global/components/GlobalStatistics.js +246 -0
  305. package/lib/ktr/template/statistics/global/components/types.js +3 -0
  306. package/lib/ktr/template/statistics/global/index.js +9 -0
  307. package/lib/ktr/template/statistics/group/components/GroupStatistics.js +181 -0
  308. package/lib/ktr/template/statistics/group/components/types.js +3 -0
  309. package/lib/ktr/template/statistics/group/index.js +9 -0
  310. package/lib/ktr/template/types/ctx.js +2 -0
  311. package/lib/ktr/template/xiaohongshu/comment/components/Comment.js +99 -0
  312. package/lib/ktr/template/xiaohongshu/comment/components/types.js +3 -0
  313. package/lib/ktr/template/xiaohongshu/comment/index.js +9 -0
  314. package/lib/ktr/template/xiaohongshu/noteInfo/components/noteInfo.js +93 -0
  315. package/lib/ktr/template/xiaohongshu/noteInfo/components/types.js +2 -0
  316. package/lib/ktr/template/xiaohongshu/noteInfo/index.js +9 -0
  317. package/lib/ktr/utils/QRCodeAvatar.js +99 -0
  318. package/lib/ktr/utils/QRcode.js +56 -0
  319. package/lib/ktr/utils/avatarProxy.js +45 -0
  320. package/lib/ktr/utils/cn.js +11 -0
  321. package/lib/ktr/utils/theme.js +12 -0
  322. package/lib/qqFields.json +75 -0
  323. package/lib/qqOptions.js +44 -0
  324. package/lib/richtext/index.js +25 -0
  325. package/lib/richtext/parse/index.js +232 -0
  326. package/lib/richtext/react/cn.js +11 -0
  327. package/lib/richtext/react/index.js +221 -0
  328. package/lib/richtext/types.js +2 -0
  329. package/lib/schema.js +352 -0
  330. package/lib/webui.js +341 -0
  331. package/package.json +88 -0
  332. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_BV.svg +1 -0
  333. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_GOODS.svg +1 -0
  334. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_LOTTERY.svg +1 -0
  335. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_VIEW_PICTURE.svg +1 -0
  336. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_VOTE.svg +1 -0
  337. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_WEB.svg +1 -0
  338. package/resources/image/bilibili/bilibili-dark.png +0 -0
  339. package/resources/image/bilibili/bilibili-light.png +0 -0
  340. package/resources/image/bilibili/bilibili.png +0 -0
  341. package/resources/image/bilibili/id-dark.svg +1 -0
  342. package/resources/image/bilibili/id-light.svg +1 -0
  343. package/resources/image/bilibili/level/lv0.svg +1 -0
  344. package/resources/image/bilibili/level/lv1.svg +1 -0
  345. package/resources/image/bilibili/level/lv2.svg +1 -0
  346. package/resources/image/bilibili/level/lv3.svg +1 -0
  347. package/resources/image/bilibili/level/lv4.svg +1 -0
  348. package/resources/image/bilibili/level/lv5.svg +1 -0
  349. package/resources/image/bilibili/level/lv6.svg +1 -0
  350. package/resources/image/bilibili/level/lv7.svg +1 -0
  351. package/resources/image/bilibili/like-dark.svg +6 -0
  352. package/resources/image/bilibili/like-light.svg +6 -0
  353. package/resources/image/bilibili/play.svg +28 -0
  354. package/resources/image/bilibili/res-local1.png +0 -0
  355. package/resources/image/bilibili/up_pb.svg +1 -0
  356. package/resources/image/bilibili//347/233/264/346/222/255/344/270/255.png +0 -0
  357. package/resources/image/douyin/douyin.png +0 -0
  358. package/resources/image/douyin/dylogo-dark.svg +23 -0
  359. package/resources/image/douyin/dylogo-light.svg +38 -0
  360. package/resources/image/douyin/search-dark.svg +1 -0
  361. package/resources/image/douyin/search-light.svg +3 -0
  362. package/resources/image/douyin//346/212/226/351/237/263-/347/233/264/346/222/255/344/270/255.png +0 -0
  363. package/resources/image/frame-logo.png +0 -0
  364. package/resources/image/kuaishou/logo.png +0 -0
  365. package/resources/image/other/handlerError/Milky.png +0 -0
  366. package/resources/image/other/handlerError/chronocat.svg +43 -0
  367. package/resources/image/other/handlerError/conwechat.webp +0 -0
  368. package/resources/image/other/handlerError/gocq-http.webp +0 -0
  369. package/resources/image/other/handlerError/lagrange.webp +0 -0
  370. package/resources/image/other/handlerError/llonebot.webp +0 -0
  371. package/resources/image/other/handlerError/napcat.webp +0 -0
  372. package/resources/image/other/handlerError/onebot.png +0 -0
  373. package/resources/image/other/handlerError/satori.png +0 -0
  374. package/resources/image/xiaohongshu/logo.png +0 -0
  375. package/resources/template/style.css +23708 -0
  376. package/resources/vite.svg +130 -0
  377. package/scripts/build.mjs +129 -0
  378. package/scripts/check-schema.cjs +55 -0
  379. package/scripts/deploy.mjs +78 -0
  380. package/scripts/make-demo-placeholders.mjs +112 -0
  381. package/scripts/patch-deps.mjs +46 -0
  382. package/scripts/patch-webui.mjs +112 -0
  383. package/scripts/smoke-commands.cjs +39 -0
  384. package/scripts/smoke-config.cjs +122 -0
  385. package/scripts/smoke-douyin.cjs +170 -0
  386. package/scripts/smoke-koishi-commands.cjs +210 -0
  387. package/scripts/smoke-login.cjs +110 -0
  388. package/scripts/smoke-parse.cjs +54 -0
  389. package/scripts/smoke-push-mock.cjs +114 -0
  390. package/scripts/smoke-push.cjs +104 -0
  391. package/scripts/smoke-qq.cjs +147 -0
  392. package/scripts/smoke-qqcard.cjs +108 -0
  393. package/scripts/smoke-qqpanel.cjs +205 -0
  394. package/scripts/smoke-render.cjs +106 -0
  395. package/scripts/smoke-server.cjs +94 -0
  396. package/src/compat/axios.ts +5 -0
  397. package/src/compat/cron.ts +86 -0
  398. package/src/compat/esm.ts +13 -0
  399. package/src/compat/express.ts +5 -0
  400. package/src/compat/heroui.tsx +53 -0
  401. package/src/compat/lodash.ts +32 -0
  402. package/src/compat/logger.ts +121 -0
  403. package/src/compat/node-karin.ts +1064 -0
  404. package/src/compat/phosphor-icons.tsx +25 -0
  405. package/src/compat/qqcard.ts +251 -0
  406. package/src/compat/root.ts +44 -0
  407. package/src/compat/runtime.ts +120 -0
  408. package/src/compat/segment.ts +161 -0
  409. package/src/compat/sqlite3.ts +123 -0
  410. package/src/compat/start.ts +3 -0
  411. package/src/compat/syncConfig.ts +64 -0
  412. package/src/compat/template-react.ts +54 -0
  413. package/src/compat/text.ts +58 -0
  414. package/src/compat/yaml.ts +6 -0
  415. package/src/configBridge.ts +94 -0
  416. package/src/index.ts +769 -0
  417. package/src/karin/app.ts +1 -0
  418. package/src/karin/apps/__ready.ts +14 -0
  419. package/src/karin/apps/admin.ts +127 -0
  420. package/src/karin/apps/help.ts +228 -0
  421. package/src/karin/apps/push.ts +327 -0
  422. package/src/karin/apps/qrlogin.ts +160 -0
  423. package/src/karin/apps/statistics.ts +203 -0
  424. package/src/karin/apps/testPush.ts +226 -0
  425. package/src/karin/apps/tools.ts +510 -0
  426. package/src/karin/apps/update.ts +239 -0
  427. package/src/karin/index.ts +9 -0
  428. package/src/karin/module/db/bilibili.ts +1089 -0
  429. package/src/karin/module/db/douyin.ts +1218 -0
  430. package/src/karin/module/db/index.ts +159 -0
  431. package/src/karin/module/db/migration.ts +249 -0
  432. package/src/karin/module/db/statistics.ts +817 -0
  433. package/src/karin/module/index.ts +37 -0
  434. package/src/karin/module/server/constants/routes.ts +53 -0
  435. package/src/karin/module/server/controllers/bots.ts +289 -0
  436. package/src/karin/module/server/controllers/config.ts +85 -0
  437. package/src/karin/module/server/controllers/video.ts +212 -0
  438. package/src/karin/module/server/index.ts +11 -0
  439. package/src/karin/module/server/middlewares/auth.ts +147 -0
  440. package/src/karin/module/server/routes/amagi.ts +57 -0
  441. package/src/karin/module/server/routes/api.ts +42 -0
  442. package/src/karin/module/server/routes/index.ts +68 -0
  443. package/src/karin/module/server/routes/ssr.ts +14 -0
  444. package/src/karin/module/server/routes/static.ts +43 -0
  445. package/src/karin/module/utils/Base.ts +497 -0
  446. package/src/karin/module/utils/CardParser.ts +503 -0
  447. package/src/karin/module/utils/Common.ts +448 -0
  448. package/src/karin/module/utils/Config.ts +443 -0
  449. package/src/karin/module/utils/EmojiReaction.ts +268 -0
  450. package/src/karin/module/utils/ErrorHandler/handler.ts +124 -0
  451. package/src/karin/module/utils/ErrorHandler/index.ts +48 -0
  452. package/src/karin/module/utils/ErrorHandler/render.ts +180 -0
  453. package/src/karin/module/utils/ErrorHandler/sender.ts +192 -0
  454. package/src/karin/module/utils/ErrorHandler/strategy.ts +41 -0
  455. package/src/karin/module/utils/ErrorHandler/types.ts +122 -0
  456. package/src/karin/module/utils/ErrorHandler/utils.ts +108 -0
  457. package/src/karin/module/utils/FFmpeg.ts +357 -0
  458. package/src/karin/module/utils/ImageHelper.ts +90 -0
  459. package/src/karin/module/utils/ImageSlice.ts +383 -0
  460. package/src/karin/module/utils/MotionPhoto.ts +297 -0
  461. package/src/karin/module/utils/Network/Downloader.ts +481 -0
  462. package/src/karin/module/utils/Network/ImageDownloader.ts +291 -0
  463. package/src/karin/module/utils/Network/Network.ts +344 -0
  464. package/src/karin/module/utils/Network/ThrottleStream.ts +76 -0
  465. package/src/karin/module/utils/Network/constants.ts +135 -0
  466. package/src/karin/module/utils/Network/helpers.ts +183 -0
  467. package/src/karin/module/utils/Network/index.ts +28 -0
  468. package/src/karin/module/utils/Network/types.ts +46 -0
  469. package/src/karin/module/utils/Networks.ts +20 -0
  470. package/src/karin/module/utils/ParseLock.ts +33 -0
  471. package/src/karin/module/utils/ParseOverride.ts +128 -0
  472. package/src/karin/module/utils/QqCardResolve.ts +116 -0
  473. package/src/karin/module/utils/QqPanel.ts +880 -0
  474. package/src/karin/module/utils/Render/coverTheme.ts +294 -0
  475. package/src/karin/module/utils/Render/index.ts +574 -0
  476. package/src/karin/module/utils/amagiClient.ts +368 -0
  477. package/src/karin/module/utils/avatar.ts +220 -0
  478. package/src/karin/module/utils/bot.ts +115 -0
  479. package/src/karin/module/utils/build-metadata.ts +60 -0
  480. package/src/karin/module/utils/changelog.ts +175 -0
  481. package/src/karin/module/utils/index.ts +10 -0
  482. package/src/karin/module/utils/loginSession.ts +291 -0
  483. package/src/karin/module/utils/parseTip.ts +59 -0
  484. package/src/karin/module/utils/runtime-report.ts +142 -0
  485. package/src/karin/module/utils/semver.ts +60 -0
  486. package/src/karin/module/utils/statisticsAggregate.ts +507 -0
  487. package/src/karin/platform/bilibili/bilibili.ts +2004 -0
  488. package/src/karin/platform/bilibili/comments.ts +397 -0
  489. package/src/karin/platform/bilibili/danmaku.ts +653 -0
  490. package/src/karin/platform/bilibili/dynamic-text.ts +926 -0
  491. package/src/karin/platform/bilibili/genParams.ts +30 -0
  492. package/src/karin/platform/bilibili/getID.ts +163 -0
  493. package/src/karin/platform/bilibili/index.ts +8 -0
  494. package/src/karin/platform/bilibili/live-status.ts +36 -0
  495. package/src/karin/platform/bilibili/login.ts +130 -0
  496. package/src/karin/platform/bilibili/push.ts +1615 -0
  497. package/src/karin/platform/bilibili/riskControl.ts +114 -0
  498. package/src/karin/platform/bilibili/search.ts +305 -0
  499. package/src/karin/platform/common/danmaku-types.ts +18 -0
  500. package/src/karin/platform/douyin/comments.ts +404 -0
  501. package/src/karin/platform/douyin/danmaku.ts +1187 -0
  502. package/src/karin/platform/douyin/douyin.ts +1244 -0
  503. package/src/karin/platform/douyin/getID.ts +101 -0
  504. package/src/karin/platform/douyin/index.ts +8 -0
  505. package/src/karin/platform/douyin/login.ts +251 -0
  506. package/src/karin/platform/douyin/push/favorite.ts +97 -0
  507. package/src/karin/platform/douyin/push/index.ts +5 -0
  508. package/src/karin/platform/douyin/push/live.ts +86 -0
  509. package/src/karin/platform/douyin/push/post.ts +75 -0
  510. package/src/karin/platform/douyin/push/recommend.ts +96 -0
  511. package/src/karin/platform/douyin/push/render.ts +768 -0
  512. package/src/karin/platform/douyin/push/types.ts +41 -0
  513. package/src/karin/platform/douyin/push.ts +1241 -0
  514. package/src/karin/platform/douyin/types.ts +151 -0
  515. package/src/karin/platform/douyin/videoQuality.ts +234 -0
  516. package/src/karin/platform/douyin/workType.ts +238 -0
  517. package/src/karin/platform/index.ts +4 -0
  518. package/src/karin/platform/kuaishou/comments.ts +114 -0
  519. package/src/karin/platform/kuaishou/getID.ts +48 -0
  520. package/src/karin/platform/kuaishou/getdata.ts +78 -0
  521. package/src/karin/platform/kuaishou/index.ts +4 -0
  522. package/src/karin/platform/kuaishou/kuaishou.ts +130 -0
  523. package/src/karin/platform/xiaohongshu/comments.ts +227 -0
  524. package/src/karin/platform/xiaohongshu/getID.ts +127 -0
  525. package/src/karin/platform/xiaohongshu/index.ts +2 -0
  526. package/src/karin/platform/xiaohongshu/xiaohongshu.ts +733 -0
  527. package/src/karin/root.ts +78 -0
  528. package/src/karin/setup.ts +77 -0
  529. package/src/karin/types/config/amagi.ts +46 -0
  530. package/src/karin/types/config/app.ts +129 -0
  531. package/src/karin/types/config/bilibili.ts +121 -0
  532. package/src/karin/types/config/cookies.ts +11 -0
  533. package/src/karin/types/config/douyin.ts +93 -0
  534. package/src/karin/types/config/index.ts +41 -0
  535. package/src/karin/types/config/kuaishou.ts +10 -0
  536. package/src/karin/types/config/pushlist.ts +55 -0
  537. package/src/karin/types/config/request.ts +27 -0
  538. package/src/karin/types/config/upload.ts +49 -0
  539. package/src/karin/types/config/xiaohongshu.ts +24 -0
  540. package/src/karin/types/datatypes.ts +42 -0
  541. package/src/karin/types/index.ts +4 -0
  542. package/src/karin/types/netrorks/NetworksConfigType.ts +61 -0
  543. package/src/karin/types/netrorks/index.ts +1 -0
  544. package/src/karin/web.config.ts +48 -0
  545. package/src/ktr/registry.ts +55 -0
  546. package/src/ktr/template/_preview/components/PreviewInfoCard.tsx +33 -0
  547. package/src/ktr/template/_preview/components/PreviewLayout.tsx +65 -0
  548. package/src/ktr/template/_preview/components/PreviewVideoCard.tsx +22 -0
  549. package/src/ktr/template/_preview/render.ts +158 -0
  550. package/src/ktr/template/_preview/types.ts +15 -0
  551. package/src/ktr/template/_preview/utils/status.ts +29 -0
  552. package/src/ktr/template/_preview/utils/time.ts +8 -0
  553. package/src/ktr/template/bilibili/bangumi/components/bangumi.tsx +462 -0
  554. package/src/ktr/template/bilibili/bangumi/components/types.ts +36 -0
  555. package/src/ktr/template/bilibili/bangumi/index.tsx +9 -0
  556. package/src/ktr/template/bilibili/comment/components/Comment.tsx +657 -0
  557. package/src/ktr/template/bilibili/comment/components/types.ts +26 -0
  558. package/src/ktr/template/bilibili/comment/index.tsx +11 -0
  559. package/src/ktr/template/bilibili/components/Icons.tsx +209 -0
  560. package/src/ktr/template/bilibili/components/shared.tsx +162 -0
  561. package/src/ktr/template/bilibili/components/types.ts +388 -0
  562. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/DYNAMIC_TYPE_ARTICLE.tsx +251 -0
  563. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/types.ts +67 -0
  564. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/index.tsx +12 -0
  565. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/DYNAMIC_TYPE_AV.tsx +238 -0
  566. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/types.ts +39 -0
  567. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/index.tsx +12 -0
  568. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/DYNAMIC_TYPE_DRAW.tsx +205 -0
  569. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/types.ts +20 -0
  570. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/index.tsx +11 -0
  571. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/DYNAMIC_TYPE_FORWARD.tsx +348 -0
  572. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/types.ts +16 -0
  573. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/index.tsx +12 -0
  574. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/DYNAMIC_TYPE_LIVE_RCMD.tsx +264 -0
  575. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/types.ts +32 -0
  576. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/index.tsx +12 -0
  577. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/DYNAMIC_TYPE_WORD.tsx +68 -0
  578. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/types.ts +14 -0
  579. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/index.tsx +12 -0
  580. package/src/ktr/template/bilibili/dynamic/components/AdditionalCard.tsx +165 -0
  581. package/src/ktr/template/bilibili/dynamic/components/CommonComponents.tsx +142 -0
  582. package/src/ktr/template/bilibili/dynamic/types.ts +382 -0
  583. package/src/ktr/template/bilibili/qrcodeImg/components/qrcodeImg.tsx +179 -0
  584. package/src/ktr/template/bilibili/qrcodeImg/components/types.ts +9 -0
  585. package/src/ktr/template/bilibili/qrcodeImg/index.tsx +12 -0
  586. package/src/ktr/template/bilibili/userlist/components/UserList.tsx +246 -0
  587. package/src/ktr/template/bilibili/userlist/components/types.ts +35 -0
  588. package/src/ktr/template/bilibili/userlist/index.tsx +11 -0
  589. package/src/ktr/template/bilibili/videoInfo/components/types.ts +28 -0
  590. package/src/ktr/template/bilibili/videoInfo/components/videoInfo.tsx +217 -0
  591. package/src/ktr/template/bilibili/videoInfo/index.tsx +12 -0
  592. package/src/ktr/template/components/AmbientCover.tsx +50 -0
  593. package/src/ktr/template/components/DefaultLayout.tsx +166 -0
  594. package/src/ktr/template/components/GlowImage.tsx +572 -0
  595. package/src/ktr/template/components/QRCodeWithAvatar.tsx +52 -0
  596. package/src/ktr/template/components/RolldownLogo.tsx +110 -0
  597. package/src/ktr/template/components/ViteLogo.tsx +134 -0
  598. package/src/ktr/template/components/iconRegistry.ts +294 -0
  599. package/src/ktr/template/douyin/article-work/components/ArticleWork.tsx +301 -0
  600. package/src/ktr/template/douyin/article-work/components/types.ts +53 -0
  601. package/src/ktr/template/douyin/article-work/index.tsx +12 -0
  602. package/src/ktr/template/douyin/comment/components/Comment.tsx +612 -0
  603. package/src/ktr/template/douyin/comment/components/types.ts +85 -0
  604. package/src/ktr/template/douyin/comment/index.tsx +11 -0
  605. package/src/ktr/template/douyin/components/Icons.tsx +75 -0
  606. package/src/ktr/template/douyin/components/types.ts +83 -0
  607. package/src/ktr/template/douyin/dynamic/components/Dynamic.tsx +283 -0
  608. package/src/ktr/template/douyin/dynamic/components/types.ts +46 -0
  609. package/src/ktr/template/douyin/dynamic/index.tsx +11 -0
  610. package/src/ktr/template/douyin/favorite-list/components/FavoriteList.tsx +201 -0
  611. package/src/ktr/template/douyin/favorite-list/components/types.ts +38 -0
  612. package/src/ktr/template/douyin/favorite-list/index.tsx +12 -0
  613. package/src/ktr/template/douyin/image-work/components/ImageWork.tsx +437 -0
  614. package/src/ktr/template/douyin/image-work/components/types.ts +78 -0
  615. package/src/ktr/template/douyin/image-work/index.tsx +11 -0
  616. package/src/ktr/template/douyin/live/components/Live.tsx +229 -0
  617. package/src/ktr/template/douyin/live/components/types.ts +47 -0
  618. package/src/ktr/template/douyin/live/index.tsx +11 -0
  619. package/src/ktr/template/douyin/musicinfo/components/MusicInfo.tsx +187 -0
  620. package/src/ktr/template/douyin/musicinfo/components/types.ts +31 -0
  621. package/src/ktr/template/douyin/musicinfo/index.tsx +11 -0
  622. package/src/ktr/template/douyin/qrcodeImg/components/qrcodeImg.tsx +170 -0
  623. package/src/ktr/template/douyin/qrcodeImg/components/types.ts +9 -0
  624. package/src/ktr/template/douyin/qrcodeImg/index.tsx +9 -0
  625. package/src/ktr/template/douyin/recommend-list/components/RecommendList.tsx +201 -0
  626. package/src/ktr/template/douyin/recommend-list/components/types.ts +37 -0
  627. package/src/ktr/template/douyin/recommend-list/index.tsx +12 -0
  628. package/src/ktr/template/douyin/user_profile/components/UserVideoList.tsx +225 -0
  629. package/src/ktr/template/douyin/user_profile/components/types.ts +71 -0
  630. package/src/ktr/template/douyin/user_profile/index.tsx +9 -0
  631. package/src/ktr/template/douyin/userlist/components/UserList.tsx +229 -0
  632. package/src/ktr/template/douyin/userlist/components/types.ts +35 -0
  633. package/src/ktr/template/douyin/userlist/index.tsx +11 -0
  634. package/src/ktr/template/douyin/video-work/components/VideoWork.tsx +398 -0
  635. package/src/ktr/template/douyin/video-work/components/types.ts +80 -0
  636. package/src/ktr/template/douyin/video-work/index.tsx +11 -0
  637. package/src/ktr/template/font.css +6071 -0
  638. package/src/ktr/template/global.d.ts +69 -0
  639. package/src/ktr/template/kuaishou/comment/components/Comment.tsx +207 -0
  640. package/src/ktr/template/kuaishou/comment/components/types.ts +47 -0
  641. package/src/ktr/template/kuaishou/comment/index.tsx +11 -0
  642. package/src/ktr/template/other/changelog/components/changelog.tsx +411 -0
  643. package/src/ktr/template/other/changelog/components/types.ts +21 -0
  644. package/src/ktr/template/other/changelog/index.tsx +9 -0
  645. package/src/ktr/template/other/handlerError/components/errorTitles.ts +224 -0
  646. package/src/ktr/template/other/handlerError/components/handlerError.tsx +1076 -0
  647. package/src/ktr/template/other/handlerError/components/stackHighlight.ts +127 -0
  648. package/src/ktr/template/other/handlerError/components/types.ts +124 -0
  649. package/src/ktr/template/other/handlerError/index.tsx +9 -0
  650. package/src/ktr/template/other/help/components/Help.tsx +249 -0
  651. package/src/ktr/template/other/help/components/types.ts +47 -0
  652. package/src/ktr/template/other/help/index.tsx +9 -0
  653. package/src/ktr/template/other/live-photo-tip/components/LivePhotoTip.tsx +295 -0
  654. package/src/ktr/template/other/live-photo-tip/components/types.ts +8 -0
  655. package/src/ktr/template/other/live-photo-tip/index.tsx +9 -0
  656. package/src/ktr/template/other/qrlogin/components/qrlogin.tsx +295 -0
  657. package/src/ktr/template/other/qrlogin/components/types.ts +11 -0
  658. package/src/ktr/template/other/qrlogin/index.tsx +9 -0
  659. package/src/ktr/template/other/runtime/components/runtime.tsx +347 -0
  660. package/src/ktr/template/other/runtime/components/types.ts +75 -0
  661. package/src/ktr/template/other/runtime/index.tsx +9 -0
  662. package/src/ktr/template/other/version_warning/components/VersionWarning.tsx +392 -0
  663. package/src/ktr/template/other/version_warning/components/types.ts +8 -0
  664. package/src/ktr/template/other/version_warning/index.tsx +9 -0
  665. package/src/ktr/template/statistics/components/BoxplotGuide.tsx +57 -0
  666. package/src/ktr/template/statistics/components/ChartCard.tsx +40 -0
  667. package/src/ktr/template/statistics/components/KpiCard.tsx +39 -0
  668. package/src/ktr/template/statistics/components/PlatformTable.tsx +83 -0
  669. package/src/ktr/template/statistics/components/RankList.tsx +127 -0
  670. package/src/ktr/template/statistics/components/SSRChart.tsx +41 -0
  671. package/src/ktr/template/statistics/components/chartPresets.ts +700 -0
  672. package/src/ktr/template/statistics/components/chartTheme.ts +234 -0
  673. package/src/ktr/template/statistics/components/format.ts +33 -0
  674. package/src/ktr/template/statistics/components/types.ts +92 -0
  675. package/src/ktr/template/statistics/global/components/GlobalStatistics.tsx +597 -0
  676. package/src/ktr/template/statistics/global/components/types.ts +138 -0
  677. package/src/ktr/template/statistics/global/index.tsx +9 -0
  678. package/src/ktr/template/statistics/group/components/GroupStatistics.tsx +468 -0
  679. package/src/ktr/template/statistics/group/components/types.ts +113 -0
  680. package/src/ktr/template/statistics/group/index.tsx +9 -0
  681. package/src/ktr/template/style.css +65 -0
  682. package/src/ktr/template/types/ctx.ts +42 -0
  683. package/src/ktr/template/xiaohongshu/comment/components/Comment.tsx +264 -0
  684. package/src/ktr/template/xiaohongshu/comment/components/types.ts +119 -0
  685. package/src/ktr/template/xiaohongshu/comment/index.tsx +9 -0
  686. package/src/ktr/template/xiaohongshu/noteInfo/components/noteInfo.tsx +271 -0
  687. package/src/ktr/template/xiaohongshu/noteInfo/components/types.ts +66 -0
  688. package/src/ktr/template/xiaohongshu/noteInfo/index.tsx +9 -0
  689. package/src/ktr/utils/QRCodeAvatar.ts +102 -0
  690. package/src/ktr/utils/QRcode.ts +65 -0
  691. package/src/ktr/utils/avatarProxy.ts +42 -0
  692. package/src/ktr/utils/cn.ts +6 -0
  693. package/src/ktr/utils/theme.ts +10 -0
  694. package/src/qqFields.json +75 -0
  695. package/src/qqOptions.ts +64 -0
  696. package/src/richtext/index.ts +9 -0
  697. package/src/richtext/parse/index.ts +271 -0
  698. package/src/richtext/react/cn.ts +6 -0
  699. package/src/richtext/react/index.tsx +582 -0
  700. package/src/richtext/types.ts +320 -0
  701. package/src/schema.ts +372 -0
  702. package/src/webui.ts +352 -0
@@ -0,0 +1,612 @@
1
+ import { createRichTextDocument, renderRichTextToReact } from '@kkk/richtext'
2
+ import { PlayIcon } from '@phosphor-icons/react'
3
+ import { differenceInSeconds, format, formatDistanceToNow, fromUnixTime } from 'date-fns'
4
+ import { zhCN } from 'date-fns/locale'
5
+ import { Search } from 'lucide-react'
6
+ import React, { type ReactNode } from 'react'
7
+
8
+ import { cn } from '../../../../utils/cn'
9
+ import { isDark } from '../../../../utils/theme'
10
+ import { DefaultLayout } from '../../../components/DefaultLayout'
11
+ import { QRCodeWithAvatar } from '../../../components/QRCodeWithAvatar'
12
+ import type { PosterProps } from '../../../types/ctx'
13
+ import { DouyinCommentIcon, DouyinFavoriteIcon, DouyinLikeIcon, DouyinMoreIcon, DouyinShareIcon } from '../../components/Icons'
14
+ import type { DouyinSubComment } from '../../components/types'
15
+ import type { DouyinCommentData } from './types'
16
+
17
+ const douyinMentionClassName = 'text-[#04498d] dark:text-[#face15]'
18
+ const douyinSearchKeywordClassName = 'font-medium text-[#04498d] dark:text-[#face15]'
19
+ const douyinSearchKeywordIconClassName = 'opacity-90'
20
+ // 注意不能提升到模块顶层调用:打包后注册表与共享 chunk 存在循环引用,
21
+ // 模块求值期调用会在「未初始化」的绑定上炸出 is not a function,必须惰性创建。
22
+ const createEmptyDouyinRichText = () => createRichTextDocument([], { platform: 'douyin' })
23
+
24
+ const renderDouyinCommentRichText = (content: DouyinSubComment['text'] | DouyinCommentData['CommentsData'][number]['text']): ReactNode => {
25
+ return renderRichTextToReact(content, {
26
+ mention: { className: douyinMentionClassName },
27
+ searchKeyword: { className: douyinSearchKeywordClassName, iconClassName: douyinSearchKeywordIconClassName }
28
+ })
29
+ }
30
+
31
+ const formatDouyinCommentTime = (timestamp: number): string => {
32
+ if (!timestamp) {
33
+ return ''
34
+ }
35
+
36
+ const commentDate = fromUnixTime(timestamp)
37
+ const diffSeconds = differenceInSeconds(new Date(), commentDate)
38
+
39
+ if (diffSeconds < 30) {
40
+ return '刚刚'
41
+ }
42
+
43
+ if (diffSeconds < 7776000) {
44
+ return formatDistanceToNow(commentDate, {
45
+ locale: zhCN,
46
+ addSuffix: true
47
+ })
48
+ }
49
+
50
+ return format(commentDate, 'yyyy-MM-dd')
51
+ }
52
+
53
+ const formatDouyinCommentDiggCount = (count: number): string => {
54
+ if (count >= 10000) {
55
+ return `${(count / 10000).toFixed(1)}w`
56
+ }
57
+
58
+ return String(count)
59
+ }
60
+
61
+ const formatPublishTime = (timestamp: number): string => {
62
+ if (!timestamp) return ''
63
+ return format(fromUnixTime(timestamp), 'yyyy年MM月dd日 HH:mm', { locale: zhCN })
64
+ }
65
+
66
+ // const DouyinLogo: React.FC<{ useDarkTheme?: boolean }> = ({ useDarkTheme }) => {
67
+ // const [hasError, setHasError] = React.useState(false)
68
+
69
+ // if (hasError) {
70
+ // return (
71
+ // <div className='flex items-center h-full text-6xl font-bold text-foreground/70'>
72
+ // 抖音
73
+ // </div>
74
+ // )
75
+ // }
76
+
77
+ // return (
78
+ // <img
79
+ // src={useDarkTheme ? '/image/douyin/dylogo-light.svg' : '/image/douyin/dylogo-dark.svg'}
80
+ // alt='抖音Logo'
81
+ // className='object-contain h-full w-auto max-w-125'
82
+ // onError={() => setHasError(true)}
83
+ // />
84
+ // )
85
+ // }
86
+
87
+ /**
88
+ * 二维码组件
89
+ * @param props 组件属性
90
+ * @returns JSX元素
91
+ */
92
+ const QRCodeSection: React.FC<Omit<DouyinCommentData, 'CommentsData'> & { useDarkTheme?: boolean }> = (props) => {
93
+ return (
94
+ <div className="flex flex-col items-center">
95
+ <div className="flex justify-center items-center w-100 h-100 p-4">
96
+ <QRCodeWithAvatar
97
+ value={props.share_url}
98
+ avatarUrl={props.AuthorAvatar}
99
+ useDarkTheme={props.useDarkTheme}
100
+ alt="二维码"
101
+ className="object-contain w-full h-full rounded-lg"
102
+ />
103
+ </div>
104
+ </div>
105
+ )
106
+ }
107
+
108
+ /**
109
+ * 视频信息头部组件
110
+ * @param props 组件属性
111
+ * @returns JSX元素
112
+ */
113
+ const VideoInfoHeader: React.FC<Omit<DouyinCommentData, 'CommentsData'> & { useDarkTheme?: boolean }> = (props) => {
114
+ return (
115
+ <div className="max-w-350 mx-auto px-10 pt-14">
116
+ <div className="flex items-start justify-between gap-10">
117
+ {/* 左侧内容区 */}
118
+ <div className="flex flex-col gap-10 flex-1 min-w-0">
119
+ {/* 作者信息 + Logo */}
120
+ <div className="flex items-start justify-between gap-6">
121
+ <div className="flex items-center gap-6 min-w-0">
122
+ {/* 作者头像 */}
123
+ <div className="w-35 h-35 shrink-0 rounded-full overflow-hidden bg-surface-secondary ring-2 ring-border/40">
124
+ <img src={props.AuthorAvatar} className="w-full h-full object-cover" alt={props.Author} />
125
+ </div>
126
+ {/* 作者名 + 时间 */}
127
+ <div className="flex flex-col gap-3 min-w-0">
128
+ <div className="flex items-center gap-4 flex-wrap">
129
+ <span className="text-5xl font-medium text-foreground truncate">{props.Author}</span>
130
+ </div>
131
+ <span className="text-4xl text-muted">{formatPublishTime(props.CreateTime)}</span>
132
+ </div>
133
+ </div>
134
+
135
+ {/* 抖音 Logo */}
136
+ {/* <div className='h-28 flex items-center shrink-0'>
137
+ <DouyinLogo useDarkTheme={props.useDarkTheme} />
138
+ </div> */}
139
+ </div>
140
+
141
+ {/* 数据统计 */}
142
+ <div className="grid grid-cols-2 gap-8">
143
+ <div className="flex items-center gap-4 text-foreground/50">
144
+ <DouyinLikeIcon size={48} />
145
+ <span className="text-5xl font-medium text-foreground/90">{formatDouyinCommentDiggCount(props.Statistics.digg_count)}</span>
146
+ </div>
147
+ <div className="flex items-center gap-4 text-foreground/50">
148
+ <DouyinCommentIcon size={48} />
149
+ <span className="text-5xl font-medium text-foreground/90">
150
+ {formatDouyinCommentDiggCount(props.Statistics.comment_count)}
151
+ </span>
152
+ </div>
153
+ <div className="flex items-center gap-4 text-foreground/50">
154
+ <DouyinShareIcon size={48} />
155
+ <span className="text-5xl font-medium text-foreground/90">{formatDouyinCommentDiggCount(props.Statistics.share_count)}</span>
156
+ </div>
157
+ <div className="flex items-center gap-4 text-foreground/50">
158
+ <DouyinFavoriteIcon size={48} />
159
+ <span className="text-5xl font-medium text-foreground/90">
160
+ {formatDouyinCommentDiggCount(props.Statistics.collect_count)}
161
+ </span>
162
+ </div>
163
+ </div>
164
+
165
+ {/* 规格信息 */}
166
+ <div className="flex items-center gap-4 flex-wrap text-muted">
167
+ <span className="text-4xl">{props.Type}</span>
168
+ {props.Type === '视频' && props.Resolution && (
169
+ <>
170
+ <span className="text-4xl text-border">·</span>
171
+ <span className="text-4xl">{props.Resolution}</span>
172
+ </>
173
+ )}
174
+ {props.Type === '视频' ? (
175
+ <>
176
+ <span className="text-4xl text-border">·</span>
177
+ <span className="text-4xl">{props.VideoSize}MB</span>
178
+ <span className="text-4xl text-border">·</span>
179
+ <span className="text-4xl">{props.VideoFPS}Hz</span>
180
+ </>
181
+ ) : (
182
+ <>
183
+ <span className="text-4xl text-border">·</span>
184
+ <span className="text-4xl">{props.Region}</span>
185
+ <span className="text-4xl text-border">·</span>
186
+ <span className="text-4xl">{props.ImageLength}张</span>
187
+ </>
188
+ )}
189
+ </div>
190
+ </div>
191
+
192
+ {/* 右侧二维码 */}
193
+ <div className="shrink-0">
194
+ <QRCodeSection {...props} />
195
+ </div>
196
+ </div>
197
+ </div>
198
+ )
199
+ }
200
+
201
+ interface ReplyNode extends DouyinSubComment {
202
+ children: ReplyNode[]
203
+ hiddenCount?: number
204
+ }
205
+
206
+ const organizeReplies = (replies: DouyinSubComment[], rootCid: string, maxDepth: number = 6): ReplyNode[] => {
207
+ const map = new Map<string, ReplyNode>()
208
+ const roots: ReplyNode[] = []
209
+
210
+ // 第一遍:创建节点
211
+ replies.forEach((r) => {
212
+ map.set(r.cid, { ...r, children: [] })
213
+ })
214
+
215
+ // 第二遍:构建树
216
+ replies.forEach((r) => {
217
+ const node = map.get(r.cid)!
218
+ const parentId = r.reply_to_reply_id
219
+ if (parentId && map.has(parentId) && parentId !== rootCid && parentId !== '0') {
220
+ map.get(parentId)!.children.push(node)
221
+ } else {
222
+ roots.push(node)
223
+ }
224
+ })
225
+
226
+ // 计算深度并修剪树的函数
227
+ const pruneTree = (nodes: ReplyNode[], currentDepth: number): ReplyNode[] => {
228
+ if (currentDepth > maxDepth) {
229
+ const count = nodes.length + nodes.reduce((acc, node) => acc + countChildren(node), 0)
230
+ if (count > 0) {
231
+ return [
232
+ {
233
+ cid: `more-${Date.now()}-${Math.random()}`,
234
+ text: createEmptyDouyinRichText(),
235
+ digg_count: 0,
236
+ create_time: 0,
237
+ nickname: '',
238
+ userimageurl: '',
239
+ ip_label: '',
240
+ text_extra: [],
241
+ label_text: '',
242
+ image_list: null,
243
+ reply_to_reply_id: '',
244
+ reply_to_username: '',
245
+ children: [],
246
+ hiddenCount: count
247
+ }
248
+ ]
249
+ }
250
+ return []
251
+ }
252
+
253
+ return nodes.map((node) => {
254
+ node.children = pruneTree(node.children, currentDepth + 1)
255
+ return node
256
+ })
257
+ }
258
+
259
+ const countChildren = (node: ReplyNode): number => {
260
+ return node.children.length + node.children.reduce((acc, child) => acc + countChildren(child), 0)
261
+ }
262
+
263
+ return pruneTree(roots, 1)
264
+ }
265
+
266
+ const ReplyItemComponent: React.FC<{ reply: ReplyNode; depth?: number; isLast?: boolean; maxDepth?: number }> = ({
267
+ reply,
268
+ depth = 0,
269
+ isLast,
270
+ maxDepth = 6
271
+ }) => {
272
+ const nicknameLength = reply.nickname.length
273
+ const replyToLength = reply.reply_to_username?.length || 0
274
+ const isNicknameLonger = nicknameLength >= replyToLength
275
+
276
+ if (reply.hiddenCount) {
277
+ return (
278
+ <div className="flex relative flex-col mb-6">
279
+ {/*
280
+ 外部网格:处理缩进和树连接
281
+ 第1列:父级线程线(脊柱) + 连接到此评论的线(曲线)
282
+ 第2列:评论本身
283
+ */}
284
+ <div className="grid grid-cols-[100px_minmax(0,1fr)] relative">
285
+ {/* 第1列:树连接区域 */}
286
+ <div className="flex relative justify-center">
287
+ {/* 1. 脊柱:来自父级的垂直线 */}
288
+ {/* 如果不是最后一个子节点则穿过 */}
289
+ {!isLast && <div className="absolute top-0 bottom-0 left-1/2 w-0.5 bg-border -ml-px"></div>}
290
+
291
+ {/* 脊柱延伸用于边距间隙 */}
292
+ {/* 连接到下一个兄弟节点的 mb-6 间隙 */}
293
+ {!isLast && <div className="absolute -bottom-6 left-1/2 w-0.5 h-6 bg-border -ml-px"></div>}
294
+
295
+ {/* 2. 曲线:L形连接到当前评论 */}
296
+ <svg className="absolute top-0 left-0 w-full h-12.5 pointer-events-none overflow-visible z-0 text-border">
297
+ <path d="M 50 0 V 15 Q 50 50 85 50 H 90" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" />
298
+ </svg>
299
+ </div>
300
+
301
+ {/* 第2列:显示更多文本 */}
302
+ <div className="flex flex-col mt-6 min-w-0">
303
+ <div className="flex items-center h-12.5">
304
+ <div className="flex items-center text-muted">
305
+ <DouyinMoreIcon size={45} className="mr-5" />
306
+ <span className="text-4xl font-medium tracking-wide">另外 {reply.hiddenCount} 条回复</span>
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+ </div>
312
+ )
313
+ }
314
+
315
+ return (
316
+ <div className="flex relative flex-col">
317
+ {/*
318
+ 外部网格:处理缩进和树连接
319
+ 第1列:父级线程线(脊柱) + 连接到此评论的线(曲线)
320
+ 第2列:评论本身
321
+ */}
322
+ <div className="grid grid-cols-[100px_minmax(0,1fr)] relative">
323
+ {/* 第1列:树连接区域 */}
324
+ <div className="flex relative justify-center">
325
+ {/* 1. 脊柱:来自父级的垂直线 */}
326
+ {/* 如果不是最后一个子节点则穿过 */}
327
+ {!isLast && <div className="absolute top-0 bottom-0 left-1/2 w-0.5 bg-border-secondary -ml-px"></div>}
328
+
329
+ {/* 脊柱延伸用于边距间隙 */}
330
+ {/* 连接到下一个兄弟节点的 mb-6 间隙 */}
331
+ {!isLast && <div className="absolute -bottom-6 left-1/2 w-0.5 h-6 bg-border -ml-px"></div>}
332
+
333
+ {/* 2. 曲线:L形连接到当前评论 */}
334
+ <svg className="absolute top-0 left-0 w-full h-12.5 pointer-events-none overflow-visible z-0 text-border-secondary">
335
+ <path d="M 50 0 V 15 Q 50 50 85 50 H 90" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" />
336
+ </svg>
337
+ </div>
338
+
339
+ {/* 第2列:评论主体(六宫格) */}
340
+ <div className="flex flex-col min-w-0">
341
+ {/* 内部网格:头像 | 内容 */}
342
+ <div className="grid grid-cols-[100px_minmax(0,1fr)] relative">
343
+ {/* 内部第1列:头像 & 子线程线 */}
344
+ {/* 添加 h-full 以确保其拉伸以匹配内容高度 */}
345
+ <div className="flex relative flex-col items-center h-full">
346
+ {/* 头像 - 固定高度 */}
347
+ <div className="w-25 h-25 shrink-0 z-10 relative">
348
+ <img src={reply.userimageurl} className="object-cover rounded-full w-25 h-25 bg-background" alt="用户头像" />
349
+ </div>
350
+
351
+ {/* 子线程线 - 从头像下方开始并延伸到此单元格底部 */}
352
+ {reply.children.length > 0 && <div className="w-0.5 bg-border-secondary h-full grow mt-3 rounded-t-full"></div>}
353
+ </div>
354
+
355
+ {/* 内部第2列:头部、内容、操作 */}
356
+ <div className={cn('flex flex-col pl-6 min-w-0 gap-2', isLast && reply.children.length === 0 ? 'pb-16' : 'pb-6')}>
357
+ {/* 第1行:头部 */}
358
+ <div className="flex flex-nowrap items-center content-center w-full overflow-hidden">
359
+ <span className={cn('mr-2 text-4xl font-normal text-muted', isNicknameLonger ? 'min-w-0 truncate shrink' : 'shrink-0')}>
360
+ {reply.nickname}
361
+ </span>
362
+ {reply.label_text !== '' && (
363
+ <div
364
+ className={cn(
365
+ 'px-4 py-1 text-3xl rounded-xl mr-2',
366
+ reply.label_text === '作者' ? 'bg-[#fe2c55] text-white' : 'bg-surface text-muted'
367
+ )}
368
+ >
369
+ {reply.label_text}
370
+ </div>
371
+ )}
372
+ {reply.reply_to_username && (
373
+ <div className={cn('flex items-center', !isNicknameLonger ? 'overflow-hidden min-w-0 shrink' : 'shrink-0')}>
374
+ <PlayIcon weight="fill" className="w-7 h-auto mr-3.5 mx-1 text-muted shrink-0" />
375
+ <span className={cn('text-4xl font-normal text-muted', !isNicknameLonger && 'truncate')}>
376
+ {reply.reply_to_username}
377
+ </span>
378
+ </div>
379
+ )}
380
+ </div>
381
+
382
+ {/* 第2行:内容 */}
383
+ <div>
384
+ <div
385
+ className="text-5xl text-foreground leading-normal whitespace-pre-wrap select-text"
386
+ style={{
387
+ wordBreak: 'break-word',
388
+ overflowWrap: 'break-word'
389
+ }}
390
+ >
391
+ {renderDouyinCommentRichText(reply.text)}
392
+ </div>
393
+
394
+ {reply.image_list &&
395
+ reply.image_list.length > 0 &&
396
+ reply.image_list.filter(Boolean).map((img, idx) => (
397
+ <div key={idx} className="my-4 overflow-hidden shadow-sm rounded-xl max-w-150">
398
+ <img className="object-contain w-full h-auto rounded-xl" src={img} alt="评论图片" />
399
+ </div>
400
+ ))}
401
+ </div>
402
+
403
+ {/* 第3行:操作 */}
404
+ <div className="pb-4">
405
+ <div className="flex gap-6 items-center text-muted">
406
+ <span className="text-4xl">{formatDouyinCommentTime(reply.create_time)}</span>
407
+ <span className="text-4xl">{reply.ip_label}</span>
408
+ <div className="flex gap-2 items-center">
409
+ <DouyinLikeIcon size={40} />
410
+ <span className="text-4xl select-text">{formatDouyinCommentDiggCount(reply.digg_count)}</span>
411
+ </div>
412
+ </div>
413
+ </div>
414
+ </div>
415
+ </div>
416
+
417
+ {/* 子容器 - 递归 */}
418
+ {reply.children.length > 0 && (
419
+ <div className="flex relative flex-col">
420
+ <div>
421
+ {reply.children.map((child, index) => (
422
+ <ReplyItemComponent
423
+ key={child.cid}
424
+ reply={child}
425
+ depth={depth + 1}
426
+ isLast={index === reply.children.length - 1}
427
+ maxDepth={maxDepth}
428
+ />
429
+ ))}
430
+ </div>
431
+ </div>
432
+ )}
433
+ </div>
434
+ </div>
435
+ </div>
436
+ )
437
+ }
438
+
439
+ /**
440
+ * 单个评论组件
441
+ * @param props 组件属性
442
+ * @returns JSX元素
443
+ * @description Root comment component
444
+ */
445
+ const CommentItemComponent: React.FC<DouyinCommentData['CommentsData'][number] & { isLast?: boolean; maxDepth?: number }> = (props) => {
446
+ return (
447
+ <div className={cn('flex flex-col px-6 pt-8', { 'pb-0': props.isLast, 'pb-10': !props.isLast })}>
448
+ {/* 根网格 - 单列主体(根节点没有连接列) */}
449
+ <div className="flex flex-col min-w-0">
450
+ {/* 内部网格:头像 | 内容 */}
451
+ <div className="grid grid-cols-[140px_minmax(0,1fr)] relative">
452
+ {/* 内部第1列:头像 & 子线程线 */}
453
+ <div className="flex relative flex-col items-center">
454
+ {/* 头像 - 根节点更大 */}
455
+ <div className="w-35 h-35 shrink-0 z-10 relative">
456
+ <img src={props.userimageurl} className="w-35 h-35 rounded-full object-cover shadow-md bg-background" alt="用户头像" />
457
+ </div>
458
+
459
+ {/* 子线程线 */}
460
+ {props.replyComment && props.replyComment.length > 0 && (
461
+ <div className="w-0.5 bg-border-secondary h-full grow mt-4 rounded-t-full"></div>
462
+ )}
463
+ </div>
464
+
465
+ {/* 内部第2列:内容 */}
466
+ <div className="flex flex-col py-4 pl-6 min-w-0 gap-2">
467
+ {/* 头部 */}
468
+ <div className="flex flex-wrap gap-4 items-center mb-3 text-4xl select-text content-center">
469
+ <span className="font-normal text-muted">{props.nickname}</span>
470
+ {props.label_type === 1 && (
471
+ <div className="inline-flex items-center px-3 py-1 rounded-lg text-3xl bg-[#fe2c55] text-white">作者</div>
472
+ )}
473
+ {props.is_author_digged && props.status_label !== '作者赞过' && (
474
+ <div className="inline-flex items-center px-3 py-1 text-3xl font-light rounded-lg bg-surface-secondary text-foreground/80">
475
+ 作者赞过
476
+ </div>
477
+ )}
478
+ {props.status_label && (
479
+ <div className="inline-flex items-center px-3 py-1 text-3xl font-light rounded-lg bg-surface-secondary text-foreground/80">
480
+ {props.status_label}
481
+ </div>
482
+ )}
483
+ </div>
484
+
485
+ <div
486
+ className="text-5xl text-foreground leading-normal whitespace-pre-wrap select-text"
487
+ style={{
488
+ wordBreak: 'break-word',
489
+ overflowWrap: 'break-word'
490
+ }}
491
+ >
492
+ {renderDouyinCommentRichText(props.text)}
493
+ </div>
494
+
495
+ {/* 评论图片 */}
496
+ {(props.commentimage || props.sticker) && (
497
+ <div className="my-6 overflow-hidden shadow-sm rounded-2xl max-w-200">
498
+ <img className="object-contain w-full h-auto rounded-2xl" src={props.commentimage || props.sticker} alt="评论图片" />
499
+ </div>
500
+ )}
501
+
502
+ <div className="flex justify-between items-center text-muted">
503
+ <div className="flex gap-6 items-center shrink-0">
504
+ <span className="text-4xl">{formatDouyinCommentTime(props.create_time)}</span>
505
+ <span className="text-4xl">{props.ip_label}</span>
506
+ <div className="flex gap-2 items-center transition-colors cursor-pointer">
507
+ <DouyinLikeIcon size={44} />
508
+ <span className="text-4xl select-text">{formatDouyinCommentDiggCount(props.digg_count)}</span>
509
+ </div>
510
+ </div>
511
+ </div>
512
+ </div>
513
+ </div>
514
+
515
+ {/* 回复容器 */}
516
+ {/*
517
+ 根缩进调整:
518
+ 根头像列为 140px。中心点为 70px。
519
+ 子外部列为 100px。中心点为 50px。
520
+
521
+ 我们需要子中心点(50px)与根中心点(70px)对齐。
522
+ 所以我们需要将子元素向右推 20px。
523
+
524
+ 容器上使用 pl-5。
525
+ */}
526
+ {props.replyComment && props.replyComment.length > 0 && (
527
+ <div className="flex relative flex-col mt-8 ml-5">
528
+ <div className="absolute -top-8 left-12.5 w-0.5 h-8 bg-border-secondary -ml-px"></div>
529
+ {organizeReplies(props.replyComment, props.cid || '', props.maxDepth).map((reply, index, arr) => (
530
+ <ReplyItemComponent key={reply.cid} reply={reply} depth={1} isLast={index === arr.length - 1} maxDepth={props.maxDepth} />
531
+ ))}
532
+ </div>
533
+ )}
534
+ </div>
535
+ </div>
536
+ )
537
+ }
538
+
539
+ /**
540
+ * 抖音评论组件
541
+ * @param props 组件属性
542
+ * @returns JSX元素
543
+ */
544
+ export const DouyinComment: React.FC<PosterProps<DouyinCommentData>> = React.memo((props) => {
545
+ // 随机选择一个搜索词
546
+ const randomSuggestWord = () => {
547
+ if (props.data.suggestWrod && props.data.suggestWrod.length > 0) {
548
+ const randomIndex = Math.floor(Math.random() * props.data.suggestWrod.length)
549
+ return props.data.suggestWrod[randomIndex]
550
+ }
551
+ return null
552
+ }
553
+
554
+ return (
555
+ <DefaultLayout {...props}>
556
+ <div className="p-5 px-15">
557
+ <div className="h-20"></div>
558
+ {/* 视频信息头部 */}
559
+ <VideoInfoHeader {...props.data} useDarkTheme={isDark(props.ctx)} />
560
+
561
+ {/* 推荐搜索词 */}
562
+ {randomSuggestWord() && (
563
+ <div className="mx-auto my-20 mb-5 ml-10">
564
+ <div className="flex gap-3 items-center px-6 py-4 rounded-2xl">
565
+ <span className="text-5xl text-muted">大家都在搜:</span>
566
+ <span className="relative text-5xl text-[#04498d] dark:text-[#face15]">
567
+ {randomSuggestWord()}
568
+ <Search size={32} className="absolute -top-2 -right-8" />
569
+ </span>
570
+ </div>
571
+ </div>
572
+ )}
573
+ {/* {randomSuggestWord && (
574
+ <div className='mx-auto my-20 ml-10'>
575
+ <div className='flex gap-10 items-center px-6 py-4 rounded-2xl'>
576
+ <span className='text-5xl font-bold text-muted'>相关搜索</span>
577
+ <span className='flex gap-2 bg-surface py-5 px-5 rounded-3xl relative text-5xl text-[#04498d] dark:text-[#face15]'>
578
+ <Search size={50} />
579
+ {randomSuggestWord}
580
+
581
+ </span>
582
+ </div>
583
+ </div>
584
+ )} */}
585
+
586
+ {/* 评论列表 */}
587
+ <div className="overflow-hidden mt-8">
588
+ {props.data.CommentsData.length > 0 ? (
589
+ <>
590
+ {props.data.CommentsData.map((comment, index) => (
591
+ <CommentItemComponent
592
+ key={comment.cid || index}
593
+ {...comment}
594
+ isLast={index === props.data.CommentsData.length - 1}
595
+ maxDepth={props.data.maxDepth}
596
+ />
597
+ ))}
598
+ </>
599
+ ) : (
600
+ <div className="flex justify-center items-center py-20 text-muted">
601
+ <div className="text-center">
602
+ <p className="text-xl">暂无评论数据</p>
603
+ </div>
604
+ </div>
605
+ )}
606
+ </div>
607
+ </div>
608
+ </DefaultLayout>
609
+ )
610
+ })
611
+
612
+ export default DouyinComment