@dsh-plugin/dsh-synapse 0.1.0-dev.41044228975 → 0.1.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 (74) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +0 -14
  3. package/package.json +1 -1
  4. package/vendor/gugle-chat-bot/LICENSE +661 -661
  5. package/vendor/gugle-chat-bot/package.json +57 -57
  6. package/vendor/gugle-chat-bot/src/allow-rule.yml +9345 -9345
  7. package/vendor/gugle-chat-bot/src/api.json +4284 -4284
  8. package/vendor/gugle-chat-bot/src/command/index.ts +141 -141
  9. package/vendor/gugle-chat-bot/src/config/features.ts +547 -547
  10. package/vendor/gugle-chat-bot/src/config/index.ts +184 -184
  11. package/vendor/gugle-chat-bot/src/config/manager.ts +356 -356
  12. package/vendor/gugle-chat-bot/src/constants/index.ts +13 -13
  13. package/vendor/gugle-chat-bot/src/custom.ts +548 -548
  14. package/vendor/gugle-chat-bot/src/event/index.ts +118 -118
  15. package/vendor/gugle-chat-bot/src/features/admin/index.ts +414 -414
  16. package/vendor/gugle-chat-bot/src/features/bili/image/impl/video.ts +39 -39
  17. package/vendor/gugle-chat-bot/src/features/bili/image/index.ts +37 -37
  18. package/vendor/gugle-chat-bot/src/features/bili/index.ts +65 -65
  19. package/vendor/gugle-chat-bot/src/features/bili/template/style/video.css +97 -97
  20. package/vendor/gugle-chat-bot/src/features/bili/template/video.html +56 -56
  21. package/vendor/gugle-chat-bot/src/features/discord-bridge/index.ts +1128 -1128
  22. package/vendor/gugle-chat-bot/src/features/discord-bridge/markdown.ts +105 -105
  23. package/vendor/gugle-chat-bot/src/features/discord-bridge/slash.ts +355 -355
  24. package/vendor/gugle-chat-bot/src/features/discord-bridge/source.ts +96 -96
  25. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/message.html +14 -14
  26. package/vendor/gugle-chat-bot/src/features/discord-bridge/template/style/message.css +144 -144
  27. package/vendor/gugle-chat-bot/src/features/github/api.ts +93 -93
  28. package/vendor/gugle-chat-bot/src/features/github/binding.ts +161 -161
  29. package/vendor/gugle-chat-bot/src/features/github/image/impl/issue.ts +132 -132
  30. package/vendor/gugle-chat-bot/src/features/github/image/impl/pr.ts +144 -144
  31. package/vendor/gugle-chat-bot/src/features/github/image/impl/release.ts +160 -160
  32. package/vendor/gugle-chat-bot/src/features/github/image/index.ts +310 -310
  33. package/vendor/gugle-chat-bot/src/features/github/index.ts +302 -302
  34. package/vendor/gugle-chat-bot/src/features/github/template/issue.html +118 -118
  35. package/vendor/gugle-chat-bot/src/features/github/template/pull_request.html +125 -125
  36. package/vendor/gugle-chat-bot/src/features/github/template/release.html +53 -53
  37. package/vendor/gugle-chat-bot/src/features/github/template/style/issue.css +468 -468
  38. package/vendor/gugle-chat-bot/src/features/github/template/style/pull_request.css +468 -468
  39. package/vendor/gugle-chat-bot/src/features/github/template/style/release.css +412 -412
  40. package/vendor/gugle-chat-bot/src/features/hermes/client.ts +184 -184
  41. package/vendor/gugle-chat-bot/src/features/hermes/config.ts +210 -210
  42. package/vendor/gugle-chat-bot/src/features/hermes/context.ts +67 -67
  43. package/vendor/gugle-chat-bot/src/features/hermes/history.ts +86 -86
  44. package/vendor/gugle-chat-bot/src/features/hermes/index.ts +1533 -1533
  45. package/vendor/gugle-chat-bot/src/features/hermes/message.ts +319 -319
  46. package/vendor/gugle-chat-bot/src/features/hermes/reaction.ts +181 -181
  47. package/vendor/gugle-chat-bot/src/features/hermes/render.ts +118 -118
  48. package/vendor/gugle-chat-bot/src/features/hermes/reply-units.ts +331 -331
  49. package/vendor/gugle-chat-bot/src/features/hermes/skills.ts +406 -406
  50. package/vendor/gugle-chat-bot/src/features/hermes/template/approval.html +30 -30
  51. package/vendor/gugle-chat-bot/src/features/hermes/template/progress.html +21 -21
  52. package/vendor/gugle-chat-bot/src/features/hermes/template/style/approval.css +81 -81
  53. package/vendor/gugle-chat-bot/src/features/hermes/template/style/progress.css +120 -120
  54. package/vendor/gugle-chat-bot/src/features/hermes/trigger.ts +86 -86
  55. package/vendor/gugle-chat-bot/src/features/hermes/types.ts +327 -327
  56. package/vendor/gugle-chat-bot/src/features/management/index.ts +156 -156
  57. package/vendor/gugle-chat-bot/src/features/minecraft/index.ts +127 -127
  58. package/vendor/gugle-chat-bot/src/features/modrinth/index.ts +71 -71
  59. package/vendor/gugle-chat-bot/src/features/parentheses/index.ts +117 -117
  60. package/vendor/gugle-chat-bot/src/features/peak-valley-timer/index.ts +451 -451
  61. package/vendor/gugle-chat-bot/src/features/poke/index.ts +24 -24
  62. package/vendor/gugle-chat-bot/src/features/version-tracker/index.ts +77 -77
  63. package/vendor/gugle-chat-bot/src/features/welcome/index.ts +57 -57
  64. package/vendor/gugle-chat-bot/src/github-ip.json +5814 -5814
  65. package/vendor/gugle-chat-bot/src/image/index.ts +278 -278
  66. package/vendor/gugle-chat-bot/src/index.ts +695 -695
  67. package/vendor/gugle-chat-bot/src/logger/index.ts +54 -54
  68. package/vendor/gugle-chat-bot/src/result.json +359 -359
  69. package/vendor/gugle-chat-bot/src/type/bili.d.ts +825 -825
  70. package/vendor/gugle-chat-bot/src/type/event.d.ts +146 -146
  71. package/vendor/gugle-chat-bot/src/type/github.d.ts +446 -446
  72. package/vendor/gugle-chat-bot/src/type/index.d.ts +254 -254
  73. package/vendor/gugle-chat-bot/tsconfig.json +46 -46
  74. package/scripts/dump-npm-latest.mjs +0 -30
