WebMusic 新功能发布:歌单分享与 AI 标签整理

随着 WebMusic 的不断迭代,今天在这个版本中,我带来了两个非常实用的功能更新:安全的歌单分享基于 GEMINI 的 AI 标签批量整理

这两个功能解决了我长期以来的两个痛点:

  1. 想把 NAS 里的好歌分享给朋友听,但又不想给他们 NAS 账号。
  2. 下载的歌曲元数据乱七八糟(文件名全是乱码或者 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}" });
}

前端实现了一个精简版的播放器,去除了所有管理功能,专注于"听"的体验。

image-1765650621799


🤖 AI 标签整理:告别 “Unknown Artist”

这是我最喜欢的功能。利用 Google 最新的 Gemini 2.0 Flash 模型,WebMusic 现在可以智能分析歌曲的文件名和路径,自动补充缺失的元数据。

痛点场景

你是否也有这样的文件:

  • /Music/周杰伦/2004-七里香/02. 搁浅.mp3 -> 标签里却是空的,播放器显示 “Unknown Title”
  • /Music/Eason/富士山下.mp3 -> 只有文件名,没有专辑信息

AI 整理流程

  1. 智能上下文提取
    后端不仅发送文件名,还会发送父文件夹名称给 AI。
    例如对于 /周杰伦/七里香/搁浅.mp3,AI 会知道 “周杰伦” 是艺术家,“七里香” 是专辑。

  2. 批量处理
    TagsController 中,我们实现了 SuggestRequest,支持一次性发送 50 首歌给 Gemini。

  3. 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(年份),这是传统正则提取做不到的。

image-1765648920633

结语

WebMusic 的初衷是管理好自己的本地音乐库。

  • AI 整理 帮我把库变得整洁有序。
  • 歌单分享 让我能把这份有序的美好分享给他人。

Enjoy the music! 🎧


本文基于 WebMusic v2 版本开发日志生成。