@dan-uni/dan-any 1.4.8 → 2.0.1

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 (200) hide show
  1. package/README.md +87 -43
  2. package/dist/adapters.d.mts +2 -0
  3. package/dist/adapters.mjs +1 -0
  4. package/dist/chunk-0Lt9GpW0.mjs +1 -0
  5. package/dist/core/db/schema.d.mts +2 -0
  6. package/dist/core/db/schema.mjs +2 -0
  7. package/dist/core/db/schema.mjs.map +1 -0
  8. package/dist/core/db/utils.d.mts +1707 -0
  9. package/dist/core/db/utils.d.mts.map +1 -0
  10. package/dist/core/db/utils.mjs +1 -0
  11. package/dist/core-BSNwOgso.mjs +2 -0
  12. package/dist/core-BSNwOgso.mjs.map +1 -0
  13. package/dist/core.d.mts +2 -0
  14. package/dist/core.mjs +1 -0
  15. package/dist/db-DWWzkRBb.mjs +41 -0
  16. package/dist/db-DWWzkRBb.mjs.map +1 -0
  17. package/dist/dm-CBYaViIb.mjs +2 -0
  18. package/dist/dm-CBYaViIb.mjs.map +1 -0
  19. package/dist/dm-extra-DrAQCrFv.d.mts +135 -0
  20. package/dist/dm-extra-DrAQCrFv.d.mts.map +1 -0
  21. package/dist/index-5rcmHUF1.d.mts +6195 -0
  22. package/dist/index-5rcmHUF1.d.mts.map +1 -0
  23. package/dist/index.d.mts +4 -0
  24. package/dist/index.mjs +1 -0
  25. package/dist/isSame-Cdw0xkUV.mjs +2 -0
  26. package/dist/isSame-Cdw0xkUV.mjs.map +1 -0
  27. package/dist/plugins.d.mts +105 -0
  28. package/dist/plugins.d.mts.map +1 -0
  29. package/dist/plugins.mjs +2 -0
  30. package/dist/plugins.mjs.map +1 -0
  31. package/dist/schema-BuenbDx9.d.mts +1619 -0
  32. package/dist/schema-BuenbDx9.d.mts.map +1 -0
  33. package/dist/utils.d.mts +25 -0
  34. package/dist/utils.d.mts.map +1 -0
  35. package/dist/utils.mjs +2 -0
  36. package/dist/utils.mjs.map +1 -0
  37. package/package.json +64 -36
  38. package/.babelrc.json +0 -12
  39. package/buf.gen.yaml +0 -10
  40. package/buf.yaml +0 -12
  41. package/dist/browser/1~rslib-runtime.min.js +0 -49
  42. package/dist/browser/index.min.js +0 -13523
  43. package/dist/browser/index.min.js.LICENSE.txt +0 -17
  44. package/dist/browser/plugins/bili.min.js +0 -1
  45. package/dist/browser/plugins/index.min.js +0 -2
  46. package/dist/browser/plugins/stats.min.js +0 -10
  47. package/dist/browser/src/ass-gen/__tests__/canvas.test.d.ts +0 -1
  48. package/dist/browser/src/ass-gen/__tests__/generate.test.d.ts +0 -1
  49. package/dist/browser/src/ass-gen/ass/create.d.ts +0 -4
  50. package/dist/browser/src/ass-gen/ass/dialogue.d.ts +0 -16
  51. package/dist/browser/src/ass-gen/ass/event.d.ts +0 -2
  52. package/dist/browser/src/ass-gen/ass/info.d.ts +0 -8
  53. package/dist/browser/src/ass-gen/ass/raw.d.ts +0 -14
  54. package/dist/browser/src/ass-gen/ass/style.d.ts +0 -2
  55. package/dist/browser/src/ass-gen/config.d.ts +0 -2
  56. package/dist/browser/src/ass-gen/index.d.ts +0 -30
  57. package/dist/browser/src/ass-gen/types.d.ts +0 -71
  58. package/dist/browser/src/ass-gen/util/color.d.ts +0 -18
  59. package/dist/browser/src/ass-gen/util/danconvert.d.ts +0 -5
  60. package/dist/browser/src/ass-gen/util/index.d.ts +0 -4
  61. package/dist/browser/src/ass-gen/util/lang.d.ts +0 -3
  62. package/dist/browser/src/ass-gen/util/layout.d.ts +0 -4
  63. package/dist/browser/src/index.d.ts +0 -283
  64. package/dist/browser/src/index.test.d.ts +0 -1
  65. package/dist/browser/src/plugins/bili/dedupe.d.ts +0 -3
  66. package/dist/browser/src/plugins/bili/history-danmaku-fast-forward.d.ts +0 -18
  67. package/dist/browser/src/plugins/bili/index.d.ts +0 -2
  68. package/dist/browser/src/plugins/bili/index.test.d.ts +0 -1
  69. package/dist/browser/src/plugins/index.d.ts +0 -2
  70. package/dist/browser/src/plugins/stats/getLatestDan.d.ts +0 -6
  71. package/dist/browser/src/plugins/stats/index.d.ts +0 -1
  72. package/dist/browser/src/plugins/stats/index.test.d.ts +0 -1
  73. package/dist/browser/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.d.ts +0 -3426
  74. package/dist/browser/src/proto/gen/danuni/danmaku/v1/danmaku_pb.d.ts +0 -176
  75. package/dist/browser/src/utils/dm-gen.d.ts +0 -309
  76. package/dist/browser/src/utils/dm-gen.test.d.ts +0 -1
  77. package/dist/browser/src/utils/fileParser.d.ts +0 -3
  78. package/dist/browser/src/utils/id-gen.d.ts +0 -50
  79. package/dist/browser/src/utils/platform.d.ts +0 -24
  80. package/dist/node/0~rslib-runtime.js +0 -23
  81. package/dist/node/index.js +0 -2099
  82. package/dist/node/plugins/bili.js +0 -1
  83. package/dist/node/plugins/index.js +0 -2
  84. package/dist/node/plugins/stats.js +0 -10
  85. package/dist/node/src/ass-gen/__tests__/canvas.test.d.ts +0 -1
  86. package/dist/node/src/ass-gen/__tests__/generate.test.d.ts +0 -1
  87. package/dist/node/src/ass-gen/ass/create.d.ts +0 -4
  88. package/dist/node/src/ass-gen/ass/dialogue.d.ts +0 -16
  89. package/dist/node/src/ass-gen/ass/event.d.ts +0 -2
  90. package/dist/node/src/ass-gen/ass/info.d.ts +0 -8
  91. package/dist/node/src/ass-gen/ass/raw.d.ts +0 -14
  92. package/dist/node/src/ass-gen/ass/style.d.ts +0 -2
  93. package/dist/node/src/ass-gen/config.d.ts +0 -2
  94. package/dist/node/src/ass-gen/index.d.ts +0 -30
  95. package/dist/node/src/ass-gen/types.d.ts +0 -71
  96. package/dist/node/src/ass-gen/util/color.d.ts +0 -18
  97. package/dist/node/src/ass-gen/util/danconvert.d.ts +0 -5
  98. package/dist/node/src/ass-gen/util/index.d.ts +0 -4
  99. package/dist/node/src/ass-gen/util/lang.d.ts +0 -3
  100. package/dist/node/src/ass-gen/util/layout.d.ts +0 -4
  101. package/dist/node/src/index.d.ts +0 -283
  102. package/dist/node/src/index.test.d.ts +0 -1
  103. package/dist/node/src/plugins/bili/dedupe.d.ts +0 -3
  104. package/dist/node/src/plugins/bili/history-danmaku-fast-forward.d.ts +0 -18
  105. package/dist/node/src/plugins/bili/index.d.ts +0 -2
  106. package/dist/node/src/plugins/bili/index.test.d.ts +0 -1
  107. package/dist/node/src/plugins/index.d.ts +0 -2
  108. package/dist/node/src/plugins/stats/getLatestDan.d.ts +0 -6
  109. package/dist/node/src/plugins/stats/index.d.ts +0 -1
  110. package/dist/node/src/plugins/stats/index.test.d.ts +0 -1
  111. package/dist/node/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.d.ts +0 -3426
  112. package/dist/node/src/proto/gen/danuni/danmaku/v1/danmaku_pb.d.ts +0 -176
  113. package/dist/node/src/utils/dm-gen.d.ts +0 -309
  114. package/dist/node/src/utils/dm-gen.test.d.ts +0 -1
  115. package/dist/node/src/utils/fileParser.d.ts +0 -3
  116. package/dist/node/src/utils/id-gen.d.ts +0 -50
  117. package/dist/node/src/utils/platform.d.ts +0 -24
  118. package/dist/umd/index.umd.min.js +0 -32093
  119. package/dist/umd/index.umd.min.js.LICENSE.txt +0 -34
  120. package/dist/umd/plugins/bili.umd.min.js +0 -32004
  121. package/dist/umd/plugins/bili.umd.min.js.LICENSE.txt +0 -34
  122. package/dist/umd/plugins/index.umd.min.js +0 -32020
  123. package/dist/umd/plugins/index.umd.min.js.LICENSE.txt +0 -34
  124. package/dist/umd/plugins/stats.umd.min.js +0 -39
  125. package/dist/umd/src/ass-gen/__tests__/canvas.test.d.ts +0 -1
  126. package/dist/umd/src/ass-gen/__tests__/generate.test.d.ts +0 -1
  127. package/dist/umd/src/ass-gen/ass/create.d.ts +0 -4
  128. package/dist/umd/src/ass-gen/ass/dialogue.d.ts +0 -16
  129. package/dist/umd/src/ass-gen/ass/event.d.ts +0 -2
  130. package/dist/umd/src/ass-gen/ass/info.d.ts +0 -8
  131. package/dist/umd/src/ass-gen/ass/raw.d.ts +0 -14
  132. package/dist/umd/src/ass-gen/ass/style.d.ts +0 -2
  133. package/dist/umd/src/ass-gen/config.d.ts +0 -2
  134. package/dist/umd/src/ass-gen/index.d.ts +0 -30
  135. package/dist/umd/src/ass-gen/types.d.ts +0 -71
  136. package/dist/umd/src/ass-gen/util/color.d.ts +0 -18
  137. package/dist/umd/src/ass-gen/util/danconvert.d.ts +0 -5
  138. package/dist/umd/src/ass-gen/util/index.d.ts +0 -4
  139. package/dist/umd/src/ass-gen/util/lang.d.ts +0 -3
  140. package/dist/umd/src/ass-gen/util/layout.d.ts +0 -4
  141. package/dist/umd/src/index.d.ts +0 -283
  142. package/dist/umd/src/index.test.d.ts +0 -1
  143. package/dist/umd/src/plugins/bili/dedupe.d.ts +0 -3
  144. package/dist/umd/src/plugins/bili/history-danmaku-fast-forward.d.ts +0 -18
  145. package/dist/umd/src/plugins/bili/index.d.ts +0 -2
  146. package/dist/umd/src/plugins/bili/index.test.d.ts +0 -1
  147. package/dist/umd/src/plugins/index.d.ts +0 -2
  148. package/dist/umd/src/plugins/stats/getLatestDan.d.ts +0 -6
  149. package/dist/umd/src/plugins/stats/index.d.ts +0 -1
  150. package/dist/umd/src/plugins/stats/index.test.d.ts +0 -1
  151. package/dist/umd/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.d.ts +0 -3426
  152. package/dist/umd/src/proto/gen/danuni/danmaku/v1/danmaku_pb.d.ts +0 -176
  153. package/dist/umd/src/utils/dm-gen.d.ts +0 -309
  154. package/dist/umd/src/utils/dm-gen.test.d.ts +0 -1
  155. package/dist/umd/src/utils/fileParser.d.ts +0 -3
  156. package/dist/umd/src/utils/id-gen.d.ts +0 -50
  157. package/dist/umd/src/utils/platform.d.ts +0 -24
  158. package/plugins/package.json +0 -6
  159. package/rslib.config.ts +0 -101
  160. package/src/ass-gen/__tests__/898651903.xml +0 -1619
  161. package/src/ass-gen/__tests__/898651903.xml.ass +0 -1516
  162. package/src/ass-gen/__tests__/canvas.test.ts +0 -15
  163. package/src/ass-gen/__tests__/generate.test.ts +0 -26
  164. package/src/ass-gen/ass/create.ts +0 -37
  165. package/src/ass-gen/ass/dialogue.ts +0 -90
  166. package/src/ass-gen/ass/event.ts +0 -57
  167. package/src/ass-gen/ass/info.ts +0 -27
  168. package/src/ass-gen/ass/raw.ts +0 -78
  169. package/src/ass-gen/ass/style.ts +0 -66
  170. package/src/ass-gen/config.ts +0 -45
  171. package/src/ass-gen/index.ts +0 -73
  172. package/src/ass-gen/types.ts +0 -76
  173. package/src/ass-gen/util/color.ts +0 -55
  174. package/src/ass-gen/util/danconvert.ts +0 -43
  175. package/src/ass-gen/util/index.ts +0 -10
  176. package/src/ass-gen/util/lang.ts +0 -35
  177. package/src/ass-gen/util/layout.ts +0 -242
  178. package/src/index.test.ts +0 -157
  179. package/src/index.ts +0 -1144
  180. package/src/plugins/bili/README.md +0 -87
  181. package/src/plugins/bili/dedupe.ts +0 -29
  182. package/src/plugins/bili/history-danmaku-fast-forward.ts +0 -86
  183. package/src/plugins/bili/index.test.ts +0 -129
  184. package/src/plugins/bili/index.ts +0 -2
  185. package/src/plugins/index.ts +0 -2
  186. package/src/plugins/stats/README.md +0 -44
  187. package/src/plugins/stats/getLatestDan.ts +0 -13
  188. package/src/plugins/stats/index.test.ts +0 -39
  189. package/src/plugins/stats/index.ts +0 -1
  190. package/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts +0 -4072
  191. package/src/proto/gen/danuni/danmaku/v1/danmaku_pb.ts +0 -223
  192. package/src/proto/src/bilibili/community/service/dm/v1/dm.proto +0 -1095
  193. package/src/proto/src/danuni/danmaku/v1/danmaku.proto +0 -52
  194. package/src/utils/dm-gen.test.ts +0 -129
  195. package/src/utils/dm-gen.ts +0 -1082
  196. package/src/utils/fileParser.ts +0 -37
  197. package/src/utils/id-gen.ts +0 -73
  198. package/src/utils/platform.ts +0 -38
  199. package/tsconfig.json +0 -108
  200. package/types/tsconfig.tsbuildinfo +0 -1
