@dan-uni/dan-any

中文文档
2.3.9发布于 2026/07/20LGPL-3.0-or-laterTypeScriptESM + CJS构建来源已验证近 30 天下载 5248

由不同平台支持的 danmaku 变压器 .

中文使用文档
文档目录15 节
  1. 功能概览
  2. Formats 支持转换的格式
  3. Plugins 常用插件
  4. 安装
  5. 接入 SKILL
  6. 快速开始
  7. 1) 从 Bilibili XML 导入,再导出为 Danuni JSON
  8. 2) 在处理链中使用插件
  9. 3) PB 双向示例(导出再导入)
  10. 高级: 提供兼容的drizzle+pglite实例接入自己的数据库
  11. 高级: 使用 WildcardAdapterUtil 进行格式自动识别与导入
  12. 高级: 自行实现 UniDB、InitedUniDB、UniChunk 方法
  13. 模块入口
  14. 开发
  15. 许可

@dan-uni/dan-any

@dan-uni/dan-any (v2) 是一个弹幕转换与处理库,用于在不同平台格式之间导入、导出与统一处理弹幕数据。

它的核心思路是:

  • 用 Adapter 把外部格式导入为统一数据
  • 用 Transformer 把统一数据导出为目标格式
  • 用 Plugin 在处理中间态(UniChunk)上做增强/清洗/统计

v2 使用 drizzle+pglite(支持MemoryFS(默认)/NodeFS/IndexedDbFS/OpfsAhpFS) 作为默认数据库选项(@dan-uni/dan-any/core/main/drizzle),同时允许通过drizzle接入自定义postgres数据库实例
v2 打包大小gzip后约100KB (大部分为打包后展开的drizzle schema定义),同时支持tree-shake,故不会大幅增加软件体积
v2 在第一次初始化实例时可能有约1s的开销,建议使用 PGLite的Multi-tab Worker 使所有调用共享一个数据库实例

v2 同时提供了纯TS实现的方法(@dan-uni/dan-any/core/main/pure),不依赖drizzle+pglite,使用Map进行数据管理。

由于pglite(调用了Emscripten生成的wasm胶水代码)在 @edge-runtime/vm ServiceWorker 下无法正常检测环境(process、pathname等无法检测),因此在这些环境下应当使用纯TS实现的方法。

功能概览

Formats 支持转换的格式

pb指protobuf格式(grpc协议下的默认传输格式)

  • DanUni(json,pb): DanuniJsonAdapter DanuniJsonTransformerConfigurator DanuniPbAdapter DanuniPbTransformer
  • bili(普通+高级弹幕,xml) 双向: BiliXmlAdapter BiliXmlTransformerConfigurator
  • bili(普通+高级弹幕,pb) 正向: BiliGrpcAdapter
  • bili(指令弹幕,pb) 正向: BiliCommandGrpcAdapter
  • dplayer: DplayerAdapter DplayerTransformer
  • artplayer: ArtplayerAdapter ArtplayerTransformer
  • 弹弹Play: DdplayAdapter DdplayTransformer
  • tencent 正向: TencentAdapter
  • vod 双向: VodAdapter VodTransformer
  • baha 双向: BahaAdapter BahaTransformer
  • iqiyi 正向: IqiyiAdapter
  • youku 正向: YoukuAdapter
  • mgtv 正向: MgtvAdapter
  • ASS(@dan-uni/dan-any-ext-ass) 双向(部分支持,仅该库生成的ass文件支持还原)

Plugins 常用插件

  • MergePluginConfigurator(合并重复弹幕)
  • DetaoluPluginConfigurator (基于pakku.js的弹幕过滤器): 由 @dan-uni/dan-any-plugin-detaolu 提供
  • DowngradeAdvancedPluginConfigurator(高级弹幕降级)
  • GetStatsTransformerConfigurator(统计输出)
  • HeatmapTransformerConfigurator(热力图生成)

安装

vp add @dan-uni/dan-any
bun add @dan-uni/dan-any
pnpm add @dan-uni/dan-any

接入 SKILL

可以从 /.agents/skills/dan-any/SKILL.md 导入技能文件。

快速开始

详细使用方法可以参考库中的测试文件。

1) 从 Bilibili XML 导入,再导出为 Danuni JSON

