773 - Automatización Total. Etiqueta tus MP3 como un profesional

773 - Automatización Total. Etiqueta tus MP3 como un profesional

Aprende a automatizar metadatos de audio en Linux con ID3CLI, la herramienta en Rust que supera los problemas de dependencias de los scripts en Python.

1:25
-3:15

En el episodio 761 titulado Rust-scritp. El fin de los scripts en Bash, un comentario recurrente era para esto Python, y si, parcialmente lo entiendo, pero no del todo. Un ejemplo claro, son las dependencias de un proyecto, y lo que te vengo a contar hoy es un ejemplo manifiesto de esto. Cuando tu proyecto en Python depende de librerías externas, y esas librerías cambian tenemos un problema. Me dirás que en Rust, pasa lo mismo, y tienes toda la razón, pero lo mio está compilado. Y esto es una gran ventaja, va a funcionar hasta que lo vuelva a compilar. Sea como fuere, el corazón de una herramienta debería estar en la propia herramienta y no en las dependencias externas.

Después de esta diatriba contra las dependencias externas, vamos al grano. Algo a lo que le dedico especial atención, probablemente mas de la que debería, no lo se, es a los tags de los audios de los podcast. Y por otro lado, como sabes, me gusta automatizar todo lo que puedo. Así, hasta hace poco, esta utilizando dos herramientas en Python, para añadir los tags a los audios y la carátula. Sin embargo, una de esas herramientas dejó de funcionar, y decidí ponerle solución definitiva al asunto, y la solución definitiva fue implementar mi propia herramienta en Rust, que es lo que te voy a contar hoy.

Automatización Total. Etiqueta tus MP3 como un profesional

Como te decía en la introducción, una de las operaciones habituales cuando grabamos un podcast es la de etiquetar el archivo de audio con los metadatos adecuados, como el título del episodio, el número, la temporada, el autor, la carátula, etc. Por lo menos esta es una operación que yo hago habitualmente, y que me parece importante. Esto es algo que hago de forma metódica. Es mas lo hago con un script que se encarga de extraer la información del propio archivo Markdown del episodio y genera los tags correspondientes.

EasyTag

Inicialmente esto de añadir los tags lo hacía con una herramienta con interfaz gráfica llamada EasyTAG

EasoTAG es una aplicación gráfica que permite editar los metadatos de archivos de audio, como MP3, FLAC, OGG, entre otros. Con EasyTAG, puedes ver y modificar fácilmente la información de los archivos de audio, como el título, el artista, el álbum, el año, el género y otros detalles relevantes.

Se trata de una herramienta muy útil para organizar y gestionar tu colección de música o podcasts, ya que te permite mantener la información de los archivos actualizada y consistente.

Sin embargo, aunque EasyTAG es una herramienta muy útil y realmente sencilla de utilizar, no es la herramienta ideal para automatizar procesos, ya que requiere de una interacción manual a través de su interfaz gráfica. Por lo que pronto empecé a buscar alternativas en la terminal, que me permitieran automatizar el proceso de etiquetado de los archivos de audio.

De la interfaz gráfica a la terminal

Sin embargo con el tiempo he ido migrando a herramientas de terminal para poder automatizar el proceso. Me parece muy absurdo, teniendo el artículo que acompaña el podcast, tener que abrir una aplicación gráfica para etiquetar el archivo de audio, cuando realmente toda la información la puedo sacar del propio artículo. De echo los artículos los tengo preparados en markdown con una cabecera conocida como front-matter, que es donde almaceno toda la información relevante del episodio.

Otra cosa muy distinta, y que he hecho durante algún tiempo, es cuando tienes que etiquetar las pistas de un album de música, donde si que es necesario tener una interacción manual para asegurarte de que cada pista tiene la información correcta. Sin embargo, para mi propia producción, como verás no tiene sentido alguno.

Sobre front-matter

front-matter es una sección especial al inicio de un archivo markdown que contiene metadatos sobre el documento. Esta sección está delimitada por tres guiones (---) al principio y al final, y utiliza un formato de datos estructurado como YAML o TOML para definir los metadatos.

