如何用JavaScript获取MPRIS2元数据?dbus-native调用问题求助
获取MPRIS2音乐播放器元数据的正确JavaScript实现
在MPRIS2规范中,Metadata是org.mpris.MediaPlayer2.Player接口下的属性,而非可调用的方法。你之前的代码错误地将其当作函数调用,这是导致问题的核心。以下是使用dbus-native库读取元数据的正确实现:
基础读取实现
import * as dbus from "@homebridge/dbus-native"; async function fetchPlayerMetadata() { const sessionBus = dbus.sessionBus(); // 获取目标播放器的Player接口实例 const playerInterface = await sessionBus.getService("org.mpris.MediaPlayer2.AudioTube") .getInterface("/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player"); // 通过DBus的Get方法读取Metadata属性 playerInterface.Get("org.mpris.MediaPlayer2.Player", "Metadata", (err, metadata) => { if (err) { console.error("读取元数据出错:", err); return; } // 输出原始元数据字典 console.log("原始元数据:", metadata); // 提取并格式化常用曲目信息 const formattedTrack = { 标题: metadata["xesam:title"], 艺术家: metadata["xesam:artist"]?.join(", "), 专辑: metadata["xesam:album"], 时长: metadata["mpris:length"] ? `${(metadata["mpris:length"] / 1000000).toFixed(2)}秒` : "未知" }; console.log("格式化曲目信息:", formattedTrack); }); } fetchPlayerMetadata().catch(console.error);
监听元数据变化(切歌自动更新)
如果需要实时监听曲目切换时的元数据更新,可以订阅PropertiesChanged信号:
// 在获取playerInterface后添加这段代码 playerInterface.on("PropertiesChanged", (interfaceName, changedProps) => { if (interfaceName === "org.mpris.MediaPlayer2.Player" && changedProps.Metadata) { console.log("元数据已更新:", changedProps.Metadata); // 这里可以添加更新UI或其他逻辑 } });
动态获取所有运行中的MPRIS2播放器
如果你不确定目标播放器的服务名称(比如系统中同时运行多个播放器),可以列出session总线上所有符合MPRIS2规范的服务:
async function listActiveMprisPlayers() { const sessionBus = dbus.sessionBus(); const dbusCore = await sessionBus.getService("org.freedesktop.DBus") .getInterface("/org/freedesktop/DBus", "org.freedesktop.DBus"); dbusCore.ListNames((err, serviceNames) => { if (err) { console.error("获取服务列表失败:", err); return; } const mprisPlayers = serviceNames.filter(name => name.startsWith("org.mpris.MediaPlayer2.")); console.log("当前运行的MPRIS2播放器:", mprisPlayers); }); } listActiveMprisPlayers().catch(console.error);
内容的提问来源于stack exchange,提问作者mikwee
相关产品推荐
相关产品推荐

