缘起
平时在 KDE 上用落雪音乐听歌,一直想要一个美观一点的面板媒体中心:面板上直接显示当前歌曲和播放控制,点开能看到封面和歌词。KDE 自带的媒体控制组件只有个简陋的弹窗,不符合预期。
上游与不足
在 KDE 商店里找到了 plasmusic-toolbar:面板上显示歌曲信息 + 播放控制(基于 MPRIS2),点开是一个带封面和滑块的完整播放器弹窗,观感不错。但它没有歌词显示——对我来说这是硬伤,桌面歌词才是听歌体验的核心。
于是基于它开发了带歌词的版本:PlasMusic Toolbar + Lyrics(当前版本 4.2.1-lyrics,GPL-3.0)。
歌词功能设计
两级显示
- 面板视图:歌曲信息旁显示单行滚动歌词,可配置「歌词替换歌曲文字」;勾选「使用专辑封面作为图标」后,面板图标直接显示当前歌曲封面
- 展开视图:完整播放器界面下方显示多行同步歌词,当前行高亮、跟随播放进度滚动,周围行渐变淡出
歌词同步基于 MPRIS2 播放进度,每 200 ms 匹配一次当前行。
三级获取链
歌词获取是逐级回退的三级策略:
| 级别 | 来源 | 说明 |
|---|---|---|
| 1 | 落雪音乐本地开放 API | GET http://localhost:23330/lyric,中文歌曲库覆盖最好 |
| 2 | LRCLIB 精确匹配 | 按歌名/歌手/专辑/时长请求 https://lrclib.net/api/get |
| 3 | LRCLIB 搜索兜底 | https://lrclib.net/api/search,取第一个结果的同步歌词 |
| 展开视图底部会标注歌词来源(LX Music / LRCLIB),可开关。 |
踩过的坑与加固
QML 小组件里异步请求和播放器状态变化交织,出了不少竞态问题,最终都做了防护:
- 切歌竞态:连续切歌时上一首歌的歌词请求回来覆盖了新歌,引入请求序号(
_fetchSeq)校验,失败自动重试 - 封面加载失败:网络抖动导致封面拉取失败,加了自动重试
- 播放器选择卡死:MPRIS2 多播放器并存时选择逻辑偶发卡死,加了看门狗自动恢复
- 翻译:8 种语言(zh_CN、es_ES、fr、it、nl、pt_BR、tr、uk),中文完整翻译
效果展示
面板视图,歌曲信息 + 单行歌词 + 播放控制:

展开视图,封面 + 多行同步歌词(底部为歌词来源标识):

安装
依赖:KDE Plasma ≥ 6.0.4、kpackagetool6、gettext(提供 msgfmt)。三种方式任选:
方式一:一键脚本(推荐)
git clone https://github.com/12userzhou/plasmusic-toolbar-lyrics.git
cd plasmusic-toolbar-lyrics
bash build_and_install.sh
脚本会依次执行:检查依赖工具 → 校验组件完整性 → 编译全部翻译(.po → .mo)→ 自动安装或升级小组件。
方式二:源码手动安装
kpackagetool6 --type Plasma/Applet -i src # 安装
kpackagetool6 --type Plasma/Applet -u src # 升级
方式三:Release 下载 .plasmoid
从 Releases 页面 下载 plasmusic-toolbar-lyrics-<版本号>.plasmoid,然后:
kpackagetool6 --type Plasma/Applet -i plasmusic-toolbar-lyrics-<版本号>.plasmoid
安装后重启 plasmashell 生效:
nohup plasmashell --replace >/dev/null 2>&1 & disown
右键面板 → 添加小组件 → 搜索 “PlasMusic Toolbar + Lyrics”。
使用提示
中文歌词覆盖最好的来源是落雪音乐的本地开放 API:打开落雪音乐 设置 → 开放 API → 启用(默认端口 23330),再在小组件配置「完整视图」页确认端口即可。未开启时小组件会自动回退到 LRCLIB 在线歌词库(需要能访问 https://lrclib.net)。
歌词样式(字号/颜色/粗体/斜体/对齐)统一在「面板视图」配置页控制,面板和展开视图共用;展开视图透明度可在「完整视图」页调节。
项目地址与致谢
GitHub:https://github.com/12userzhou/plasmusic-toolbar-lyrics
本项目基于 GPL-3.0 发布,感谢上游 plasmusic-toolbar(原作者 Claudio Catterina)打下的基础,以及 LRCLIB 提供的在线歌词服务。