Beets – Organiza tu música de una forma muy geek

 

A pesar de la cantidad de opciones que hay a la hora de escuchar música hoy día y en pleno auge de servicios como Spotify o Google Play Music, reconozco que soy un poco reacio a hacer uso de estos servicios y prefiero tener mi colección de música en una carpeta en mi disco duro como vengo haciendo desde hace muchos años.
Esto supone un trabajo extra si nos gusta tenerlo todo bien catalogado y ordenado. Seguro que muchos me entendéis si os digo que he pasado horas enteras editando las etiquetas ID3 de mi colección de música hasta dejarlas a mi gusto, renombrando los archivos, buscando carátulas de los discos, etc. Pues bien, esto se ha acabado, al fin he encontrado un programa que haga esto por mi y se llama Beets.

¿Que es Beets?

Imaginaos añadir un disco nuevo a vuestra colección y que este vaya de forma automática a la carpeta correspondiente, que las canciones estén bien nombradas, que tenga la carátula del disco, la letra de las canciones y todo lo que tu desees sin tener que hacer nada más… dónde hay que firmar ¿verdad?. Pues esto y mucho más es lo que hace Beets.

Beets es un organizador para tu colección de música escrito en Python y para la terminal que se basa en comandos similares a los de esta. Dentro de sus funciones están:

  • Descargar metadatos de MusicBrainz, Discogs y Beatport
  • Editar y borrar los metadatos de los archivos
  • Renombrar, copiar y mover archivos
  • Transformar archivos entre distintos formatos (con ffmpeg)
  • Buscar canciones duplicadas o perdidas
  • Examinar nuestra colección con nuestro navegador web y reproducirla
  • Oír nuestra colección con cualquier reproductor que hable el protocolo MPD
  • Es extensible mediante plug-ins

La forma de trabajar con beets es la misma que con cualquier comando de la terminal. Beets crea una base de datos para indexar nuestra colección de música y provee herramientas para hacer consultas, sincronizar la base de datos con las etiquetas de los archivos así como operar con ellos directamente (editar tags, renombrar, mover, buscar letras, carátulas, etc).

Instalación y actualización

Beets suele estar en los repositorios de la mayoría de distribuciones y lo podemos instalar desde ahí, pero si queremos tener la última versión es mejor instalarlo con pip. Primero necesitamos tener PyPi instalado. Para esto debemos instalar los paquetes python-dev y python-pip que estarán en los repositorios de nuestra distro.

Una vez tengamos pip, instalar beets es tan sencillo como escribir en la terminal:

pip install beets

Quizá sea necesario usar sudo en algunas distros.

Para actualizar beets a través de pip lo haremos así:

pip install -U beets

Para otras formas de instalación podemos consultar la documentación.

Configuración

Una vez que tenemos beets instalado lo primero es editar la configuración. Aquí es donde está el meollo de la cuestión. Hacer que beets se comporte como nosotros queremos puede llevarnos horas, pero oye, una vez conseguido es una gozada y nos ahorrará mucho trabajo.
Voy a hablar de como lo tengo configurado yo, pero hay infinitas posibilidades.

Para saber donde se encuentra el archivo de configuración escribimos:

beet config -p

Este archivo suele estar en “~/.config/beets/config.yaml”. Podemos ir directamente y editarlo en esa ruta o abrirlo desde beets. Para esto escribimos en una terminal:

beet config -e

Y se nos abrirá con nuestro editor de textos por defecto.

El archivo de configuración por defecto estará vacío. Lo primero que debemos hacer es indicar en él dónde vamos a tener nuestra colección de música (las canciones) y donde queremos guardar la base de datos de beets. Para esto escribiremos en el archivo:

directory: /ruta_donde_guardar_las_canciones
library: /ruta_bbdd/musiclibrary.blb

