如何在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的封装库快速实现:
- 安装依赖库
npm install windows-media-controller
- 核心代码示例(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的播放信息:
- 要求用户启动浏览器时开启远程调试端口(如Chrome添加启动参数
--remote-debugging-port=9222) - 安装依赖库
npm install chrome-remote-interface
- 核心代码示例
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
相关产品推荐
相关产品推荐

