@dan-uni/dan-any 1.4.8 → 2.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.
- package/README.md +87 -43
- package/dist/adapters.d.mts +2 -0
- package/dist/adapters.mjs +1 -0
- package/dist/chunk-0Lt9GpW0.mjs +1 -0
- package/dist/core/db/schema.d.mts +2 -0
- package/dist/core/db/schema.mjs +2 -0
- package/dist/core/db/schema.mjs.map +1 -0
- package/dist/core/db/utils.d.mts +1707 -0
- package/dist/core/db/utils.d.mts.map +1 -0
- package/dist/core/db/utils.mjs +1 -0
- package/dist/core-D7LMAB5h.mjs +2 -0
- package/dist/core-D7LMAB5h.mjs.map +1 -0
- package/dist/core.d.mts +2 -0
- package/dist/core.mjs +1 -0
- package/dist/db-DWWzkRBb.mjs +41 -0
- package/dist/db-DWWzkRBb.mjs.map +1 -0
- package/dist/dm-extra-DrAQCrFv.d.mts +135 -0
- package/dist/dm-extra-DrAQCrFv.d.mts.map +1 -0
- package/dist/dm-tkTdR_W6.mjs +2 -0
- package/dist/dm-tkTdR_W6.mjs.map +1 -0
- package/dist/index-vAs4qV9A.d.mts +6195 -0
- package/dist/index-vAs4qV9A.d.mts.map +1 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.mjs +1 -0
- package/dist/isSame-D4G9eoE4.mjs +2 -0
- package/dist/isSame-D4G9eoE4.mjs.map +1 -0
- package/dist/plugins.d.mts +105 -0
- package/dist/plugins.d.mts.map +1 -0
- package/dist/plugins.mjs +2 -0
- package/dist/plugins.mjs.map +1 -0
- package/dist/schema-BuenbDx9.d.mts +1619 -0
- package/dist/schema-BuenbDx9.d.mts.map +1 -0
- package/dist/utils.d.mts +25 -0
- package/dist/utils.d.mts.map +1 -0
- package/dist/utils.mjs +2 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +65 -37
- package/.babelrc.json +0 -12
- package/buf.gen.yaml +0 -10
- package/buf.yaml +0 -12
- package/dist/browser/1~rslib-runtime.min.js +0 -49
- package/dist/browser/index.min.js +0 -13523
- package/dist/browser/index.min.js.LICENSE.txt +0 -17
- package/dist/browser/plugins/bili.min.js +0 -1
- package/dist/browser/plugins/index.min.js +0 -2
- package/dist/browser/plugins/stats.min.js +0 -10
- package/dist/browser/src/ass-gen/__tests__/canvas.test.d.ts +0 -1
- package/dist/browser/src/ass-gen/__tests__/generate.test.d.ts +0 -1
- package/dist/browser/src/ass-gen/ass/create.d.ts +0 -4
- package/dist/browser/src/ass-gen/ass/dialogue.d.ts +0 -16
- package/dist/browser/src/ass-gen/ass/event.d.ts +0 -2
- package/dist/browser/src/ass-gen/ass/info.d.ts +0 -8
- package/dist/browser/src/ass-gen/ass/raw.d.ts +0 -14
- package/dist/browser/src/ass-gen/ass/style.d.ts +0 -2
- package/dist/browser/src/ass-gen/config.d.ts +0 -2
- package/dist/browser/src/ass-gen/index.d.ts +0 -30
- package/dist/browser/src/ass-gen/types.d.ts +0 -71
- package/dist/browser/src/ass-gen/util/color.d.ts +0 -18
- package/dist/browser/src/ass-gen/util/danconvert.d.ts +0 -5
- package/dist/browser/src/ass-gen/util/index.d.ts +0 -4
- package/dist/browser/src/ass-gen/util/lang.d.ts +0 -3
- package/dist/browser/src/ass-gen/util/layout.d.ts +0 -4
- package/dist/browser/src/index.d.ts +0 -283
- package/dist/browser/src/index.test.d.ts +0 -1
- package/dist/browser/src/plugins/bili/dedupe.d.ts +0 -3
- package/dist/browser/src/plugins/bili/history-danmaku-fast-forward.d.ts +0 -18
- package/dist/browser/src/plugins/bili/index.d.ts +0 -2
- package/dist/browser/src/plugins/bili/index.test.d.ts +0 -1
- package/dist/browser/src/plugins/index.d.ts +0 -2
- package/dist/browser/src/plugins/stats/getLatestDan.d.ts +0 -6
- package/dist/browser/src/plugins/stats/index.d.ts +0 -1
- package/dist/browser/src/plugins/stats/index.test.d.ts +0 -1
- package/dist/browser/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.d.ts +0 -3426
- package/dist/browser/src/proto/gen/danuni/danmaku/v1/danmaku_pb.d.ts +0 -176
- package/dist/browser/src/utils/dm-gen.d.ts +0 -309
- package/dist/browser/src/utils/dm-gen.test.d.ts +0 -1
- package/dist/browser/src/utils/fileParser.d.ts +0 -3
- package/dist/browser/src/utils/id-gen.d.ts +0 -50
- package/dist/browser/src/utils/platform.d.ts +0 -24
- package/dist/node/0~rslib-runtime.js +0 -23
- package/dist/node/index.js +0 -2099
- package/dist/node/plugins/bili.js +0 -1
- package/dist/node/plugins/index.js +0 -2
- package/dist/node/plugins/stats.js +0 -10
- package/dist/node/src/ass-gen/__tests__/canvas.test.d.ts +0 -1
- package/dist/node/src/ass-gen/__tests__/generate.test.d.ts +0 -1
- package/dist/node/src/ass-gen/ass/create.d.ts +0 -4
- package/dist/node/src/ass-gen/ass/dialogue.d.ts +0 -16
- package/dist/node/src/ass-gen/ass/event.d.ts +0 -2
- package/dist/node/src/ass-gen/ass/info.d.ts +0 -8
- package/dist/node/src/ass-gen/ass/raw.d.ts +0 -14
- package/dist/node/src/ass-gen/ass/style.d.ts +0 -2
- package/dist/node/src/ass-gen/config.d.ts +0 -2
- package/dist/node/src/ass-gen/index.d.ts +0 -30
- package/dist/node/src/ass-gen/types.d.ts +0 -71
- package/dist/node/src/ass-gen/util/color.d.ts +0 -18
- package/dist/node/src/ass-gen/util/danconvert.d.ts +0 -5
- package/dist/node/src/ass-gen/util/index.d.ts +0 -4
- package/dist/node/src/ass-gen/util/lang.d.ts +0 -3
- package/dist/node/src/ass-gen/util/layout.d.ts +0 -4
- package/dist/node/src/index.d.ts +0 -283
- package/dist/node/src/index.test.d.ts +0 -1
- package/dist/node/src/plugins/bili/dedupe.d.ts +0 -3
- package/dist/node/src/plugins/bili/history-danmaku-fast-forward.d.ts +0 -18
- package/dist/node/src/plugins/bili/index.d.ts +0 -2
- package/dist/node/src/plugins/bili/index.test.d.ts +0 -1
- package/dist/node/src/plugins/index.d.ts +0 -2
- package/dist/node/src/plugins/stats/getLatestDan.d.ts +0 -6
- package/dist/node/src/plugins/stats/index.d.ts +0 -1
- package/dist/node/src/plugins/stats/index.test.d.ts +0 -1
- package/dist/node/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.d.ts +0 -3426
- package/dist/node/src/proto/gen/danuni/danmaku/v1/danmaku_pb.d.ts +0 -176
- package/dist/node/src/utils/dm-gen.d.ts +0 -309
- package/dist/node/src/utils/dm-gen.test.d.ts +0 -1
- package/dist/node/src/utils/fileParser.d.ts +0 -3
- package/dist/node/src/utils/id-gen.d.ts +0 -50
- package/dist/node/src/utils/platform.d.ts +0 -24
- package/dist/umd/index.umd.min.js +0 -32093
- package/dist/umd/index.umd.min.js.LICENSE.txt +0 -34
- package/dist/umd/plugins/bili.umd.min.js +0 -32004
- package/dist/umd/plugins/bili.umd.min.js.LICENSE.txt +0 -34
- package/dist/umd/plugins/index.umd.min.js +0 -32020
- package/dist/umd/plugins/index.umd.min.js.LICENSE.txt +0 -34
- package/dist/umd/plugins/stats.umd.min.js +0 -39
- package/dist/umd/src/ass-gen/__tests__/canvas.test.d.ts +0 -1
- package/dist/umd/src/ass-gen/__tests__/generate.test.d.ts +0 -1
- package/dist/umd/src/ass-gen/ass/create.d.ts +0 -4
- package/dist/umd/src/ass-gen/ass/dialogue.d.ts +0 -16
- package/dist/umd/src/ass-gen/ass/event.d.ts +0 -2
- package/dist/umd/src/ass-gen/ass/info.d.ts +0 -8
- package/dist/umd/src/ass-gen/ass/raw.d.ts +0 -14
- package/dist/umd/src/ass-gen/ass/style.d.ts +0 -2
- package/dist/umd/src/ass-gen/config.d.ts +0 -2
- package/dist/umd/src/ass-gen/index.d.ts +0 -30
- package/dist/umd/src/ass-gen/types.d.ts +0 -71
- package/dist/umd/src/ass-gen/util/color.d.ts +0 -18
- package/dist/umd/src/ass-gen/util/danconvert.d.ts +0 -5
- package/dist/umd/src/ass-gen/util/index.d.ts +0 -4
- package/dist/umd/src/ass-gen/util/lang.d.ts +0 -3
- package/dist/umd/src/ass-gen/util/layout.d.ts +0 -4
- package/dist/umd/src/index.d.ts +0 -283
- package/dist/umd/src/index.test.d.ts +0 -1
- package/dist/umd/src/plugins/bili/dedupe.d.ts +0 -3
- package/dist/umd/src/plugins/bili/history-danmaku-fast-forward.d.ts +0 -18
- package/dist/umd/src/plugins/bili/index.d.ts +0 -2
- package/dist/umd/src/plugins/bili/index.test.d.ts +0 -1
- package/dist/umd/src/plugins/index.d.ts +0 -2
- package/dist/umd/src/plugins/stats/getLatestDan.d.ts +0 -6
- package/dist/umd/src/plugins/stats/index.d.ts +0 -1
- package/dist/umd/src/plugins/stats/index.test.d.ts +0 -1
- package/dist/umd/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.d.ts +0 -3426
- package/dist/umd/src/proto/gen/danuni/danmaku/v1/danmaku_pb.d.ts +0 -176
- package/dist/umd/src/utils/dm-gen.d.ts +0 -309
- package/dist/umd/src/utils/dm-gen.test.d.ts +0 -1
- package/dist/umd/src/utils/fileParser.d.ts +0 -3
- package/dist/umd/src/utils/id-gen.d.ts +0 -50
- package/dist/umd/src/utils/platform.d.ts +0 -24
- package/plugins/package.json +0 -6
- package/rslib.config.ts +0 -101
- package/src/ass-gen/__tests__/898651903.xml +0 -1619
- package/src/ass-gen/__tests__/898651903.xml.ass +0 -1516
- package/src/ass-gen/__tests__/canvas.test.ts +0 -15
- package/src/ass-gen/__tests__/generate.test.ts +0 -26
- package/src/ass-gen/ass/create.ts +0 -37
- package/src/ass-gen/ass/dialogue.ts +0 -90
- package/src/ass-gen/ass/event.ts +0 -57
- package/src/ass-gen/ass/info.ts +0 -27
- package/src/ass-gen/ass/raw.ts +0 -78
- package/src/ass-gen/ass/style.ts +0 -66
- package/src/ass-gen/config.ts +0 -45
- package/src/ass-gen/index.ts +0 -73
- package/src/ass-gen/types.ts +0 -76
- package/src/ass-gen/util/color.ts +0 -55
- package/src/ass-gen/util/danconvert.ts +0 -43
- package/src/ass-gen/util/index.ts +0 -10
- package/src/ass-gen/util/lang.ts +0 -35
- package/src/ass-gen/util/layout.ts +0 -242
- package/src/index.test.ts +0 -157
- package/src/index.ts +0 -1144
- package/src/plugins/bili/README.md +0 -87
- package/src/plugins/bili/dedupe.ts +0 -29
- package/src/plugins/bili/history-danmaku-fast-forward.ts +0 -86
- package/src/plugins/bili/index.test.ts +0 -129
- package/src/plugins/bili/index.ts +0 -2
- package/src/plugins/index.ts +0 -2
- package/src/plugins/stats/README.md +0 -44
- package/src/plugins/stats/getLatestDan.ts +0 -13
- package/src/plugins/stats/index.test.ts +0 -39
- package/src/plugins/stats/index.ts +0 -1
- package/src/proto/gen/bilibili/community/service/dm/v1/dm_pb.ts +0 -4072
- package/src/proto/gen/danuni/danmaku/v1/danmaku_pb.ts +0 -223
- package/src/proto/src/bilibili/community/service/dm/v1/dm.proto +0 -1095
- package/src/proto/src/danuni/danmaku/v1/danmaku.proto +0 -52
- package/src/utils/dm-gen.test.ts +0 -129
- package/src/utils/dm-gen.ts +0 -1082
- package/src/utils/fileParser.ts +0 -37
- package/src/utils/id-gen.ts +0 -73
- package/src/utils/platform.ts +0 -38
- package/tsconfig.json +0 -108
- package/types/tsconfig.tsbuildinfo +0 -1
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
decimalColorToRGB,
|
|
3
|
-
formatColor,
|
|
4
|
-
getDecoratingColor,
|
|
5
|
-
hexColorToRGB,
|
|
6
|
-
isWhite,
|
|
7
|
-
} from './color'
|
|
8
|
-
export { DanmakuList2UniPool, UniPool2DanmakuLists } from './danconvert'
|
|
9
|
-
export { arrayOfLength, assign, uniqueArray } from './lang'
|
|
10
|
-
export { layoutDanmaku } from './layout'
|
package/src/ass-gen/util/lang.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export const assign = <T extends object>(
|
|
2
|
-
source: T,
|
|
3
|
-
...targets: Partial<T>[]
|
|
4
|
-
): T => {
|
|
5
|
-
for (const target of targets) {
|
|
6
|
-
for (const key of Object.keys(target)) {
|
|
7
|
-
;(source as any)[key] = target[key as keyof typeof target]
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return source
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const arrayOfLength = <T>(length: number, defaultValue: T): T[] => {
|
|
15
|
-
// eslint-disable-next-line unicorn/no-new-array
|
|
16
|
-
const array = new Array(length)
|
|
17
|
-
for (let i = 0; i < length; i++) {
|
|
18
|
-
array[i] = defaultValue
|
|
19
|
-
}
|
|
20
|
-
return array
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export const uniqueArray = <T>(array: T[]) => {
|
|
24
|
-
const duplicates: T[] = []
|
|
25
|
-
const result: T[] = []
|
|
26
|
-
|
|
27
|
-
for (const item of array) {
|
|
28
|
-
if (!duplicates.includes(item)) {
|
|
29
|
-
duplicates.push(item)
|
|
30
|
-
result.push(item)
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return result
|
|
35
|
-
}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import type { UniPool } from '../..'
|
|
2
|
-
import type { CanvasCtx, Danmaku, SubtitleStyle } from '../types'
|
|
3
|
-
|
|
4
|
-
import { DanmakuType, FontSize } from '../types'
|
|
5
|
-
import { DanmakuList2UniPool, UniPool2DanmakuLists } from './danconvert'
|
|
6
|
-
import { arrayOfLength } from './lang'
|
|
7
|
-
|
|
8
|
-
// 计算一个矩形移进屏幕的时间(头进屏幕到尾巴进屏幕)
|
|
9
|
-
const computeScrollInTime = (
|
|
10
|
-
rectWidth: number,
|
|
11
|
-
screenWidth: number,
|
|
12
|
-
scrollTime: number,
|
|
13
|
-
) => {
|
|
14
|
-
const speed = (screenWidth + rectWidth) / scrollTime
|
|
15
|
-
return rectWidth / speed
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// 计算一个矩形在屏幕上的时间(头进屏幕到头离开屏幕)
|
|
19
|
-
const computeScrollOverTime = (
|
|
20
|
-
rectWidth: number,
|
|
21
|
-
screenWidth: number,
|
|
22
|
-
scrollTime: number,
|
|
23
|
-
) => {
|
|
24
|
-
const speed = (screenWidth + rectWidth) / scrollTime
|
|
25
|
-
return screenWidth / speed
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
interface ScrollGrid {
|
|
29
|
-
start: number
|
|
30
|
-
end: number
|
|
31
|
-
width: number
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
type FixGrid = number
|
|
35
|
-
|
|
36
|
-
interface DanmakuGrids {
|
|
37
|
-
// [DanmakuType.SCROLL]: ScrollGrid[];
|
|
38
|
-
// [DanmakuType.TOP]: FixGrid[];
|
|
39
|
-
// [DanmakuType.BOTTOM]: FixGrid[];
|
|
40
|
-
1: ScrollGrid[] // DanmakuType.SCROLL
|
|
41
|
-
3: FixGrid[] // DanmakuType.TOP
|
|
42
|
-
2: FixGrid[] // DanmakuType.BOTTOM
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const splitGrids = ({
|
|
46
|
-
fontSize,
|
|
47
|
-
padding,
|
|
48
|
-
playResY,
|
|
49
|
-
bottomSpace,
|
|
50
|
-
}: {
|
|
51
|
-
fontSize: number[]
|
|
52
|
-
padding: number[]
|
|
53
|
-
playResY: number
|
|
54
|
-
bottomSpace: number
|
|
55
|
-
}): DanmakuGrids => {
|
|
56
|
-
const defaultFontSize = fontSize[FontSize.NORMAL]
|
|
57
|
-
const paddingTop = padding[0]
|
|
58
|
-
const paddingBottom = padding[2]
|
|
59
|
-
const linesCount = Math.floor(
|
|
60
|
-
(playResY - bottomSpace) / (defaultFontSize + paddingTop + paddingBottom),
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
// 首先以通用的字号把屏幕的高度分成若干行,字幕只允许落在一个行里
|
|
64
|
-
return {
|
|
65
|
-
// 每一行里的数字是当前在这一行里的最后一条弹幕区域(算入padding)的右边离开屏幕的时间,
|
|
66
|
-
// 这个时间和下一条弹幕的左边离开屏幕的时间相比较,能确定在整个弹幕的飞行过程中是否会相撞(不同长度弹幕飞行速度不同)|,
|
|
67
|
-
// 当每一条弹幕加到一行里时,就会把这个时间算出来,获取新的弹幕时就可以判断哪一行是允许放的就放进去
|
|
68
|
-
1: arrayOfLength(linesCount, {
|
|
69
|
-
start: 0,
|
|
70
|
-
end: 0,
|
|
71
|
-
width: 0,
|
|
72
|
-
}),
|
|
73
|
-
// 对于固定的弹幕,每一行里都存放弹幕的消失时间,只要这行的弹幕没消失就不能放新弹幕进来
|
|
74
|
-
3: arrayOfLength(linesCount, 0),
|
|
75
|
-
2: arrayOfLength(linesCount, 0),
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export const measureTextWidthConstructor = (canvasContext: CanvasCtx) => {
|
|
80
|
-
const supportTextMeasure = !!canvasContext.measureText('中')
|
|
81
|
-
|
|
82
|
-
if (supportTextMeasure) {
|
|
83
|
-
return (
|
|
84
|
-
fontName: string,
|
|
85
|
-
fontSize: number,
|
|
86
|
-
bold: boolean,
|
|
87
|
-
text: string,
|
|
88
|
-
) => {
|
|
89
|
-
canvasContext.font = `${bold ? 'bold' : 'normal'} ${fontSize}px ${fontName}`
|
|
90
|
-
const textWidth = canvasContext.measureText(text).width
|
|
91
|
-
return Math.round(textWidth)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
console.warn(
|
|
96
|
-
'[Warn] node-canvas is installed without text measure support, layout may not be correct',
|
|
97
|
-
)
|
|
98
|
-
return (_fontName: string, fontSize: number, _bold: boolean, text: string) =>
|
|
99
|
-
text.length * fontSize
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// 找到能用的行
|
|
103
|
-
const resolveAvailableFixGrid = (grids: FixGrid[], time: number) => {
|
|
104
|
-
for (const [i, grid] of grids.entries()) {
|
|
105
|
-
if (grid <= time) {
|
|
106
|
-
return i
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return -1
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const resolveAvailableScrollGrid = (
|
|
114
|
-
grids: ScrollGrid[],
|
|
115
|
-
rectWidth: number,
|
|
116
|
-
screenWidth: number,
|
|
117
|
-
time: number,
|
|
118
|
-
duration: number,
|
|
119
|
-
) => {
|
|
120
|
-
for (const [i, previous] of grids.entries()) {
|
|
121
|
-
// 对于滚动弹幕,要算两个位置:
|
|
122
|
-
//
|
|
123
|
-
// 1. 前一条弹幕的尾巴进屏幕之前,后一条弹幕不能开始出现
|
|
124
|
-
// 2. 前一条弹幕的尾巴离开屏幕之前,后一条弹幕的头不能离开屏幕
|
|
125
|
-
const previousInTime =
|
|
126
|
-
previous.start +
|
|
127
|
-
computeScrollInTime(previous.width, screenWidth, duration)
|
|
128
|
-
const currentOverTime =
|
|
129
|
-
time + computeScrollOverTime(rectWidth, screenWidth, duration)
|
|
130
|
-
|
|
131
|
-
if (time >= previousInTime && currentOverTime >= previous.end) {
|
|
132
|
-
return i
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
return -1
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
const initializeLayout = (config: SubtitleStyle, canvasCtx: CanvasCtx) => {
|
|
140
|
-
const {
|
|
141
|
-
playResX,
|
|
142
|
-
playResY,
|
|
143
|
-
fontName,
|
|
144
|
-
fontSize,
|
|
145
|
-
bold,
|
|
146
|
-
padding,
|
|
147
|
-
scrollTime,
|
|
148
|
-
fixTime,
|
|
149
|
-
bottomSpace,
|
|
150
|
-
} = config
|
|
151
|
-
const [paddingTop, paddingRight, paddingBottom, paddingLeft] = padding
|
|
152
|
-
|
|
153
|
-
const defaultFontSize = fontSize[FontSize.NORMAL]
|
|
154
|
-
const grids = splitGrids(config)
|
|
155
|
-
const gridHeight = defaultFontSize + paddingTop + paddingBottom
|
|
156
|
-
|
|
157
|
-
return (danmaku: Danmaku) => {
|
|
158
|
-
const targetGrids = grids[danmaku.type as keyof DanmakuGrids]
|
|
159
|
-
const danmakuFontSize = fontSize[danmaku.fontSizeType]
|
|
160
|
-
const rectWidth =
|
|
161
|
-
measureTextWidthConstructor(canvasCtx)(
|
|
162
|
-
fontName,
|
|
163
|
-
danmakuFontSize,
|
|
164
|
-
bold,
|
|
165
|
-
danmaku.content,
|
|
166
|
-
) +
|
|
167
|
-
paddingLeft +
|
|
168
|
-
paddingRight
|
|
169
|
-
const verticalOffset =
|
|
170
|
-
paddingTop + Math.round((defaultFontSize - danmakuFontSize) / 2)
|
|
171
|
-
|
|
172
|
-
if (danmaku.type === DanmakuType.SCROLL) {
|
|
173
|
-
const scrollGrids = targetGrids as ScrollGrid[]
|
|
174
|
-
const gridNumber = resolveAvailableScrollGrid(
|
|
175
|
-
scrollGrids,
|
|
176
|
-
rectWidth,
|
|
177
|
-
playResX,
|
|
178
|
-
danmaku.time,
|
|
179
|
-
scrollTime,
|
|
180
|
-
)
|
|
181
|
-
if (gridNumber < 0) {
|
|
182
|
-
// console.warn(`[Warn] Collision ${danmaku.time}: ${danmaku.content}`)
|
|
183
|
-
return null
|
|
184
|
-
}
|
|
185
|
-
targetGrids[gridNumber] = {
|
|
186
|
-
width: rectWidth,
|
|
187
|
-
start: danmaku.time,
|
|
188
|
-
end: danmaku.time + scrollTime,
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const top = gridNumber * gridHeight + verticalOffset
|
|
192
|
-
const start = playResX + paddingLeft
|
|
193
|
-
const end = -rectWidth
|
|
194
|
-
|
|
195
|
-
return { ...danmaku, top, start, end }
|
|
196
|
-
} else {
|
|
197
|
-
const gridNumber = resolveAvailableFixGrid(
|
|
198
|
-
targetGrids as FixGrid[],
|
|
199
|
-
danmaku.time,
|
|
200
|
-
)
|
|
201
|
-
if (gridNumber < 0) {
|
|
202
|
-
// console.warn(`[Warn] Collision ${danmaku.time}: ${danmaku.content}`)
|
|
203
|
-
return null
|
|
204
|
-
}
|
|
205
|
-
if (danmaku.type === DanmakuType.TOP) {
|
|
206
|
-
targetGrids[gridNumber] = danmaku.time + fixTime
|
|
207
|
-
|
|
208
|
-
const top = gridNumber * gridHeight + verticalOffset
|
|
209
|
-
// 固定弹幕横向按中心点计算
|
|
210
|
-
const left = Math.round(playResX / 2)
|
|
211
|
-
|
|
212
|
-
return { ...danmaku, top, left }
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
targetGrids[gridNumber] = danmaku.time + fixTime
|
|
216
|
-
|
|
217
|
-
// 底部字幕的格子是留出`bottomSpace`的位置后从下往上算的
|
|
218
|
-
const top =
|
|
219
|
-
playResY -
|
|
220
|
-
bottomSpace -
|
|
221
|
-
gridHeight * gridNumber -
|
|
222
|
-
gridHeight +
|
|
223
|
-
verticalOffset
|
|
224
|
-
const left = Math.round(playResX / 2)
|
|
225
|
-
|
|
226
|
-
return { ...danmaku, top, left }
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
export const layoutDanmaku = (
|
|
232
|
-
inputList: UniPool,
|
|
233
|
-
config: SubtitleStyle,
|
|
234
|
-
canvasCtx: CanvasCtx,
|
|
235
|
-
): UniPool => {
|
|
236
|
-
const list = [...UniPool2DanmakuLists(inputList)].toSorted(
|
|
237
|
-
(x, y) => x.time - y.time,
|
|
238
|
-
)
|
|
239
|
-
const layout = initializeLayout(config, canvasCtx)
|
|
240
|
-
|
|
241
|
-
return DanmakuList2UniPool(list.map(layout).filter((danmaku) => !!danmaku))
|
|
242
|
-
}
|
package/src/index.test.ts
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { createCanvas } from 'canvas'
|
|
2
|
-
import { describe, expect, it } from 'vitest'
|
|
3
|
-
|
|
4
|
-
import { UniPool } from './index'
|
|
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
|
-
describe('转化自', () => {
|
|
31
|
-
it('bili(xml)[双向]', () => {
|
|
32
|
-
const pool = UniPool.fromBiliXML(xml)
|
|
33
|
-
console.info(xml)
|
|
34
|
-
console.info(pool)
|
|
35
|
-
console.info(pool.toBiliXML())
|
|
36
|
-
console.info(pool.toBiliXML({ avoidSenderIDWithAt: true }))
|
|
37
|
-
const imp = UniPool.import(xml)
|
|
38
|
-
expect(imp.fmt).toBe('bili.xml')
|
|
39
|
-
expect(imp.pool).toEqual(pool)
|
|
40
|
-
const imp2 = UniPool.import(xml, undefined, 'test-bili.xml')
|
|
41
|
-
expect(imp2).toEqual(imp)
|
|
42
|
-
})
|
|
43
|
-
it('artplayer(json)', () => {
|
|
44
|
-
const json = {
|
|
45
|
-
danmuku: [
|
|
46
|
-
{
|
|
47
|
-
text: 'artplayer测试弹幕', // 弹幕文本
|
|
48
|
-
time: 10, // 弹幕时间, 默认为当前播放器时间
|
|
49
|
-
mode: 0, // 弹幕模式: 0: 滚动(默认),1: 顶部,2: 底部
|
|
50
|
-
color: '#FFFFFF', // 弹幕颜色,默认为白色
|
|
51
|
-
border: false, // 弹幕是否有描边, 默认为 false
|
|
52
|
-
style: { border: '10rem' }, // 弹幕自定义样式, 默认为空对象
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
}
|
|
56
|
-
const pool = UniPool.fromArtplayer(json, 'playerid-test', 'acfun')
|
|
57
|
-
console.info(json)
|
|
58
|
-
console.info(pool)
|
|
59
|
-
const imp = UniPool.import(json)
|
|
60
|
-
expect(imp.fmt).toBe('artplayer.json')
|
|
61
|
-
// 该适配器ctime始终为now,无法双向测试
|
|
62
|
-
// expect(imp.pool).toEqual(pool)
|
|
63
|
-
UniPool.import(json, undefined, 'test-artplayer.json')
|
|
64
|
-
// expect(imp2).toEqual(imp)
|
|
65
|
-
})
|
|
66
|
-
it('ass[双向]', () => {
|
|
67
|
-
const canvas = createCanvas(50, 50)
|
|
68
|
-
const pool = UniPool.fromBiliXML(xml)
|
|
69
|
-
const ass = pool.toASS(canvas.getContext('2d'))
|
|
70
|
-
console.info(ass)
|
|
71
|
-
console.info(UniPool.fromASS(ass))
|
|
72
|
-
const imp = UniPool.import(ass)
|
|
73
|
-
expect(imp.fmt).toBe('common.ass')
|
|
74
|
-
expect(imp.pool).toEqual(pool)
|
|
75
|
-
const imp2 = UniPool.import(ass, undefined, 'test-common.ass')
|
|
76
|
-
expect(imp2).toEqual(imp)
|
|
77
|
-
})
|
|
78
|
-
it('pb[双向]', () => {
|
|
79
|
-
const pool = UniPool.fromBiliXML(xml)
|
|
80
|
-
const pb = pool.toPb()
|
|
81
|
-
console.info(UniPool.fromPb(pb))
|
|
82
|
-
const imp = UniPool.import(pb)
|
|
83
|
-
expect(imp.fmt).toBe('danuni.binpb')
|
|
84
|
-
expect(imp.pool).toEqual(pool)
|
|
85
|
-
const imp2 = UniPool.import(pb, undefined, 'test-danuni.binpb')
|
|
86
|
-
expect(imp2).toEqual(imp)
|
|
87
|
-
})
|
|
88
|
-
it('DDPlay[双向]', () => {
|
|
89
|
-
const pool = UniPool.fromBiliXML(xml)
|
|
90
|
-
const ddplay = pool.toDDPlay()
|
|
91
|
-
console.info(UniPool.fromDDPlay(ddplay, '1'))
|
|
92
|
-
const imp = UniPool.import(ddplay)
|
|
93
|
-
expect(imp.fmt).toBe('ddplay.json')
|
|
94
|
-
// 该适配器ctime始终为now,无法双向测试
|
|
95
|
-
UniPool.import(ddplay, undefined, 'test-ddplay.json')
|
|
96
|
-
// expect(imp2).toEqual(imp)
|
|
97
|
-
})
|
|
98
|
-
it('min[双向]', () => {
|
|
99
|
-
const pool = UniPool.fromBiliXML(xml)
|
|
100
|
-
const min = pool.minify()
|
|
101
|
-
console.info(min)
|
|
102
|
-
const imp = UniPool.import(min)
|
|
103
|
-
expect(imp.fmt).toBe('danuni.min.json')
|
|
104
|
-
// 该适配器ctime始终为now,无法双向测试
|
|
105
|
-
// expect(imp.pool).toEqual(pool)
|
|
106
|
-
UniPool.import(min, undefined, 'test-danuni.min.json')
|
|
107
|
-
// expect(imp2).toEqual(imp)
|
|
108
|
-
})
|
|
109
|
-
})
|
|
110
|
-
|
|
111
|
-
describe('共通值', () => {
|
|
112
|
-
const pool = UniPool.fromBiliXML(xml)
|
|
113
|
-
it('获取shared', () => {
|
|
114
|
-
console.info(pool.getMost('SOID'))
|
|
115
|
-
console.info(pool.shared)
|
|
116
|
-
expect(pool.getShared('SOID')).toBe(pool.shared.SOID)
|
|
117
|
-
})
|
|
118
|
-
it('获取most', () => {
|
|
119
|
-
console.info(pool.getMost('senderID'))
|
|
120
|
-
console.info(pool.most)
|
|
121
|
-
expect(pool.getMost('senderID').val).toBe(pool.most.senderID)
|
|
122
|
-
})
|
|
123
|
-
it('按pool分组', () => {
|
|
124
|
-
console.info(pool.split('pool'))
|
|
125
|
-
})
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
describe('其它', () => {
|
|
129
|
-
const pool = UniPool.fromBiliXML(xml)
|
|
130
|
-
it('最小化', () => {
|
|
131
|
-
console.info(pool.minify())
|
|
132
|
-
})
|
|
133
|
-
it('合并范围内重复', () => {
|
|
134
|
-
console.info(pool.merge(10).minify())
|
|
135
|
-
})
|
|
136
|
-
it('禁止DMID生成', () => {
|
|
137
|
-
console.info(
|
|
138
|
-
UniPool.fromBiliXML(xml, {
|
|
139
|
-
dmid: false,
|
|
140
|
-
}),
|
|
141
|
-
)
|
|
142
|
-
})
|
|
143
|
-
it('自定义DMID生成长度', () => {
|
|
144
|
-
console.info(
|
|
145
|
-
UniPool.fromBiliXML(xml, {
|
|
146
|
-
dmid: 64,
|
|
147
|
-
}),
|
|
148
|
-
)
|
|
149
|
-
})
|
|
150
|
-
it('自定义DMID生成器', () => {
|
|
151
|
-
console.info(
|
|
152
|
-
UniPool.fromBiliXML(xml, {
|
|
153
|
-
dmid: (dan) => dan.ctime.toString() + Math.random(),
|
|
154
|
-
}),
|
|
155
|
-
)
|
|
156
|
-
})
|
|
157
|
-
})
|