Como te puedes imaginar, esta sección es muy útil para almacenar información relevante sobre el episodio del podcast, como el título, el número de episodio, la temporada, la fecha de publicación, las etiquetas (tags), el autor, la descripción y otros detalles que pueden ser útiles para organizar y presentar el contenido.

Por ejemplo, un dato que incluyo en el front-matter es el número de episodio. De esta manera, encontrar un número de episodio específico es tan sencillo como utilizar ripgrep para buscar en los archivos markdown. Pero no solo guardo el número de episodio, también guardo el título, la temporada, la fecha en la que escribí el artículo, las etiquetas asociadas, etc. Incluso te diría que muchos de los artículos que escribo tienen un título diferente al nombre del archivo markdown, por lo que tener el título en el front-matter es fundamental para etiquetar correctamente el archivo de audio.

Esa información en front-matter la puedo extraer fácilmente con herramientas de terminal como yq o awk y luego usar esa información para etiquetar el archivo de audio.

Las herramientas de terminal

Hasta la fecha estaba haciéndolo con dos herramientas de terminal, eyeD3 y mid3v2. Una, la utilizaba para las etiquetas, mientras que la otra la utilizaba para la carátula. Realmente, ahora mismo, no recuerdo cual hacía que.

Sin embargo, la primera dejó de funcionar. Por lo que he podido ver, era una cuestión de dependencias, y la verdad, no me apetecía ponerme a solucionar el problema.

eyeD3

eyeD3 es una herramienta de software escrita en Python diseñada para trabajar con archivos de audio, específicamente para leer y manipular sus etiquetas ID3.

En pocas palabras, es la herramienta que necesitas para cambiar el nombre del artista, el título de la canción, el álbum o incluso la carátula que aparece cuando reproduces un archivo MP3.

Con esta herramienta puedes realizar las siguientes operaciones,

  • Editar metadatos. Cambiar el título, artista, álbum, año y género.
  • Gestionar imágenes. Insertar o extraer la carátula (cover art) del archivo de audio.
  • Consultar detalles técnicos. Ver la duración de la canción, el bitrate (calidad) y la frecuencia de muestreo.
  • Organización masiva. Es muy usado por programadores para crear scripts que renombran miles de archivos automáticamente basándose en sus etiquetas.

mid3v2

mid3v2 es una herramienta de línea de comandos diseñada específicamente para manipular etiquetas ID3v2 en archivos de audio MP3. Forma parte del paquete Mutagen, que es una biblioteca de Python para manejar metadatos en varios formatos de archivos de audio. Algunas características específicas de mid3v2 son,

  • Compatibilidad Total con ID3v2.4. Mientras que algunos reproductores antiguos sufren con la versión 2.4, Mutagen la maneja a la perfección, permitiendo cosas como etiquetas múltiples para un mismo campo.
  • Conversión de etiquetas. Una de sus funciones más útiles es convertir etiquetas viejas (ID3v1) a versiones modernas (ID3v2.4) de forma automática.
  • Limpieza profunda. Tiene opciones para borrar todas las etiquetas de un archivo y empezar desde cero, eliminando «basura» de metadatos que otros programas dejan atrás.

Llegados a este punto, probablemente te estarás preguntado, porque utilizaba dos herramientas. Pues la respuesta es sencilla, no lo se, no lo recuerdo. Pero, así era.

id3cli

De cualquier forma, visto el problema con la actualización de una de las herramientas, en lugar de estudiar a fondo el problema, o ver si con la otra herramienta lo podía resolver, decidí, crear mi propia herramienta en Rust para gestionar los tags de los archivos de audio. Porque la gran ventaja de Rust es que puedes compilar tu programa y tener todas las dependencias incluidas en el binario resultante. Esto significa que una vez que compilas tu herramienta, puedes ejecutarla en cualquier sistema compatible sin preocuparte por las dependencias externas.

A diferencia de las dos herramientas anteriores, id3cli es una herramienta muy específica y personal, diseñada para ser una interfaz de línea de comandos sencilla y moderna. Mientras que eyeD3 y mid3v2 son herramientas generales que intentan cubrir cada pequeño detalle del estándar ID3, id3cli busca la simplicidad y la eficiencia del flujo de trabajo moderno.

Actualmente id3cli solo tiene dos dependencias importantes que son id3 y clap. La primera es una biblioteca de Rust para manipular etiquetas ID3 en archivos MP3, y la segunda es una biblioteca para crear interfaces de línea de comandos.