@@ -1,87 +0,0 @@
1
- # Bili 插件
2
-
3
- 为 B 站(哔哩哔哩)弹幕处理提供的实用工具集合。
4
-
5
- ## 功能模块
6
-
7
- ### 1. 去重 (`dedupe`)
8
-
9
- 针对直接从 B 站 API 获取到的弹幕进行去重处理。
10
-
11
- #### 导出函数
12
-
13
- - **`to_bili_deduped(pool: UniPool): UniPool`** - 返回去重后的新 UniPool 实例
14
- - **`bili_dedupe(pool: UniPool): void`** - 原地修改 UniPool 实例,移除重复弹幕
15
-
16
- #### 去重示例
17
-
18
- ```typescript
19
- import { bili } from '@danuni/dan-any/plugins'
20
-
21
- const pool = UniPool.import(biliData)
22
-
23
- // 方式1:获取去重后的新实例
24
- const _deduped = pool.pipe(bili.bili_dedupe.to_bili_deduped)
25
-
26
- // 方式2:原地去重
27
- pool.pipe(bili.bili_dedupe.bili_dedupe)
28
- ```
29
-
30
- #### 说明
31
-
32
- - 使用 B 站 API 中的 `dmid`(弹幕 ID)作为去重依据
33
- - **仅支持** B 站主站直接获取的弹幕(需要包含 `extra.bili.dmid` 字段)
34
- - 若弹幕缺少 `dmid` 字段会抛出错误
35
-
36
- ---
37
-
38
- ### 2. 历史弹幕逆向快进算法 (`history-danmaku-fast-forward`)
39
-
40
- 针对 B 站历史弹幕采用时间逆序查询时,快速确定完成获取/下一次获取位置的算法。
41
-
42
- 该方法受 [BiliPlus 全弹幕下载器](https://github.com/HengXin666/BiLiBiLi_DanMu_Crawling/issues/14) 启发。
43
-
44
- #### 快进算法函数
45
-
46
- - **`bili_history_fast_forward(query_history_date: string): Function`** - 返回处理函数
47
-
48
- #### 快进算法示例
49
-
50
- ```typescript
51
- import { bili } from '@danuni/dan-any/plugins'
52
-
53
- const pool = UniPool.import(biliHistoryData)
54
-
55
- // 查询 2024-01-10 这一天的历史弹幕
56
- const _result = pool.pipe(bili.bili_history_fast_forward('2024-01-10'))
57
-
58
- // 返回值示例:
59
- // {
60
- // earliest: '2024-01-01', // 最早弹幕的日期
61
- // FastForward: ['2024-01-01', '2024-01-02', '2024-01-04'], // 有弹幕的日期
62
- // skip: ['2024-01-03', '2024-01-05', ...], // 无弹幕的日期
63
- // SpecicDate: '2024-01-10' // 查询的日期
64
- // }
65
- ```
66
-
67
- #### 返回值说明
68
-
69
- | 字段 | 类型 | 说明 |
70
- | --- | --- | --- |
71
- | `earliest` | `string \| null` | 最早弹幕的日期(`yyyy-MM-dd` 格式),无弹幕时为 `null` |
72
- | `FastForward` | `string[]` | 早于查询日期、且有弹幕的日期列表 |
73
- | `skip` | `string[]` | `earliest` 到查询日期之间、无弹幕的日期列表 |
74
- | `SpecicDate` | `string` | 查询的日期(`yyyy-MM-dd` 格式) |
75
-
76
- #### 工作原理
77
-
78
- 1. 筛选出早于查询日期的所有弹幕
79
- 2. 找出最早弹幕的日期作为 `earliest`
80
- 3. 收集有弹幕的日期到 `FastForward` 列表
81
- 4. 找出没有弹幕的日期到 `skip` 列表
82
-
83
- #### 时间处理
84
-
85
- - 所有日期基于时区 `Asia/Shanghai`(UTC+8)
86
- - 输入格式:`yyyy-MM-dd`
87
- - 输出格式:`yyyy-MM-dd`
@@ -1,29 +0,0 @@
1
- import type { UniDM } from '../..'
2
-
3
- import { UniPool } from '../..'
4
- import { PlatformVideoSource } from '../../utils/platform'
5
-
6
- /**
7
- * 用于过滤直接从B站api获取到的弹幕中去除dmid重复的弹幕
8
- */
9
- function main(that: UniPool) {
10
- that.dans.forEach((d) => {
11
- if (d.platform !== PlatformVideoSource.Bilibili)
12
- throw new Error('bili-dedupe: 仅支持B站(主站)的弹幕')
13
- if (!d.extra.bili?.dmid && !d.extra.bili?.command?.id)
14
- throw new Error('bili-dedupe: 弹幕缺少bili extra dmid字段')
15
- })
16
- const map = new Map<bigint, UniDM>()
17
- that.dans.forEach((d) => map.set(d.extra.bili!.dmid!, d)) // 已由上方的检查保证存在
18
- return map
19
- }
20
-
21
- export function to_bili_deduped(that: UniPool): UniPool {
22
- const map = main(that)
23
- return new UniPool([...map.values()], that.options, that.info)
24
- }
25
-
26
- export function bili_dedupe(that: UniPool): void {
27
- const map = main(that)
28
- that.dans = [...map.values()]
29
- }
@@ -1,86 +0,0 @@
1
- /**
2
- * 注:该方法受BiliPlus全弹幕下载器启发
3
- * 详情参考以下链接
4
- * @see https://github.com/HengXin666/BiLiBiLi_DanMu_Crawling/issues/14
5
- */
6
-
7
- import { DateTime } from 'luxon'
8
- import type { UniPool } from '../..'
9
-
10
- interface BiliHistoryDanmakuFastForwardResult {
11
- earliest: string | null
12
- FastForward: string[]
13
- skip: string[]
14
- SpecificDate: string
15
- }
16
-
17
- /**
18
- * 针对B站历史弹幕使用时间逆序+快进以确定完成获取/下一次获取位置的算法
19
- *
20
- * 传入值是一个包含历史弹幕的UniPool,来自对任意一天(UTC+8, yyyy-MM-dd)的历史弹幕api
21
- */
22
- function main(
23
- that: UniPool,
24
- query_history_date: string,
25
- ): BiliHistoryDanmakuFastForwardResult {
26
- const qhd = DateTime.fromFormat(query_history_date, 'yyyy-MM-dd', {
27
- zone: 'Asia/Shanghai',
28
- }).setZone('Asia/Shanghai')
29
- if (!qhd.isValid) throw new Error('Invalid query_history_date')
30
- const s = qhd.startOf('day')
31
- const before = that.dans.filter((d) => d.ctime < s.toJSDate())
32
-
33
- if (before.length === 0) {
34
- return {
35
- earliest: null,
36
- FastForward: [],
37
- skip: [],
38
- SpecificDate: qhd.toFormat('yyyy-MM-dd'),
39
- }
40
- }
41
-
42
- // 获取最早的日期(字符串格式)
43
- const earliestCtime = before.toSorted(
44
- (a, b) => a.ctime.getTime() - b.ctime.getTime(),
45
- )[0].ctime
46
- const earliestDate = DateTime.fromJSDate(earliestCtime)
47
- .setZone('Asia/Shanghai')
48
- .startOf('day')
49
-
50
- // 提取有弹幕的日期集合
51
- const datesWithDanmaku = new Set<string>()
52
- for (const dan of before) {
53
- const dateStr = DateTime.fromJSDate(dan.ctime)
54
- .setZone('Asia/Shanghai')
55
- .toFormat('yyyy-MM-dd')
56
- datesWithDanmaku.add(dateStr)
57
- }
58
-
59
- // 计算earliest到query_history_date之间的所有日期
60
- let current = earliestDate
61
- const allDates: string[] = []
62
- while (current < s) {
63
- allDates.push(current.toFormat('yyyy-MM-dd'))
64
- current = current.plus({ days: 1 })
65
- }
66
-
67
- // 区分fast-forward和skip
68
- const FastForward = allDates.filter((d) => datesWithDanmaku.has(d))
69
- const skip = allDates.filter((d) => !datesWithDanmaku.has(d))
70
-
71
- return {
72
- earliest: earliestDate.toFormat('yyyy-MM-dd'),
73
- FastForward,
74
- skip,
75
- SpecificDate: qhd.toFormat('yyyy-MM-dd'),
76
- }
77
- }
78
-
79
- export function bili_history_fast_forward(
80
- /**
81
- * 请求api时使用的日期(UTC+8, yyyy-MM-dd)
82
- */
83
- query_history_date: string,
84
- ) {
85
- return (that: UniPool) => main(that, query_history_date)
86
- }
@@ -1,129 +0,0 @@
1
- //基于以下注释,根据vitest生成测试用例
2
- import { describe, expect, it } from 'vitest'
3
-
4
- import { UniDM, UniPool } from '../..'
5
- import { bili_dedupe, to_bili_deduped } from './dedupe'
6
- import { bili_history_fast_forward } from './history-danmaku-fast-forward'
7
-
8
- const xml = `<i>
9
- <chatserver>chat.bilibili.com</chatserver>
10
- <chatid>1156756312</chatid>
11
- <mission>0</mission>
12
- <maxlimit>2947</maxlimit>
13
- <state>0</state>
14
- <real_name>0</real_name>
15
- <source>k-v</source>
16
- <d p="13.213,1,25,16777215,1686314041,3,ff41173d,1335658005672492032">喜欢</d>
17
- <d p="13.213,1,25,16777215,1686590010,0,296b35b5,1337972999512832512">来了 哈哈~~</d>
18
- <d p="13.246,1,25,16777215,1686276875,0,5664cfc4,1335346233459549696">就是</d>
19
- <d p="13.266,1,25,16777215,1686283375,0,c7e6646f,1335400761013670912">什么鬼?</d>
20
- <d p="13.284,1,25,16777215,1686291338,0,38662881,1335517923728804864">哇哦</d>
21
- <d p="13.306,1,25,16777215,1686268410,0,4c01de10,1335275224983600896">试试</d>
22
- <d p="13.331,1,25,16777215,1686948453,3,56a3c5d5,1340979831550069760">不喜欢</d>
23
- <d p="13.374,1,25,16777215,1686300770,3,647fe355,1335546672880933888">不喜欢</d>
24
- <d p="13.376,1,25,16777215,1686297921,0,469d94b8,1335522778300134400">哦豁</d>
25
- <d p="13.419,1,25,8700107,1686268005,0,be402447,1335271828100244224">太酷啦</d>
26
- <d p="13.419,1,25,16777215,1686316828,3,7ffb6619,1335681385016736768">喜欢</d>
27
- <d p="13.459,1,25,16777215,1686299729,0,45834405,1335537942797634048">一般,不好看</d>
28
- <d p="13.462,1,25,16777215,1686302133,0,3cab672c,1335558106620590080">哈哈哈</d>
29
- <d p="13.481,1,25,16777215,1686297342,0,ce67fafd,1335517923728804864">?</d>
30
- <d p="13.499,1,25,16777215,1686301548,3,2848bf1c,1335517923728804864">不喜欢</d>
31
- </i>`
32
-
33
- describe('B站弹幕相关', () => {
34
- const pool = UniPool.fromBiliXML(xml)
35
- it('B站dmid去重(仅限主站直接获取的弹幕)', () => {
36
- const ori = pool.dans.length
37
- expect(ori).toBe(15)
38
- const n = pool.pipe(to_bili_deduped)
39
- expect(n.dans.length).toBe(13)
40
- expect(pool.dans.length).toBe(15)
41
- pool.pipe(bili_dedupe)
42
- expect(pool.dans.length).toBe(13)
43
- })
44
- describe('B站历史弹幕反向快进算法', () => {
45
- it('正常测试', () => {
46
- // Mock一些历史弹幕数据:跨越2024-01-01到2024-01-10
47
- const mockDans = [
48
- // 2024-01-01 有弹幕
49
- UniDM.create({
50
- SOID: '123@bili',
51
- content: 'test1',
52
- progress: 10,
53
- ctime: new Date('2024-01-01T10:00:00+08:00'),
54
- }),
55
- // 2024-01-02 有弹幕
56
- UniDM.create({
57
- SOID: '123@bili',
58
- content: 'test2',
59
- progress: 20,
60
- ctime: new Date('2024-01-02T15:30:00+08:00'),
61
- }),
62
- // 2024-01-03 无弹幕(跳过)
63
- // 2024-01-04 有弹幕
64
- UniDM.create({
65
- SOID: '123@bili',
66
- content: 'test3',
67
- progress: 30,
68
- ctime: new Date('2024-01-04T08:00:00+08:00'),
69
- }),
70
- // 2024-01-05 到 2024-01-09 无弹幕(跳过)
71
- // 2024-01-10 有弹幕(但这是查询日期,不应该包含在结果中)
72
- UniDM.create({
73
- SOID: '123@bili',
74
- content: 'test4',
75
- progress: 40,
76
- ctime: new Date('2024-01-10T12:00:00+08:00'),
77
- }),
78
- // 2024-01-11 有弹幕(晚于查询日期,不应该包含)
79
- UniDM.create({
80
- SOID: '123@bili',
81
- content: 'test5',
82
- progress: 50,
83
- ctime: new Date('2024-01-11T09:00:00+08:00'),
84
- }),
85
- ]
86
-
87
- const pool = new UniPool(mockDans)
88
- const result = pool.pipe(bili_history_fast_forward('2024-01-10'))
89
-
90
- // 验证结果
91
- expect(result.earliest).toBe('2024-01-01')
92
- expect(result.SpecificDate).toBe('2024-01-10')
93
-
94
- // fast-forward 应该包含有弹幕的日期(2024-01-01, 02, 04)
95
- expect(result.FastForward).toEqual([
96
- '2024-01-01',
97
- '2024-01-02',
98
- '2024-01-04',
99
- ])
100
-
101
- // skip 应该包含没有弹幕的日期(2024-01-03, 05-09)
102
- expect(result.skip).toEqual([
103
- '2024-01-03',
104
- '2024-01-05',
105
- '2024-01-06',
106
- '2024-01-07',
107
- '2024-01-08',
108
- '2024-01-09',
109
- ])
110
- })
111
- it('无历史弹幕', () => {
112
- const mockDans = [
113
- UniDM.create({
114
- SOID: '123@bili',
115
- content: 'test',
116
- progress: 10,
117
- ctime: new Date('2024-01-10T12:00:00+08:00'),
118
- }),
119
- ]
120
-
121
- const pool = new UniPool(mockDans)
122
- const result = pool.pipe(bili_history_fast_forward('2024-01-10'))
123
-
124
- expect(result.earliest).toBe(null)
125
- expect(result.FastForward).toEqual([])
126
- expect(result.skip).toEqual([])
127
- })
128
- })
129
- })
@@ -1,2 +0,0 @@
1
- export * as bili_dedupe from './dedupe'
2
- export { bili_history_fast_forward } from './history-danmaku-fast-forward'
@@ -1,2 +0,0 @@
1
- export * as bili from './bili'
2
- export * as stats from './stats'
@@ -1,44 +0,0 @@
1
- # 统计插件
2
-
3
- 为弹幕池提供统计和查询功能的工具集合。
4
-
5
- ## 功能模块
6
-
7
- ### 获取最新弹幕 (`getLatestDan`)
8
-
9
- 从弹幕池中查找出最新发送的一条弹幕。
10
-
11
- #### 导出函数
12
-
13
- - **`getLatestDan(pool: UniPool): UniDM | null`** - 获取最新的一条弹幕
14
-
15
- #### 使用示例
16
-
17
- ```typescript
18
- import { stats } from '@danuni/dan-any/plugins'
19
-
20
- const pool = UniPool.import(biliData)
21
-
22
- // 获取最新弹幕
23
- const latest = pool.pipe(stats.getLatestDan)
24
-
25
- if (latest) {
26
- console.log(`最新弹幕: ${latest.content}`)
27
- console.log(`发送时间: ${latest.ctime}`)
28
- } else {
29
- console.log('弹幕池为空')
30
- }
31
- ```
32
-
33
- #### 返回值
34
-
35
- - **`UniDM`** - 最新的弹幕对象(包含内容、时间、发送者等信息)
36
- - **`null`** - 当弹幕池为空时
37
-
38
- #### 工作原理
39
-
40
- 按照弹幕的创建时间(`ctime`)进行比较,通过遍历整个弹幕池找出时间戳最新的一条弹幕。
41
-
42
- #### 时间复杂度
43
-
44
- - 平均/最坏情况:**O(n)** — n 是弹幕数量
@@ -1,13 +0,0 @@
1
- import type { UniDM, UniPool } from '../..'
2
-
3
- /**
4
- * 从弹幕池中查找出最新的一条弹幕
5
- * 按照弹幕的创建时间(ctime)排序,返回最新的一条
6
- */
7
- export default function getLatestDan(that: UniPool): UniDM | null {
8
- return that.dans.length === 0
9
- ? null
10
- : that.dans.reduce((latest, current) =>
11
- current.ctime > latest.ctime ? current : latest,
12
- )
13
- }
@@ -1,39 +0,0 @@
1
- import { describe, expect, it } from 'vitest'
2
-
3
- import { UniPool } from '../..'
4
- import getLatestDan from './getLatestDan'
5
-
6
- const xml = `<i>
7
- <chatserver>chat.bilibili.com</chatserver>
8
- <chatid>1156756312</chatid>
9
- <mission>0</mission>
10
- <maxlimit>2947</maxlimit>
11
- <state>0</state>
12
- <real_name>0</real_name>
13
- <source>k-v</source>
14
- <d p="13.213,1,25,16777215,1686314041,3,ff41173d,1335658005672492032">喜欢</d>
15
- <d p="13.213,1,25,16777215,1686590010,0,296b35b5,1337972999512832512">来了 哈哈~~</d>
16
- <d p="13.246,1,25,16777215,1686276875,0,5664cfc4,1335346233459549696">就是</d>
17
- <d p="13.266,1,25,16777215,1686283375,0,c7e6646f,1335400761013670912">什么鬼?</d>
18
- <d p="13.284,1,25,16777215,1686291338,0,38662881,1335467554877267456">哇哦</d>
19
- <d p="13.306,1,25,16777215,1686268410,0,4c01de10,1335275224983600896">试试</d>
20
- <d p="13.331,1,25,16777215,1686948453,3,56a3c5d5,1340979831550069760">不喜欢</d>
21
- <d p="13.374,1,25,16777215,1686300770,3,647fe355,1335546672880933888">不喜欢</d>
22
- <d p="13.376,1,25,16777215,1686297921,0,469d94b8,1335522778300134400">哦豁</d>
23
- <d p="13.419,1,25,8700107,1686268005,0,be402447,1335271828100244224">太酷啦</d>
24
- <d p="13.419,1,25,16777215,1686316828,3,7ffb6619,1335681385016736768">喜欢</d>
25
- <d p="13.459,1,25,16777215,1686299729,0,45834405,1335537942797634048">一般,不好看</d>
26
- <d p="13.462,1,25,16777215,1686302133,0,3cab672c,1335558106620590080">哈哈哈</d>
27
- <d p="13.481,1,25,16777215,1686297342,0,ce67fafd,1335517923728804864">?</d>
28
- <d p="13.499,1,25,16777215,1686301548,3,2848bf1c,1335553202649003264">不喜欢</d>
29
- </i>`
30
-
31
- describe('统计', () => {
32
- it('获取最新的一条弹幕', () => {
33
- const pool = UniPool.fromBiliXML(xml)
34
- const latest = pool.pipe(getLatestDan)
35
- expect(latest).not.toBeNull()
36
- expect(latest?.content).toBe('不喜欢')
37
- expect(latest?.ctime).toStrictEqual(new Date(1686948453 * 1000))
38
- })
39
- })
@@ -1 +0,0 @@
1
- export { default as getLatestDan } from './getLatestDan'