Dos apuntes sobre esto:

  • Si no definimos la opción library beets creará por defecto una base de datos “library.blb” en la misma ruta donde está el archivo de configuración.
  • IMPORTANTE: Recomiendo encarecidamente que la ruta directory esté vacía, que no tenga música dentro. Es decir elegir una nueva ubicación donde guardar la nueva colección de música. Si la ruta que tenemos pensada ya tenía nuestra música recomiendo moverla a otra ruta a modo de copia de seguridad y dejar la ruta que va a usar beets vacía por el momento. Luego veremos el motivo.

Nota: A partir de ahora cuando hable de colección me referiré a la carpeta del disco duro donde está la música que es distinto a la base de datos que gestión beets.

Con sólo estas dos líneas en la configuración ya podríamos empezar a usar beets ya que tiene algunos parámetros configurados por defecto, pero como igual no son de nuestro agrado voy a comentar los más básicos primero y luego vemos si los cambiamos o no.

  • id3v23: Por defecto beets usa ID3v2.4, si no queremos cambiarlo no hace falta añadir nada, pero si queremos que use ID3v2.3 para conservar la compatibilidad con Windows y otros dispositivos añadiremos al archivo:
id3v23: yes
  • import: Beets a la hora de importar música nueva por defecto la copia y modifica los tags. Podemos cambiar este comportamiento de varias maneras:
    • copy: Por defecto es yes, si ponemos no beets no copiará los archivos a la hora de importarlos, los indexará en la ubicación donde estén.
    • move: Por defecto es no, pero si ponemos yes beets moverá los archivos desde donde los importemos a nuestra colección. Move sobrescribe a copy, así que si está en yes no se tendrá en cuenta el valor de copy
    • write: Por defecto es yes, pero si lo ponemos en no beets no modificará los tags de las canciones al importarlas.
En resumen, las opciones por defecto de beets serían:
import:
    copy: yes
    move: no
    write: yes
No hace falta añadirlas al archivo si no vamos a cambiarlas. Lo pongo sólo a modo de ejemplo para ver como se escribe el archivo de configuración.
  • paths: Esta opción indica a beets como tiene que nombrar y organizar las canciones en la colección. Cada uno tendrá sus preferencias en plan “autor – album/track – titulo”, la opción que se encarga de esto es default. Lo mismo debemos especificar para aquellas canciones que están sueltas y no pertenecen a un disco o no tenemos el disco entero porque solo nos interesa ese tema, la opción que se encarga de estas últimas es singleton. Se pueden hacer muchas combinaciones pero en mi caso particular las he definido así:
default: $albumartist - $album ($year)/$track $title
singleton: Varios/$albumartist - $title

Yo guardo cada disco en una carpeta llamada “artista – album (año)/pista titulo”. Las canciones sueltas las guardo en Varios/artista – titulo.

Bien para resumir, configurando las opciones directory, library y paths ya podemos empezar a usar beets. El archivo básico de configuración sería algo así:

## Opciones Globales
directory: ~/Musica
library: ~/beets/musiclibrary.blb

## Configuracion de rutas
paths:
    default: $albumartist - $album ($year)/$track $title
    singleton: Varios/$albumartist - $title

Si queréis trabajar con tags id3v23 añadimos id3v23: yes a las opciones globales. Debéis también cambiar las rutas.

Usando beets

Vamos a ver con ejemplos como se usa beets de forma básica. Antes dije que la ruta donde vamos a guardar la colección de música es preferible que esté vacía, esto es porque al principio podemos cometer errores que hagan desaparecer algún disco (si, me ha pasado) así que creo que en lugar de importar nuestra colección ya existente es mejor copiarla a una ubicación segura e ir importando con la opción de copia desde allí. De esta forma tendremos siempre la copia antigua de nuestra música por si algo sale mal.

Para empezar, si escribimos en la terminal simplemente beet veremos todas las órdenes que podemos darle a beets. Estas irán creciendo conforme vayamos añadiendo plugins. Esto lo veremos más adelante.

Importar discos

