自定义源脚本编写入门——自己写一个音源脚本
为什么要自己写音源脚本
- 现有音源脚本失效了——第三方平台接口变化或脚本作者停止维护。
- 想支持某个特定平台——比如你想用某个小众音乐平台的资源,但找不到现成的音源脚本。
- 想定制行为——比如固定使用某个音质、过滤某些歌曲、添加自己的搜索逻辑。
洛雪音乐的自定义源接口文档是公开的,有 JavaScript 基础就能上手。
脚本的基本结构
每个音源脚本文件(.js)开头必须有元信息注释块:
/**
* @name 音源显示名称
* @description 音源简介
* @version 1.0.0
* @author 你的名字
* @homepage http://your-site.com
*/
然后导入宿主注入的 API:
const { EVENT_NAMES, request, on, send } = globalThis.lx;
脚本核心逻辑包括三部分:
- 声明能力:加载完成后发送
inited事件,告诉宿主你支持哪些音质、哪些操作。 - 事件处理:用
on()注册宿主请求的处理函数。 - 发起请求:用
request()从第三方平台获取数据。
宿主注入的核心 API
request(url, options, callback)
发起 HTTP 请求。与浏览器的 fetch 类似,但不受同源策略限制(脚本可以向任意域名发请求)。
request('https://api.example.com/search?q=' + keyword, (err, resp) => {
if (err) return console.error(err);
const data = JSON.parse(resp.body);
// 处理数据
});
on(eventName, handler)
注册事件处理函数。宿主会向脚本发送各种请求事件:
search:搜索歌曲musicUrl:获取播放 URLpic:获取专辑封面lyric:获取 LRC 歌词- 其他...
on(EVENT_NAMES.request, ({ action, info, source }) => {
if (action === 'musicUrl') {
// info 包含歌曲信息和请求的音质
const url = 'https://api.example.com/music/' + info.songmid + '/url';
request(url, (err, resp) => {
if (err) return send(EVENT_NAMES.response, { action, info, source, err });
send(EVENT_NAMES.response, { action, info, source, data: resp.body });
});
}
});
send(eventName, data)
向宿主发送事件。最常用的是发送响应数据:
send(EVENT_NAMES.response, {
action: 'musicUrl',
source: 'my-source',
info: { songmid: 'xxx' },
data: 'https://audio.example.com/song.flac'
});
音质声明
脚本加载完成后,向宿主发送 inited 事件,声明自己支持哪些音质:
const qualitys = {
mysource: {
'128k': 'standard',
'320k': 'high',
'flac': 'lossless',
}
};
send(EVENT_NAMES.inited, {
source: 'mysource',
name: '我的音源',
qualitys
});
qualitys 对象映射了宿主请求的音质标识(左侧)到你的平台内部使用的音质参数(右侧)。
脚本编码要求
- UTF-8 编码:文件必须用 UTF-8 编码保存。
- ES6+ 语法:支持现代 JavaScript 语法(const / let / 箭头函数 / Promise / async-await 等)。
- 沙箱环境:脚本运行在宿主注入的沙箱中,只能使用
globalThis.lx提供的 API,不能访问文件系统或 Node.js 原生模块。
最简音源脚本骨架
/**
* @name 测试音源
* @description 我写的第一个音源脚本
* @version 1.0.0
* @author 我
*/
const { EVENT_NAMES, request, on, send } = globalThis.lx;
const sourceName = 'test-source';
// 1. 声明初始化
send(EVENT_NAMES.inited, {
source: sourceName,
name: '测试音源',
qualitys: {
testsource: { '128k': '1' }
}
});
// 2. 注册请求处理
on(EVENT_NAMES.request, ({ action, info }) => {
if (action === 'musicUrl') {
// 获取播放 URL
const url = 'https://your-api.com/music?id=' + info.songmid;
request(url, (err, resp) => {
if (err) return send(EVENT_NAMES.response, { action, info, source: sourceName, err });
send(EVENT_NAMES.response, { action, info, source: sourceName, data: resp.body });
});
}
});
测试和调试
脚本写好后:
- 打开洛雪音乐 → 设置 → 自定义源管理 → 导入。
- 选择你的
.js文件。 - 勾选启用,看是否显示「初始化成功」。
- 按
Ctrl + Shift + I打开开发者工具 → Console 标签,查看脚本输出的日志和错误。
开发者工具的 Console 是调试音源脚本的主要手段——console.log / console.error 的输出都会显示在那里。
学习资源
- 官方的自定义源说明文档(lxmusic.toside.cn/desktop/custom-source)。
- GitHub Issues 中搜索「自定义源」或「custom source」,看看别人分享的脚本。
- 开源社区的分享:GitHub、Gitee、掘金、CSDN 等平台有大量源码示例。
法律与合规
⚠️ 自行编写音源脚本时必须注意:
- 不要绕过平台的反爬机制,否则可能触发法律风险。
- 不要用于商业用途。
- 使用第三方平台接口时遵守该平台的服务条款。
- 洛雪音乐官方不托管、不背书任何第三方音源脚本,包括你自己写的。