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

如何在NodeJS中获取浏览器当前播放歌曲并开发Obsidian.md插件?

解决方案:Windows平台下Obsidian插件实现浏览器曲目查看与控制

为什么MediaSession API不可用

你用的navigator.mediaSession是浏览器端专属API,Obsidian插件运行在NodeJS/Electron环境中,无法直接调用浏览器的navigator对象,因此返回null是必然的。

推荐方案:Windows原生媒体控制API(兼容所有支持系统媒体会话的应用)

Windows 10 1809及以上版本提供了GlobalSystemMediaTransportControlsSessionManager API,可统一获取系统中所有正在播放的媒体会话(包括Chrome/Edge中的YouTube Music),并支持播放/暂停/切歌控制。可以通过NodeJS的封装库快速实现:

  1. 安装依赖库
npm install windows-media-controller
  1. 核心代码示例(Obsidian插件中集成)
const { MediaController } = require('windows-media-controller');

// 初始化媒体控制器
const mediaController = new MediaController();

// 监听新的媒体会话创建
mediaController.on('sessionCreated', async (session) => {
  // 过滤出YouTube Music的会话(会话名称通常包含"YouTube Music")
  if (session.appName.includes('YouTube Music')) {
    // 获取当前曲目元数据
    const metadata = await session.getMetadata();
    console.log(`当前播放:${metadata.title} - ${metadata.artist}`);

    // 绑定控制功能
    // 播放/暂停
    await session.playPause();
    // 下一曲
    await session.next();
    // 上一曲
    await session.previous();
  }
});

// 启动控制器
mediaController.start();

// 在插件卸载时停止控制器,避免内存泄漏
// this.register(() => mediaController.stop());

备选方案:Chrome/Edge远程调试协议(CDP)

如果系统级API存在兼容性问题,可以通过浏览器的远程调试接口直接获取YouTube Music的播放信息:

  1. 要求用户启动浏览器时开启远程调试端口(如Chrome添加启动参数--remote-debugging-port=9222)
  2. 安装依赖库
npm install chrome-remote-interface
  1. 核心代码示例
const CDP = require('chrome-remote-interface');

async function connectToYTMusic() {
  try {
    const client = await CDP({ port: 9222 });
    const { Media, Runtime } = client;

    await Media.enable();
    await Runtime.enable();

    // 监听播放器属性变化
    Media.on('playerPropertiesChanged', (params) => {
      // 过滤YouTube Music的播放器实例
      if (params.playerId.includes('youtube')) {
        const titleProp = params.properties.find(p => p.name === 'title');
        const artistProp = params.properties.find(p => p.name === 'artist');
        if (titleProp) {
          console.log(`当前播放:${titleProp.value} - ${artistProp?.value || ''}`);
        }
      }
    });

    // 控制播放暂停(需先获取目标playerId)
    // await Media.play({ playerId: '目标播放器ID' });
  } catch (err) {
    console.error('连接浏览器失败:', err);
  }
}

connectToYTMusic();

Obsidian插件集成注意事项

  • 确保依赖库兼容Electron环境,部分库可能需要重新编译(可使用electron-rebuild工具)
  • 系统级API方案无需用户额外配置,体验更优;CDP方案需要引导用户开启浏览器远程调试
  • 需处理媒体会话的销毁/切换事件,确保曲目信息实时更新

内容的提问来源于stack exchange,提问作者SpeedyGo55

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:33:26