Lo primero que vamos a hacer es importar algún disco. para esto tenemos que indicar a beets la ruta donde está la carpeta que contiene el disco y por defecto beets hará una copia de él que pondrá en la ruta que hayamos definido y modificará sus etiquetas ID3.

Voy a importar a mi colección el disco Faceless de Godsmack. Para esto uso import o imp Escribo:

beet imp /ruta/Godsmack\ -\ Faceless

Como resultado beets nos muestra esto:

Tagging:
    Godsmack - Faceless
URL:
    https://musicbrainz.org/release/61f506ec-2605-4bbe-903e-2be1f34a654e
(Similarity: 100.0%) (CD, 2003, US, Republic Records)

Lo que significa que hay una coincidencia del 100% en musicbrainz.org y por tanto extrae los metadatos de esta web y los guarda en las canciones de nuestro disco. Además renombra y organiza las canciones como hemos definido en paths.
Hay veces que la coincidencia no es del 100% y beets nos presentará una serie de acciones para que elijamos una.

Por cierto, si queremos ver todas las opciones de la orden import podemos escribir beet help import para verlas. Las opciones -c, -C, -m, -w y -W por ejemplo sobrescriben el comportamiento definido por copy, move y write en el archivo de configuración.

Nota: Hay veces que la información de los discos no es correcta o que alguno de nuestros discos no se encuentran en musicbrainz.org, siempre podemos editar las etiquetas a mano, pero una mejor solución con la que además colaboramos con esta comunidad es crearnos una cuenta en MusicBrainz y corregir los errores nosotros mismos así como añadir discos que no estén.

Hacer consultas

Yo ya tengo añadidos unos cuantos discos. Vamos a ver como podemos verlos.
Para hacer consultas usamos list o ls. Beets mostrará todas las canciones que contengan las palabras a buscar. Si queremos ver el disco de Godsmack que importé antes escribiremos:

beet ls godsmack faceless

Esto nos mostrará las canciones del disco:

Godsmack - Faceless - Straight Out of Line
Godsmack - Faceless - Faceless
Godsmack - Faceless - Changes
Godsmack - Faceless - Make Me Believe
Godsmack - Faceless - I Stand Alone
Godsmack - Faceless - Re-Align
Godsmack - Faceless - I Fucking Hate You
Godsmack - Faceless - Releasing the Demons
Godsmack - Faceless - Dead and Broken
Godsmack - Faceless - I Am
Godsmack - Faceless - The Awakening
Godsmack - Faceless - Serenity

Las búsquedas de beets son por palabras. Es decir que si escribimos sólo el nombre del grupo mostrará todos los discos que tengamos de ese grupo. Si escribimos una palabra mostrará todas las canciones que contengan esa palabra en el título.
La orden list tiene opciones interesantes como -a para que la búsqueda sea sólo en nombres de discos y no en canciones, -f que nos permite dar formato de presentación a la salida, o -p que nos permite ver la ruta donde están las canciones.

Exportar discos

Otra de las muchas cosas que nos permite hacer beets es exportar discos, es decir copiar un disco en otra ubicación por si queremos llevárnoslo en un pendrive, móvil, etc. Vamos que es el equivalente a copiar la carpeta del disco y pegarla en otro sitio.
Para esto usamos la orden move o mv que realmente sirve para mover y renombrar pero con su opción -e lo que hace es copiar (exportar).

beet mv -e -d /ruta_destino Godsmack Faceless

Esto copiaría la carpeta de este disco a la ruta que queramos. Si ponemos el nombre del grupo exporta todos los discos de ese grupo y si no ponemos nada exporta toda la colección.

Borrar canciones y discos

También podemos borrar canciones y discos con la opción remove. Para borrar todas las canciones que contengan la cadena de búsqueda escribimos:

beet remove Godsmack Faceless

Esto borraría solo este disco de la base de datos (no del disco duro). Si ponemos sólo Godsmack borrará todos los discos del grupo. Con -a la consulta será sólo en nombres de discos y no en nombres de canciones. Con -d borramos además las canciones del disco duro.

