Skip to content

Bridge 协议

插件通过 WebView2 的 window.chrome.webview.postMessage 与 C++ 层通信,上层封装为 window.fb2k 对象。

Bridge 对象

插件会自动注入 window.fb2k 对象:

javascript
window.fb2k = {
    // 调用 API
    invoke(method, params) → Promise<result>,
    
    // 监听事件
    on(event, callback) → unsubscribe function,
    
    // 内部属性(勿直接使用)
    _callbacks: Map,
    _callId: number,
    _evts: Object
};

请求格式

json
{
    "id": 1,
    "method": "playback.play",
    "params": {}
}
字段类型描述
idnumber自增请求 ID,用于匹配响应
methodstringAPI 方法名,格式为 namespace.action
paramsobject请求参数

响应格式

成功响应

json
{
    "type": "response",
    "id": 1,
    "result": { "success": true }
}

错误响应

json
{
    "type": "response",
    "id": 1,
    "error": "Invalid playlist index"
}

事件格式

json
{
    "type": "event",
    "event": "playback:trackChanged",
    "data": {
        "title": "Song Name",
        "artist": "Artist Name",
        "album": "Album Name",
        "duration": 180.5
    }
}

重要注意事项

异步操作

所有 fb2k.invoke() 调用都返回 Promise,必须使用 await.then()

javascript
// ✅ 正确
await fb2k.invoke('playback.play');
const track = await fb2k.invoke('playback.getCurrentTrack');

// ❌ 错误:忘记 await 会导致操作未完成
fb2k.invoke('playback.play');
const track = fb2k.invoke('playback.getCurrentTrack'); // 返回 Promise 而非结果

事件名称格式

所有事件使用 冒号分隔 的命名格式:

javascript
// ✅ 正确格式
fb2k.on('playback:trackChanged', callback);
fb2k.on('playback:stateChanged', callback);
fb2k.on('playlist:itemsAdded', callback);

// ❌ 错误格式(不支持)
fb2k.on('playback.trackChanged', callback);
fb2k.on('playbackTrackChanged', callback);

音量格式

场景范围说明
API 输入/输出0-100整数百分比,0=静音,100=最大
滑块控件0-100直接绑定
dB 换算-0% ≈ -100dB,100% = 0dB

路径格式

API 返回的曲目对象包含两个路径字段:

字段说明
pathfoobar2000 内部路径(可能是 file-relative:// 等特殊格式)
absolutePath本地文件系统绝对路径(推荐使用)

始终使用 absolutePath

在调用需要文件路径的 API(如 artwork.getForTrack)时,始终使用 absolutePath 而非 path

路径类型

路径前缀类型示例
C:\ D:\本地文件D:\Music\song.flac
file://URI 格式file://D:/Music/song.flac
file-relative://相对路径file-relative://../../song.flac
archive://压缩包archive://D:\Album.zip|track01.flac
cdda://CD 音轨cdda://E,1
http:// https://网络流https://stream.example.com/live

文件类型识别

javascript
function getFileType(absolutePath) {
    if (!absolutePath) return 'unknown';
    if (absolutePath.startsWith('http://') || 
        absolutePath.startsWith('https://')) return 'stream';
    if (absolutePath.startsWith('cdda://')) return 'cd';
    if (absolutePath.startsWith('archive://') ||
        absolutePath.startsWith('unpack://')) return 'archive';
    return 'local';
}