Características de id3cli

Las características principales de id3cli son las siguientes,

  • Completo y fácil de usar
  • Añadir/modificar metadatos ID3. título, artista, álbum, año, género, pista, temporada, fecha, copyright
  • Soporte completo para podcasts. compositor, subtítulo, artista original, artista del álbum, temporada (TPOS)
  • Soporte para letras de canciones (lyrics) en formato USLT
  • Soporte para URL (sitio web oficial del artista) en formato WOAR
  • Soporte para metadatos de Apple: compilation, album sort, artist sort, title sort
  • Soporte para carátulas en JPG, PNG y WEBP con detección automática de tipo MIME
  • Soporte para múltiples artistas (colaboraciones)
  • Eliminar tags específicos con nombres en inglés o español
  • Visualizar todos los tags existentes con formato legible
  • Preserva metadatos existentes al actualizar campos específicos

Comandos disponibles

# Mostrar todos los tags del archivo
id3cli show <FILE>

# Editar tags del archivo
id3cli edit <FILE> [OPTIONS]

# Eliminar tags específicos del archivo
id3cli remove <FILE> [TAGS...]

Opciones para el comando remove

ArgumentoDescripción
<FILE>Ruta del archivo MP3 (requerido)
[TAGS...]Tags a eliminar (uno o más argumentos posicionales)

Tags disponibles: title, artist, album, year, genre, track, season, date, copyright, composer, subtitle, original_artist, album_artist, cover, lyrics, url, compilation, album_sort, artist_sort, title_sort

También acepta nombres en español: título, artista, álbum, año, género, pista, temporada, fecha, compositor, subtítulo, carátula, letra, compilación, etc.

Opciones para el comando edit

OpciónDescripción
<FILE>Ruta del archivo MP3 (argumento posicional, requerido)
-t, --title <TITLE>Título de la canción
-a, --artist <ARTIST>Artista (se puede repetir para múltiples artistas)
-A, --album <ALBUM>Álbum
-y, --year <YEAR>Año
-g, --genre <GENRE>Género
-T, --track <TRACK>Número de pista
-S, --season <SEASON>Temporada (TPOS – útil para podcasts)
-d, --date <DATE>Fecha de grabación (YYYY-MM-DD o YYYY)
-C, --copyright <COPYRIGHT>Copyright
--composer <COMPOSER>Compositor (TCOM)
--subtitle <SUBTITLE>Subtítulo o descripción (TIT3)
--original-artist <ORIGINAL_ARTIST>Artista original (TOPE)
--album-artist <ALBUM_ARTIST>Artista del álbum / Publisher (TPE2)
-c, --cover <COVER>Ruta del archivo de imagen para la carátula (JPG, PNG, WEBP)
-L, --lyrics <LYRICS>Letra de la canción (lyrics)
-u, --url <URL>URL asociada (sitio web del artista, página oficial, etc.)
--compilationMarcar como compilación (Apple TCMP)
--album-sort <ALBUM_SORT>Orden de clasificación del álbum (Apple TSOA)
--artist-sort <ARTIST_SORT>Orden de clasificación del artista (Apple TSOP)
--title-sort <TITLE_SORT>Orden de clasificación del título (Apple TSOT)
-h, --helpMostrar ayuda

Ejemplos de uso

Ver tags existentes

id3cli show cancion.mp3

Salida:

📋 Tags ID3 encontrados:

═══════════════════════════════════════
🎵 Título:    Yesterday
🎤 Artista:   The Beatles
💿 Álbum:     Help!
📅 Año:       1965
📆 Fecha:     1965-08-06
🎸 Género:    Rock
#️⃣  Pista:     2
©️  Copyright: © 1965 Apple Records
🖼️  Carátulas: 1 imagen(es)
   [1] Tipo: CoverFront, MIME: image/jpeg, Tamaño: 24.5 KB

📦 Total de frames: 9
═══════════════════════════════════════

Ejemplo de podcast con temporada:

📋 Tags ID3 encontrados:

