Releases: xmcp/pakku.js
2024.12.1
新功能
没有新功能!
但是别急,2024.12.1 版本使用 WebAssembly 重构了计算文本相似度的算法,同时还对算法本身进行了多处性能优化。作为结果,当弹幕非常密集、时间阈值设置得非常大时,pakku 的处理速度有显著提升。
例如,对于视频 BV1iP4y1F7Kq,如果将时间阈值设为 60 秒、其他参数保持默认,原先处理视频第一个弹幕分片(前 6 分钟)在 R7-6800H 上用时约 12.8 秒,其中计算文本相似度用时 11.8 秒(92.2%):
新版本将此时间缩短到了约 3.4 秒,其中计算文本相似度用时 3.2 秒(95.8%):
为了喜迎性能提升,时间阈值(对新用户)的默认设置从 20 秒提高到了 30 秒。此参数可以在设置页面中修改。
重构后可能会出现一些 bug 或者兼容问题,如果发现有什么不对劲的情况可以提交 issue。新版本会由浏览器逐渐推送给所有用户,如果等不及可以去 https://s.xmcp.ltd/pakkujs/?update_banner 下载 CRX 手动更新。
其他改进
- (2014.12.2)改进了自动弹幕优选功能处理弹幕权重的计算逻辑
- (2024.12.1)改进了在分块边缘几秒钟的弹幕密度计算准确性
- (2014.12.2)WebAssembly 程序提前释放不再需要的弹幕信息,以减少内存占用
- (2014.12.2)在合并弹幕时避免复制弹幕信息,以减少内存占用和时间开销
- (2024.12.1)修改 pakku 设置后不再需要刷新所有已打开的页面才能生效
Bug 修复
- (2024.10.2)从旧版本迁移设置可能出错
- (2024.10.3)角标设置为“显示最大弹幕密度”但未计算弹幕密度时会显示为0
- (2024.12.1)弹幕密度分析图的位置与新版播放器不匹配
- (2024.12.1)没有弹幕且无法获取分片数量时提示信息不正确
- (2014.12.2)弹幕信息显示框无法识别 UP 主弹幕
- (2014.12.2)WebAssembly 程序出错时只在控制台提示而不抛出异常
2024.10.1
pakku 2024.10.1 版本主要增加了针对B站最近频繁更新的弹幕智能云屏蔽功能的相关选项。
以下是 2024.10.1 版本相比于 2024.7.1 的变化。
新功能
阻止弹幕云屏蔽
B站近期灰度测试了多个版本的 弹幕智能云屏蔽 功能。此功能将隐藏部分权重较低的弹幕,且在播放器设置中无法完全关闭。
已有很多用户反馈此功能效果欠佳,且与 pakku 的 “自动弹幕优选” 功能互相干扰。因此,pakku 2024.10.1 版本增加了选项来阻止此功能生效。
如果你希望回退到播放器原先的可以设定等级的屏蔽功能,可以在勾选此选项的同时,添加以下 全局用户脚本。同时也可以尝试 pakku 的自动弹幕优选功能作为代替。
const FILTER_LEVEL = 3; // 仅保留权重大于等于此值的弹幕,权重范围一般为1到11
tweak_after_pakku(c=>{
let orig_len = c.objs.length;
c.objs = c.objs.filter(d => d.weight >= FILTER_LEVEL);
console.log('weight filtering:', orig_len, '->', c.objs.length);
});
自动弹幕优选的逻辑改进
pakku 2024.10.1 版本重写了自动弹幕优选的逻辑。之前的逻辑只会丢弃权重为 1 且未被合并的弹幕,因此对于个别弹幕实在过多的视频,弹幕密度依然会远超设置的阈值。 目前的逻辑将灵活处理这种情况,从效果上优于之前的版本,应该也优于播放器的弹幕智能云屏蔽功能。
如果你真的想知道目前的逻辑,以下是详细解释:
首先,对于一条弹幕,我们计算它的字符串长度 L,其中
₍₁₂₃₎
等角标数字记为 0.3 个字符。设它的字号为 S(默认为 25),则这条弹幕对弹幕密度的贡献定义为:
$\sqrt{L} \times \text{max}(\text{min}(\frac{S}{25}, 2.5), 0.7)^{1.5}$ (此公式对应 dispval 函数)某个时间点 t 的弹幕密度定义为 t 减去 4.5 秒到 t 之间这段时间内所有弹幕的贡献之和。这就是打开 “弹幕密度分析图” 之后在图表上看到的数字。
如果自动弹幕优选的阈值设置为 T,那么 pakku 会从前到后依次遍历每条弹幕,若此时弹幕密度 V 大于 T,设当前弹幕由 n 个弹幕合并而成,其权重的最大值为 w(介于 1 到 11 之间),则按以下公式计算丢弃此弹幕的概率:
$p = \frac{V-T}{T} - \frac{w-1}{10} - \frac{\sqrt{n}-1}{2}$ (此公式对应 judge_drop 函数)pakku 将按照概率 p 丢弃这条弹幕(如果大于 1,将一定丢弃此弹幕;如果小于 0,则不会丢弃此弹幕)。如果此弹幕被丢弃,则它不再计入后续的弹幕密度计算。
由于目前的逻辑会丢弃更多的弹幕,在更新之后你可能需要把阈值稍微调高一些,来维持与之前相近的效果。被此功能删除的弹幕数量可以在统计信息面板中查看。
角标可以显示最大弹幕密度
此前,pakku 可以在角标上显示过滤掉的弹幕数量或百分比。现在可以设置为显示最大弹幕密度。
已知情况 1:只有打开了 “自动减小字号” 或 “自动弹幕优选” 时 pakku 才会计算弹幕密度。因此如果这两个功能都没有打开,角标将显示为 0。此问题将在下一个版本修复。
已知情况 2:如果你打开了 “自动减小字号” 功能,则角标显示的数值可能大于在弹幕密度分析图上看到的数值。这是因为前者是在缩小前计算的,后者是在缩小后计算的。
其他改进
- (2024.10.1)改进了对个别视频获取弹幕分段数量的逻辑
- (2024.10.1)调整了 “自动减小字号” 功能的预设强度
Bug 修复
- (2024.8.1)弹幕信息显示框的快捷键功能与新版播放器不兼容
- (2024.10.1)输出XML格式时maxlimit字段有误
2024.7.1
pakku 2024.7.1 版本主要包括对播放器增强功能的改进,以及用户脚本等高级功能的改进和 bug 修复。
以下是 2024.7.1 版本相比于 2024.6.1 的变化。
新功能
播放器增强
从 2024.7.1 版本起,弹幕信息显示框可以识别弹幕中的时间戳、AV/BV号、用户名等信息,点击即可跳转到对应内容:
从 2024.6.3 版本起,弹幕密度分析图将以数字形式显示弹幕密度:
此数字与自动减小字号、自动弹幕优选等功能的弹幕密度计算方法相同,可以用作设置这些功能强度的参考。
另外,2024.6.3 版本改进了部分 UI 样式,增加了圆角边框、磨砂背景、阴影等效果,并略微增大了文字间距,使其样式与播放器更协调。
高级功能改进
受浏览器限制,pakku 的每个设置项均不能超过 8KB,因此无法存储过多的正则表达式规则或过长的用户脚本。
从 2024.7.1 版本起,pakku 会对设置项进行 deflate 压缩,从而在 8KB 的限制下容纳更多(一般可以到 50%~150%)内容。
另外,从 2024.7.1 版本起,pakku 会从网页的 localStorage
读取额外的用户脚本和屏蔽词。因此如果你有大量的屏蔽词难以导入B站播放器,或者需要编写大于 8KB 的用户脚本,可以将它们存储在 www.bilibili.com 域的 localStorage
中。以下是相应的示例:
- 添加额外屏蔽词:
localStorage['pakku_extra_blacklist'] = JSON.stringify([{type: 1, filter: '^.{1,6}[天时点分钟秒]前', opened: true, id: 0}]);
(格式与B站播放器导出的 JSON 格式相同) - 添加额外用户脚本:
localStorage['pakku_extra_userscript'] = 'tweak_before_pakku(chunk=>{})';
(将被拼接到其他用户脚本的末尾)
请注意 localStorage
中存储的内容可能会在清除浏览器缓存后丢失。对于大多数用户,依然建议优先将用户脚本保存在 pakku 设置中(跟随浏览器的登录账号同步)、将屏蔽词导入B站播放器(跟随B站账号同步)。
另外,用户脚本可以利用 importScripts
函数通过 URL 引入外部文件,这也是一种绕过代码长度限制的方法。用户脚本文档 已经增加了相应的示例。
其他改进
- (2024.6.3)改进了弹幕密度分析图在高分辨率屏幕上的清晰度
- (2024.7.1)当存在多个不同时间、相同内容的弹幕时,弹幕信息显示框将读取视频当前时间来猜测要显示哪一个
- (2024.7.1)改进了选择合并后的弹幕文本的算法
- (2024.6.3)改进了弹幕信息显示框与 Bilibili-Evolved 的弹幕空降功能的兼容性
- (2024.7.1)在统计信息弹窗中显示用户脚本的执行时长,而非用户脚本数量
- (2024.6.3)改进了配置加载失败时的错误提示(#287)和版本更新提示
- (2024.6.2)设置页面为每个平台分别展示对应的商店评分链接
Bug 修复
- (2024.7.1)升级 pakku 版本后全局用户脚本可能会被清空
- (2024.6.3)跨域 iframe 播放器无法正常加载弹幕
- (2024.6.2)切换视频后,弹幕信息显示框和弹幕密度分析图可能工作异常
- (2024.7.1)在设置页面的正则表达式输入框按回车键会真的输入一个回车
- (2024.6.3)弹幕密度分析图可能仅当鼠标在进度条上左右移动后才显示
- (2024.7.1)弹幕密度分析图可能显示在错误的高度
2024.6.1
pakku 2024.6.1 版本主要增加了一些高级用户可能会用到的新功能,以及一些性能提升和 bug 修复。
以下是 2024.6.1 版本相比于 2024.5.1 的变化。
新功能
弹幕密度分析图更新
在此前的版本中,弹幕密度分析图并不会显示有多少弹幕被删除了(包括命中播放器屏蔽词和被自动弹幕优选功能删除的弹幕)。从 2024.6.1 版本起,弹幕密度分析图会把被删除弹幕的密度显示为一个独立的部分。
如下图所示,图中的蓝色、黄色、红色部分分别对应实际显示的、被合并的、被删除的弹幕密度。因此之前版本的红色对应现在的黄色。
另外,2024.6.1 版本还调整了弹幕密度分析图的密度计算公式,使其与 pakku 其他功能的计算方式相同。
通过用户脚本修改弹幕元信息
从 2024.6.1 版本起,用户脚本新增 tweak_proto_view
API,可以修改播放器获取到的弹幕元信息(api.bilibili.com/x/v2/dm/web/view),详见 用户脚本文档。
由于这是 B 站播放器的私有 API,pakku 不保证此接口的稳定性,也无法解释每个字段的准确含义。可以在播放器页面的 console 里搜索 “pakku protobuf api: got view” 来看看它的具体内容。
以下是一些利用此 API 可以实现的功能:
tweak_proto_view(view=>{
// 删除视频中的一键三连按钮
view.commandDms = view.commandDms.filter(d => d.command!=='#ATTENTION#');
// 禁用表情弹幕,如 “OHH”
view.expressions = [];
// 删除偶尔出现的贴片广告,如 “云视听小电视”
view.activityMetas = [];
view.maskWalls = [];
view.postPanel = [];
view.postPanelV2 = [];
// 非硬核会员启用 “硬核会员弹幕模式” 选项
view.dmSetting.seniorModeSwitch = 3;
});
自定义数值类型选项
pakku 的设置页面中有很多数值类型的选项,但仅能在几个预设值(禁用、轻微、中等、强力)中选择一个。从 2024.6.1 版本起,勾选了 “我是高级用户” 后,可以选择 “自定义” 然后输入其他数值:
另外,从 2024.6.1 版本起,“自动弹幕优选" 功能的阈值预设从 240、160、100 调整为 150、100、70。更新后将保持原来设置的数值,因此原先设置为 “中等 (>160)” 将在更新后显示为 “自定义 (>160)”。
性能提升
- (2024.5.2)预读取视频时长,对短视频避免预加载多余分片或创建多余的 Web Worker
- (2024.5.4)改进播放器重新加载弹幕的方式,避免在视频页面反复开关 pakku 时消耗额外内存
- (2024.6.1)减少关键路径上的
await
以缓解处理弹幕时主线程被播放器阻塞
其他改进
- (2024.5.2)弹幕处理结果页面选择输出为 debug 格式时,将把弹幕保存为全局变量
D
,以便用 console 调试 - (2024.5.2)弹幕处理结果页面选择输出为 XML 格式时,将增加弹幕的云屏蔽权重字段
- (2024.6.1)统计信息面板将显示执行的用户脚本数量
- (2024.6.1)更新了设置页面的示例图片
- (2024.5.3)完善了导入设置时的合法性检查
- (2024.5.4)设置保存失败时增加错误提示
- (2024.5.2)对 Edge 商店提交单独打包的版本,此版本按审核要求去除了设置页面中提及其他浏览器的内容
Bug 修复
- (2024.5.2)播放器无法从B站账号同步弹幕设置(#282)
- (2024.5.3)从旧版本升级时,设置迁移可能工作不正常导致设置损坏(#283)
- (2024.6.1)未被合并的弹幕也会显示为被 pakku 标准化后的文本
- (2024.5.4)按住 ctrl 查询弹幕信息功能对 UP 主弹幕无法工作
- (2024.5.3)与其他设备上的旧版 pakku 同时使用时,浏览器的同步功能可能导致设置损坏
- (2024.5.4)重置所有设置时 “阻止弹幕动态更新" 功能的生效状态没有应用
- (2024.5.2)弹幕处理结果页面无法获取结果时将卡在 “loading...” 状态
- (2024.5.4)用户脚本的最后一行是注释时会报告为存在语法错误
- (2024.6.1)用户脚本的 Web Worker 没有及时关闭导致消耗额外内存
- (2024.5.2)解析 URL 参数的方式不符合规范
2024.5.1
经历了 ManifestV3 重构后,经过半个多月的测试,恶性 bug 基本修复完毕。在此发布 pakku 2024.5.1 功能更新,这也将是 pakku 首个上架 Edge 商店的 ManifestV3 版本。为什么四月就发布了 2024.5.1 版本?因为等 Edge 商店审核通过了就该到五月了。
以下是 2024.5.1 版本相比于 2024.4.1 的变化。
新功能
自动弹幕优选
有些视频可能会出现激烈争吵、讨论、版聊等情况,导致弹幕合并之后的密度仍然过高,影响观看体验。
从 2024.5.1 版本起,新增自动弹幕优选功能,在瞬时弹幕密度过高时,将按比例删除云屏蔽权重为 1 且未被合并的弹幕,从而使弹幕密度大致不超过一个上限。
此功能默认禁用,可以在选项中设置强度:
在图中可以看到,从 2024.5.1 版本起,“自动减小字号” 功能也可以调节强度了(原先功能开启时的强度对为现在的中等档位)。
以视频 小米SU7,全国首撞!(BV1PE421u7UV) 为例,以下是自动弹幕优选功能设置为不同强度时的弹幕密度,可见弹幕密度过高的情况得到了缓解:
保存并处理本地弹幕
从 2024.4.3 版本起,点击 pakku 弹窗的 “弹幕 xxx → xxx” 文字进入弹幕处理结果页面后,增加了保存按钮,可以将处理结果保存为 XML 或 Pakku Debug 格式:
其中 Pakku Debug 格式为使用 JSON(输出时带单行注释和末尾逗号)存储的 DanmuObject[]
类型,在 用户脚本文档 中有相关类型定义。
从 2024.4.3 版本起,优化了与 Bilibili-Evolved 共同使用的体验。当 pakku 开启时,Bilibili-Evolved 的下载弹幕组件(v2.8.10 或更新版本)将下载 pakku 处理后的弹幕。
从 2024.4.3 版本起,新增批量处理本地弹幕功能 (#274),可以使用 pakku 处理本地存储的 XML 或 Pakku Debug 格式弹幕:
从 2024.4.4 版本起,可以右键点击 pakku 图标展开菜单,进入此功能:
读取播放器屏蔽词
pakku 会默认读取播放器屏蔽词,在合并弹幕之前先按屏蔽词过滤一遍弹幕,从而使数量标记和弹幕密度计算更准确,并避免数量标记影响正则匹配。
从 2024.4.3 版本起,可以在统计信息面板中查看每个屏蔽词的命中次数:
从 2024.5.1 版本起,如果不需要读取播放器屏蔽词,可以在设置中关闭此功能:
性能提升
- (2024.4.5) hook 了播放器的 view 请求,使得加载完成时间提前大约几百毫秒
- (2024.5.1) 提前加载第一个分片,使得第一个分片上屏时间提前大约几百毫秒
- (2024.5.1) 线程数量设置为 1 时将依然使用 Web Worker 来避免阻塞页面(设置为 0 来完全禁用 Web Worker)
- (2024.5.1) 对没有弹幕的分片不进行合并,节省 Web Worker 通信开销
其他改进
- (2024.5.1) 在 “正在下载/处理弹幕” 提示语后增加进度信息
- (2024.5.1) 改进了分块边界几秒钟的弹幕密度计算准确度
- 改进了多处异常处理和错误提示
- 调整了设置页面的编排逻辑
- 完成了全部残留代码的 TypeScript 和 ES6 重构
Bug 修复
- (2024.4.2) Firefox 平台少数情况下无法工作 (#272)
- (2024.4.6) Chrome 99-110 版本下无法工作 (#278)
- (2024.4.5) “阻止弹幕动态更新” 功能会导致直播弹幕不显示
- (2024.4.3) 播放器屏蔽用户被识别为屏蔽词 (#275)
- (2024.5.1) Chrome 94(如搜狗浏览器和 QQ 浏览器)安装时报错,目前可以安装,但部分功能不可用且设置页面会出现警告
- (2024.4.7) 播放器屏蔽词正则表达式存在语法错误时无法工作 (#279)
- (2024.5.1) 处理本地弹幕功能输出 Debug 格式时结果可能不全
- (2024.5.1) 在搜索结果和个人空间页面鼠标悬停在视频预览时会加载全量弹幕
- (2024.4.5) 弹幕数量极多时弹幕处理结果页面无法工作
- (2024.4.4) 播放器换P后统计页面显示不正常
- (2024.4.4) 页面刷新后角标文本没有清空
- (2024.4.4) 切换工作状态后会再次下载弹幕
- (2024.4.6) 解析特殊弹幕 JSON 和屏蔽词的行为与播放器有差异
- (2024.4.4) Chrome 平台的用户脚本和处理本地弹幕功能依赖于 crbug.com/1504703
- (2024.5.1) 旧版残余的选项没有清理
此版本已经上架 Chrome Web Store 和 Mozilla Add-Ons。因此除 Edge 用户外,无需任何操作,等待浏览器自动更新即可。
2024.4.1
此前的 v2024.3.1 在大型重构后确实引入了亿些bug。此版本带来了bug修复和其他优化,建议v2024.3.1用户现在更新,旧版用户可以等待浏览器自动更新。
Chrome平台目前已对10%用户灰度发布,Firefox平台已全量发布,Edge平台暂未发布,将在测试稳定后发布。
修复的bug
- 删除强制合并规则会导致设置损坏
- 弹幕密度计算错误导致弹幕密度过大时减小字号功能异常
- iframe中的播放器无法加载弹幕
- 在换P后弹幕信息面板找不到弹幕详情
- 按住ctrl时可能会显示多余的弹幕
- 没有使用出现次数最多的文本
- 更改阻止弹幕动态更新设置后没有立刻生效
- 在首页或播放器页面鼠标移过其他视频缩略图时预览弹幕会误触发合并
- 大会员彩色弹幕被点赞后样式异常
- 弹幕分片编号显示错误
其他优化
- 改善了首个分片的加载性能
- 调整了弹幕密度计算公式
- 改善了忽略多余空格选项对中文的支持
- 改善了Firefox平台的用户脚本错误提示
- 调整了部分默认设置
- 改善了部分界面的文案和文档
Chrome或Edge用户可以下载CRX安装包提前更新到最新版。此前在Firefox中安装了2024.3.1版本的用户需要卸载后安装正式版。
2024.3.1
这是 pakku 的一次大型重构,目前在 Chrome Web Store 上发布了 1% 用户的灰度测试,将在一段时间后全量发布。
主要更新内容如下:
新功能
- 用户脚本功能: 可以使用 JavaScript 代码深度自定义 pakku 的功能,
从而一举关闭了很多 Feature Request - 并行处理: pakku 现在使用 Web Worker 并行处理弹幕,可以大幅提升弹幕多、时间长的视频的处理性能,例如对于具有 13 万弹幕、51 分钟的 哔哩哔哩2020拜年祭(P1),在使用 3 个线程时(此为默认值,可以在选项中调整为 1 ~ 6 个),完整处理时间从 8 秒降低至 3 秒
功能改进
- pakku 将自动读取播放器的黑名单,而不需要在设置页面手动导入
- 支持了大会员彩色弹幕
- 移除了常驻后台的背景页面,在不访问B站时可节省大约 40MB 内存
- 其他界面优化
- 其他代码质量优化(使用了 TypeScript、async functions、ES modules 等现代特性)
- 以后将以
year.month.rev
格式命名版本号,因为之前的major.minor.rev
格式没什么意义,反正浏览器会自动升级扩展程序
功能移除
- 不再支持【弹幕黑名单】选项,因为现在将自动读取播放器的黑名单
- 不再支持【眼不见心不烦模式】选项(不显示重复数量大于 x 的弹幕),此功能可通过用户脚本实现
- 不再支持【设置云同步 (beta)】选项,现在将始终使用浏览器提供的同步功能