MIT License

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

Widdit/now-playing-service技术分析

项目背景与痛点

在当今的数字音乐时代,获取和展示「正在播放」的歌曲信息已经成为众多多媒体软件和直播场景中的标配功能之一。然而,各大音乐软件间的协议和API接口各有不同,缺乏一个通用的解决方案,这给开发者带来了不少困扰。Widdit/now-playing-service应运而生,它支持检测20多款热门音乐软件的歌曲信息,并提供便捷的API接口,适配OBS及其他直播软件与日常桌面使用。这不仅减轻了开发者的工作负担,还为用户提供了无缝的体验。

核心技术揭秘

Widdit/now-playing-service通过使用跨平台的Node.js为核心技术栈,结合多种设计模式和数据流处理方案,实现了对多款音乐软件插件的无缝集成与观测。其架构设计考虑了多种因素,包括性能、接口一致性以及维护的复杂度。

graph TD A[用户请求API] --> B[Router] B -->|"监听服务"| C{"检测音乐软件"} C -->|"发现插件"| D[插件加载] C -->|"未发现插件"| E[错误处理] D --> F[插件执行] F --> G{"获取歌曲信息"} G -->|"成功获取"| H[信息返回] G -->|"失败获取"| I[日志记录] H --> J[数据格式化] J --> K[返回用户]

该项目的核心算法在于能够准确捕获系统内多个音乐软件的播放状态及歌曲信息。这需要对各类音乐播放器做详尽的适配研究,例如iTunes、Spotify、网易云音乐等,并逐个解析它们的API文档,从而快速响应用户请求,及时呈现歌曲信息。并且通过状态机模型管理播放状态,提高系统整体的响应效率与稳定性。

功能亮点与差异

Widdit/now-playing-service显著区别于其他竞品之处在于其设计的人性化和功能的便捷性。内置精美的歌曲组件和播放器组件,提供了丰富的自定义选项,使得展示效果更具多样化。不仅如此,Widdit/now-playing-service支持OBS等直播平台,优化了整个生产环境的体验。其灵活的API接口设计也使得与第三方系统对接变得简单,广泛适用于各类业务场景。

应用场景与落地建议

在生产环境中使用Widdit/now-playing-service时,需要关注性能优化、错误处理以及接口文档的详细阅读。对于直播场景,确保网络稳定性和数据流动的时效性尤为重要。在日常桌面使用中,则更关注美观性和交互体验。因此,在实际应用时,可以根据不同的业务需求选择适合的组件和插件,最大化发挥Widdit/now-playing-service的价值。

合理利用内置API进行接口灵活整合,可以实现从云端到终端之间的流畅播放信息展示,适用于从音乐会直播到个人社交媒体分享等各种实际应用场景,极大地方便了终端用户的使用。

综合评价

Widdit/now-playing-service作为一款全能的「正在播放」歌曲展示工具,具有以下显著优势:

  • 全面支持:兼容多款流行音乐播放器,覆盖用户主流需求;
  • 高可扩展性:灵活的API设计使得集成与自定义变得更便捷;
  • 界面美观:丰富的组件选项满足多样化展示需求。

其主要缺点则集中于:

  • 适配复杂度高:针对不同软件平台的适配工作量较大,未来扩展性较难保证;
  • 兼容性问题:部分歌曲组件在特定环境可能表现不稳定或不符合预期。

总体而言,Widdit/now-playing-service为现代多媒体应用提供了一站式解决方案,极大地方便了开发者和用户群体,适合作为音乐展示工具的首选。

简要分析

热度分
1067
价值分
588
活跃状态
活跃

语言占比

AutoHotkey
C#
CSS
HTML
Java
JavaScript

Release

README

Banner

一款用于直播/桌面的「正在播放」歌曲信息展示工具

此仓库为 Now Playing 后端代码仓库,前端代码请访问:now-playing-frontend

QQ 交流群:150453391


功能特性

核心功能

  • 歌曲组件:实时检测并展示正在播放的歌曲信息,包括歌名、作者、封面、时长及播放进度
  • 歌词组件:提供近 40 个配置项,支持全方位自定义;智能匹配最佳歌词,同时获取多种歌词源并采用最佳结果
  • 播放器:仿 Apple Music 风格的播放器页面,展示歌曲信息与滚动歌词;支持电脑、移动设备等多端同步使用
  • 信息输出:系统会生成包含当前歌曲信息的文件,供直播软件读取,支持模板自定义展示歌曲信息
  • API 接口:开发者可利用 Now Playing API 自行设计前端页面,并通过软件内置服务器进行本地部署

