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,170 @@
1
+ import { Menu, ScanLine, ShieldCheck, Smartphone } from 'lucide-react'
2
+ import React from 'react'
3
+ import { RiArrowRightFill, RiTiktokFill } from 'react-icons/ri'
4
+
5
+ import { isDark } from '../../../../utils/theme'
6
+ import { DefaultLayout } from '../../../components/DefaultLayout'
7
+ import { QRCodeWithAvatar } from '../../../components/QRCodeWithAvatar'
8
+ import type { PosterProps } from '../../../types/ctx'
9
+ import type { DouyinQrcodeImgData } from './types'
10
+
11
+ /**
12
+ * 抖音二维码登录组件
13
+ * @param props 组件属性
14
+ * @returns JSX元素
15
+ */
16
+ export const DouyinQrcodeImg: React.FC<PosterProps<DouyinQrcodeImgData>> = React.memo((props) => {
17
+ const dark = isDark(props.ctx)
18
+
19
+ const theme = {
20
+ bg: dark ? '#000000' : '#FFFFFF',
21
+ text: dark ? '#FFFFFF' : '#000000',
22
+ subText: dark ? '#888888' : '#666666',
23
+ accent: '#FF2C55',
24
+ // 双色弥散
25
+ gradientTL: '#fe1700', // 左上
26
+ gradientBR: '#0fffff' // 右下
27
+ }
28
+
29
+ return (
30
+ <DefaultLayout
31
+ {...props}
32
+ className="relative overflow-hidden font-sans"
33
+ style={{
34
+ background: theme.bg,
35
+ color: theme.text
36
+ }}
37
+ >
38
+ {/* 1. 弥散模糊效果 */}
39
+ <div className="absolute inset-0 overflow-hidden pointer-events-none">
40
+ {/* 左上角主光辉 */}
41
+ <div
42
+ className="absolute top-[-40%] left-[-50%] w-400 h-600 rounded-full blur-[200px] opacity-25"
43
+ style={{ background: theme.gradientTL }}
44
+ />
45
+ {/* 右下角氛围光 */}
46
+ <div
47
+ className="absolute top-[80%] right-[-50%] w-400 h-600 rounded-full blur-[200px] opacity-25"
48
+ style={{ background: theme.gradientBR }}
49
+ />
50
+ </div>
51
+
52
+ {/* 2. 单色噪点层 */}
53
+ <div className="absolute inset-0 pointer-events-none" style={{ opacity: dark ? 0.16 : 0.2 }}>
54
+ <svg className="w-full h-full" xmlns="http://www.w3.org/2000/svg">
55
+ <filter id="pixelNoise" x="0%" y="0%" width="100%" height="100%">
56
+ <feTurbulence type="fractalNoise" baseFrequency="0.8" numOctaves="2" stitchTiles="stitch" result="noise" />
57
+ <feColorMatrix type="saturate" values="0" result="gray" />
58
+ <feComponentTransfer>
59
+ <feFuncR type="discrete" tableValues="0 1" />
60
+ <feFuncG type="discrete" tableValues="0 1" />
61
+ <feFuncB type="discrete" tableValues="0 1" />
62
+ </feComponentTransfer>
63
+ </filter>
64
+ <rect width="100%" height="100%" filter="url(#pixelNoise)" />
65
+ </svg>
66
+ </div>
67
+
68
+ <div className="relative z-10 flex flex-col items-center justify-center h-full py-40 px-24 space-y-32">
69
+ {/* 标题区 */}
70
+ <div className="text-center space-y-12">
71
+ {/* Title */}
72
+ <h1 className="text-8xl font-bold tracking-tight">
73
+ <span className="bg-linear-to-r from-foreground to-muted bg-clip-text text-transparent">扫码登录</span>
74
+ </h1>
75
+
76
+ {/* 操作步骤 */}
77
+ <div className="flex items-start justify-center gap-10 opacity-90" style={{ color: theme.text }}>
78
+ {/* Step 1 */}
79
+ <div className="flex flex-col items-center gap-4">
80
+ <div className="p-5 rounded-3xl bg-surface/50 backdrop-blur-md">
81
+ <RiTiktokFill size={64} />
82
+ </div>
83
+ <span className="text-[28px] font-medium tracking-wide">打开抖音</span>
84
+ </div>
85
+ <RiArrowRightFill size={40} className="mt-8 opacity-40" />
86
+ {/* Step 2 */}
87
+ <div className="flex flex-col items-center gap-4">
88
+ <div className="p-5 rounded-3xl bg-surface/50 backdrop-blur-md">
89
+ <Menu size={64} />
90
+ </div>
91
+ <span className="text-[28px] font-medium tracking-wide">左上角菜单</span>
92
+ </div>
93
+ <RiArrowRightFill size={40} className="mt-8 opacity-40" />
94
+ {/* Step 3 */}
95
+ <div className="flex flex-col items-center gap-4">
96
+ <div className="p-5 rounded-3xl bg-surface/50 backdrop-blur-md">
97
+ <ScanLine size={64} />
98
+ </div>
99
+ <span className="text-[28px] font-medium tracking-wide">顶部扫一扫</span>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+ {/* 二维码 */}
105
+ <div className="relative group">
106
+ <div
107
+ className="relative p-4"
108
+ style={{
109
+ width: '800px',
110
+ height: '800px'
111
+ }}
112
+ >
113
+ {props.data.share_url ? (
114
+ <QRCodeWithAvatar
115
+ value={props.data.share_url}
116
+ avatarUrl={props.data.avatarUrl}
117
+ useDarkTheme={dark}
118
+ alt="QR Code"
119
+ className="w-full h-full object-contain"
120
+ />
121
+ ) : (
122
+ <div className="w-full h-full flex flex-col items-center justify-center gap-8">
123
+ <div className="w-24 h-24 border-4 border-gray-200 border-t-black rounded-full animate-spin" />
124
+ </div>
125
+ )}
126
+ </div>
127
+
128
+ {/* 倒计时 */}
129
+ <div className="absolute -bottom-24 left-0 right-0 text-center">
130
+ <p className="text-[28px] font-medium tracking-wide flex items-center justify-center gap-3" style={{ color: theme.subText }}>
131
+ <span className="h-6 w-1.5 rounded-full bg-danger shadow-[0_0_8px_rgba(255,44,85,0.8)]"></span>
132
+ 此二维码 120 秒内有效,请及时扫码登录。
133
+ </p>
134
+ </div>
135
+ </div>
136
+
137
+ {/* 底部信息 */}
138
+ <div className="w-full max-w-225 grid grid-cols-2 gap-24 pt-20">
139
+ <div className="flex flex-col items-start space-y-6 mt-1.5">
140
+ <div className="flex items-center justify-center w-16 h-16 mb-2">
141
+ <Smartphone size={64} style={{ color: theme.text }} strokeWidth={1} />
142
+ </div>
143
+ <h3 className="text-[40px] font-bold" style={{ color: theme.text }}>
144
+ 扫码登录说明
145
+ </h3>
146
+ <p className="text-[24px] leading-relaxed opacity-60" style={{ color: theme.text }}>
147
+ 抖音目前仅禁止相册扫码,无法通过截图在本机自助登录,请在另一台设备上展示二维码,并使用手机抖音扫码完成登录。
148
+ </p>
149
+ </div>
150
+
151
+ <div className="flex flex-col items-start space-y-6">
152
+ <div className="flex items-center justify-center w-16 h-16 mb-2">
153
+ <ShieldCheck size={64} style={{ color: theme.text }} strokeWidth={1} />
154
+ </div>
155
+ <h3 className="text-[40px] font-bold" style={{ color: theme.text }}>
156
+ 安全承诺
157
+ </h3>
158
+ <p className="text-[24px] leading-relaxed opacity-60" style={{ color: theme.text }}>
159
+ 扫码后仅会在本地获取您的登录凭据(CK),用于视频解析等相关业务,不会上传至任何第三方,也不会用于与本工具无关的操作,请在可信环境下使用本功能。
160
+ </p>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </DefaultLayout>
165
+ )
166
+ })
167
+
168
+ DouyinQrcodeImg.displayName = 'DouyinQrcodeImg'
169
+
170
+ export default DouyinQrcodeImg
@@ -0,0 +1,9 @@
1
+ /** 本模板的数据类型(路由 index.tsx 与 components/ 实现共用)。 */
2
+
3
+ /** 抖音二维码登录组件属性 */
4
+ export interface DouyinQrcodeImgData {
5
+ /** 分享链接(用于生成自定义二维码) */
6
+ share_url?: string
7
+ /** 触发登录的用户头像 URL,嵌入二维码中心作为 logo;缺省时生成普通二维码 */
8
+ avatarUrl?: string
9
+ }
@@ -0,0 +1,9 @@
1
+ import { defineTemplate } from '@karinjs/template-react'
2
+
3
+ import { DouyinQrcodeImg } from './components/qrcodeImg'
4
+
5
+ export default defineTemplate({
6
+ name: '登录二维码',
7
+ description: '抖音登录二维码展示模板',
8
+ component: DouyinQrcodeImg
9
+ })
@@ -0,0 +1,201 @@
1
+ import { format } from 'date-fns'
2
+ import { Quote } from 'lucide-react'
3
+ import React from 'react'
4
+
5
+ import { isDark } from '../../../../utils/theme'
6
+ import { DefaultLayout } from '../../../components/DefaultLayout'
7
+ import { QRCodeWithAvatar } from '../../../components/QRCodeWithAvatar'
8
+ import type { PosterProps } from '../../../types/ctx'
9
+ import { DouyinCommentIcon, DouyinFavoriteIcon, DouyinLikeIcon, DouyinRecommendIcon, DouyinShareIcon } from '../../components/Icons'
10
+ import type { DouyinRecommendListData } from './types'
11
+
12
+ /**
13
+ * 抖音推荐列表组件
14
+ */
15
+ export const DouyinRecommendList: React.FC<PosterProps<DouyinRecommendListData>> = (props) => {
16
+ const dark = isDark(props.ctx)
17
+
18
+ // 弥散光颜色配置 - 绿色 + 蓝色
19
+ const glowColors = dark
20
+ ? {
21
+ primary: 'rgba(16, 185, 129, 0.15)', // Emerald-500 (Green)
22
+ secondary: 'rgba(59, 130, 246, 0.15)' // Blue-500 (Blue)
23
+ }
24
+ : {
25
+ primary: 'rgba(34, 197, 94, 0.25)', // Green-500
26
+ secondary: 'rgba(59, 130, 246, 0.25)' // Blue-500
27
+ }
28
+
29
+ return (
30
+ <DefaultLayout {...props} className="relative overflow-hidden bg-surface">
31
+ {/* 1. 弥散光背景层 */}
32
+ <div className="absolute inset-0 pointer-events-none z-0">
33
+ <div
34
+ className="absolute rounded-full w-full h-[60%] top-[-20%] left-[-20%] blur-[150px]"
35
+ style={{ background: glowColors.primary }}
36
+ />
37
+ <div
38
+ className="absolute rounded-full w-full h-[60%] bottom-[-20%] right-[-20%] blur-[180px]"
39
+ style={{ background: glowColors.secondary }}
40
+ />
41
+ </div>
42
+
43
+ {/* 2. 杂色纹理层 */}
44
+ <div className={'absolute inset-0 pointer-events-none z-10 mix-blend-overlay'}>
45
+ <svg className="w-full h-full" xmlns="http://www.w3.org/2000/svg">
46
+ <filter id="noiseFilter">
47
+ <feTurbulence type="fractalNoise" baseFrequency="0.8" numOctaves="3" stitchTiles="stitch" />
48
+ <feColorMatrix type="saturate" values="0" />
49
+ </filter>
50
+ <rect width="100%" height="100%" filter="url(#noiseFilter)" />
51
+ </svg>
52
+ </div>
53
+
54
+ {/* 3. 主要内容区域 */}
55
+ <div className="relative z-20 p-12 pb-0 grid grid-cols-12 gap-12 min-h-150 items-stretch">
56
+ {/* 左侧 */}
57
+ <div className="col-span-4 flex flex-col justify-between py-8">
58
+ {/* 顶部 Branding */}
59
+ <div className="flex flex-col gap-1 select-none">
60
+ <span className="text-6xl font-black text-foreground/10 tracking-tighter leading-none">DOUYIN</span>
61
+ <span className="text-6xl font-black text-emerald-500/20 tracking-tighter leading-none">RECOMMEND</span>
62
+ <div className="flex items-center gap-3 mt-2">
63
+ <div className="h-1.5 w-16 bg-emerald-500 rounded-full"></div>
64
+ <span className="text-base text-muted font-mono tracking-widest uppercase">Push Notification</span>
65
+ </div>
66
+ </div>
67
+
68
+ {/* 中间 */}
69
+ <div className="flex flex-col gap-10 relative">
70
+ {/* 装饰图形 */}
71
+ <div className="absolute -left-8 top-10 w-16 h-16 rounded-full border-4 border-emerald-300/30 animate-[bounce_4s_infinite]"></div>
72
+
73
+ {/* 装饰图形 */}
74
+ <div className="absolute right-10 -top-4 w-6 h-6 rounded-full bg-blue-300/40"></div>
75
+
76
+ <div className="relative w-fit self-center">
77
+ <div className="absolute -inset-8 bg-linear-to-br from-emerald-400 to-blue-400 rounded-full blur-2xl opacity-40 animate-pulse"></div>
78
+ {/* 装饰图形 */}
79
+ <div className="absolute -inset-4 rounded-full border-2 border-dashed border-emerald-400/30 animate-[spin_10s_linear_infinite]"></div>
80
+
81
+ <img
82
+ src={props.data.recommender_avatar}
83
+ className="relative w-64 h-64 rounded-full border-[6px] border-white object-cover shadow-2xl"
84
+ alt="Recommender"
85
+ />
86
+ <div className="absolute -bottom-3 -right-3 bg-emerald-500 text-white px-5 py-2 rounded-full border-[5px] border-white font-bold text-xl shadow-xl flex items-center gap-2">
87
+ <DouyinRecommendIcon size={20} />
88
+ <span>推荐</span>
89
+ </div>
90
+ </div>
91
+
92
+ <div className="flex flex-col items-center text-center">
93
+ <span className="text-6xl font-black text-foreground leading-tight relative">
94
+ {props.data.recommender_username}
95
+ {/* 装饰图形 */}
96
+ <svg className="absolute -right-8 -top-2 text-blue-400 w-8 h-8 opacity-60" viewBox="0 0 24 24" fill="currentColor">
97
+ <path d="M12 2l2.4 7.2h7.6l-6 4.8 2.4 7.2-6-4.8-6 4.8 2.4-7.2-6-4.8h7.6z" />
98
+ </svg>
99
+ </span>
100
+ <div className="px-6 py-6 pt-0 rounded-full text-2xl text-muted font-mono">@{props.data.recommender_douyin_id}</div>
101
+
102
+ <div className="mt-6 flex flex-col items-center gap-2 text-emerald-500">
103
+ <div className="flex items-center gap-3">
104
+ <DouyinRecommendIcon size={40} />
105
+ <span className="text-4xl font-bold">刚刚推荐了这个作品</span>
106
+ </div>
107
+ {/* 装饰线条 */}
108
+ <svg width="200" height="20" viewBox="0 0 200 20" className="opacity-60">
109
+ <path d="M0 10 Q 50 20, 100 10 T 200 10" stroke="currentColor" strokeWidth="3" fill="none" strokeLinecap="round" />
110
+ </svg>
111
+ </div>
112
+ </div>
113
+ </div>
114
+
115
+ {/* 底部 */}
116
+ <div className="flex flex-col gap-8 relative">
117
+ {/* 装饰图形 */}
118
+ <div className="absolute left-4 bottom-4 w-32 h-32 bg-emerald-500/5 rounded-2xl -z-10 rotate-12"></div>
119
+
120
+ <div className="h-px w-full bg-linear-to-r from-surface-secondary via-border to-transparent"></div>
121
+ <div className="flex items-end gap-6">
122
+ <QRCodeWithAvatar
123
+ value={props.data.share_url}
124
+ avatarUrl={props.data.author_avatar}
125
+ useDarkTheme={dark}
126
+ className="w-65 h-auto rounded-2xl mix-blend-multiply"
127
+ alt="QR"
128
+ />
129
+ <div className="flex flex-col justify-end h-56 pb-2">
130
+ <span className="text-muted text-sm font-mono mb-2">SCAN TO VIEW</span>
131
+ <span className="text-3xl font-bold text-foreground/80 leading-none">{format(new Date(), 'HH:mm')}</span>
132
+ <span className="text-lg text-muted font-medium">{format(new Date(), 'yyyy.MM.dd')}</span>
133
+ </div>
134
+ </div>
135
+ </div>
136
+ </div>
137
+
138
+ {/* 右侧 */}
139
+ <div className="col-span-8 h-full">
140
+ <div className="h-full bg-surface/60 backdrop-blur-xl rounded-[3rem] p-10 border border-border flex flex-col gap-8 shadow-2xl relative overflow-hidden">
141
+ {/* 作者信息栏 */}
142
+ <div className="flex items-center justify-between z-10">
143
+ <div className="flex items-center gap-6 flex-1 min-w-0 mr-6">
144
+ <img
145
+ src={props.data.author_avatar}
146
+ className="w-24 h-24 rounded-full border-2 border-surface shadow-md shrink-0"
147
+ alt="Author"
148
+ />
149
+ <div className="flex flex-col gap-1 min-w-0">
150
+ <span className="text-4xl font-bold text-foreground/90 truncate" title={props.data.author_username}>
151
+ {props.data.author_username}
152
+ </span>
153
+ <span className="text-xl text-muted font-mono truncate">抖音号: {props.data.author_douyin_id}</span>
154
+ </div>
155
+ </div>
156
+ <div className="px-6 py-3 bg-surface/80 backdrop-blur-md rounded-full text-muted font-medium text-lg shrink-0">
157
+ 发布于 {props.data.create_time.split(' ')[0]}
158
+ </div>
159
+ </div>
160
+
161
+ {/* 封面图 */}
162
+ <div className="flex-1 relative rounded-[2.5rem] overflow-hidden group shadow-inner bg-black/5">
163
+ <img src={props.data.image_url} className="w-full h-full object-cover transition-transform duration-700" alt="Cover" />
164
+ {/* 描述遮罩 */}
165
+ <div className="absolute inset-x-0 bottom-0 pt-40 pb-12 px-12 bg-linear-to-t from-black/90 via-black/50 to-transparent">
166
+ <div className="flex gap-6 items-start">
167
+ <Quote size={48} className="text-emerald-500/90 shrink-0 rotate-180 mt-2" />
168
+ <div
169
+ className="text-white text-4xl font-medium leading-relaxed line-clamp-3 drop-shadow-lg tracking-wide"
170
+ dangerouslySetInnerHTML={{ __html: props.data.desc || '分享视频' }}
171
+ />
172
+ </div>
173
+ </div>
174
+ </div>
175
+
176
+ {/* 统计数据 */}
177
+ <div className="grid grid-cols-5 gap-6 z-10">
178
+ <StatItem icon={DouyinLikeIcon} value={props.data.dianzan} />
179
+ <StatItem icon={DouyinRecommendIcon} value={props.data.tuijian} iconColor="#13C15A" />
180
+ <StatItem icon={DouyinCommentIcon} value={props.data.pinglun} />
181
+ <StatItem icon={DouyinFavoriteIcon} value={props.data.shouchang} />
182
+ <StatItem icon={DouyinShareIcon} value={props.data.share} />
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </div>
187
+ </DefaultLayout>
188
+ )
189
+ }
190
+
191
+ /** 统计项小组件 */
192
+ const StatItem: React.FC<{
193
+ icon: React.ComponentType<{ size?: number; className?: string; color?: string }>
194
+ value: string
195
+ iconColor?: string
196
+ }> = ({ icon: IconComponent, value, iconColor }) => (
197
+ <div className="flex flex-col items-center justify-center gap-2 py-6 rounded-3xl bg-surface">
198
+ <IconComponent size={48} color={iconColor} className="opacity-90" />
199
+ <span className="text-2xl font-bold text-foreground/70 mt-1">{value}</span>
200
+ </div>
201
+ )
@@ -0,0 +1,37 @@
1
+ /** 本模板的数据类型(路由 index.tsx 与 components/ 实现共用)。 */
2
+
3
+ /**
4
+ * 抖音推荐列表组件属性接口
5
+ */
6
+ export interface DouyinRecommendListData {
7
+ /** 图片URL */
8
+ image_url: string
9
+ /** 描述内容 */
10
+ desc: string
11
+ /** 点赞数 */
12
+ dianzan: string
13
+ /** 评论数 */
14
+ pinglun: string
15
+ /** 收藏数 */
16
+ shouchang: string
17
+ /** 推荐数 */
18
+ tuijian: string
19
+ /** 分享数 */
20
+ share: string
21
+ /** 创建时间 */
22
+ create_time: string
23
+ /** 推荐者(订阅者)用户名 */
24
+ recommender_username: string
25
+ /** 推荐者头像URL */
26
+ recommender_avatar: string
27
+ /** 推荐者抖音号 */
28
+ recommender_douyin_id: string
29
+ /** 作品作者用户名 */
30
+ author_username: string
31
+ /** 作品作者头像URL */
32
+ author_avatar: string
33
+ /** 作品作者抖音号 */
34
+ author_douyin_id: string
35
+ /** 分享链接 */
36
+ share_url: string
37
+ }
@@ -0,0 +1,12 @@
1
+ import { defineTemplate } from '@karinjs/template-react'
2
+
3
+ import { DouyinRecommendList } from './components/RecommendList'
4
+ import type { DouyinRecommendListData } from './components/types'
5
+
6
+ export default defineTemplate({
7
+ name: '推荐列表',
8
+ description: '抖音推荐列表推送模板',
9
+ component: DouyinRecommendList,
10
+ validate: (data): data is DouyinRecommendListData =>
11
+ typeof data === 'object' && data !== null && typeof (data as any).share_url === 'string'
12
+ })
@@ -0,0 +1,225 @@
1
+ import { formatDistanceToNow } from 'date-fns'
2
+ import { zhCN } from 'date-fns/locale'
3
+ import React from 'react'
4
+ import { AiFillPushpin, AiOutlineVideoCamera } from 'react-icons/ai'
5
+ import { BiImage } from 'react-icons/bi'
6
+ import { FaMusic, FaTiktok, FaUserGroup } from 'react-icons/fa6'
7
+ import { MdLightbulbOutline, MdLocationOn } from 'react-icons/md'
8
+ import { RiUserFollowLine, RiVerifiedBadgeFill } from 'react-icons/ri'
9
+
10
+ import { DefaultLayout } from '../../../components/DefaultLayout'
11
+ import type { PosterProps } from '../../../types/ctx'
12
+ import { DouyinCommentIcon, DouyinFavoriteIcon, DouyinLikeIcon, DouyinShareIcon } from '../../components/Icons'
13
+ import type { DouyinUserVideoListData } from './types'
14
+
15
+ /**
16
+ * 格式化数字显示 (使用中文单位:万、亿)
17
+ */
18
+ const formatCount = (count: number): string => {
19
+ if (count >= 100000000) return (count / 100000000).toFixed(1) + '亿'
20
+ if (count >= 10000) return (count / 10000).toFixed(1) + '万'
21
+ return count.toString()
22
+ }
23
+
24
+ /**
25
+ * 格式化视频时长显示 (如: 6:20)
26
+ * @param milliseconds 毫秒数
27
+ */
28
+ const formatDuration = (milliseconds: number): string => {
29
+ const seconds = Math.floor(milliseconds / 1000)
30
+ const mins = Math.floor(seconds / 60)
31
+ const secs = seconds % 60
32
+ return `${mins}:${secs.toString().padStart(2, '0')}`
33
+ }
34
+
35
+ /**
36
+ * 单个视频卡片组件
37
+ */
38
+ const VideoCard: React.FC<{ video: DouyinUserVideoListData['videos'][number] }> = ({ video }) => {
39
+ const titleRef = React.useRef<HTMLHeadingElement>(null)
40
+
41
+ return (
42
+ <div className="bg-surface rounded-3xl overflow-hidden flex flex-col h-full">
43
+ {/* 视频封面 - 固定 3:4 比例 */}
44
+ <div className="relative bg-foreground overflow-hidden" style={{ aspectRatio: '3 / 4' }}>
45
+ <img src={video.cover} alt={video.title} className="w-full h-full object-cover" />
46
+
47
+ {/* 左上角索引标签 */}
48
+ {video.index && (
49
+ <div className="absolute top-4 left-4 px-6 py-4 rounded-2xl text-4xl font-bold bg-black/40 text-white backdrop-blur-md shadow-lg border border-white/10 z-10">
50
+ {video.index}
51
+ </div>
52
+ )}
53
+
54
+ {/* 视频/图集标签 */}
55
+ <div className="absolute top-4 right-4 flex flex-col gap-2">
56
+ <div className="px-6 py-4 rounded-2xl text-4xl bg-white/50 text-black backdrop-blur-xs shadow-lg flex items-center gap-2">
57
+ {video.is_video ? <AiOutlineVideoCamera size={34} /> : <BiImage size={34} />}
58
+ <span>{video.is_video ? '视频' : '图集'}</span>
59
+ </div>
60
+ {video.is_top && (
61
+ <div className="px-6 py-4 rounded-2xl text-4xl bg-warning text-black backdrop-blur-xs shadow-lg flex items-center gap-2">
62
+ <AiFillPushpin size={34} />
63
+ <span>置顶</span>
64
+ </div>
65
+ )}
66
+ </div>
67
+
68
+ {/* 时长标签(仅视频显示) */}
69
+ {video.is_video && (
70
+ <div className="absolute bottom-4 right-4 px-8 py-3 rounded-2xl text-4xl bg-white/50 text-black backdrop-blur-xs shadow-lg">
71
+ {formatDuration(video.duration)}
72
+ </div>
73
+ )}
74
+
75
+ {/* 背景音乐图标 */}
76
+ {video.music && (
77
+ <div className="absolute bottom-4 left-4 flex items-center gap-2 px-6 py-3 rounded-2xl text-xl bg-white/50 text-black backdrop-blur-xs shadow-lg">
78
+ <FaMusic size={34} />
79
+ <span className="max-w-80 truncate">{video.music.title}</span>
80
+ </div>
81
+ )}
82
+ </div>
83
+
84
+ {/* 视频信息 */}
85
+ <div className="p-4 px-8 pb-8 flex flex-col flex-1">
86
+ {/* 标题 */}
87
+ <h3 ref={titleRef} className="text-4xl font-semibold text-foreground line-clamp-2 my-2">
88
+ {video.title || '无标题'}
89
+ </h3>
90
+
91
+ {/* 发布时间 */}
92
+ <p className="text-3xl text-foreground/70 mb-8">
93
+ {formatDistanceToNow(new Date(video.create_time * 1000), {
94
+ locale: zhCN,
95
+ addSuffix: true
96
+ })}
97
+ </p>
98
+
99
+ {/* 统计数据 */}
100
+ <div className="mt-auto">
101
+ <div className="grid grid-cols-2 gap-3 text-3xl">
102
+ <div className="flex items-center gap-2 text-foreground/70">
103
+ <DouyinLikeIcon size={34} />
104
+ <span>{formatCount(video.statistics.like_count)}</span>
105
+ </div>
106
+ <div className="flex items-center gap-2 text-foreground/70">
107
+ <DouyinCommentIcon size={34} />
108
+ <span>{formatCount(video.statistics.comment_count)}</span>
109
+ </div>
110
+ <div className="flex items-center gap-2 text-foreground/70">
111
+ <DouyinFavoriteIcon size={34} />
112
+ <span>{formatCount(video.statistics.collect_count)}</span>
113
+ </div>
114
+ <div className="flex items-center gap-2 text-foreground/70">
115
+ <DouyinShareIcon size={34} />
116
+ <span>{formatCount(video.statistics.share_count)}</span>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ )
123
+ }
124
+
125
+ /**
126
+ * 抖音用户视频列表页面组件
127
+ */
128
+ export const DouyinUserVideoList: React.FC<PosterProps<DouyinUserVideoListData>> = (prpos) => {
129
+ return (
130
+ <DefaultLayout {...prpos}>
131
+ {/* 头部背景图片 - 占满宽度 */}
132
+ {prpos.data.user.head_image && (
133
+ <div className="relative w-full overflow-hidden">
134
+ <img src={prpos.data.user.head_image} alt="头部背景" className="w-full h-auto object-cover" />
135
+ {/* 渐变遮罩 - 从图片渐变到 bg-surface */}
136
+ <div className="absolute inset-0 bg-linear-to-b from-transparent via-surface/40 to-surface" />
137
+ </div>
138
+ )}
139
+
140
+ <div className="flex justify-center">
141
+ <div className="px-20">
142
+ {/* 用户信息头部 */}
143
+ <div
144
+ className={`bg-surface/60 backdrop-blur-xl mb-30 rounded-4xl p-10 relative ${prpos.data.user.head_image ? '-mt-170' : 'mt-35'}`}
145
+ >
146
+ {/* 上部分:头像、名称、抖音号、IP、用户统计 */}
147
+ <div className="flex items-start gap-8 pb-8 border-b border-border mb-8">
148
+ {/* 用户头像 */}
149
+ <img src={prpos.data.user.avatar} alt={prpos.data.user.nickname} className="w-45 h-auto rounded-2xl object-cover shrink-0" />
150
+ {/* 用户信息 */}
151
+ <div className="flex-1">
152
+ <div className="flex items-center gap-3 mb-4">
153
+ <h1 className="text-6xl font-bold text-foreground">{prpos.data.user.nickname}</h1>
154
+ {prpos.data.user.verified && <RiVerifiedBadgeFill size={40} className="text-accent" />}
155
+ </div>
156
+
157
+ {/* 抖音号和 IP 属地 */}
158
+ <div className="flex gap-6 mb-6 text-2xl text-muted">
159
+ <span className="flex items-center gap-2">
160
+ <FaTiktok size={24} /> 抖音号:{prpos.data.user.short_id}
161
+ </span>
162
+ {prpos.data.user.ip_location && (
163
+ <span className="flex items-center gap-1">
164
+ <MdLocationOn size={28} /> {prpos.data.user.ip_location}
165
+ </span>
166
+ )}
167
+ </div>
168
+
169
+ {/* 用户统计 */}
170
+ <div className="flex gap-8 text-3xl">
171
+ <div className="flex items-center gap-2">
172
+ <RiUserFollowLine size={28} className="text-muted" />
173
+ <span className="text-muted">关注</span>
174
+ <span className="font-medium text-4xl text-foreground"> {formatCount(prpos.data.user.following_count)}</span>
175
+ </div>
176
+ <div className="flex items-center gap-2">
177
+ <FaUserGroup size={28} className="text-muted" />
178
+ <span className="text-muted">粉丝</span>
179
+ <span className="font-medium text-4xl text-foreground"> {formatCount(prpos.data.user.follower_count)}</span>
180
+ </div>
181
+ <div className="flex items-center gap-2">
182
+ <DouyinLikeIcon size={28} />
183
+ <span className="text-muted">获赞</span>
184
+ <span className="font-medium text-4xl text-foreground"> {formatCount(prpos.data.user.total_favorited)}</span>
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+
190
+ {/* 下部分:用户签名 */}
191
+ <p className="text-3xl text-foreground/80 line-clamp-3">{prpos.data.user.signature || '这个用户很懒,还没有签名'}</p>
192
+ </div>
193
+
194
+ {/* 提示信息卡片 */}
195
+ {prpos.data.timeoutSeconds && (
196
+ <div className="bg-surface/60 backdrop-blur-xl mb-8 rounded-4xl p-6 border border-border/50 shadow-sm flex justify-center items-center">
197
+ <p className="text-3xl text-foreground/80 font-medium flex items-center gap-3">
198
+ <MdLightbulbOutline size={40} className="text-warning" />
199
+ <span>
200
+ 请在 {prpos.data.timeoutSeconds} 秒内发送 <span className="text-accent font-bold">1~{prpos.data.videos.length}</span>{' '}
201
+ 之间的数字解析对应作品。例如发送“1”解析第一个作品
202
+ </span>
203
+ </p>
204
+ </div>
205
+ )}
206
+
207
+ {/* 视频网格 */}
208
+ {prpos.data.videos.length > 0 ? (
209
+ <>
210
+ <div className="grid grid-cols-2 gap-6 mb-8">
211
+ {prpos.data.videos.map((video) => (
212
+ <VideoCard key={video.aweme_id} video={video} />
213
+ ))}
214
+ </div>
215
+ </>
216
+ ) : (
217
+ <div className="text-center py-20">
218
+ <p className="text-[32px] text-muted">暂无视频内容</p>
219
+ </div>
220
+ )}
221
+ </div>
222
+ </div>
223
+ </DefaultLayout>
224
+ )
225
+ }