From f67b21ced8a18fda2c5abf7293ec23bfb5681716 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 29 Jun 2026 15:33:36 +0000 Subject: [PATCH] feat(plugin): add winddrift.asus-keyboard-light v1.0.0 --- plugins/winddrift.asus-keyboard-light.js | 118 +++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 plugins/winddrift.asus-keyboard-light.js diff --git a/plugins/winddrift.asus-keyboard-light.js b/plugins/winddrift.asus-keyboard-light.js new file mode 100644 index 0000000..adac723 --- /dev/null +++ b/plugins/winddrift.asus-keyboard-light.js @@ -0,0 +1,118 @@ +/** + * @name ASUS 键盘背光联动 + * @id winddrift.asus-keyboard-light + * @version 1.0.0 + * @description 监听当前播放曲目封面变化,通过本地桥接服务将封面主题色应用到华硕键盘背光 + * @author WindDrift + * @homepage https://github.com/WindDrift/SPlayer-ASUS-Keyboard-Light-Controller + * @type control + * @grant network + * @apiLevel 2 + * @updateUrl https://raw.githubusercontent.com/WindDrift/SPlayer-ASUS-Keyboard-Light-Controller/main/SPlayer-ASUS-Keyboard-Light-Controller.js + */ + +splayer.register({ + events: ["trackChange"], + settings: [ + { + key: "enabled", + type: "switch", + label: "启用键盘背光联动", + default: true, + }, + { + key: "bridgeUrl", + type: "text", + label: "桥接服务地址", + default: "http://127.0.0.1:38901", + placeholder: "http://127.0.0.1:38901", + }, + { + key: "mode", + type: "select", + label: "灯效类型", + default: "0", + options: [ + { label: "恒亮", value: "0" }, + { label: "呼吸", value: "1" }, + { label: "色彩循环", value: "2" }, + { label: "闪烁", value: "10" }, + ], + }, + { + key: "brightness", + type: "select", + label: "亮度", + default: "3", + options: [ + { label: "低", value: "1" }, + { label: "中", value: "2" }, + { label: "高", value: "3" }, + ], + }, + ], +}); + +// 缓存当前曲目信息,用于设置变更时重新应用 +let currentTrack = null; + +/** + * 将封面主题色通过桥接服务应用到键盘背光 + * @param {object} track - 当前曲目对象,需包含 cover 字段 + */ +const applyBacklight = (track) => { + if (!splayer.getSetting("enabled")) return; + const url = track && track.cover; + if (!url || !/^https?:\/\//i.test(url)) { + splayer.log.debug("仅支持 HTTP 封面,跳过:", url); + return; + } + const bridgeUrl = splayer.getSetting("bridgeUrl"); + const mode = Number(splayer.getSetting("mode")); + const brightness = Number(splayer.getSetting("brightness")); + splayer + .request(`${bridgeUrl}/apply`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + url, + mode, + brightness, + title: track.title || "", + artist: track.artist || "", + album: track.album || "", + }), + timeout: 10000, + }) + .then(({ body }) => { + if (body && body.ok) { + splayer.log.info("已应用键盘背光颜色:", body.color); + } else { + splayer.log.warn("桥接服务返回失败:", body && body.error); + } + }) + .catch((err) => { + splayer.log.warn("应用键盘背光失败:", err); + }); +}; + +splayer.player.on("trackChange", ({ track }) => { + if (!track || !track.cover) { + currentTrack = null; + return; + } + currentTrack = track; + applyBacklight(currentTrack); +}); + +splayer.onSettingChange("mode", () => { + if (currentTrack) applyBacklight(currentTrack); +}); + +splayer.onSettingChange("brightness", () => { + if (currentTrack) applyBacklight(currentTrack); +}); + +splayer.onSettingChange("enabled", (value) => { + if (value && currentTrack) applyBacklight(currentTrack); +});