SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

*nix en casos prácticos: organizar música con amor y esmero (1)

2014-12-29

Llega otra entrega de *nix en casos prácticos, la serie de artículos sobre usos y técnicas de sistemas *nix en general y de la potente línea de órdenes en particular. Hoy vamos a ver una manera de copiar un disco de música a un ordenador.

Si el reloj no falla, este artículo está escrito a punto de acabar el año 2014. La práctica ancestral de comprar discos físicos de música es apenas un vestigio de lo que fue. Más raro todavía es que uno de los escasos compradores de discos compactos se dedique a organizar su biblioteca de música con herramientas de línea de órdenes para sistemas de tipo *nix (¿quién sabe si GNU/Linux o FreeBSD?). Alguna rara avis podría haber en el mundo que encuentre la técnica descrita en este artículo interesante.

Digamos que tenemos un disco compacto de música cuyo contenido queremos pasar a un ordenador. Podríamos hacerlo de muchas maneras distintas, pero tenemos un viejo ritual que nos agrada practicar de vez en cuando.

  1. En primer lugar, extraemos el contenido del disco con una herramienta como cdparanoia. La cosa puede ser tan sencilla como esto:
    cdparanoia -B
    Esta herramienta nos deja un fichero por cada pista del disco con nombres tales como track01.cdda.wav, track02.cdda.wav
  2. Nos interesa comprimir un poco el audio, pero sin pérdida. Usaremos FLAC. La conversión es muy fácil de hacer:
    flac --best *.wav

Ya tenemos todos nuestros ficheros de audio con compresión sin pérdida. Ahora queremos añadir metadatos: el grupo, el nombre del disco… Hay bases de datos en Internet con información sobre muchísimos discos y no estaría de más usarlas. Ahora bien, estamos practicando un ritual lleno de cariño y esmero; tenemos que poner un poquito de esfuerzo por nuestra parte para disfrutar más del producto final. Lo que haremos será rellenar los datos a mano en unos ficheritos de texto y luego programaremos la máquina para que use esos datos para anotar bien la música. Digamoso que nuestro disco es del grupo Grupo de rock, que por supuesto hace música rock. El disco se llama Todavía comprando cedés, es del año 2014 y tiene dos canciones: Primera canción y Última canción. Rellenaremos los siguientes ficheros con estos datos:

album
Todavía comprando cedés
artist
Grupo de rock
genre
rock
year
2014
titles
Primera canción Última% canción

Ahora usaremos esta información con un pequeño script. En primer lugar, cargamos la información fija:
ALBUM=`cat album` ARTIST=`cat artist` GENRE=`cat genre` TRACKTOTAL=`awk 'END{print NR}' < titles` YEAR=`cat year`
La única parte que no es trivial es la asignación del valor de TRACKTOTAL, que es el número de pistas que tiene el disco; lo hacemos con esa sencilla instrucción de awk porque es probablemente la forma más sencilla de hacerlo sin importar si hay o no un carácter de fin de línea tras el título de la última canción. Después, iteramos sobre los títulos de canción:
awk 'nl -w2 -nrz titles | while read TRACKNUMBER TITLE; do
Esto empieza un bucle sobre las líneas del fichero titles. La invocación de nl sirve para volcar el contenido de titles con el número de línea (el número de canción) antepuesto; la opción -w2 sirve para fijar el número de caracteres del número de línea a 2 y -nrz sirve para que estos números aparezcan con ceros iniciales, igual que como aparecen en lo que generó cdparanoia. La orden read TRACKNUMBER TITLE asigna la primera palabra de cada línea de la salida de nl (el número de canción) a la variable TRACKNUMBER y el resto (el título de la canción) a la variable TITLE. Dentro del bucle, hacemos las siguientes operaciones:

  1. Renombramos los ficheros FLAC a algo con el nombre de canción:
    NAME="${TRACKNUMBER}_-_${TITLE}.flac" mv "track${TRACKNUMBER}.cdda.flac" "$NAME"
  2. Anotamos el título de la canción en los metadatos con metaflac:
    metaflac --set-tag="TITLE=$TITLE" "$NAME"
  3. Anotamos el artista en los metadatos con metaflac:
    metaflac --set-tag="ARTIST=$ARTIST" "$NAME"
  4. Anotamos el número de pista en los metadatos con metaflac:
    metaflac --set-tag="TRACKNUMBER=$TRACKNUMBER" "$NAME"
  5. Anotamos la cantidad total de pistas en los metadatos con metaflac:
    metaflac --set-tag="TRACKTOTAL=$TRACKTOTAL" "$NAME"
  6. Anotamos la nombre del disco en los metadatos con metaflac:
    metaflac --set-tag="ALBUM=$ALBUM" "$NAME"
  7. Anotamos el año en los metadatos con metaflac:
    metaflac --set-tag="DATE=$YEAR" "$NAME"
  8. Anotamos el género en los metadatos con metaflac:
    metaflac --set-tag="GENRE=$GENRE" "$NAME"

Finalmente, terminamos el bucle:
done

Esto queda todo junto en un script así:
#!/bin/sh ALBUM=`cat album` ARTIST=`cat artist` GENRE=`cat genre` TRACKTOTAL=`awk 'END{print NR}' < titles` YEAR=`cat year` awk 'nl -w2 -nrz titles | while read TRACKNUMBER TITLE; do NAME="${TRACKNUMBER}_-_${TITLE}.flac" mv "track${TRACKNUMBER}.cdda.flac" "$NAME" metaflac --set-tag="TITLE=$TITLE" "$NAME" metaflac --set-tag="ARTIST=$ARTIST" "$NAME" metaflac --set-tag="TRACKNUMBER=$TRACKNUMBER" "$NAME" metaflac --set-tag="TRACKTOTAL=$TRACKTOTAL" "$NAME" metaflac --set-tag="ALBUM=$ALBUM" "$NAME" metaflac --set-tag="DATE=$YEAR" "$NAME" metaflac --set-tag="GENRE=$GENRE" "$NAME" done


Categorías: Informática

Permalink: http://sgcg.es/articulos/2014/12/29/unix-en-casos-practicos-organizar-musica-con-amor-y-esmero-1/