@@ -1,39 +1,39 @@
1
- import { ViewData } from '@/type/bili';
2
- import { Template, tryGenerateImage } from '@/image';
3
- import { Logger } from 'winston';
4
- import { convertDuration, convertStat, getPicB64 } from '@/features/bili/image';
5
- import { QQBot } from '@/index';
6
- import dayjs from 'dayjs';
7
-
8
- export function videoHandler(bot: QQBot, viewData: ViewData, logger?: Logger): Promise<string> {
9
- return new Promise<string>((resolve, reject) => {
10
- Promise.all([
11
- getPicB64(bot, viewData.pic).then(cover => {
12
- viewData.pic = cover;
13
- }),
14
- getPicB64(bot, viewData.owner.face).then(cover => {
15
- viewData.owner.face = cover;
16
- })
17
- ]).then(() => {
18
- const description = `<p>${viewData.desc.split('\n').join('</p>\n<p>')}</p>`;
19
- const template = Template.load('video', 'src/features/bili/template')
20
- .arg('title', viewData.title)
21
- .arg('description', description)
22
- .arg('cover', viewData.pic)
23
- .arg('avatar', viewData.owner.face)
24
- .arg('name', viewData.owner.name)
25
- .arg('date', dayjs(viewData.ctime * 1000).format('YYYY-MM-DD HH:mm'))
26
- .arg('duration', convertDuration(viewData.duration))
27
- .arg('view', convertStat(viewData.stat.view))
28
- .arg('like', convertStat(viewData.stat.like))
29
- .arg('reply', convertStat(viewData.stat.reply));
30
- const templateFile = template.file();
31
- template
32
- .handler()
33
- .then(video => {
34
- logger?.debug(`Start process video message...`);
35
- tryGenerateImage(resolve, reject, video, 820, templateFile);
36
- });
37
- });
38
- });
39
- }
1
+ import { ViewData } from '@/type/bili';
2
+ import { Template, tryGenerateImage } from '@/image';
3
+ import { Logger } from 'winston';
4
+ import { convertDuration, convertStat, getPicB64 } from '@/features/bili/image';
5
+ import { QQBot } from '@/index';
6
+ import dayjs from 'dayjs';
7
+
8
+ export function videoHandler(bot: QQBot, viewData: ViewData, logger?: Logger): Promise<string> {
9
+ return new Promise<string>((resolve, reject) => {
10
+ Promise.all([
11
+ getPicB64(bot, viewData.pic).then(cover => {
12
+ viewData.pic = cover;
13
+ }),
14
+ getPicB64(bot, viewData.owner.face).then(cover => {
15
+ viewData.owner.face = cover;
16
+ })
17
+ ]).then(() => {
18
+ const description = `<p>${viewData.desc.split('\n').join('</p>\n<p>')}</p>`;
19
+ const template = Template.load('video', 'src/features/bili/template')
20
+ .arg('title', viewData.title)
21
+ .arg('description', description)
22
+ .arg('cover', viewData.pic)
23
+ .arg('avatar', viewData.owner.face)
24
+ .arg('name', viewData.owner.name)
25
+ .arg('date', dayjs(viewData.ctime * 1000).format('YYYY-MM-DD HH:mm'))
26
+ .arg('duration', convertDuration(viewData.duration))
27
+ .arg('view', convertStat(viewData.stat.view))
28
+ .arg('like', convertStat(viewData.stat.like))
29
+ .arg('reply', convertStat(viewData.stat.reply));
30
+ const templateFile = template.file();
31
+ template
32
+ .handler()
33
+ .then(video => {
34
+ logger?.debug(`Start process video message...`);
35
+ tryGenerateImage(resolve, reject, video, 820, templateFile);
36
+ });
37
+ });
38
+ });
39
+ }
@@ -1,37 +1,37 @@
1
- import { QQBot } from '@/index';
2
- import { ViewData } from '@/type/bili';
3
- import { Logger } from 'winston';
4
- import { videoHandler } from '@/features/bili/image/impl/video';
5
-
6
- const B64_IMG_PREFIX = 'data:image/jpg;base64,';
7
-
8
- export class BiliImage {
9
- public static videoHandler(bot: QQBot, viewData: ViewData, logger?: Logger): Promise<string> {
10
- return videoHandler(bot, viewData, logger);
11
- }
12
- }
13
-
14
- export function getPicB64(bot: QQBot, url: string): Promise<string> {
15
- return new Promise<string>((resolve, reject) => {
16
- bot.axiosInstance
17
- .get(url, { responseType: 'arraybuffer' })
18
- .then(res => resolve(B64_IMG_PREFIX + Buffer.from(res.data, 'binary').toString('base64')))
19
- .catch(reject);
20
- });
21
- }
22
-
23
- export function convertDuration(duration: number): string {
24
- const hour = Math.floor(duration / 3600);
25
- const min = Math.floor((duration % 3600) / 60);
26
- const sec = Math.floor(duration % 60);
27
- if (hour > 0) return `${hour}:${min}:${sec}`;
28
- if (min > 0) return `${min}:${sec}`;
29
- return `${sec}秒`;
30
- }
31
-
32
- export function convertStat(stat: number) {
33
- if (Math.floor(stat / 10000) > 0) {
34
- return `${Math.floor(stat / 10000)}.${Math.floor((stat % 10000) / 1000)}万`;
35
- }
36
- return `${stat}`;
37
- }
1
+ import { QQBot } from '@/index';
2
+ import { ViewData } from '@/type/bili';
3
+ import { Logger } from 'winston';
4
+ import { videoHandler } from '@/features/bili/image/impl/video';
5
+
6
+ const B64_IMG_PREFIX = 'data:image/jpg;base64,';
7
+
8
+ export class BiliImage {
9
+ public static videoHandler(bot: QQBot, viewData: ViewData, logger?: Logger): Promise<string> {
10
+ return videoHandler(bot, viewData, logger);
11
+ }
12
+ }
13
+
14
+ export function getPicB64(bot: QQBot, url: string): Promise<string> {
15
+ return new Promise<string>((resolve, reject) => {
16
+ bot.axiosInstance
17
+ .get(url, { responseType: 'arraybuffer' })
18
+ .then(res => resolve(B64_IMG_PREFIX + Buffer.from(res.data, 'binary').toString('base64')))
19
+ .catch(reject);
20
+ });
21
+ }
22
+
23
+ export function convertDuration(duration: number): string {
24
+ const hour = Math.floor(duration / 3600);
25
+ const min = Math.floor((duration % 3600) / 60);
26
+ const sec = Math.floor(duration % 60);
27
+ if (hour > 0) return `${hour}:${min}:${sec}`;
28
+ if (min > 0) return `${min}:${sec}`;
29
+ return `${sec}秒`;
30
+ }
31
+
32
+ export function convertStat(stat: number) {
33
+ if (Math.floor(stat / 10000) > 0) {
34
+ return `${Math.floor(stat / 10000)}.${Math.floor((stat % 10000) / 1000)}万`;
35
+ }
36
+ return `${stat}`;
37
+ }
@@ -1,65 +1,65 @@
1
- import { QQBot } from '@/index';
2
- import { GroupMessageWSMSG, Message } from '@/type';
3
- import { ViewData } from '@/type/bili';
4
- import { BiliImage } from '@/features/bili/image';
5
-
6
- const BV_REG_EXP = /^BV[a-zA-Z0-9]{10}$/;
7
- const AV_REG_EXP = /^av(\d+)$/;
8
- const B23_REG_EXP = /^(https:\/\/)?(b23.tv\/[a-zA-Z0-9]{7})$/;
9
-
10
- export class Bili {
11
- public static processMessage(bot: QQBot, msg: GroupMessageWSMSG, sentMessage: Message[]): Promise<void> {
12
- const bv = msg.raw_message.match(BV_REG_EXP);
13
- if (bv) {
14
- return Bili.getVideoInfo(bot, msg, bv[0], sentMessage);
15
- }
16
- const av = msg.raw_message.match(AV_REG_EXP);
17
- if (av) {
18
- return Bili.getVideoInfo(bot, msg, av[0], sentMessage);
19
- }
20
- return Promise.resolve();
21
- }
22
-
23
- public static getVideoInfo(bot: QQBot, msg: GroupMessageWSMSG, vid: string, sentMessage: Message[]): Promise<void> {
24
- return Bili.renderVideoCard(bot, vid).then(result => {
25
- sentMessage.push({
26
- type: 'image',
27
- data: {
28
- file: `data:image/png;base64, ${result}`
29
- }
30
- });
31
- });
32
- }
33
-
34
- /**
35
- * 渲染视频信息卡片(供 AI 技能等程序化调用):支持 BV 号 / av 号 / b23.tv 短链,
36
- * 返回 base64 图片;失败抛错由调用方统一处理。
37
- */
38
- public static async renderVideoCard(bot: QQBot, input: string): Promise<string> {
39
- let vid = input.trim();
40
- const shortLink = vid.match(B23_REG_EXP);
41
- if (shortLink) {
42
- // b23 短链:跟随 302 跳转,从最终 URL 提取 BV/av 号
43
- const url = `https://${shortLink[2]}`;
44
- const res = await bot.axiosInstance.get(url);
45
- const finalUrl: string = res.request?.res?.responseUrl ?? '';
46
- const resolved = finalUrl.match(/BV[a-zA-Z0-9]{10}/) ?? finalUrl.match(/av\d+/);
47
- if (!resolved) throw new Error(`无法从短链 ${shortLink[2]} 解析出视频`);
48
- vid = resolved[0];
49
- }
50
- if (!BV_REG_EXP.test(vid) && !AV_REG_EXP.test(vid)) {
51
- throw new Error(`无法识别的视频号:${input}(支持 BV 号 / av 号 / b23.tv 短链)`);
52
- }
53
- const params = vid.startsWith('BV') ? { bvid: vid } : { aid: vid.slice(2) };
54
- const res = await bot.axiosInstance.get<{ code: number; message: string; data: ViewData }>(
55
- 'https://api.bilibili.com/x/web-interface/view',
56
- { params }
57
- );
58
- const { code, message, data } = res.data;
59
- // B 站业务错误(如 -412 请求被拦截、-404 视频不存在)抛错,由调用方统一处理
60
- if (code !== 0) {
61
- throw new Error(`B 站接口返回错误(${code}):${message || '未知错误'}`);
62
- }
63
- return BiliImage.videoHandler(bot, data, bot.logger);
64
- }
65
- }
1
+ import { QQBot } from '@/index';
2
+ import { GroupMessageWSMSG, Message } from '@/type';
3
+ import { ViewData } from '@/type/bili';
4
+ import { BiliImage } from '@/features/bili/image';
5
+
6
+ const BV_REG_EXP = /^BV[a-zA-Z0-9]{10}$/;
7
+ const AV_REG_EXP = /^av(\d+)$/;
8
+ const B23_REG_EXP = /^(https:\/\/)?(b23.tv\/[a-zA-Z0-9]{7})$/;
9
+
10
+ export class Bili {
11
+ public static processMessage(bot: QQBot, msg: GroupMessageWSMSG, sentMessage: Message[]): Promise<void> {
12
+ const bv = msg.raw_message.match(BV_REG_EXP);
13
+ if (bv) {
14
+ return Bili.getVideoInfo(bot, msg, bv[0], sentMessage);
15
+ }
16
+ const av = msg.raw_message.match(AV_REG_EXP);
17
+ if (av) {
18
+ return Bili.getVideoInfo(bot, msg, av[0], sentMessage);
19
+ }
20
+ return Promise.resolve();
21
+ }
22
+
23
+ public static getVideoInfo(bot: QQBot, msg: GroupMessageWSMSG, vid: string, sentMessage: Message[]): Promise<void> {
24
+ return Bili.renderVideoCard(bot, vid).then(result => {
25
+ sentMessage.push({
26
+ type: 'image',
27
+ data: {
28
+ file: `data:image/png;base64, ${result}`
29
+ }
30
+ });
31
+ });
32
+ }
33
+
34
+ /**
35
+ * 渲染视频信息卡片(供 AI 技能等程序化调用):支持 BV 号 / av 号 / b23.tv 短链,
36
+ * 返回 base64 图片;失败抛错由调用方统一处理。
37
+ */
38
+ public static async renderVideoCard(bot: QQBot, input: string): Promise<string> {
39
+ let vid = input.trim();
40
+ const shortLink = vid.match(B23_REG_EXP);
41
+ if (shortLink) {
42
+ // b23 短链:跟随 302 跳转,从最终 URL 提取 BV/av 号
43
+ const url = `https://${shortLink[2]}`;
44
+ const res = await bot.axiosInstance.get(url);
45
+ const finalUrl: string = res.request?.res?.responseUrl ?? '';
46
+ const resolved = finalUrl.match(/BV[a-zA-Z0-9]{10}/) ?? finalUrl.match(/av\d+/);
47
+ if (!resolved) throw new Error(`无法从短链 ${shortLink[2]} 解析出视频`);
48
+ vid = resolved[0];
49
+ }
50
+ if (!BV_REG_EXP.test(vid) && !AV_REG_EXP.test(vid)) {
51
+ throw new Error(`无法识别的视频号:${input}(支持 BV 号 / av 号 / b23.tv 短链)`);
52
+ }
53
+ const params = vid.startsWith('BV') ? { bvid: vid } : { aid: vid.slice(2) };
54
+ const res = await bot.axiosInstance.get<{ code: number; message: string; data: ViewData }>(
55
+ 'https://api.bilibili.com/x/web-interface/view',
56
+ { params }
57
+ );
58
+ const { code, message, data } = res.data;
59
+ // B 站业务错误(如 -412 请求被拦截、-404 视频不存在)抛错,由调用方统一处理
60
+ if (code !== 0) {
61
+ throw new Error(`B 站接口返回错误(${code}):${message || '未知错误'}`);
62
+ }
63
+ return BiliImage.videoHandler(bot, data, bot.logger);
64
+ }
65
+ }
@@ -1,97 +1,97 @@
1
- * {
2
- font-family: "Sarasa Fixed SC", sans-serif;
3
- margin: 0;
4
- }
5
-
6
- body {
7
- background-color: #00000000;
8
- }
9
-
10
- .container {
11
- background-color: #F3F4F6;
12
- width: 800px;
13
- border-radius: 15px;
14
- padding: 10px;
15
- }
16
-
17
- .cover {
18
- width: 800px;
19
- border-radius: 10px;
20
- }
21
-
22
- .up {
23
- margin: 10px;
24
- }
25
-
26
- .up-avatar {
27
- display: inline-block;
28
- position: absolute;
29
- border: 4px solid #fff;
30
- border-radius: 99999px;
31
- width: 50px;
32
- height: 50px;
33
- }
34
-
35
- .up-name {
36
- display: block;
37
- width: 100%;
38
- margin-left: 60px;
39
- font-size: 20px;
40
- font-weight: bold;
41
- }
42
-
43
- .up-date {
44
- display: inline-block;
45
- margin-left: 60px;
46
- font-size: 14px;
47
- color: #999;
48
- }
49
-
50
- .up-date::after {
51
- display: inline-block;
52
- content: "·";
53
- font-size: 14px;
54
- color: #999;
55
- }
56
-
57
- .up-duration {
58
- display: inline-block;
59
- font-size: 14px;
60
- color: #999;
61
- }
62
-
63
- .title {
64
- margin: 10px;
65
- font-size: 24px;
66
- font-weight: bold;
67
- }
68
-
69
- .stats {
70
- color: #5A5F66;
71
- font-size: 14px;
72
- }
73
-
74
- .stats svg {
75
- display: inline-block;
76
- vertical-align: middle;
77
- }
78
-
79
- .view {
80
- display: inline-block;
81
- margin-left: 30px;
82
- }
83
-
84
- .like {
85
- display: inline-block;
86
- margin-left: 10px;
87
- }
88
-
89
- .reply {
90
- display: inline-block;
91
- margin-left: 10px;
92
- }
93
-
94
- .description {
95
- margin: 20px;
96
- font-size: 20px;
97
- }
1
+ * {
2
+ font-family: "Sarasa Fixed SC", sans-serif;
3
+ margin: 0;
4
+ }
5
+
6
+ body {
7
+ background-color: #00000000;
8
+ }
9
+
10
+ .container {
11
+ background-color: #F3F4F6;
12
+ width: 800px;
13
+ border-radius: 15px;
14
+ padding: 10px;
15
+ }
16
+
17
+ .cover {
18
+ width: 800px;
19
+ border-radius: 10px;
20
+ }
21
+
22
+ .up {
23
+ margin: 10px;
24
+ }
25
+
26
+ .up-avatar {
27
+ display: inline-block;
28
+ position: absolute;
29
+ border: 4px solid #fff;
30
+ border-radius: 99999px;
31
+ width: 50px;
32
+ height: 50px;
33
+ }
34
+
35
+ .up-name {
36
+ display: block;
37
+ width: 100%;
38
+ margin-left: 60px;
39
+ font-size: 20px;
40
+ font-weight: bold;
41
+ }
42
+
43
+ .up-date {
44
+ display: inline-block;
45
+ margin-left: 60px;
46
+ font-size: 14px;
47
+ color: #999;
48
+ }
49
+
50
+ .up-date::after {
51
+ display: inline-block;
52
+ content: "·";
53
+ font-size: 14px;
54
+ color: #999;
55
+ }
56
+
57
+ .up-duration {
58
+ display: inline-block;
59
+ font-size: 14px;
60
+ color: #999;
61
+ }
62
+
63
+ .title {
64
+ margin: 10px;
65
+ font-size: 24px;
66
+ font-weight: bold;
67
+ }
68
+
69
+ .stats {
70
+ color: #5A5F66;
71
+ font-size: 14px;
72
+ }
73
+
74
+ .stats svg {
75
+ display: inline-block;
76
+ vertical-align: middle;
77
+ }
78
+
79
+ .view {
80
+ display: inline-block;
81
+ margin-left: 30px;
82
+ }
83
+
84
+ .like {
85
+ display: inline-block;
86
+ margin-left: 10px;
87
+ }
88
+
89
+ .reply {
90
+ display: inline-block;
91
+ margin-left: 10px;
92
+ }
93
+
94
+ .description {
95
+ margin: 20px;
96
+ font-size: 20px;
97
+ }
@@ -1,57 +1,57 @@
1
- <!DOCTYPE html>
2
- <html lang="zh">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>{{title}}</title>
6
- <link rel="stylesheet" href="./style/video.css">
7
- </head>
8
- <body>
9
- <div class="container">
10
- <img class="cover" alt="cover" src="{{cover}}"/>
11
- <div class="up">
12
- <img class="up-avatar" alt="avatar" src="{{avatar}}"/>
13
- <div class="up-name">
14
- {{name}}
15
- </div>
16
- <div class="up-date">{{date}}</div>
17
- <div class="up-duration">{{duration}}</div>
18
- </div>
19
- <div class="title">
20
- {{title}}
21
- </div>
22
- <div class="stats">
23
- <div class="view">
24
- <svg width="14" height="14" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
25
- <path d="M24 36C35.0457 36 44 24 44 24C44 24 35.0457 12 24 12C12.9543 12 4 24 4 24C4 24 12.9543 36 24 36Z"
26
- fill="currentColor" stroke="currentColor" stroke-width="4" stroke-linejoin="round"/>
27
- <path d="M24 29C26.7614 29 29 26.7614 29 24C29 21.2386 26.7614 19 24 19C21.2386 19 19 21.2386 19 24C19 26.7614 21.2386 29 24 29Z"
28
- fill="#FFF" stroke="#FFF" stroke-width="4" stroke-linejoin="round"/>
29
- </svg>
30
- {{view}}
31
- </div>
32
- <div class="like">
33
- <svg width="14" height="14" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
34
- <path d="M4.18898 22.1733C4.08737 21.0047 5.00852 20 6.18146 20H10C11.1046 20 12 20.8954 12 22V41C12 42.1046 11.1046 43 10 43H7.83363C6.79622 43 5.93102 42.2068 5.84115 41.1733L4.18898 22.1733Z"
35
- fill="currentColor" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
36
- <path d="M18 21.3745C18 20.5388 18.5194 19.7908 19.2753 19.4345C20.9238 18.6574 23.7329 17.0938 25 14.9805C26.6331 12.2569 26.9411 7.33595 26.9912 6.20878C26.9982 6.05099 26.9937 5.89301 27.0154 5.73656C27.2861 3.78446 31.0543 6.06492 32.5 8.47612C33.2846 9.78471 33.3852 11.504 33.3027 12.8463C33.2144 14.2825 32.7933 15.6699 32.3802 17.0483L31.5 19.9845H42.3569C43.6832 19.9845 44.6421 21.2518 44.2816 22.5281L38.9113 41.5436C38.668 42.4051 37.8818 43 36.9866 43H20C18.8954 43 18 42.1046 18 41V21.3745Z"
37
- fill="currentColor" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
38
- </svg>
39
- {{like}}
40
- </div>
41
- <div class="reply">
42
- <svg width="14" height="14" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
43
- <path d="M44 6H4V36H13V41L23 36H44V6Z" fill="currentColor" stroke="currentColor" stroke-width="4"
44
- stroke-linecap="round" stroke-linejoin="round"/>
45
- <path d="M14 19.5V22.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
46
- <path d="M24 19.5V22.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
47
- <path d="M34 19.5V22.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
48
- </svg>
49
- {{reply}}
50
- </div>
51
- </div>
52
- <div class="description">
53
- {{description}}
54
- </div>
55
- </div>
56
- </body>
1
+ <!DOCTYPE html>
2
+ <html lang="zh">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>{{title}}</title>
6
+ <link rel="stylesheet" href="./style/video.css">
7
+ </head>
8
+ <body>
9
+ <div class="container">
10
+ <img class="cover" alt="cover" src="{{cover}}"/>
11
+ <div class="up">
12
+ <img class="up-avatar" alt="avatar" src="{{avatar}}"/>
13
+ <div class="up-name">
14
+ {{name}}
15
+ </div>
16
+ <div class="up-date">{{date}}</div>
17
+ <div class="up-duration">{{duration}}</div>
18
+ </div>
19
+ <div class="title">
20
+ {{title}}
21
+ </div>
22
+ <div class="stats">
23
+ <div class="view">
24
+ <svg width="14" height="14" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
25
+ <path d="M24 36C35.0457 36 44 24 44 24C44 24 35.0457 12 24 12C12.9543 12 4 24 4 24C4 24 12.9543 36 24 36Z"
26
+ fill="currentColor" stroke="currentColor" stroke-width="4" stroke-linejoin="round"/>
27
+ <path d="M24 29C26.7614 29 29 26.7614 29 24C29 21.2386 26.7614 19 24 19C21.2386 19 19 21.2386 19 24C19 26.7614 21.2386 29 24 29Z"
28
+ fill="#FFF" stroke="#FFF" stroke-width="4" stroke-linejoin="round"/>
29
+ </svg>
30
+ {{view}}
31
+ </div>
32
+ <div class="like">
33
+ <svg width="14" height="14" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
34
+ <path d="M4.18898 22.1733C4.08737 21.0047 5.00852 20 6.18146 20H10C11.1046 20 12 20.8954 12 22V41C12 42.1046 11.1046 43 10 43H7.83363C6.79622 43 5.93102 42.2068 5.84115 41.1733L4.18898 22.1733Z"
35
+ fill="currentColor" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
36
+ <path d="M18 21.3745C18 20.5388 18.5194 19.7908 19.2753 19.4345C20.9238 18.6574 23.7329 17.0938 25 14.9805C26.6331 12.2569 26.9411 7.33595 26.9912 6.20878C26.9982 6.05099 26.9937 5.89301 27.0154 5.73656C27.2861 3.78446 31.0543 6.06492 32.5 8.47612C33.2846 9.78471 33.3852 11.504 33.3027 12.8463C33.2144 14.2825 32.7933 15.6699 32.3802 17.0483L31.5 19.9845H42.3569C43.6832 19.9845 44.6421 21.2518 44.2816 22.5281L38.9113 41.5436C38.668 42.4051 37.8818 43 36.9866 43H20C18.8954 43 18 42.1046 18 41V21.3745Z"
37
+ fill="currentColor" stroke="currentColor" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
38
+ </svg>
39
+ {{like}}
40
+ </div>
41
+ <div class="reply">
42
+ <svg width="14" height="14" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
43
+ <path d="M44 6H4V36H13V41L23 36H44V6Z" fill="currentColor" stroke="currentColor" stroke-width="4"
44
+ stroke-linecap="round" stroke-linejoin="round"/>
45
+ <path d="M14 19.5V22.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
46
+ <path d="M24 19.5V22.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
47
+ <path d="M34 19.5V22.5" stroke="#FFF" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
48
+ </svg>
49
+ {{reply}}
50
+ </div>
51
+ </div>
52
+ <div class="description">
53
+ {{description}}
54
+ </div>
55
+ </div>
56
+ </body>
57
57
  </html>