Estadísticas

Con la orden stats podemos ver cuantos grupos, discos y canciones tenemos, cuanto ocupan en disco y alguna cosilla más.

beet stats

A la salida veremos algo así:

Tracks: 2964
Total time: 1.3 weeks
Approximate total size: 19.2 GiB
Artists: 196
Albums: 236
Album artists: 118

Configuración avanzada

Antes hemos visto una configuración básica de beets, pero hay miles de opciones más y además se pueden usar multitud de plugins para añadir funcionalidades extra. Voy a mencionar aquí los que yo uso y como los he configurado.

  • import: En import yo añado dos opciones detail y log. Cuando un disco coincide al 100% beets no muestra más detalles, con detail conseguimos ver detalles extra. Con log podemos definir una ruta para que beets guarde un log con todo lo que hace.
import:
    detail: yes
    log: /ruta/log.txt

Para añadir plugins que vienen de serie con beets tenemos que añadir en las opciones globales la opción plugins: seguida de los nombres de los plugins
separados por espacio. Además podemos definir una opción para cada plugin si queremos cambiar su comportamiento por defecto.

Estos son los que yo uso:
plugins: inline web mbsync lyrics missing duplicates fetchart embedart info mbcollection play zero scrub

Voy a explicar uno por uno:

Por defecto beets numera las canciones de los álbumes con varios discos todas seguidas, es decir que si el primer disco tiene 10 canciones, la primera canción del segundo disco será la 11, y la segunda la 12 y así sucesivamente. A mi personalmente me gusta guardar cada disco en una carpeta llamada Disco 1, Disco 2, etc, y que además que en cada disco las canciones empiecen desde 1. Para que beets reinicie la numeración por cada disco hay que añadir en las opciones globales la línea per_disc_numbering: yes y luego para que los discos se dividan en carpetas usamos el plugin inline.

  • inline: Permite usar Python para modificar el nombre y la organización de los discos en la opción paths que vimos en la configuración básica. Para configurarlo necesitamos crear una sección en el archivo de configuración llamada item_fields. Yo lo he configurado así:
item_fields:
    multidisc: 1 if disctotal > 1 else 0

Esto lo que hace es definir una variable multidisc que será 1 si el álbum tiene más de un disco y 0 si sólo tiene un disco. Además he cambiado la sección paths para que si el álbum tiene más de un disco (multidisc valdrá 1) me cree carpetas y las llame Disc 1, Disc 2, etc.

paths:
    default: $albumartist - $album ($year)/%if{$multidisc,Disc $disc/}$track $title
  • web: Esto nos proporciona una interfaz web que usa Flask para mostrarnos toda nuestra colección de música e incluso podemos reproducirla desde el navegador de forma remota. Para lanzar el servidor usaremos beet web y para acceder desde el navegador http://localhost:8337. Podemos cambiar la dirección y el puerto en el archivo de configuración (ver documentación).
  • mbsync: Permite actualizar los tags de nuestros discos si han sufrido cambios en musicbrainz.org para reflejar esos cambios en nuestra colección. Si modificamos por ejemplo nosotros mismo un disco en MusicBrainz tendremos que hacer un beet mbsync para que se descarguen los cambios.
  • lyric: Permite descargar y añadir a los archivos la letra de las canciones.
lyrics:
    auto: no

Por defecto guarda la letra en las canciones, yo lo tengo puesto para que no sea automático.

  • missing: Muestra discos a los que les falte alguna canción consultando MusicBrainz
missing:
    format: $albumartist - $album - $title

Definimos el formato en el que se muestran las canciones que faltan con format.

  • duplicates: Muestra canciones duplicadas
  • fetchart: Encuentra la carátula de los discos y la guarda en un archivo cover.jpg en la carpeta del disco. Por defecto es automático
fetchart:
    cautious: yes

