// Source Plugin
音源插件
音源插件只做一件事:给定来源、歌曲和音质,返回一个能播放的地址。如果你的需求是接入一台服务器,或者要提供搜索与歌单,请写 列表插件,那里同样可以实现 musicUrl。
何时需要音源插件
- 你已经有一份根据歌曲信息解析地址的脚本(澜音或洛雪格式),想直接使用。
- 某个来源由列表插件提供了搜索和歌单,但不由它自己提供播放;播放地址交给一个独立的音源插件解析。
音源插件需要在 设置 → 插件 里显式选择当前使用哪一个;列表插件则可以同时启用多个。音源插件没有配置表单,也没有持久化存储。
澜音(CeruMusic)契约
/**
* @name 我的音源
* @version 1.0.0
* @author you
* @description 演示用音源插件
*/
module.exports = {
pluginInfo: {
name: '我的音源',
version: '1.0.0',
author: 'you',
description: '演示用音源插件',
},
sources: {
git: { name: '示例来源', qualitys: ['128k', '320k', 'flac'] },
},
async musicUrl(source, musicInfo, quality) {
const res = await cerumusic.request(
`https://example.com/resolve?src=${source}&id=${musicInfo.songmid}&q=${quality}`,
{ timeout: 10000 },
);
if (res.statusCode !== 200) throw new Error('解析失败:HTTP ' + res.statusCode);
const body = typeof res.body === 'string' ? JSON.parse(res.body) : res.body;
return body.url;
},
};
字段
| 字段 | 说明 |
|---|---|
pluginInfo.name | 必填,最多 256 个字符。version、author、description 缺失时会回退读取脚本头部注释里的 @version、@author、@description。 |
sources | 必填。键是来源 ID,只能是宿主为兼容旧版音源格式保留的 ID(如 git);音源插件不支持自定义 ID,那是列表插件的能力。 |
sources.<id>.qualitys | 该来源支持的音质数组,也可以拼作 qualities。只认 已知的音质名称,没有任何有效音质的来源会被丢弃。至少要有一个有效来源,否则安装失败。 |
sources.<id>.name | 显示名,最多 128 字符。 |
musicUrl(source, musicInfo, quality) | 必填。返回播放地址。 |
musicUrl
source:来源 ID。musicInfo:歌曲,即 MusicItem 的 JSON。quality:音质名称。- 宿主在调用之前,会先检查这个来源与音质是否在你的声明里;不在声明里的组合不会到达你的函数。
- 返回值可以是字符串,也可以是
{ url }或{ musicUrl }。地址必须是不含用户名密码的http(s)URL,长度不超过 8192。 - 抛出异常或 Promise reject 表示解析失败。
洛雪(LX)脚本
洛雪的事件式脚本(用 lx.on('request', …) 响应、用 lx.send('inited', …) 声明来源)可以直接安装,安装时会被转换成宿主能执行的形式。宿主提供了一个精简的 lx 对象:
const { EVENT_NAMES, request, on, send } = globalThis.lx;
on(EVENT_NAMES.request, ({ source, action, info }) => {
if (action !== 'musicUrl') return Promise.reject(new Error('不支持的操作'));
const song = info.musicInfo; // 歌曲
const quality = info.type; // 音质
return resolveUrl(source, song, quality); // Promise<string>
});
send(EVENT_NAMES.inited, {
sources: {
git: { name: '示例来源', type: 'music', actions: ['musicUrl'], qualitys: ['128k', '320k'] },
},
});
lx.request与cerumusic.request相同,也支持request(url, options, callback)的回调写法。lx.utils就是cerumusic.utils(crypto.md5等)。lx.env为'desktop'(移动端为'mobile'),lx.version为'2.0.0'。- 宿主只处理
musicUrl一个动作。脚本里依赖require、Node 内置模块、DOM 或文件系统的洛雪脚本无法运行。 - 脚本必须发出
inited,且已注册request处理函数,宿主才会开始调用它。
限制
音源插件使用比列表插件更小的预算:每次调用最多 16 个请求,单个响应体最大 4 MiB,内存 32 MiB,总时限同样是 30 秒,脚本不超过 1 MiB。其它与列表插件相同,见 限制一览。
调试
音源插件的错误信息被有意隐藏
为防止签名地址或凭据通过异常泄露,音源插件的失败只会显示固定文案:网络层失败是「插件网络请求失败或超时」,其它是「插件初始化或播放解析失败」。要定位原因,请在脚本里用
console.log 输出关键步骤,再到插件日志里看。
- 日志里的
[error] 解析 <来源> 失败:…是宿主记录的失败行。 - 被拒绝的地址、请求超限、响应过大都会以固定文案出现在这里。
- 更多排错步骤见 调试与发布。