═══════════════════════════════════════
🎵 Título:    La historia del TCP/IP
🎤 Artista:   Tech Podcast
💿 Álbum:     Historia de Internet
📆 Fecha:     2026-01-22
🎸 Género:    Podcast
#️⃣  Pista:     5
📺 Temporada: 2
©️  Copyright: © 2026 CC BY 4.0
🎼 Compositor: Tech Podcast
📄 Subtítulo: Cómo se creó el protocolo TCP/IP

📦 Total de frames: 10
═══════════════════════════════════════

✏️ Añadir metadatos básicos

id3cli edit cancion.mp3 \
  --title "Bohemian Rhapsody" \
  --artist "Queen" \
  --album "A Night at the Opera" \
  --year 1975 \
  --genre "Rock" \
  --track 11

👥 Múltiples artistas (colaboraciones)

id3cli edit remix.mp3 \
  --title "Despacito Remix" \
  --artist "Luis Fonsi" \
  --artist "Daddy Yankee" \
  --artist "Justin Bieber"

Resultado: Los artistas se unen con "; "Luis Fonsi; Daddy Yankee; Justin Bieber

📺 Añadir temporada (ideal para podcasts)

# Episodio con temporada
id3cli edit episodio.mp3 \
  --title "El origen de Internet" \
  --artist "Tech Podcast" \
  --album "Historia de la Tecnología" \
  --track 5 \
  --season 2 \
  --genre "Podcast"

Resultado: Temporada 2, Episodio 5 (S02E05) perfectamente identificado

🎨 Añadir carátula

Soporta JPG, PNG y WEBP con detección automática de tipo MIME:

# JPG o JPEG
id3cli edit cancion.mp3 --cover portada.jpg

# PNG
id3cli edit cancion.mp3 --cover portada.png

# WEBP
id3cli edit cancion.mp3 --cover portada.webp

🎶 Añadir letra (lyrics)

# Letra simple
id3cli edit cancion.mp3 -L "Primera línea
Segunda línea
Coro completo"

# Desde archivo
id3cli edit cancion.mp3 -L "$(cat letra.txt)"

# Con otros metadatos
id3cli edit cancion.mp3 -t "Canción" -a "Artista" -L "Letra completa..."

🌐 Añadir URL

# URL del sitio oficial del artista
id3cli edit cancion.mp3 -u "https://artista.com"

# Con otros metadatos
id3cli edit cancion.mp3 -t "Canción" -a "Artista" -u "https://artista.com/official"

🍎 Metadatos de Apple

Los metadatos de Apple son útiles para organizar bibliotecas musicales en iTunes y otros reproductores compatibles:

# Marcar como compilación (álbum recopilatorio)
id3cli edit cancion.mp3 --compilation

# Especificar orden de clasificación personalizado
id3cli edit cancion.mp3 \
  --title "A Hard Day's Night" \
  --artist "The Beatles" \
  --album "A Hard Day's Night" \
  --album-sort "Hard Day's Night, A" \
  --artist-sort "Beatles, The" \
  --title-sort "Hard Day's Night, A"

# Compilación con orden de clasificación
id3cli edit cancion.mp3 \
  --compilation \
  --album-sort "Greatest Hits" \
  --artist-sort "Various Artists"

Frames utilizados:

  • TCMP – Compilation flag (1 = compilación)
  • TSOA – Album sort order
  • TSOP – Performer/Artist sort order
  • TSOT – Title sort order

🎙️ Metadatos para Podcasts

Configuración completa para episodios de podcast con todas las etiquetas recomendadas:

id3cli edit episodio42.mp3 \
  --title "Episodio 42: Introducción a Rust" \
  --subtitle "Aprendiendo sobre ownership y borrowing" \
  --artist "Lorenzo" \
  --album "atareao con Linux" \
  --album-artist "Lorenzo" \
  --composer "Lorenzo" \
  --original-artist "Lorenzo" \
  --genre "Podcast" \
  --track 42 \
  --season 3 \
  --date "2026-01-22" \
  --copyright "© 2026 CC BY 4.0"

Correspondencia con frames ID3v2:

  • --title → TIT2 (título del episodio)
  • --subtitle → TIT3 (descripción corta)
  • --artist → TPE1 (host/presentador)
  • --album → TALB (nombre del podcast)
  • --album-artist → TPE2 (publisher/creador)
  • --composer → TCOM (autor)
  • --original-artist → TOPE (artista original)
  • --genre → TCON («Podcast»)
  • --track → TRCK (número de episodio)
  • --season → TPOS (temporada)
  • --date → TDRC (fecha de publicación)
  • --copyright → TCOP (licencia)

