Beets — консольный менеджер музыкальной библиотеки на Python. Он читает теги, сверяет их с MusicBrainz, переименовывает файлы по шаблону, скачивает обложки и убирает дубликаты. В отличие от плеера, beets не проигрывает музыку: его задача — привести каталог к предсказуемому виду, чтобы любой плеер видел одинаковых исполнителей, альбомы и номера треков. Ниже — установка, конфигурация, импорт и типовые операции.
Установка и первый запуск
В Debian и Ubuntu пакет есть в репозитории, но версия может отставать. Если нужны свежие плагины, ставьте через pipx в отдельное окружение — так beets не смешается с системными пакетами Python.
sudo apt install beets ffmpeg
beet version
beet config -p
beet fields
Команда beet fields показывает доступные поля тегов, beet config -p — путь к файлу настроек. По умолчанию это ~/.config/beets/config.yaml. Каталог библиотеки и база задаются там же.
Конфигурация
Минимальный конфиг описывает, где лежит музыка, где хранится база и как строить пути. Шаблон пути — главный инструмент порядка: он определяет структуру каталогов после импорта.
directory: ~/Music/library
library: ~/Music/library.db
import:
write: yes
copy: yes
move: no
timid: no
autotag: yes
paths:
default: $albumartist/$album%aunique{}/$track $title
singleton: Non-Album/$artist/$title
comp: Compilations/$album%aunique{}/$track $title
write: yes записывает найденные теги в файлы, copy: yes копирует музыку в библиотеку, оставляя исходники. Для первого прогона лучше именно копирование: ошибку можно отменить, не потеряв файлы. %aunique{} добавляет уточнение, если в библиотеке уже есть альбом с таким именем.
Импорт
Импорт — интерактивный процесс. Beets показывает кандидатов из MusicBrainz и ждёт решения. В приглашении есть выбор: применить, оставить как есть, пропустить, посмотреть другие варианты, собрать альбом вручную или ввести идентификатор записи. Для большой коллекции удобно сначала прогнать тихий режим и посмотреть отчёт.
beet import ~/Music/incoming
beet import -q ~/Music/incoming
beet import -A ~/Music/incoming
beet ls -f '$artist - $album - $title' | head -20
Флаг -q включает тихий режим и пропускает спорные альбомы, -A отключает автотегирование и полезен для уже размеченных файлов. После импорта проверьте выборку: если исполнители дублируются с разным написанием, значит часть альбомов не сопоставилась.
Плагины
Плагины включаются списком в конфиге. Начните с обложек, текстов, жанров и поиска проблем. Каждый плагин приносит свои команды и поля.
plugins: fetchart embedart lyrics lastgenre duplicates missing
fetchart:
auto: yes
minwidth: 500
embedart:
auto: yes
remove_art_file: yes
lastgenre:
auto: yes
source: album
fetchart ищет обложки, embedart встраивает их в теги, lyrics подтягивает текст, lastgenre уточняет жанр по данным Last.fm, duplicates и missing дают команды поиска проблем. Для сопоставления по отпечатку нужны пакет pyacoustid, утилита fpcalc и ключ AcoustID; без них beets работает по тегам. Для большой библиотеки включайте плагины постепенно и сверяйте время импорта.
Порядок в библиотеке
Основные операции выполняются одной командой. Сначала посмотрите статистику и список проблем, затем правьте точечно.
beet stats
beet duplicates -f '$artist - $title'
beet missing
beet update
beet update перечитывает каталог и добавляет файлы, появившиеся в обход импорта. beet missing показывает треки, которых не хватает в альбомах библиотеки. Найденные дубликаты удаляйте вручную после прослушивания: автоматическое удаление по названию часто убирает разные версии записи.
Массовую правку удобно делать через beet modify с запросом. Например, жанр для всех альбомов исполнителя меняется одной строкой, а -y подтверждает изменения без вопросов. Перед массовой операцией сделайте копию базы: отменить пакетную правку одной командой не получится.
beet modify -y -a albumartist:Кино genres=rock
beet modify -y -a album:'Группа крови' year=1988
beet write
Конвертация для плеера
Плагин convert готовит копии в другом формате для телефона или автомагнитолы. Исходники остаются в библиотеке, а результат складывается в отдельный каталог.
convert:
auto: no
ffmpeg: /usr/bin/ffmpeg
formats:
mp3:
command: ffmpeg -i $source -y -vn -acodec libmp3lame -q:a 2 $dest
extension: mp3
Запуск beet convert -d /media/player -f mp3 query создаст копии только для выбранных треков. Проверьте, что у вас установлен libmp3lame; в некоторых сборках ffmpeg его нет, и команда завершится ошибкой.
Плейлисты и выборки
Beets умеет формировать списки воспроизведения по запросу. Простейший способ — вывести пути и сохранить их в M3U, который понимает большинство плееров.
beet ls -f '$path' genres:rock year:1980..1989 > rock80.m3u
beet ls -f '$path' albumartist:'Various Artists' > various.m3u
beet ls -f '$albumartist|$album|$title' year:1990..1999
Формат вывода задаётся строкой с полями в $. Разделитель | удобен для таблицы, а $path даёт абсолютный путь к файлу. Запросы поддерживают диапазоны, отрицания и регулярные выражения.
Диагностика
Если beets не находит альбом, проверьте подключение к MusicBrainz и корректность тегов. Частая причина — сборник с пустым полем исполнителя альбома. Для разбора используйте подробный вывод.
beet -v import ~/Music/incoming/album
beet config
beet ls -f '$id $path' artist:''
sqlite3 ~/Music/library.db '.tables'
Ошибки вида «no matching release» означают, что кандидатов нет: проверьте название, год и количество треков. Ошибка записи тегов обычно связана с правами на файл или неподдерживаемым контейнером. Логика простая: сначала теги, потом структура, и только затем обложки.
Чек-лист
- Библиотека и база лежат в отдельном каталоге, исходники сохранены.
- Шаблон путей проверен на десяти альбомах до массового импорта.
- Включены fetchart и embedart, размер обложки не меньше 500 пикселей.
- Дубликаты проверяются перед удалением, база скопирована.
- Для телефона настроен convert с отдельным каталогом назначения.
- Есть регулярная копия library.db и каталога библиотеки.
Итог
Beets наводит порядок там, где обычный плеер только показывает список файлов. Импорт с автотегами, понятный шаблон путей и несколько плагинов дают библиотеку, которую не стыдно открыть на любом устройстве. Начните с копии коллекции, проверьте шаблон на небольшой пачке альбомов и только потом запускайте массовый импорт. Дальше останется лишь изредка проверять дубликаты и обложки.