mirror of
https://github.com/Megghy/vtsuru.live.git
synced 2025-12-07 02:46:55 +08:00
add live
This commit is contained in:
117
src/data/DanmakuExport.ts
Normal file
117
src/data/DanmakuExport.ts
Normal file
@@ -0,0 +1,117 @@
|
||||
import { AccountInfo, DanmakuModel, EventDataTypes, ResponseLiveInfoModel } from '@/api/api-models'
|
||||
import { XMLBuilder } from 'fast-xml-parser'
|
||||
import { List } from 'linqts'
|
||||
|
||||
const builder = new XMLBuilder({
|
||||
attributeNamePrefix: '@',
|
||||
ignoreAttributes: false,
|
||||
processEntities: false,
|
||||
format: true,
|
||||
})
|
||||
|
||||
export function GetString(account: AccountInfo | undefined, live: ResponseLiveInfoModel, danmakus: DanmakuModel[], type: 'json' | 'xml' | 'csv') {
|
||||
const tempDanmakus = new List(danmakus)
|
||||
.Select((d) => {
|
||||
return {
|
||||
uId: d.uId,
|
||||
uName: d.uName,
|
||||
sendDate: d.time,
|
||||
type: d.type,
|
||||
message: d.msg,
|
||||
price: d.price,
|
||||
}
|
||||
})
|
||||
.ToArray()
|
||||
const obj = {
|
||||
live: live,
|
||||
danmakus: tempDanmakus,
|
||||
}
|
||||
switch (type) {
|
||||
case 'json': {
|
||||
return JSON.stringify(obj)
|
||||
}
|
||||
case 'xml': {
|
||||
const xmlJsonObj = {
|
||||
i: {
|
||||
chatserver: 'chat.bilibili.com',
|
||||
chatid: '0',
|
||||
mission: '0',
|
||||
maxlimit: '0',
|
||||
state: '0',
|
||||
real_name: '0',
|
||||
source: 'e-r',
|
||||
metadata: {
|
||||
user_name: account?.name,
|
||||
room_id: account?.biliRoomId,
|
||||
room_title: live.title,
|
||||
area: live.area,
|
||||
parent_area: live.parentArea,
|
||||
live_start_time: new Date(live.startAt),
|
||||
record_start_time: new Date(live.stopAt ?? 0),
|
||||
recorder: 'https://vtsuru.live/',
|
||||
},
|
||||
d: [] as any[],
|
||||
gift: [] as any[],
|
||||
sc: [] as any[],
|
||||
},
|
||||
}
|
||||
danmakus.forEach((danmaku) => {
|
||||
if (danmaku.type == EventDataTypes.Message) {
|
||||
xmlJsonObj.i.d.push({
|
||||
'@p': `${GetTime(danmaku)},1,25,16777215,${danmaku.time},0,-1`,
|
||||
'@uid': danmaku.uId,
|
||||
'@user': danmaku.uName,
|
||||
'#text': danmaku.msg,
|
||||
})
|
||||
} else if (danmaku.type == EventDataTypes.Gift) {
|
||||
xmlJsonObj.i.gift.push({
|
||||
'@ts': GetTime(danmaku),
|
||||
'@uid': danmaku.uId,
|
||||
'@user': danmaku.uName,
|
||||
'@giftname': danmaku.msg,
|
||||
'@giftcount': danmaku.num,
|
||||
'@cointype': (danmaku.price ?? 0) > 0 ? '金瓜子' : '银瓜子',
|
||||
'@price': (danmaku.price ?? 0) * 1000,
|
||||
})
|
||||
} else if (danmaku.type == EventDataTypes.Guard) {
|
||||
xmlJsonObj.i.gift.push({
|
||||
'@ts': GetTime(danmaku),
|
||||
'@uid': danmaku.uId,
|
||||
'@user': danmaku.uName,
|
||||
'@giftname': danmaku.msg,
|
||||
'@giftcount': danmaku.num,
|
||||
'@cointype': '舰长',
|
||||
'@price': danmaku.price,
|
||||
})
|
||||
} else if (danmaku.type == EventDataTypes.SC) {
|
||||
xmlJsonObj.i.sc.push({
|
||||
'@ts': GetTime(danmaku),
|
||||
'@uid': danmaku.uId,
|
||||
'@user': danmaku.uName,
|
||||
'@price': danmaku.price,
|
||||
'#text': danmaku.msg,
|
||||
})
|
||||
}
|
||||
})
|
||||
function GetTime(danmaku: DanmakuModel) {
|
||||
return ((danmaku.time - live.startAt) / 1000).toFixed(3)
|
||||
}
|
||||
return builder.build(xmlJsonObj)
|
||||
}
|
||||
case 'csv': {
|
||||
return objectsToCSV(tempDanmakus)
|
||||
}
|
||||
}
|
||||
}
|
||||
function objectsToCSV(arr: any[]) {
|
||||
const array = [Object.keys(arr[0])].concat(arr)
|
||||
return array
|
||||
.map((row) => {
|
||||
return Object.values(row)
|
||||
.map((value) => {
|
||||
return typeof value === 'string' ? JSON.stringify(value) : value
|
||||
})
|
||||
.toString()
|
||||
})
|
||||
.join('\n')
|
||||
}
|
||||
Reference in New Issue
Block a user