@dan-uni/dan-any
Version:
A danmaku transformer lib, supporting danmaku from different platforms.
310 lines (309 loc) • 8.16 kB
TypeScript
import type { DM_JSON_BiliCommandGrpc } from '..';
import type { PlatformDanmakuSource } from './platform';
import { DMIDGenerator } from './id-gen';
import { PlatformDanmakuOnlySource } from './platform';
export declare enum DMAttr {
Protect = "Protect",
FromLive = "FromLive",
HighLike = "HighLike",
Compatible = "Compatible",// 由dan-any进行过兼容处理的弹幕,可能丢失部分信息
Reported = "Reported",// 在DanUni上被多人举报过的弹幕
Unchecked = "Unchecked",// 在DanUni上未被审核过的弹幕
HasEvent = "HasEvent",// 该弹幕当前在DanUni上存在事件(如点赞/举报等)
Hide = "Hide"
}
interface DMBili {
id: bigint;
progress: number;
mode: number;
fontsize: number;
color: number;
mid?: bigint;
midHash: string;
/**
* 特殊类型解析:
* - [ohh] : /oh{2,}/gi
* - [前方高能]
* - [...] (JS数组) : 高级弹幕
*/
content: string;
ctime: bigint;
pool: number;
weight?: number;
action?: string;
idStr?: string;
attr?: number;
animation?: string;
extra?: string;
colorful?: number;
type?: number;
oid?: bigint;
}
interface DMBiliCommand extends DM_JSON_BiliCommandGrpc {
}
interface DMDplayer {
/**
* 进度(秒)
*/
progress: number;
mode: number;
color: number;
midHash: string;
content: string;
}
interface DMArtplayer {
/**
* 进度(秒)
*/
progress: number;
mode: number;
color: number;
content: string;
border?: boolean;
style?: object;
}
interface DMDDplay {
cid: bigint;
/**
* content
*/
m: string;
/**
* p[0]
*/
progress: number;
/**
* p[1]
*/
mode: number;
/**
* p[2]
*/
color: number;
/**
* p[3]
*/
uid: string;
}
export interface Extra {
artplayer?: ExtraArtplayer;
bili?: ExtraBili;
danuni?: ExtraDanUni;
}
interface ExtraArtplayer {
style?: object;
border?: boolean;
}
interface ExtraBili {
mode?: number;
pool?: number;
dmid?: bigint;
attr?: number;
mid?: bigint;
adv?: string;
code?: string;
bas?: string;
command?: DMBiliCommand;
}
export interface ExtraDanUni {
chapter?: ExtraDanUniChapter;
merge?: ExtraDanUniMerge;
}
export interface ExtraDanUniChapter {
duration: number;
type: ExtraDanUniChapterType;
}
export interface ExtraDanUniMerge {
duration: number;
count: number;
senders: string[];
taolu_count: number;
taolu_senders: string[];
}
export declare enum ExtraDanUniChapterType {
Chapter = "ch",//其它片段(用于标记章节)
Review = "rev",//回顾
OP = "op",//片头
Intermission = "int",//中场
ED = "ed",//片尾
Preview = "prvw",//预告
Cut = "cut",//删减(删减版中提供删减说明,提供开始位置、长度)
Duplicate = "dup",//补档(完整版中指明其它平台中删减位置)
AdBiz = "biz",//商业广告
AdUnpaid = "promo"
}
export declare enum ExtraDanUniChapterAction {
Disabled = -1,
ShowOverlay = 0,
ManualSkip = 1,
AutoSkip = 2
}
export declare enum Modes {
Normal = 0,
Bottom = 1,
Top = 2,
Reverse = 3,//逆向弹幕
Ext = 4
}
export declare enum Pools {
Def = 0,//默认池
Sub = 1,//重要池,建议强制加载,含字幕、科普、空降等
Adv = 2,//高级弹幕专用池,均需读取extra
Ix = 3
}
export type ctime = string | number | bigint | Date;
export interface UniDMObj {
SOID: string;
progress: number;
mode: Modes;
fontsize: number;
color: number;
senderID: string;
content: string;
ctime: Date;
weight: number;
pool: Pools;
attr: DMAttr[];
platform: PlatformDanmakuSource | string;
extra: string | Extra;
extraStr: string;
DMID: string;
}
interface Options {
dmid?: boolean | number | DMIDGenerator;
}
export declare class UniDM {
/**
* 资源ID
* @description 由某一danuni服务确定的某一剧集下不同资源(不同视频站/字幕组具有细节差异)的ID
*/
SOID: string;
/**
* 弹幕出现位置(单位s;精度为ms,即保留三位小数)
*/
progress: number;
/**
* 弹幕类型
*/
mode: Modes;
/**
* 字号
* @default 25
* - 12
* - 16
* - 18:小
* - 25:标准
* - 36:大
* - 45
* - 64
*/
fontsize: number;
/**
* 颜色
* @description 为DEC值(十进制RGB888值),默认白色
* @default 16777215
*/
color: number;
/**
* 发送者 senderID
*/
senderID: string;
/**
* 正文
*/
content: string;
/**
* 发送时间
*/
ctime: Date;
/**
* 权重 用于屏蔽等级 区间:[0,11]
* @description 参考B站,源弹幕有该参数则直接利用,
* 本实现默认取5,再经过ruleset匹配加减分数
* @description 为0时表示暂时未计算权重
*/
weight: number;
/**
* 弹幕池 0:普通池 1:字幕池 2:特殊池(代码/BAS弹幕) 3:互动池(互动弹幕中选择投票快速发送的弹幕)
*/
pool: Pools;
/**
* 弹幕属性位(bin求AND)
* bit0:保护 bit1:直播 bit2:高赞
*/
attr: DMAttr[];
/**
* 初始来源平台
* `danuni`与任意空值(可隐式转换为false的值)等价
*/
platform?: PlatformDanmakuSource | string;
/**
* 弹幕原始数据(不推荐使用)
* @description 适用于无法解析的B站代码弹幕、Artplayer弹幕样式等
* @description 初步约定:
* - Artplayer: style不为空时,将其JSON.stringify()存入
*/
extraStr?: string;
DMID?: string;
private options;
init(options?: Options): this;
validate(): Promise<void>;
static create(pjson?: Partial<UniDMObj>, options?: Options): UniDM;
get extra(): Extra;
get isFrom3rdPlatform(): boolean;
/**
* 弹幕id
* @description sha3-256(content+senderID+ctime)截取前8位
* @description 同一SOID下唯一
*/
toDMID(): string | undefined;
isSameAs(dan: UniDM, options?: {
skipDanuniMerge?: boolean;
}): boolean;
minify(): Partial<UniDMObj> & Pick<UniDMObj, "SOID">;
downgradeAdvcancedDan({ include, exclude, cleanExtra, }?: {
include?: (keyof Extra)[];
exclude?: (keyof Extra)[];
cleanExtra?: boolean;
}): UniDM;
/**
* 将各种类型的时间进行格式化
* @param oriCtime
* @param tsUnit 当`oriCtime`为数字类型表时间戳时的单位;
* 为 毫秒(ms)/秒(s)
* @returns {Date} Date格式时间
*/
static transCtime(oriCtime: ctime, tsUnit?: 'ms' | 's'): Date;
static transMode(oriMode: number, fmt: 'bili' | 'dplayer' | 'artplayer' | 'ddplay'): Modes;
static parseBiliSingle(p: string, c: string): {
content: string;
progress: number;
mode: number;
fontsize: number;
color: number;
ctime: bigint;
pool: number;
midHash: string;
id: bigint;
weight: number;
};
static fromBili(args: DMBili, cid?: bigint, options?: Options, recSOID?: string): UniDM;
toBiliXML(options?: {
skipBiliCommand?: boolean;
/**
* 见 ../index.ts UniPool.toBiliXML() 的 options,该option不宜手动调用,判断逻辑未封装
*/
avoidSenderIDWithAt?: boolean;
}): {
'#text': string;
'@_p': string;
} | null;
static fromBiliCommand(args: DMBiliCommand, cid?: bigint, options?: Options): UniDM;
static fromDplayer(args: DMDplayer, playerID: string, domain: string, options?: Options): UniDM;
toDplayer(): DMDplayer;
static fromArtplayer(args: DMArtplayer, playerID: string, domain: string, options?: Options): UniDM;
toArtplayer(): DMArtplayer;
static fromDDplay(args: DMDDplay, episodeId: string, domain?: PlatformDanmakuOnlySource, options?: Options): UniDM;
toDDplay(): DMDDplay;
}
export {};