@dan-uni/dan-any 0.0.2
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/.babelrc.json +12 -0
- package/LICENSE +165 -0
- package/README.md +30 -0
- package/buf.gen.yaml +8 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.js +1 -0
- package/dist/index.min.js +1 -0
- package/dist/index.test.d.ts +1 -0
- package/dist/index.umd.min.js +1 -0
- package/dist/proto/gen/bili/dm_pb.d.ts +3426 -0
- package/dist/proto/gen/danuni_pb.d.ts +145 -0
- package/dist/utils/dm-gen.d.ts +314 -0
- package/dist/utils/id-gen.d.ts +72 -0
- package/package.json +45 -0
- package/rollup.config.mjs +51 -0
- package/src/index.test.ts +51 -0
- package/src/index.ts +282 -0
- package/src/proto/gen/bili/dm_pb.ts +4072 -0
- package/src/proto/gen/danuni_pb.ts +187 -0
- package/src/proto/src/bili/dm.proto +1095 -0
- package/src/proto/src/danuni.proto +42 -0
- package/src/utils/dm-gen.ts +638 -0
- package/src/utils/id-gen.ts +118 -0
- package/tsconfig.json +110 -0
package/src/index.ts
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { XMLParser } from 'fast-xml-parser'
|
|
2
|
+
import type { CommandDm as DM_JSON_BiliCommandGrpc } from './proto/gen/bili/dm_pb'
|
|
3
|
+
// import type * as UniDMType from './utils/dm-gen'
|
|
4
|
+
import type { platfrom } from './utils/id-gen'
|
|
5
|
+
|
|
6
|
+
import { create, fromBinary, toBinary } from '@bufbuild/protobuf'
|
|
7
|
+
import {
|
|
8
|
+
timestampDate,
|
|
9
|
+
timestampFromDate,
|
|
10
|
+
timestampNow,
|
|
11
|
+
} from '@bufbuild/protobuf/wkt'
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
// DanmakuElem as DM_JSON_BiliGrpc,
|
|
15
|
+
DmSegMobileReplySchema,
|
|
16
|
+
DmWebViewReplySchema,
|
|
17
|
+
} from './proto/gen/bili/dm_pb'
|
|
18
|
+
import { DanmakuReplySchema } from './proto/gen/danuni_pb'
|
|
19
|
+
// import type * as UniIDType from './utils/id-gen'
|
|
20
|
+
|
|
21
|
+
import { UniDM } from './utils/dm-gen'
|
|
22
|
+
import * as UniDMTools from './utils/dm-gen'
|
|
23
|
+
import * as UniIDTools from './utils/id-gen'
|
|
24
|
+
|
|
25
|
+
export interface DM_XML_Bili {
|
|
26
|
+
i: {
|
|
27
|
+
chatserver: string
|
|
28
|
+
chatid: number
|
|
29
|
+
mission: number
|
|
30
|
+
maxlimit: number
|
|
31
|
+
state: number
|
|
32
|
+
real_name: number
|
|
33
|
+
source: string
|
|
34
|
+
d: {
|
|
35
|
+
'#text': string
|
|
36
|
+
'@_p': string
|
|
37
|
+
}[]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export interface DM_JSON_Dplayer {
|
|
41
|
+
code: 0
|
|
42
|
+
/**
|
|
43
|
+
* progress,mode,color,midHash,content
|
|
44
|
+
*/
|
|
45
|
+
data: [number, number, number, string, string][]
|
|
46
|
+
}
|
|
47
|
+
export interface DM_JSON_Artplayer {
|
|
48
|
+
text: string // 弹幕文本
|
|
49
|
+
time?: number // 弹幕时间, 默认为当前播放器时间
|
|
50
|
+
mode?: number // 弹幕模式: 0: 滚动(默认),1: 顶部,2: 底部
|
|
51
|
+
color?: string // 弹幕颜色,默认为白色
|
|
52
|
+
border?: boolean // 弹幕是否有描边, 默认为 false
|
|
53
|
+
style?: {} // 弹幕自定义样式, 默认为空对象
|
|
54
|
+
}
|
|
55
|
+
export interface DM_JSON_DDPlay {
|
|
56
|
+
count: number | string
|
|
57
|
+
comments: {
|
|
58
|
+
cid: number
|
|
59
|
+
p: string
|
|
60
|
+
m: string
|
|
61
|
+
}[]
|
|
62
|
+
}
|
|
63
|
+
export class UniPool {
|
|
64
|
+
constructor(public dans: UniDM[]) {}
|
|
65
|
+
static fromPb(bin: Uint8Array | ArrayBuffer) {
|
|
66
|
+
const data = fromBinary(DanmakuReplySchema, new Uint8Array(bin))
|
|
67
|
+
return new UniPool(
|
|
68
|
+
data.danmakus.map(
|
|
69
|
+
(d) =>
|
|
70
|
+
new UniDM(
|
|
71
|
+
d.FCID,
|
|
72
|
+
d.progress,
|
|
73
|
+
d.mode as number,
|
|
74
|
+
d.fontsize,
|
|
75
|
+
d.color,
|
|
76
|
+
d.senderID,
|
|
77
|
+
d.content,
|
|
78
|
+
timestampDate(d.ctime || timestampNow()),
|
|
79
|
+
d.weight,
|
|
80
|
+
d.pool as number,
|
|
81
|
+
d.attr as UniDMTools.DMAttr[],
|
|
82
|
+
d.platform,
|
|
83
|
+
d.SPMO,
|
|
84
|
+
d.extra,
|
|
85
|
+
d.DMID,
|
|
86
|
+
),
|
|
87
|
+
),
|
|
88
|
+
)
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 转为 protobuf 二进制
|
|
92
|
+
*/
|
|
93
|
+
toPb() {
|
|
94
|
+
return toBinary(
|
|
95
|
+
DanmakuReplySchema,
|
|
96
|
+
create(DanmakuReplySchema, {
|
|
97
|
+
danmakus: this.dans.map((d) => {
|
|
98
|
+
return {
|
|
99
|
+
FCID: d.FCID,
|
|
100
|
+
DMID: d.DMID,
|
|
101
|
+
progress: d.progress,
|
|
102
|
+
mode: d.mode as number,
|
|
103
|
+
fontsize: d.fontsize,
|
|
104
|
+
color: d.color,
|
|
105
|
+
senderID: d.senderID,
|
|
106
|
+
content: d.content,
|
|
107
|
+
ctime: timestampFromDate(d.ctime),
|
|
108
|
+
weight: d.weight,
|
|
109
|
+
pool: d.pool as number,
|
|
110
|
+
attr: d.attr,
|
|
111
|
+
platform: d.platform,
|
|
112
|
+
SPMO: d.SPMO,
|
|
113
|
+
extra: d.extraStr,
|
|
114
|
+
}
|
|
115
|
+
}),
|
|
116
|
+
}),
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
static fromBiliXML(xml: string, SPMO?: string) {
|
|
120
|
+
const parser = new XMLParser({ ignoreAttributes: false }),
|
|
121
|
+
oriData: DM_XML_Bili = parser.parse(xml),
|
|
122
|
+
dans = oriData.i.d
|
|
123
|
+
return new UniPool(
|
|
124
|
+
dans.map((d) => {
|
|
125
|
+
const p_str = d['@_p'],
|
|
126
|
+
p_arr = p_str.split(',')
|
|
127
|
+
return UniDM.fromBili(
|
|
128
|
+
{
|
|
129
|
+
content: d['#text'],
|
|
130
|
+
progress: Number.parseFloat(p_arr[0]),
|
|
131
|
+
mode: Number.parseInt(p_arr[1]),
|
|
132
|
+
fontsize: Number.parseInt(p_arr[2]),
|
|
133
|
+
color: Number.parseInt(p_arr[3]),
|
|
134
|
+
ctime: BigInt(p_arr[4]),
|
|
135
|
+
pool: Number.parseInt(p_arr[5]),
|
|
136
|
+
midHash: p_arr[6],
|
|
137
|
+
id: BigInt(p_arr[7]),
|
|
138
|
+
weight: Number.parseInt(p_arr[8]),
|
|
139
|
+
},
|
|
140
|
+
SPMO,
|
|
141
|
+
BigInt(oriData.i.chatid),
|
|
142
|
+
)
|
|
143
|
+
}),
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
static fromBiliGrpc(bin: Uint8Array | ArrayBuffer, SPMO?: string) {
|
|
147
|
+
const data = fromBinary(DmSegMobileReplySchema, new Uint8Array(bin)),
|
|
148
|
+
json = data.elems
|
|
149
|
+
return new UniPool(
|
|
150
|
+
json.map((d) => {
|
|
151
|
+
return UniDM.fromBili(d, SPMO)
|
|
152
|
+
}),
|
|
153
|
+
)
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
*
|
|
157
|
+
* @param bin 符合`DmWebViewReplySchema`(bili视频meta)的protobuf二进制
|
|
158
|
+
* @param SPMO
|
|
159
|
+
*/
|
|
160
|
+
static fromBiliCommandGrpc(bin: Uint8Array | ArrayBuffer, SPMO?: string) {
|
|
161
|
+
const data = fromBinary(DmWebViewReplySchema, new Uint8Array(bin)),
|
|
162
|
+
json = data.commandDms
|
|
163
|
+
return new UniPool(
|
|
164
|
+
json.map((d) => {
|
|
165
|
+
return UniDM.fromBiliCommand(d, SPMO)
|
|
166
|
+
}),
|
|
167
|
+
)
|
|
168
|
+
}
|
|
169
|
+
static fromDplayer(
|
|
170
|
+
json: DM_JSON_Dplayer,
|
|
171
|
+
playerID: string,
|
|
172
|
+
domain = 'other',
|
|
173
|
+
) {
|
|
174
|
+
return new UniPool(
|
|
175
|
+
json.data.map((d) => {
|
|
176
|
+
// let TYPE = 0
|
|
177
|
+
// if (d[1] === 1) TYPE = 5
|
|
178
|
+
// else if (d[1] === 2) TYPE = 4
|
|
179
|
+
return UniDM.fromDplayer(
|
|
180
|
+
{
|
|
181
|
+
content: d[4],
|
|
182
|
+
progress: d[0],
|
|
183
|
+
mode: d[1],
|
|
184
|
+
color: d[2],
|
|
185
|
+
midHash: d[3],
|
|
186
|
+
},
|
|
187
|
+
playerID,
|
|
188
|
+
domain,
|
|
189
|
+
)
|
|
190
|
+
}),
|
|
191
|
+
)
|
|
192
|
+
}
|
|
193
|
+
toDplayer(): DM_JSON_Dplayer {
|
|
194
|
+
return {
|
|
195
|
+
code: 0,
|
|
196
|
+
data: this.dans.map((dan) => {
|
|
197
|
+
const d = dan.toDplayer()
|
|
198
|
+
return [d.progress, d.mode, d.color, d.midHash, d.content]
|
|
199
|
+
}),
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
static fromArtplayer(
|
|
203
|
+
json: DM_JSON_Artplayer[],
|
|
204
|
+
playerID: string,
|
|
205
|
+
domain = 'other',
|
|
206
|
+
) {
|
|
207
|
+
return new UniPool(
|
|
208
|
+
json.map((d) => {
|
|
209
|
+
// let TYPE = 0
|
|
210
|
+
// if (d.mode === 1) TYPE = 5
|
|
211
|
+
// else if (d.mode === 2) TYPE = 4
|
|
212
|
+
return UniDM.fromArtplayer(
|
|
213
|
+
{
|
|
214
|
+
content: d.text,
|
|
215
|
+
progress: d.time || 0,
|
|
216
|
+
mode: d.mode || 0,
|
|
217
|
+
color: Number((d.color || 'FFFFFF').replace('#', '0x')),
|
|
218
|
+
style: d.style,
|
|
219
|
+
},
|
|
220
|
+
playerID,
|
|
221
|
+
domain,
|
|
222
|
+
)
|
|
223
|
+
}),
|
|
224
|
+
)
|
|
225
|
+
}
|
|
226
|
+
toArtplayer(): DM_JSON_Artplayer[] {
|
|
227
|
+
return this.dans.map((dan) => {
|
|
228
|
+
const d = dan.toArtplayer()
|
|
229
|
+
return {
|
|
230
|
+
text: d.content,
|
|
231
|
+
time: d.progress,
|
|
232
|
+
mode: d.mode as 0 | 1 | 2,
|
|
233
|
+
color: `#${d.color.toString(16).toUpperCase() || 'FFFFFF'}`,
|
|
234
|
+
border: d.border,
|
|
235
|
+
style: d.style,
|
|
236
|
+
}
|
|
237
|
+
})
|
|
238
|
+
}
|
|
239
|
+
static fromDDPlay(json: DM_JSON_DDPlay, episodeId: string, domain?: string) {
|
|
240
|
+
return new UniPool(
|
|
241
|
+
json.comments.map((d) => {
|
|
242
|
+
const p_arr = d.p.split(',')
|
|
243
|
+
return UniDM.fromDDplay(
|
|
244
|
+
{
|
|
245
|
+
cid: d.cid,
|
|
246
|
+
color: Number.parseInt(p_arr[2]),
|
|
247
|
+
m: d.m,
|
|
248
|
+
mode: Number.parseInt(p_arr[1]),
|
|
249
|
+
progress: Number.parseFloat(p_arr[0]),
|
|
250
|
+
uid: p_arr[3],
|
|
251
|
+
},
|
|
252
|
+
episodeId,
|
|
253
|
+
domain,
|
|
254
|
+
)
|
|
255
|
+
}),
|
|
256
|
+
)
|
|
257
|
+
}
|
|
258
|
+
toDDplay(): DM_JSON_DDPlay {
|
|
259
|
+
return {
|
|
260
|
+
count: this.dans.length,
|
|
261
|
+
comments: this.dans.map((dan) => {
|
|
262
|
+
const d = dan.toDDplay()
|
|
263
|
+
return {
|
|
264
|
+
cid: d.cid,
|
|
265
|
+
p: `${d.progress},${d.mode},${d.color},${d.uid}`,
|
|
266
|
+
m: d.m,
|
|
267
|
+
}
|
|
268
|
+
}),
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export {
|
|
274
|
+
// UniPool,
|
|
275
|
+
UniDM,
|
|
276
|
+
UniDMTools,
|
|
277
|
+
UniIDTools,
|
|
278
|
+
type DM_JSON_BiliCommandGrpc,
|
|
279
|
+
type platfrom,
|
|
280
|
+
// type UniDMType,
|
|
281
|
+
// type UniIDType,
|
|
282
|
+
}
|