You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:25:14