📦 Metadata completa

id3cli edit cancion.mp3 \
  --title "Yesterday" \
  --artist "The Beatles" \
  --album "Help!" \
  --year 1965 \
  --genre "Rock" \
  --track 2 \
  --date "1965-08-06" \
  --copyright "© 1965 Apple Records" \
  --cover cover.jpg

🔄 Actualizar campos específicos

Los tags existentes se preservan automáticamente:

# Solo cambiar el año
id3cli edit cancion.mp3 --year 2026

# Solo añadir carátula (preserva título, artista, etc.)
id3cli edit cancion.mp3 --cover nueva_portada.jpg

# Cambiar artista sin afectar otros tags
id3cli edit cancion.mp3 -a "Nuevo Artista"

🗑️ Eliminar tags específicos

Acepta nombres en inglés o español:

# Eliminar un tag
id3cli remove cancion.mp3 title

# Eliminar varios tags a la vez
id3cli remove cancion.mp3 title artist album

# Usar nombres en español
id3cli remove cancion.mp3 título artista

# Eliminar carátula
id3cli remove cancion.mp3 cover

# Eliminar letra
id3cli remove cancion.mp3 lyrics

# Eliminar URL
id3cli remove cancion.mp3 url

# Eliminar metadatos de Apple
id3cli remove cancion.mp3 compilation
id3cli remove cancion.mp3 album_sort artist_sort title_sort

# Usar nombres en español para metadatos Apple
id3cli remove cancion.mp3 compilación
id3cli remove cancion.mp3 orden-album orden-artista orden-titulo

Tags disponibles para eliminar:
title, artist, album, year, genre, track, season, date, copyright, composer, subtitle, original_artist, album_artist, cover, lyrics, url, compilation, album_sort, artist_sort, title_sort

🎯 Ejemplos adicionales del comando remove

# Eliminar todos los metadatos básicos
id3cli remove cancion.mp3 title artist album year genre

# Limpiar metadatos de podcast
id3cli remove episodio.mp3 season subtitle composer original_artist

# Eliminar solo elementos multimedia
id3cli remove cancion.mp3 cover lyrics url

# Resetear ordenes de clasificación de Apple
id3cli remove cancion.mp3 compilation album_sort artist_sort title_sort

Instalación

Desde binario (Linux)

Descarga la última release:

wget https://github.com/atareao/id3cli/releases/latest/download/id3cli-linux-x86_64
chmod +x id3cli-linux-x86_64
sudo mv id3cli-linux-x86_64 /usr/local/bin/id3cli

Compilar desde código fuente

git clone https://github.com/atareao/id3cli.git
cd id3cli
cargo build --release
sudo cp target/release/id3cli /usr/local/bin/

Mi uso particular

Como te decía, yo lo utilizo para etiquetar los audios del podcast. Esto lo saco del front-matter del episodio y le doy las etiquetas al audio de la siguiente forma,

title=$(grep "^title: " "${MD_FILE}" | head -n1)
title="${title//title: /}"
season=$(grep "^season: " "${MD_FILE}" | head -n1)
season="${season//season: /}"
date=$(date "+%Y-%m-%d")
year=$(date "+%Y")
id3cli --file "${MP3_FILE}" \
       --album "atareao con Linux" \
       --composer "Lorenzo Carbonell" \
       --genre "Podcast" \
       --copyright "Copyright © $(date "+%Y") Lorenzo Carbonell (CC BY 4.0)" \
       --date "${date}" \
       --year "${year}" \
       --title "${title}" \
       --subtitle "atareao con Linux. El podcast sobre Linux y Open Source" \
       --original-artist "Lorenzo Carbonell" \
       --artist "Lorenzo Carbonell" \
       --album-artist "Lorenzo Carbonell" \
       --cover "${JPG_FILE}" \
       --track "${EPISODE}" \
       --season "${season}"
id3cli --file "${MP3_FILE}" --show

Más información,

Deja una respuesta

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