Leer etiquetas ID3 (información de artista, álbum, etc.…) de ficheros MP3 con Java

Os habréis fijado que todos los reproductores de música saben “mágicamente” el artista, el álbum, el año y demás datos de la canción que les damos a reproducir. Los MP3 tienen una sección en la que se almacenan todos estos datos y acceder a ellos desde Java no es difícil haciendo uso de alguna librería de terceros. En este ejemplo usaremos JID3 de “Blinkenlights”, que podéis encontrar en http://jid3.blinkenlights.org/ Para ver cómo funciona crearemos una clase con un par de métodos que lea alguna etiqueta y la muestre por pantalla. Lo cierto es que la forma de escribirlas sería reemplazar las llamadas a “read” por “write”… vamos, que se nos habría ocurrido a todos ;)Lo primero sería añadir la librería (el jar) de blinkenlights a nuestro proyecto… eso depende del IDE que uséis, si tenéis dudas poned un comentario, seguro que alguno de nosotros usa el mismo que vosotros y os echa una mano :)Yo me he creado una clase “EjemploLecturaID3Tags” (que original soy) con un método Main que llama a un método (readTags) pasándole la ruta a un fichero mp3. El código del método es el siguiente:

 public void readTags(String file) {
  MediaFile mediaFile = new MP3File(new File(file));
  try {
   for (Object obj : mediaFile.getTags()) {
    if (obj instanceof ID3V1_0Tag)
     readID3V1Tags(obj);
    else if (obj instanceof ID3V2_3_0Tag)
     readID3V2_3Tags(obj);
   }
  } catch (ID3Exception e1) {
   e1.printStackTrace();
  }
 }

Vamos a analizarlo. Recibe una cadena de texto (file) que es la ruta al MP3 y crea un objeto MediaFile (es requisito de JID3), hasta ahí claro. Ahora llama a mediaFile.getTags() (que devuelve un array de “Tags” por decirlo de alguna forma) y lo recorre. Si alguien no conocía esa estructura, es el “foreach” de java ;)

Lo raro empieza ahora, para cada elemento (cada “tag”) pregunta si es instancia de ID3V1_0Tag o de ID3V2_3_0Tag. Sí, efectivamente, los ficheros mp3 pueden contener Tags en varios formatos. Lo normal es que ya estén todos en la versión 2… pero no está de más implementar la lectura de las versión 1, que sigue habiendo.

Vale, veréis que el método readTags no las lee, sino que delega la lectura en métodos específicos para cada versión. Ahora os los pongo, pero son muy muy parecidos:

 private void readID3V1Tags(Object obj) {
  ID3V1_0Tag oID3V1_0Tag = (ID3V1_0Tag) obj;
  if (oID3V1_0Tag.getTitle() != null)
   System.out.println(oID3V1_0Tag.getTitle());
  if (oID3V1_0Tag.getAlbum() != null)
   System.out.println(oID3V1_0Tag.getAlbum());
  if (oID3V1_0Tag.getArtist() != null)
   System.out.println(oID3V1_0Tag.getArtist());
 }
 private void readID3V2_3Tags(Object obj) {
  ID3V2_3_0Tag oID3V2_3_0Tag = (ID3V2_3_0Tag) obj;
  if (oID3V2_3_0Tag.getTitle() != null)
   System.out.println(oID3V2_3_0Tag.getTitle());
  if (oID3V2_3_0Tag.getAlbum() != null)
   System.out.println(oID3V2_3_0Tag.getAlbum());
  if (oID3V2_3_0Tag.getArtist() != null)
   System.out.println(oID3V2_3_0Tag.getArtist());
 }

El método, aunque algo cutre, funciona. Se basa en preguntar por las etiquetas que queremos y mostrarlas por pantalla en caso de que sean distintas de null, vamos, en caso de que exista.

Si tenéis cualquier duda, ya sabéis, usad los comentarios. ¡Suerte!

About the Author

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P