UNPKG

@dan-uni/dan-any

Version:

A danmaku transformer lib, supporting danmaku from different platforms.

310 lines (309 loc) 8.16 kB
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 {};