Con cautious indicamos que sólo descargue imágenes que contengan las palabras: cover, front, art, album, folder

  • embedart: Incrusta la carátula del disco como una etiqueta. Usado junto con fetchart usa la carátula descargada por este último. Por defecto es automático.
embedart:
    ifempty: yes
    remove_art_file: yes

Con ifempty evitamos que se sobrescriba la carátula si los archivos ya tienen una. Con remove_art_file conseguimos que se borre el archivo cover.jpg una vez incrustado en las canciones.

  • info: Muestra todas las etiquetas ID3 de uno o varios archivos.
  • mbcollection: Permite subir nuestra colección de música como una colección a musicbrainz.org. Es necesario tener cuenta.
musicbrainz:
    user: usuario
    pass: contraseña
  • play: Permite reproducir canciones buscándolas en la biblioteca de beets. Podemos definir nuestro reproductor favorito, en mi caso puse VLC.
play:
    command: vlc
  • zero: Este plugin sirve para dejar vacías todas aquellas etiquetas que no nos interesen o que algunos rippers añaden a las canciones como encoder,comment, etc. Por defecto es automático
zero:
    auto: no
    fields: encoder

Yo no lo tengo automático. Con la opción fields definimos la lista negra de las etiquetas a borrar. Si usamos keep_fields es como definir una lista blanca con las etiquetas que permanecen y todas las que no estén en ella serán vaciadas. Estas dos opciones son exclusivas, sólo podemos definir una de las dos.

  • scrub: Este plugin hay que manejarlo con cuidado. Lo que hace es borrar todas las etiquetas de los archivos (no las vacía, las borra por completo) y luego reescribe las etiquetas con los datos que hay en la base de datos de beets. Por defecto es automático pero yo no lo tengo así. Tiene una opción al ejecutarlo que es -W que lo que hace es borrar las etiquetas pero no las sobrescribe, con lo que deja los archivos sin ninguna etiqueta. Es para esto mismo para lo que lo uso yo de vez en cuando.
scrub:
    auto: no

En fin, estos son los plugins que yo uso actualmente, pero hay muchos más y algunos muy interesantes. Podéis echar un vistazo a todos los que hay y como se configuran aquí. Además como beets está hecho en Python, incluye una API para que podamos crear nuevos plugins. Para ver todas las opciones de configurarlo podéis visitar su documentación.

A modo de resumen para los que les guste mi configuración dejo aquí mi archivo de configuración completo por si queréis copiarlo:

### Beets config file

## Opciones Globales
directory: ~/Musica
library: ~/beets/musiclibrary.blb

plugins: inline web mbsync lyrics missing duplicates fetchart embedart info mbcollection play zero scrub

id3v23: yes

per_disc_numbering: yes

## Opciones al importar
import:
    detail: yes
    log: ~/beets/log.txt

## Configuracion de rutas
paths:
    default: $albumartist - $album ($year)/%if{$multidisc,Disc $disc/}$track $title
    singleton: Varios/$albumartist - $title

## Plugin Options
item_fields:
    multidisc: 1 if disctotal > 1 else 0

zero:
    auto: no
    fields: encoder

scrub:
    auto: no

lyrics:
    auto: no

missing:
    format: $albumartist - $album - $title
    
fetchart:
    cautious: yes
    
embedart:
    ifempty: yes
    remove_art_file: yes

musicbrainz:
    user: usuario
    pass: contraseña

play:
    command: vlc

Pues con esta pequeña guía ya podemos empezar a jugar con beets y organizar nuestra colección de música de una forma diferente pero a la larga gratificante. No olvidéis tener copia de vuestros discos antes de empezar a jugar con beets y tener un poco de práctica para evitar desastres.

Espero que os haya gustado la entrada de hoy y espero vuestros comentarios. Nos vemos en la próxima.

Saludos linuxeros.

 

Iconos de imagen destacada hechos por Freepik en www.flaticon.com con licencia CC 3.0 BY.

2 comentarios en “Beets – Organiza tu música de una forma muy geek”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *