Beets

来自 ArchWiki

Beets 是一个使用 MusicBrainz 数据库的音乐标签器和库管理器。它最初于 2010 年发布,并且此后定期更新。

安装

安装 beets 软件包或 beets-gitAUR 开发版本。

Beets 的音频文件解码后端是 audioread,这是一个由同一团队开发的项目。这个后端本身通过使用 FFmpeg 和/或 GStreamer(包括其 gst-libavgst-plugins-good 软件包)作为后端来工作。

此外,请参阅 #插件 以了解插件特定的依赖项。

配置

提示: Beets 提供了一个用于配置操作的命令。要编辑配置文件,请运行 beet config -e。它将使用 环境变量 EDITOR 中指定的文本编辑器打开。

用户配置使用 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 命令及其子命令(例如importlist等等)支持 -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 自动标签器,方法是从音乐库直接重新导入文件

  1. ...使用路径:beet import /my/beets/library/my/album
  2. ...使用查询(参见 #查询)]: beet import -L query

要手动标记音乐,可以使用 modify 命令或来自 edit 插件的 edit 命令(参见 #插件)。请注意,edit 命令将使用关于移动(move 选项)和复制(copy 选项)的 import 配置,以便在命令完成后移动文件。例如,您可以使用以下命令向音乐添加两个流派标签

$ beet modify query genre="genre1;genre2"

标记修改将写入数据库。要将修改反映到文件标签中,请使用以下命令

$ beet write query

查询

几乎所有 Beets 命令都基于查询对匹配项(导入到库中的音乐文件)进行操作。您可以使用 beet fields 命令列出可用的字段。查询格式如下

value
匹配标签 titleartistalbumnamealbumartistgenrecomments 中包含 value 的歌曲。
#value
使用 bareasc 插件匹配歌曲,使用简单的 ASCII 字符匹配(忽略特殊字符)搜索库。
~value
使用 fuzzy 插件匹配歌曲,使用模糊匹配算法搜索库。
tag:value
匹配 tag 包含 value 的歌曲。
tag::regex
匹配 tagPython 正则表达式regex 匹配的歌曲。
tag:N1..N2
匹配 tag 与范围 N1N2 之间的数字匹配的歌曲。
tag:=value / tag:=~value
分别以区分大小写或不区分大小写的方式匹配 tagvalue 匹配的歌曲。
空格
查询之间的逻辑与。
,空格
查询之间的逻辑或(逗号后的 空格 字符是强制性的,用于分隔关键字)。
^ / -
逻辑非。

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 软件包的 FFmpegGStreamer 后端)。
chroma
使用 Chromaprint 技术计算音频指纹,并使用 AcoustID 在线数据库识别歌曲。需要 chromaprint 软件包提供的 fpcalc 命令行工具进行指纹计算,以及 python-pyacoustid 软件包用于获取在线数据库。指纹将写入文件的 ACOUSTID_FINGERPRINT 标签中。
lyrics
在音乐导入期间从 Web 数据库搜索和下载歌词(依赖于后端 python-beautifulsoup4 软件包)。
fetchart
在音乐导入期间搜索本地文件系统和/或从 Web 数据库下载专辑封面。
convert
将库转码到另一个目录(例如,从无损转码到有损,用于游牧设备)(依赖于 FFmpeg 等后端)。
alternatives
外部插件,支持库的多个版本(例如,无损和有损版本)或位置。
playlist
读取 m3u 格式的播放列表。
smartplaylist
基于预定义的查询,以 m3u 格式创建和自动更新播放列表。
fuzzy
使用模糊模式匹配搜索库。
edit
在外部编辑器中修改音乐元数据(例如,为 VimEmacs 等配置 EDITOR 变量)。
badfiles
使用校验和检查损坏的文件。FLAC 文件需要 flac,MP3 文件需要 mp3valAUR

技巧和窍门

启用 Tab 自动补全

BashZsh 提供自动补全支持。

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 库的目录。

注意: 可以使用符号链接代替硬链接,因为 Beets 不会取消引用链接。与硬链接相比,它允许指向不同的文件系统(例如,外部驱动器)。

它具有以下优点

  1. 当库已同步但不可在同一路径上使用时,拥有指向跨机器不同路径的库链接。
  2. 允许通过更新符号链接来动态更改库的路径,例如,当切换到同步的外部硬盘驱动器时。
  3. 当库移动时,不必处理 SQLite 的数据库项目路径。实际上,如果您在没有任何 beet 命令的情况下更改文件系统上的库位置,则更改数据库文件中已导入项目的路径将很麻烦(请参阅 #更新库目录)。

例如,要使用固定路径为 /srv/beets 的符号链接,指向通过网络挂载在 /mnt/network/beets 的库,请执行

$ ln -sfT /srv/beets /mnt/network/beets

您可以重新执行相同的命令,稍后将符号链接更新到另一个位置。在配置文件中,应具有

~/.config/beets/config.yaml
directory: /srv/beets

更新库目录

根据 Beets 的 FAQ,提供了两个常规选项来修改文件导入后库目录(包含音乐文件)的路径

  1. ~/.config/beets/config.yaml 中进行修改并使用 beet move。此解决方案的缺点是库应由 Beets 本身移动,而不是之前由外部程序移动。
  2. 删除 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 中报告的那样)

Syncthing
用于跨设备同步 SQLite 数据库和库。
git-annex
用于跨设备和外部驱动器以更高级和细粒度的配置同步库。

参见