Beets
Beets 是一个使用 MusicBrainz 数据库的音乐标签器和库管理器。它最初于 2010 年发布,并且此后定期更新。
安装
安装 beets 软件包或 beets-gitAUR 开发版本。
Beets 的音频文件解码后端是 audioread,这是一个由同一团队开发的项目。这个后端本身通过使用 FFmpeg 和/或 GStreamer(包括其 gst-libav 和 gst-plugins-good 软件包)作为后端来工作。
此外,请参阅 #插件 以了解插件特定的依赖项。
配置
用户配置使用 YAML 语法完成。例如
~/.config/beets/config.yaml
directory: ~/beets/library/ # Library directory to store music. library: ~/beets/library.db # Database file to store library state and metada.
用法
请参阅 入门指南 以开始使用 Beets。在本节中,我们假设读者已经了解了基础知识。以下操作按其目标组织,并且是比基础知识更高级的示例。
获取帮助和概述
beet
命令及其子命令(例如,import
、list
、等等)支持 -h/--help
标志来打印帮助。您可以使用 beet version
列出已启用/加载的插件。您可以使用 -vv
标志启用详细输出以进行调试。最后,您可以使用 --plugin=""
标志仅为一个命令确保没有任何已加载插件的默认行为。
添加音乐
请参阅 Beets 导入音乐。
默认情况下,Beets 将复制或移动导入的文件,以及将标签写入文件。Beets 支持只读导入模式,其中导入的文件不会被修改或移动
$ beet import -A -C -W path
此外,可以启用 fetchart
插件,使用 --plugin=fetchart
,这样 Beets 将在与导入文件相同的目录中查找专辑封面。
列出音乐
请参阅 Beets 查看您的音乐。
Beets 支持自定义格式来列出音乐。字段名称可以是默认/标准字段(以下示例中的 genre
)或自定义/灵活字段(以下示例中的 mood
),只要它在 Beets SQLite 数据库中使用
$ beet ls -f 'Mood: ${mood} Genre: ${genre}' query
以下是列出音乐时的一些极端情况
- 列出标签中没有标题的文件
$ beet list -p "title::^$"
- 列出库中丢失的文件
$ beet --plugin="badfiles" bad 2>/dev/null | grep "file does not exist"
- 自动从库中删除丢失的文件
$ beet --plugin="badfiles" bad 2>/dev/null | grep "file does not exist" | cut -d ":" -f 1 | xargs -I% beet remove -f path::%
移除音乐
请参阅 Beets remove。
beet
的情况下对文件进行任何更改,请不要忘记运行 beet update
以更新您的库数据库。标记音乐
要在已导入的音乐上运行 Beets 自动标签器,方法是从音乐库直接重新导入文件
- ...使用路径:
beet import /my/beets/library/my/album
- ...使用查询(参见 #查询)]:
beet import -L query
要手动标记音乐,可以使用 modify
命令或来自 edit
插件的 edit
命令(参见 #插件)。请注意,edit
命令将使用关于移动(move
选项)和复制(copy
选项)的 import
配置,以便在命令完成后移动文件。例如,您可以使用以下命令向音乐添加两个流派标签
$ beet modify query genre="genre1;genre2"
标记修改将写入数据库。要将修改反映到文件标签中,请使用以下命令
$ beet write query
查询
几乎所有 Beets 命令都基于查询对匹配项(导入到库中的音乐文件)进行操作。您可以使用 beet fields
命令列出可用的字段。查询格式如下
value
- 匹配标签
title
、artist
、albumname
、albumartist
、genre
、comments
中包含value
的歌曲。 #value
- 使用
bareasc
插件匹配歌曲,使用简单的 ASCII 字符匹配(忽略特殊字符)搜索库。 ~value
- 使用
fuzzy
插件匹配歌曲,使用模糊匹配算法搜索库。 tag:value
- 匹配
tag
包含value
的歌曲。 tag::regex
- 匹配
tag
与 Python 正则表达式 的regex
匹配的歌曲。 tag:N1..N2
- 匹配
tag
与范围N1
和N2
之间的数字匹配的歌曲。 tag:=value
/tag:=~value
- 分别以区分大小写或不区分大小写的方式匹配
tag
与value
匹配的歌曲。 空格
- 查询之间的逻辑与。
,空格
- 查询之间的逻辑或(逗号后的
空格
字符是强制性的,用于分隔关键字)。 ^
/-
- 逻辑非。
ReplayGain
可以通过包含的插件访问 ReplayGain 支持(参见 #插件)。可以使用以下命令计算与查询匹配的文件的 ReplayGain 信息
$ beet --plugin="replaygain" replaygain query
-w -f
标志以强制将结果写入文件标签。专辑封面
如果在导入期间启用了包含的 fetchart
插件(参见 #插件),则会自动获取专辑封面。导入后,可以
- 手动将图像添加为文件元数据中的专辑封面
$ beet --plugin="embedart" embedart -f /path/to/image.jpg query
确保 zero
插件未加载,否则它将在保存后删除我们的专辑封面,从而取消我们的命令。
- 将专辑封面导入库
$ beet --plugin="fetchart" fetchart -q query
它将优先搜索文件系统上的图像,即,音乐存储在库中的位置。
- 从文件中删除专辑封面
- 首先,在配置文件中包含
zero
插件的fields
参数中的images
。 - 其次,运行
- 首先,在配置文件中包含
$ beet --plugin="zero" zero query
插件
Beets 支持 官方插件 和 社区插件。这是一个精选列表,列出了在其他音乐库管理器工具中可能可用的主要功能插件
replaygain
- 支持在音乐导入期间计算和添加 ReplayGain 信息(依赖于通过 python-gobject 软件包的 FFmpeg 或 GStreamer 后端)。
chroma
- 使用 Chromaprint 技术计算音频指纹,并使用 AcoustID 在线数据库识别歌曲。需要 chromaprint 软件包提供的
fpcalc
命令行工具进行指纹计算,以及 python-pyacoustid 软件包用于获取在线数据库。指纹将写入文件的ACOUSTID_FINGERPRINT
标签中。 lyrics
- 在音乐导入期间从 Web 数据库搜索和下载歌词(依赖于后端 python-beautifulsoup4 软件包)。
fetchart
- 在音乐导入期间搜索本地文件系统和/或从 Web 数据库下载专辑封面。
convert
- 将库转码到另一个目录(例如,从无损转码到有损,用于游牧设备)(依赖于 FFmpeg 等后端)。
alternatives
- 外部插件,支持库的多个版本(例如,无损和有损版本)或位置。
playlist
- 读取
m3u
格式的播放列表。 smartplaylist
- 基于预定义的查询,以
m3u
格式创建和自动更新播放列表。 fuzzy
- 使用模糊模式匹配搜索库。
edit
- 在外部编辑器中修改音乐元数据(例如,为 Vim、Emacs 等配置
EDITOR
变量)。 badfiles
- 使用校验和检查损坏的文件。FLAC 文件需要 flac,MP3 文件需要 mp3valAUR。
技巧和窍门
启用 Tab 自动补全
Bash
Beets 包含对 Bash shell 命令补全 的支持。要启用补全,请将以下行放入您的 .bashrc
~/.bashrc
eval "$(beet completion)"
您还需要 安装 bash-completion 软件包才能使其工作。
Zsh
官方 Arch 软件包在系统上安装 Zsh 补全。如果使用其他安装方法,要安装补全,请使 beets/extra/_beet
(来自上游存储库)文件在 Zsh 的 $fpath
目录之一中可用(通过复制或符号链接)。按照文档的建议使用 Zsh 的 Bash 补全兼容性只能部分工作。
设置库目录(外部驱动器,网络)
导入后,Beets 会将库中每个项目的路径硬编码到 SQLite 的 .db
数据库文件中。因此,建议在文件系统上使用固定路径,使用链接重定向到实际存储 Beets 库的目录。
它具有以下优点
- 当库已同步但不可在同一路径上使用时,拥有指向跨机器不同路径的库链接。
- 允许通过更新符号链接来动态更改库的路径,例如,当切换到同步的外部硬盘驱动器时。
- 当库移动时,不必处理 SQLite 的数据库项目路径。实际上,如果您在没有任何
beet
命令的情况下更改文件系统上的库位置,则更改数据库文件中已导入项目的路径将很麻烦(请参阅 #更新库目录)。
例如,要使用固定路径为 /srv/beets
的符号链接,指向通过网络挂载在 /mnt/network/beets
的库,请执行
$ ln -sfT /srv/beets /mnt/network/beets
您可以重新执行相同的命令,稍后将符号链接更新到另一个位置。在配置文件中,应具有
~/.config/beets/config.yaml
directory: /srv/beets
更新库目录
根据 Beets 的 FAQ,提供了两个常规选项来修改文件导入后库目录(包含音乐文件)的路径
- 在
~/.config/beets/config.yaml
中进行修改并使用beet move
。此解决方案的缺点是库应由 Beets 本身移动,而不是之前由外部程序移动。 - 删除 SQLite 数据库(
.db
文件)并使用beet import -AWC
从新路径重新创建它。此解决方案的缺点是存储在 SQLite 数据库本身(而不是音乐文件的元数据/标头中)的自定义标签将丢失。
Beets 开发人员建议的最后一个解决方案是手动修改 SQLite 数据库,但没有进一步说明。可以通过以下方式实现,假设已安装 SQLite,并且库的旧路径和新路径分别为 /old/library/path
和 /new/library/path
。
1. 备份库数据库并打开它
$ cp /path/to/library.db /path/to/library.db.bak" $ sqlite /path/to/library.db
2. 列出表以检查方案是否与以下 UPDATE
请求相对应,并更新它(就地)
sqlite> .schema sqlite> UPDATE items SET path = REPLACE(path, '/old/library/path', '/new/library/path'); sqlite> UPDATE albums SET artpath = REPLACE(artpath, '/old/library/path', '/new/library/path');
3. 退出 SQLite
sqlite> .exit
4. 检查 Beets 是否正确列出新路径下库的文件
$ beet ls -p [QUERY]
跨计算机和外部驱动器同步
Beets 本身不实现任何同步机制。但是,其架构使其非常适合与其他 FOSS 同步软件一起使用(如其 GitHub Issue #271 中报告的那样)