跳到正文

队列与发现

涵盖 fb.queuefb.jitQueuefb.discoveryfb.keyboard 四个命名空间。

fb.queue 播放队列

get()

获取当前播放队列内容。

javascript
const q = await fb.queue.get();
// q.items: [{ path, playlist, index }, ...]

getCount()

fb.queue.getCount(): Promise<{ count: number }> 获取队列中的曲目数量,返回 { count }

add(options)

向队列添加曲目。

参数类型说明
optionsobject包含 playlist、index 等标识信息
javascript
await fb.queue.add({ playlist: 0, index: 5 });

addPaths(paths, options?)

通过路径添加曲目到队列。

javascript
await fb.queue.addPaths(['E:\\\\Music\\\\song.flac']);

remove(index)

移除队列中指定位置的曲目。

javascript
await fb.queue.remove(0); // 移除队列第一项

moveToTop(index)

将队列中指定项移到顶部。

javascript
await fb.queue.moveToTop(3);

flush()

fb.queue.flush() 通过 queue.flush 清空宿主播放队列,返回值可能包含 clearedCount

clear()

清空播放队列。

javascript
await fb.queue.clear();

fb.jitQueue JIT 即时队列

JIT 队列是一种即时播放机制,插入的曲目会在当前曲目结束后立即播放。

getState()

获取 JIT 队列状态。

javascript
const state = await fb.jitQueue.getState();

enqueueNext(options)

将曲目排入"下一首播放"。

javascript
await fb.jitQueue.enqueueNext({ playlist: 0, index: 3 });

playNow(options)

立即播放指定曲目。

javascript
await fb.jitQueue.playNow({ playlist: 0, index: 5 });

preloadBatch(options)

fb.jitQueue.preloadBatch(options) 从可选的 startIndex 开始预加载 urlsreplace 决定是否替换现有预加载缓冲区。超过 2048 字符的 URL 会被跳过,并计入 invalidCount

javascript
await fb.jitQueue.preloadBatch({
	urls: ['https://example.invalid/audio/one.flac'],
	startIndex: 0,
	replace: true,
});

skip()

跳过当前 JIT 队列项。

stop()

停止 JIT 队列播放。

clear()

清空 JIT 队列。

notifyEmpty()

通知 JIT 队列已清空(用于回调通知)。

JIT 队列事件

通过 fb.on() 订阅 jitQueue:needNextjitQueue:trackChangedjitQueue:listExhaustedjitQueue:preloadCompletejitQueue:error。对应的 payload 类型均从包根导出。

javascript
const off = fb.on('jitQueue:needNext', ({ currentTrackId, reason }) => {
	console.log(currentTrackId, reason);
});

fb.discovery 服务发现

提供 foobar2000 内部服务、菜单命令、组件的枚举与执行能力。

getAllServices()

获取所有已注册的服务列表。

javascript
const { discovery } = fb;
const r = await discovery.getAllServices();

getMainMenuCommands(options?)

获取所有主菜单命令。默认会展开运行时构建子菜单的组件(mainmenu_commands_v2,如 ESLyric),因此结果中除父命令外还包含其子命令;传 { expandDynamic: false } 则只返回静态注册表。

javascript
const cmds = await fb.discovery.getMainMenuCommands();
// cmds.commands: [{ guid, subGuid?, name, path, isDynamic, kind }, ...]
// cmds.dynamicCount: 展开出来的子命令数量

getMainMenuGroups()

获取主菜单分组。仅枚举静态注册的 mainmenu_group 服务;运行时子菜单是命令节点树,不在此列表中,请用 getMainMenuCommands()

executeMainMenuCommand(guid, subGuid?)

执行指定 GUID 的主菜单命令。对展开自动态子菜单的条目,必须同时传该条目的 subGuid,否则只会派发静态父命令。

javascript
await fb.discovery.executeMainMenuCommand('{xxxxxxxx-...}');

// 动态子命令:guid + subGuid 成对使用
const lyric = cmds.commands.find((c) => c.isDynamic && c.name.includes('ESLyric'));
await fb.discovery.executeMainMenuCommand(lyric.guid, lyric.subGuid);

getContextMenuCommands()

枚举所有可用的右键菜单命令。

executeContextMenuCommand(options)

执行右键菜单命令。

javascript
const { discovery } = fb;
await discovery.executeContextMenuCommand({ guid: '...' });

executeContextMenuByPath(options)

通过菜单路径执行右键菜单命令。

javascript
await fb.discovery.executeContextMenuByPath({ path: 'Properties', handles: [...] });

getContextMenuTree()

获取当前上下文(正在播放/选择)的右键菜单树。

getInputFormats()

获取所有支持的输入格式(解码器)。

javascript
const r = await fb.discovery.getInputFormats();
// r.formats: [{ name, extensions }, ...]

getComponents()

获取所有已加载的组件列表,返回 { components, count }

javascript
const components = await fb.discovery.getComponents();

getUIElements()

获取所有 UI 元素。

getDspEntries()

获取所有 DSP 插件条目。

getOutputDevices()

获取所有输出设备。

getPreferencePages()

获取所有偏好设置页面。

searchCommands(query)

搜索菜单命令。

参数类型说明
querystring搜索关键词
javascript
const { discovery } = fb;
const r = await discovery.searchCommands('convert');

fb.keyboard 全局快捷键

registerHotkey(key, action, options?)

注册全局快捷键。

参数类型说明
keystring快捷键组合,如 'Ctrl+Shift+P'
actionstring触发的动作标识
optionsobject可选配置
javascript
await fb.keyboard.registerHotkey('Ctrl+Shift+P', 'playPause');

registerShortcut(key, action)

注册快捷键(简化版)。

javascript
await fb.keyboard.registerShortcut('Space', 'toggle');

unregisterHotkey(options)

注销快捷键。

javascript
await fb.keyboard.unregisterHotkey({ key: 'Ctrl+Shift+P' });

getRegisteredHotkeys()

获取所有已注册的快捷键列表。

javascript
const r = await fb.keyboard.getRegisteredHotkeys();

keyboard:hotkey

keyboard:hotkey 事件携带 KeyboardHotkeyPayload,其中包含数字 idkeyaction

javascript
fb.on('keyboard:hotkey', ({ id, key, action }) => {
	console.log(id, key, action);
});