WebMusic 新功能发布:歌单分享与 AI 标签整理
随着 WebMusic 的不断迭代,今天在这个版本中,我带来了两个非常实用的功能更新:安全的歌单分享 和 基于 GEMINI 的 AI 标签批量整理。
这两个功能解决了我长期以来的两个痛点:
- 想把 NAS 里的好歌分享给朋友听,但又不想给他们 NAS 账号。
- 下载的歌曲元数据乱七八糟(文件名全是乱码或者
Track 01.mp3),手动整理太累。
🎵 歌单分享:让音乐流动起来
现在,你可以将任何歌单,或者歌单里选中的几首歌曲,一键生成分享链接发送给朋友。接收者无需登录,直接在浏览器中即可播放。
核心特性
- 灵活分享模式:
- 整单分享:直接分享现有歌单,朋友看到的歌单内容会随你的更新而变化。
- 选曲分享:只选中几首特定的歌,系统会自动创建一个临时的"分享列表",适合安利特定曲目。
- 安全控制:
- 密码保护:可以设置访问密码,防止链接泄露。
- 有效期设置:支持设置链接的有效期(如 1 天、7 天),过期自动失效。
- 独立的播放体验:
- 分享页面是一个独立的播放器应用 (
SharedPlaylistPage)。 - 断点续听:朋友听了一半关闭页面,下次打开会自动恢复到上次播放的位置(基于 LocalStorage)。
- 锁屏控制:支持 Media Session API,在手机锁屏界面也能切歌。
- 分享页面是一个独立的播放器应用 (
技术实现
后端在 PlaylistController 中新增了 SharePlaylist 接口,生成唯一的 ShareToken。为了保证安全性,分享页面的接口 GetSharedPlaylist 使用 [AllowAnonymous] 允许匿名访问,但严格校验 Token、有效期和密码。
// 后端:生成分享链接
[HttpPost("{id}/share")]
public async Task<IActionResult> SharePlaylist(int id, [FromBody] SharePlaylistDto dto)
{
// ... 生成 Token,设置 Password 和 Expiry ...
return Ok(new { shareUrl = $"/share/{token}" });
}
前端实现了一个精简版的播放器,去除了所有管理功能,专注于"听"的体验。

🤖 AI 标签整理:告别 “Unknown Artist”
这是我最喜欢的功能。利用 Google 最新的 Gemini 2.0 Flash 模型,WebMusic 现在可以智能分析歌曲的文件名和路径,自动补充缺失的元数据。
痛点场景
你是否也有这样的文件:
/Music/周杰伦/2004-七里香/02. 搁浅.mp3-> 标签里却是空的,播放器显示 “Unknown Title”/Music/Eason/富士山下.mp3-> 只有文件名,没有专辑信息
AI 整理流程
-
智能上下文提取:
后端不仅发送文件名,还会发送父文件夹名称给 AI。
例如对于/周杰伦/七里香/搁浅.mp3,AI 会知道 “周杰伦” 是艺术家,“七里香” 是专辑。 -
批量处理:
在TagsController中,我们实现了SuggestRequest,支持一次性发送 50 首歌给 Gemini。 -
Gemini 2.0 Flash 加持:
使用最新的 Flash 模型,速度极快且成本极低。AI 会返回标准的 JSON 格式,包含Title,Artist,Album,Genre,Year。
// 给 AI 的 Prompt 上下文
var contextData = songs.Select(m => new {
FileName = fileName,
FolderName = parentFolder // 关键:利用文件夹结构辅助识别
});
实际效果
实测下来,对于只有文件名的老歌,AI 的识别准确率惊人。它甚至能根据歌名自动补全Genre(流派)和 Year(年份),这是传统正则提取做不到的。
结语
WebMusic 的初衷是管理好自己的本地音乐库。
- AI 整理 帮我把库变得整洁有序。
- 歌单分享 让我能把这份有序的美好分享给他人。
Enjoy the music! 🎧
本文基于 WebMusic v2 版本开发日志生成。
