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 pylast

fpcalc (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

Связанные


← mrgnl