import { UniDB } from "@dan-uni/dan-any/core/main/drizzle";
// import { UniDB } from '@dan-uni/dan-any/core/main/pure'
import { BiliXmlAdapter, DanuniJsonTransformerConfigurator } from "@dan-uni/dan-any/adapters";

const xml = `...bili xml弹幕文本...`;

const udb = await new UniDB().init();
const chunk = await udb.import(BiliXmlAdapter(xml));
const json = await chunk.export(DanuniJsonTransformerConfigurator({ minify: true }));

console.log(json);
await udb.close();

2) 在处理链中使用插件

import { mergePluginConfigurator } from "@dan-uni/dan-any/plugins";
import { DanuniJsonTransformerConfigurator } from "@dan-uni/dan-any/adapters";

const merged = await chunk.plugin(mergePluginConfigurator(10));
const result = await merged.export(DanuniJsonTransformerConfigurator({ minify: true }));

console.log(result);

3) PB 双向示例(导出再导入)

import { DanuniPbTransformer, DanuniPbAdapter } from "@dan-uni/dan-any/adapters";

const pb = await chunk.export(DanuniPbTransformer);
const reimported = await udb.import(DanuniPbAdapter(pb));

高级: 提供兼容的drizzle+pglite实例接入自己的数据库

详见 测试文件 tests/db.test.ts 。

高级: 使用 WildcardAdapterUtil 进行格式自动识别与导入

详见 测试文件 tests/utils.test.ts 。

高级: 自行实现 UniDB、InitedUniDB、UniChunk 方法

import * as base from "./index.ts";

class UniDB implements base.UniDB {
  // 实现 UniDB 接口
}
class InitedUniDB extends UniDB implements base.InitedUniDB {
  // 实现 InitedUniDB 接口
}
class UniChunk implements base.UniChunk {
  // 实现 UniChunk 接口
}

注意实现 import/plugin 方法时需要类型转换 base.UniDB / base.InitedUniDB / base.UniChunk 为当前实现的类,以保证插件系统的类型兼容性。

详见 src/core/main-pure.ts / src/core/main-drizzle.ts 。

模块入口

包已提供以下子路径导出:

  • @dan-uni/dan-any(聚合导出)
  • @dan-uni/dan-any/adapters (导入、导出适配器)
  • @dan-uni/dan-any/core (核心类与接口定义+聚合导出core实现)
    • @dan-uni/dan-any/core/main/drizzle (drizzle+pglite核心实现)
    • @dan-uni/dan-any/core/main/pure (纯TS核心实现)
  • @dan-uni/dan-any/plugins (插件、类插件导出、类导出插件)
  • @dan-uni/dan-any/utils (工具函数)
  • @dan-uni/dan-any/core/db/schema (drizzle+pglite 数据库schema定义)
  • @dan-uni/dan-any/core/db/utils (drizzle+pglite 数据库工具函数)

开发

vp install
vp check
vp test
vp pack

许可

LGPL-3.0-or-later

版本与发布记录

@dan-uni/dan-any 共发布 86 个版本,首次发布于 2025/01/19;过去 12 个月发布了 50 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
2.3.9latest2026/07/203 个月前
2.3.82026/06/304 个月前
2.3.72026/06/304 个月前
2.3.62026/06/304 个月前
2.3.42026/06/294 个月前
2.3.32026/06/284 个月前

关于 @dan-uni/dan-any 的常见问题

@dan-uni/dan-any 是什么?

由不同平台支持的 danmaku 变压器 .

如何安装 @dan-uni/dan-any?

在项目目录运行 npm install @dan-uni/dan-any,或使用 pnpm add / yarn add / bun add。

@dan-uni/dan-any 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@dan-uni/dan-any 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@dan-uni/dan-any 可以商用吗?

@dan-uni/dan-any 使用 LGPL-3.0-or-later 许可。弱 Copyleft:作为库被调用时通常不要求开源你自己的代码,但修改库本身需以 LGPL 开源;前端打包合并后的适用边界存在不同理解。以上为概括,不构成法律意见,请以许可原文为准。

@dan-uni/dan-any 的下载量有多少?

根据 npm 官方下载统计,@dan-uni/dan-any 在 2026/10/11 – 2026/11/09 这 30 天内被下载 5,248 次,日均约 175 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@dan-uni/dan-any 还在维护吗?

最新版本 2.3.9 发布于 2026/07/20(3 个月前);至今共发布 86 个版本,其中过去 12 个月发布了 50 个;首次发布于 2025/01/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。