Abstract
Beets — CLI-тул для управления музыкальной библиотекой. Сопоставляет треки с MusicBrainz — свободной базой метаданных. Автоматически проставляет правильные названия, артистов, альбомы, обложки, тексты и жанры.
Зачем
671 трек в библиотеке . Теги разного качества:
- Spotify sync качает с YouTube — теги от туда (часто кривые)
- Русские исполнители — MusicBrainz знает не всех
- Обложки есть не везде
- Тексты отсутствуют
Решение: iTunes Search API для обложек и жанров (без VPN, без токена, знает нишевых артистов) + Genius API для текстов (через VPN, нужен токен). Beets/MusicBrainz оказался бесполезен для андеграундной музыки.
- Названия — точное сопоставление с MusicBrainz (по тегам + fingerprint)
- Обложки — fetchart плагин (Cover Art Archive, iTunes, Amazon)
- Тексты — lyrics плагин (lrclib, Genius)
- Жанры — lastgenre плагин (Last.fm жанры)
Установка
python3 -m venv /home/orca/beets-venv
source /home/orca/beets-venv/bin/activate
pip install beets requests pyacoustid beautifulsoup4 pylastfpcalc (Chromaprint) уже установлен в системе — нужен для fingerprinting.
Конфиг
~/.config/beets/config.yaml:
directory: /home/orca/subwave/music_mount
library: /home/orca/beets-venv/beets.db
import:
move: no # НЕ двигать файлы — они на sshfs mount
copy: no # НЕ копировать
write: yes # Перезаписывать теги в файлах
resume: yes
incremental: yes
quiet_fallback: skip
musicbrainz:
auto: yes
search_limit: 5
plugins: fetchart embedart lyrics lastgenre
fetchart:
auto: yes
sources:
coverart: yes
itunes: yes
amazon: yes
albumart: yes
fanarttv: yes
embedart:
auto: yes
remove_art_file: yes
lyrics:
auto: yes
sources: genius lrclib
fallback: ''
lastgenre:
auto: yes
count: 2
fallback: ''Импорт
Разовый импорт всей библиотеки:
source /home/orca/beets-venv/bin/activate
beet import -A -q --group-albums /home/orca/subwave/music_mount/-A— не группировать по альбомам (авто-определение)-q— тихий режим (без интерактивных вопросов)--group-albums— группировать треки в альбомы для матчинга
Автоматизация
Beets запускается после Spotify sync (раз в день в 3:00):
if [ "$NEW_FILES" -gt 0 ]; then
/home/orca/beets-venv/bin/beet import -A -q --group-albums "$MUSIC_DIR"
/home/orca/beets-venv/bin/beet fetchart -q
fi
curl -s "http://localhost:4533/rest/startScan.view?..." >/dev/nullПосле beets — Navidrome rescan подхватывает новые теги и обложки.
Ограничения
MusicBrainz не знает андеграунд
Beets сматчил 0 из 671 треков с MusicBrainz. Андеграундная музыка (ssshhhiiittt!, , hehehe, ssklonen) отсутствует в базе. Beets бесполезен для такой библиотеки.
Genius rate-limiting
Genius API отдаёт 429 (Too Many Requests) после ~20 запросов. Тексты в основном берутся через lrclib (свободная база).
Русские исполнители
MusicBrainz знает не всех русскоязычных исполнителей (hehehe, shiawase, ssklonen). Beets оставляет оригинальные теги если не находит матч.
Рабочее решение: iTunes + Genius
Вместо beets используется скрипт fetch-itunes-metadata.py:
- Обложки — iTunes Search API (бесплатно, без токена, без VPN). Находит , ssshhhiiittt!, hehehe. Обложка 600x600 встраивается в MP3 (APIC tag).
- Жанры — iTunes отдаёт
primaryGenreName(Hip-Hop, Alternative, Rock). Встраивается как TCON tag. - Тексты — lrclib (через VPN, synced lyrics) → Genius (через VPN, scraping со страницы). Встраиваются как USLT tag.
- Всё через mutagen — прямая запись ID3v2 тегов в MP3
MP3 файл
↓ ffprobe читает теги (artist, title)
↓ iTunes Search API → обложка + жанр + альбом
↓ lrclib → тексты (synced/plain)
↓ Genius API → тексты (scraping со страницы)
↓ mutagen → встраивание в MP3 (APIC, TCON, TALB, USLT)
Плагины
| Плагин | Что делает | Источник |
|---|---|---|
fetchart | Скачивает обложки альбомов | Cover Art Archive, iTunes, Amazon |
embedart | Встраивает обложки в MP3 теги | — |
lyrics | Скачивает тексты песен | Genius, lrclib |
lastgenre | Проставляет жанры | Last.fm |
Связанные статьи
- — радио с библиотекой, которую тегирует beets
- — скробблинг того, что играет радио
- — beets работает с файлами на sshfs mount из Docker
Связанные