2026/10/10 2:40:34

Bilibili-Evolved 快捷键扩展插件解析:为播放器添加「开关 CC 字幕」动作

Bilibili-Evolved 快捷键扩展插件解析:为播放器添加「开关 CC 字幕」动作 前端音视频【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved点击查看免费下载导读本文聚焦 Bilibili-Evolved 仓库中「快捷键扩展 - 开关 CC 字幕」这一内置插件围绕其唯一职责——在快捷键动作列表中添加「开关 CC 字幕」动作——展开源码级剖析。通过阅读本文你将掌握该插件的注册机制addData(keymap.actions, ...)与addData(keymap.presets, ...)数据注入、底层播放器字幕切换逻辑playerAgent.toggleSubtitle()以及如何在「快捷键设置」面板中查看、绑定与自定义这一动作并了解它与其他快捷键类插件的扩展范式差异。一、插件概述一句话的文档一整套快捷键扩展链路该插件的官方说明registry/lib/plugins/utils/keymap-toggle-subtitle/index.md非常精炼全文只有一句在快捷键的动作列表里添加一个 开关 CC 字幕。这短短一句话的背后是 Bilibili-Evolved 完整的功能插件PluginMetadata与快捷键组件keymap之间的数据通信机制。插件本身不渲染任何 UI也不直接操作 DOM 上的字幕按钮而是通过「数据注入」向快捷键组件追加一个动作定义和若干预设键位真正的开关逻辑由播放器适配层player-agent统一承担。二、插件源码逐行解析插件完整实现位于 registry/lib/plugins/utils/keymap-toggle-subtitle/index.ts共 33 行核心结构如下import { PluginMetadata } from /plugins/plugin import { playerAgent } from /components/video/player-agent import type { KeyBindingAction } from ../../../components/utils/keymap/bindings export const plugin: PluginMetadata { name: keymap.actions.toggleSubtitle, displayName: 快捷键扩展 - 开关 CC 字幕, setup: ({ addData }) { addData(keymap.actions, (actions: Recordstring, KeyBindingAction) { actions.toggleSubtitle { displayName: 开关 CC 字幕, run: async ({ showTip }) { const { result } playerAgent.toggleSubtitle() if (result no-subtitle-configured) { showTip(当前视频没有可选字幕, mdi-subtitles) } }, } }) addData( keymap.presets, ( presetBase: Recordstring, string, builtInPresets: Recordstring, Recordstring, string, ) { presetBase.toggleSubtitle shift c builtInPresets.YouTube.toggleSubtitle c builtInPresets.YouTube.coin builtInPresets.PotPlayer.toggleSubtitle alt h }, ) }, }2.1 插件元数据name: keymap.actions.toggleSubtitle全局唯一的插件名遵循「数据 key 动作名」的命名惯例与keymap.actions.toggleDanmakuList等插件一致。displayName: 快捷键扩展 - 开关 CC 字幕在组件/插件管理界面展示的名称。setup插件初始化函数接收PluginSetupParameters此处解构出addData用于向快捷键组件注入数据src/plugins/plugin.ts。2.2 注入动作addData(keymap.actions, ...)addData是 Bilibili-Evolved 的数据注入 APIsrc/plugins/data.ts其语义是向以key标识的数据对象添加一个 providerprovider 会在getData数据被加载时被一次性应用并立即丢弃。keymap组件在加载时通过registerAndGetData(keymap.actions, builtInActions)注册动作集合registry/lib/components/utils/keymap/actions.ts任何插件随后通过addData(keymap.actions, provider)即可向该集合追加新的KeyBindingAction。KeyBindingAction接口定义在 registry/lib/components/utils/keymap/bindings.tsexport interface KeyBindingAction { displayName: string run: (context: KeyBindingActionContext) unknown prevent?: boolean ignoreTyping?: boolean ignoreFocus?: boolean }本插件只使用了displayName与run两个字段displayName: 开关 CC 字幕在快捷键设置界面中展示的动作名。run: async ({ showTip }) ...动作执行函数解构出上下文中的showTip播放器区域内的提示框见 registry/lib/components/utils/keymap/actions.ts。执行时调用playerAgent.toggleSubtitle()若返回result no-subtitle-configured则向用户提示「当前视频没有可选字幕」并附带mdi-subtitles图标。2.3 注入预设键位addData(keymap.presets, ...)keymap.presets的数据结构是「基础预设presetBase 若干内置预设builtInPresets」的二元组由 registry/lib/components/utils/keymap/presets.ts 通过registerAndGetData(keymap.presets, presetBase, builtInPresets)注册。本插件向三处写入了键位预设键位说明presetBase.toggleSubtitleshift c所有预设共用的默认键位优先级最低builtInPresets.YouTube.toggleSubtitlecYouTube 风格预设builtInPresets.YouTube.coin清空 YouTube 预设中的投币键避免与c冲突因为原预设中coin默认是cbuiltInPresets.PotPlayer.toggleSubtitlealt hPotPlayer 风格预设这里的冲突处理值得注意默认基础预设registry/lib/components/utils/keymap/presets.ts中coin: c而 YouTube 预设又把字幕开关映射到c因此插件显式将YouTube.coin置空空字符串表示该动作在该预设下永不触发保证两套动作互不打架。这体现了「组合优先级」机制实际生效的键位由presetBase、所选预设、用户自定义按键三者按优先级从低到高合并registry/lib/components/utils/keymap/index.ts。三、底层原理playerAgent.toggleSubtitle()如何工作动作本体并不直接点击页面元素而是委托给播放器适配层。实现位于 src/components/video/player-agent/base.ts完整状态机逻辑如下查询关闭开关查找.bpx-player-ctrl-subtitle-close-switch元素CC 字幕的关闭开关。无字幕判定若该元素不存在说明当前视频未配置可选字幕返回{ result: no-subtitle-configured }。当前处于开启状态若关闭开关带bpx-state-active类表示字幕当前被关闭则直接click()关闭开关并返回success。当前处于关闭状态遍历.bpx-player-ctrl-subtitle-major .bpx-player-ctrl-subtitle-language-item获取所有可选字幕语言项若列表为空同样返回no-subtitle-configured。语言选择优先级读取播放器配置subtitle.preferred_language或subtitle.lansrc/components/video/player-agent/base.ts若无配置直接点击列表第一项若有配置则按「同语言人工字幕 → 同基础语言的任意人工字幕 → 同语言的 AI 字幕ai-前缀→ 列表第一项」的顺序依次匹配src/components/video/player-agent/base.ts点击命中项并返回success。返回值类型由 src/components/video/player-agent/types.ts 约束仅包含success与no-subtitle-configured两种结果插件据此决定是否提示用户。这套逻辑意味着该快捷键并非简单开关而是智能地在「打开字幕优先用户偏好语言→ 关闭字幕」之间切换与 B 站原生 CC 字幕控制面板的行为一一对应。四、使用方式在「快捷键设置」中查看与配置「开关 CC 字幕」动作随插件安装后自动出现在快捷键动作列表中具体位置与配置入口如下打开脚本设置 → 组件「快捷键扩展」registry/lib/components/utils/keymap/index.ts通过「快捷键扩展 - 搜索支持」插件提供的启动栏动作或组件内的设置面板打开「快捷键设置」弹窗registry/lib/components/utils/keymap/settings/KeymapSettings.vue在「快捷键设置」表格中找到「开关 CC 字幕」行每一行包含三列键位默认按键shift c、预设按键随预设切换如 YouTube 为c、PotPlayer 为alt h、自定义按键用户输入优先级最高。4.1 键位书写语法自定义按键输入遵循 registry/lib/components/utils/keymap/help.md 定义的规则留空表示禁用该动作永不触发直接写按键名称对应KeyboardEvent的code或key属性多个按键用空格分隔空格键本身写作space组合键支持shift/ctrl/alt/metaWindows 上是 Win 键macOS 上是 Command 键组合键为精确匹配Ctrl Shift A不会触发配置为shift a的快捷键可选的组合键用[]包裹如[ctrl] shift a同时匹配Ctrl Shift A与Shift A。4.2 键位匹配的执行细节最终键位会在每次keydown时由loadKeyBindings注册的处理器匹配registry/lib/components/utils/keymap/bindings.ts其要点包括输入框打字时默认忽略快捷键ignoreTyping、播放器控制按钮聚焦时不拦截、按修饰键精确比对后再匹配key或code命中后调用动作的run并视返回值决定是否preventDefault。五、同类插件对比与扩展范式该插件是 Bilibili-Evolved 快捷键扩展体系中「动作扩展插件」的典型样本。仓库中还存在同族插件如「快捷键扩展 - 开关弹幕列表」registry/lib/plugins/utils/keymap-toggle-danmaku-list/index.ts它同样注入keymap.actions与keymap.presets但动作体直接通过dq(.bui-collapse-header)?.click()操作 DOM并为HTML5Player、PotPlayer预设清空键位。两者对比可见设计取舍涉及播放器状态切换的动作字幕、弹幕开关、音量等统一走playerAgent适配层兼容 B 站播放器的多次改版v2/v3/v4适配涉及页面 UI 元素的动作可直接操作 DOM 选择器如投币、收藏等按钮点击。从源码结构看任何第三方插件开发者都可以复制本插件的骨架通过addData(keymap.actions, ...)addData(keymap.presets, ...)在几行代码内为 Bilibili-Evolved 的快捷键系统扩展自定义动作这正是该项目插件化数据通信设计的初衷。结语「开关 CC 字幕」插件虽然文档仅一句话却是理解 Bilibili-Evolved 插件体系的最佳切片之一一个PluginMetadata定义、两次addData调用、一次对playerAgent.toggleSubtitle()的委托便完成了从动作注册、预设键位到播放器字幕状态机的完整链路。掌握这一范式即可触类旁通地开发或理解仓库中其余数十个快捷键扩展类插件。赞分享前端音视频【免费下载链接】Bilibili-Evolved强大的哔哩哔哩增强脚本项目地址https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved点击查看免费下载相关推荐Bilibili-Evolved 快捷键扩展插件实战「开关弹幕列表」动作的实现与按键体系解析Bilibili Evolved 快捷键扩展插件实战「开关弹幕列表」动作的实现与按键体系解析 本文以 Bilibili Evolved 仓库中 registr前端音视频Bilibili-Evolved 快捷键扩展实战为动作列表添加夜间模式切换keymap-dark-mode 插件解析Bilibili Evolved 快捷键扩展实战为动作列表添加夜间模式切换keymap dark mode 插件解析 导读 本文围绕 Bilibili前端音视频Bilibili-Evolved 快捷键扩展实战剖析开关灯插件从注册到触发播放器灯光的完整链路Bilibili Evolved 快捷键扩展实战剖析开关灯插件从注册到触发播放器灯光的完整链路 本篇技术指南以 Bilibili Evolved 仓库中的前端音视频上一篇CANN Runtime 错误码 EE1019 全解析Stream 待处理任务数超限Execution_Error的成因、源码定位与解决办法下一篇Pandoc raw_tex 扩展解析LaTeX 环境原样透传的底层机制与命令测试实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考