支持平台

支持 20+ 音乐平台,持续扩充中:

类型 平台
国内平台 网易云音乐、QQ音乐、酷狗音乐、酷我音乐、汽水音乐、全民K歌
国外平台 Spotify、Apple Music、YouTube Music
点歌机 咩播、卡西米尔唱片机、花花直播助手、BQ 点歌姬
本地播放器 PotPlayer、Foobar2000、AIMP、Salt Player、SPlayer-Next
其它 浏览器、洛雪音乐、MusicFree、Cider、YesPlayMusic

检测能力

  • 歌曲信息:歌名、歌手名、专辑名、歌曲封面、时长
  • 进度条信息:进度条位置、播放状态(播放/暂停)
  • 识别方式:支持窗口标题 / SMTC 两种方式

兼容性

  • 直播软件:适用于 OBS、B 站直播姬、抖音直播伴侣、斗鱼直播伴侣、虎牙直播、视频号直播、小红书直播、Streamlabs 等各类直播软件
  • 操作系统:Windows 10 / 11(64 位)

界面预览


使用方法

方法一:下载整合包(推荐)

  • 前往 Release 页面下载整合包
  • 开箱即用,无需进行任何配置

方法二:结合第三方网站

  1. 前往 网站 并使用 Google 账号登录(仅登录时需要梯子)
  2. 点击 “Widgets” 页面进入组件设置页面
  3. 在 “Music Service” 中选择 “YouTube Music”,下方样式设置可自由调整
  4. 在 “OBS Setup” 中点击 “Click here to copy your URL” 复制链接
  5. 在直播软件中添加浏览器源,将复制的 URL 填入

方法三:使用 API 自行开发

  • 开发者可利用 Now Playing API 自行设计前端页面,并通过软件内置服务器进行本地部署

  • API 接口界面:


开发引导

核心代码(Java)

使用 IDEA 打开项目(需注意:请使用 JDK 11 运行):

操作 步骤
运行 运行 NowPlayingApplication 类的 main 方法
打包 依次双击 IDEA 右侧 Maven → Lifecycle 的 clean 和 package,在 target 目录下生成 JAR 包
JAR To EXE 使用 exe4j 将 JAR 包转为 EXE

外部程序(C#)

external_programs/AudioService/GetMusicStatus 使用 VS Code 打开:

操作 命令
运行 dotnet run
打包 dotnet publish -c Release -r win-x64 --self-contained -o ./publish

程序原理

通过 Assets/AudioService/GetMusicStatus.exe 程序检测音乐软件的播放状态(Playing、Paused、None)和歌曲信息,通常情况下每隔 1 秒输出一次,当检测到歌曲状态变化时会立即输出。

点击展开详细原理

命令行参数

接收命令行参数(具体取值请参考 源码):

参数 含义 描述
--device-id 音频设备 ID 仅检测该音频设备,默认值为 default,检测默认音频设备
--platform 音乐平台 期望检测的音乐软件平台,默认值为 netease,检测网易云音乐
--smtc 是否优先使用 SMTC 优先通过 SMTC 识别歌曲信息,默认值为 true
--poll-interval 轮询间隔(ms) 建议取值范围为 100~1000 ms,默认值为 100 ms(最快)

独立运行示例

GetMusicStatus.exe 程序可独立运行,运行示例如下图所示:

执行流程

说明

由于播放进度是通过算法逻辑计算出来的,所以拖动进度条无法检测,但暂停动作可以检测到。该部分使用了 这段代码 来获取指定进程的实时音量,从而判断音乐是否暂停。

但是针对网易云音乐、全民K歌已单独适配,C# 程序通过 UI Automation 读取主窗口的进度文本(MM:SS / MM:SS),可以实时捕捉到拖动进度条的动作。

若支持进度条同步,GetMusicStatus.exe 会在原先两行输出(状态、歌曲信息)之外额外输出一行 Progress:currentSec|totalSec;如果读取失败,会自动回退原先的两行输出。


Star History

Star History Chart

评论

暂无评论