mutagen 元数据引擎 — Seal 如何在本地写入音频文件标签
mutagen 是什么
mutagen 是 Python 生态里最成熟的音频文件元数据读写库之一。它是 yt-dlp 默认集成的元数据处理工具,Seal 继承了这个集成。
mutagen 支持几乎所有主流音频格式的标签规范:
| 格式 | 标签规范 | 支持程度 |
|---|---|---|
| MP3 | ID3v2.4 | 完整 |
| AAC/M4A | MP4 原子标签 | 完整 |
| FLAC | Vorbis Comment | 完整 |
| Opus | Ogg Vorbis | 完整 |
| WAV | RIFF INFO | 基础 |
| WMA | ASF | 基础 |
| 其他 | ... | 大多支持 |
为什么 Seal 选 mutagen
三个原因:
1. 与 yt-dlp 原生集成
yt-dlp 自己就用 mutagen 处理元数据——Seal 用 youtubedl-android 把 yt-dlp 和 mutagen 一起打包进 APK。不需要额外引入其他元数据库,减少依赖体积和兼容性风险。
2. 纯 Python,安卓可移植
mutagen 是纯 Python 实现(不需要 C 扩展),所以能在安卓设备上直接通过 Python 解释器运行。这比用 Kotlin/Java 重写一套元数据逻辑(可能不完整)更可靠。
3. 覆盖格式广
大多数手机端下载器要么不做元数据写入,要么只支持 MP3——mutagen 一次覆盖 AAC/MP3/FLAC/Opus 等几乎所有主流格式,Seal 能保证无论下载哪种格式音频都能正确写标签。
Seal 调用 mutagen 的时机
下载完成后(aria2c 把字节抓完、ffmpeg 合并流),Seal 调用 mutagen 依次写入:
- 视频标题 → 音频文件的 Title 字段
- 上传者/频道名 → Artist 字段
- 播放列表标题 → Album 字段(v1.12.0 起)
- 封面图(视频缩略图)→ AlbumArt/AlbumCover 字段
v1.10.0 起"强制内嵌元数据"变成可选——关掉后 Seal 还是会写标题和艺术家,只是不嵌封面图。
元数据写入的常见问题
| 问题 | 原因 |
|---|---|
| 播放器不显示封面 | 播放器本身不支持封面显示、或封面格式不匹配(mutagen 会尽量写通用格式) |
| 中文标题乱码 | 极少数播放器对 Unicode 标签支持不好,不是 Seal 的问题 |
| 标签写入失败 | 权限不足(下载目录只读)或文件被其他应用锁定 |
想了解 Seal 的 UI 技术栈?跳到 Kotlin + Jetpack Compose。