Pablo Delgado Flores

Editando metadatos ID3 en ficheros mp3 con Python

Nivel del post no aplicainicialintermedioavanzado
Tiempo de lectura aproximado 5min

Os dejo un script en Python para añadir y editar etiquetas ID3 en vuestros ficheros mp3.

¿Qué, cómo va ese veranito (si eres de España, claro)? Aquí en Andalucía las altas temperaturas apenas nos dejan salir a la calle. Y aprovechando esta tesitura, me puse hace unos días a escribir un nuevo programita en Python para que me librara de otra tarea tediosa. Si solo te interesa el código y no mis batallitas, haz scroll y píllalo más abajo. Yo voy a contar mientras el porque de este programa y como he acabado editando metadatos ID3 en ficheros mp3 con Python.

¿Sabéis eso de que en casa del herrero, cuchillo de palo? Pues eso me pasó a mi hace unos -varios- años. Te pasas la vida recomendando a la gente que haga copias de seguridad de sus datos en varios sitios, pero tu te juegas la vida con un único almacenamiento en disco mecánico. Y claro, pasó lo que tuvo que pasar. El disco duro de 1Tb que usaba de almacén para todo (música, fotos, apuntes) dejó un buen día de funcionar. Llegué a mandarlo a una de esas empresas que cobran un pastón por recuperar datos, pero fue imposible. Estaba para tirarlo.

La cosa es que yo tenía una colección de audios del Carnaval de Cádiz curiosa. Y se fue al garete. Hace un tiempo, le pedí a un colega que me pasara lo que tuviese, para empezar dicha colección nuevamente. Hablamos de cientos y miles de ficheros mp3, con carnaval desde los años 60 hasta este 2022. Total, que empecé a ordenarlo todo por carpetas, seleccionar aquellas pistas -o para que me entiendas, canciones- que más me gustaban para llevarlas en el iPhone, ponerles sus etiquetas, etc. Pero cuando llevaba casi 600, pensé: «esto es un trabajo chino. No puedo nombrar las canciones como ficheros, ahora abrir el mp3tag para ponerles la información y carátulas, etc. Tengo que automatizar». Y dicho y hecho.

En dos ratejos saqué este script que coge las pistas de cada agrupación y con el nombre del fichero (por ejemplo, 01 – Presentación) y el nombre de la carpeta que lo tiene (que es en realidad el nombre de la agrupación en un año determinado) lo monto todo. Pero llegué a rizar el rizo y hasta hay una parte que monta una cadena de búsqueda, se va a YouTube y me obtiene el año de dicha agrupación, para ponérselo de metadato. Lo único manual que pongo son las carátulas, porque a veces están en los ficheros que me pasó mi colega, otras hay que conectarse a una web que tiene otras tantas, etc.

Antes del código, os resumo brevemente como está pensado, porque entiendo que el mundo del carnaval a mucha gente se le escapa. Lo detallo para entender el programa, pero comentando ciertas cosas os vale para ordenar vuestra música.

Yo tengo una carpeta que contiene todas las subcarpetas (C:\Carnaval). Dentro de esta, tengo organizadas las agrupaciones por el autor que las compone (Juan Carlos Aragón, Antonio Martínez Ares, etc). Y ya, dentro de los autores, están las diferentes subcarpetas de las agrupaciones de cada año (Los ángeles caídos, La eternidad, Los aguafiestas…). Estas carpetas, por último, contienen las pistas (o canciones, para que me entendáis) de cada agrupación. Un esquema rápido:

C:.
├───Antonio Martin
│   ├───A fuego vivo
│   ├───Agua clara
│   ├───Andaluces por el mundo
│   ├───Caleta
├───El Sheriff
│   ├───Cai Story
│   ├───Caiman
│   ├───De tienda en tienda
│   ├───El escuadron de los jartibles
        |
        |Presentación.mp3
        |Como me gusta.mp3
        |Sobre la cama.mp3
        |Cuples.mp3
        |Popurri.mp3
        |Tengo un amigo.mp3

Ea, pues esto es todo. Ahora que tenéis el esquema en la cabeza, aquí os dejo el código. Si tenéis alguna duda, podéis preguntar en los comentarios.

##IMPORTS
import os
from pathlib import Path
from os import walk
import mutagen
from mutagen.easyid3 import EasyID3
from os import listdir
from youtubesearchpython import VideosSearch
from dateutil.parser import parse, ParserError

#Directorio de la agrupación a gestionar
rootdir = r"C:\Carnaval\Nombre_de_la_agrupación_que_toque"

for rootdir, dirs, files in os.walk(rootdir):
	for subdir in dirs:
		
		#VARIABLES GLOBALES POR AGRUPACIÓN
		genero = "Chirigota" #Indico si es chirigota, comparsa, etc
		autor = "J. A. Vera Luque" #Indico el nombre del autor que quiero que me ponga como etiqueta.
		agrupacion = subdir #Vale para intérprete y álbum
		search_cadena = genero + " " + agrupacion #Monto la cadena de búsqueda para YouTube

		#Obtener el año de la agrupación buscándolo en YouTube
		videosSearch = VideosSearch(search_cadena, limit = 10) #Me traigo los primeros 10 resultados para montar un diccionario con los títulos
		result = videosSearch.result()
		result1 = result["result"]
		anio_agrupacion = None
		i = 0
		while not anio_agrupacion:
			resultdict = result1[i]
			year = resultdict['title']
			try:
				anio_agrupacion = str(parse(str(year), fuzzy=True).year)
			except ParserError:
				i += 1
				if i == 10:
					anio_agrupacion = 2500

		for i in range(numero_pistas):
			pista = pistas[i]
			print(pista)
			ruta_pista = os.path.join(ruta,pista)
			print(ruta_pista)

			#Manejo de cadenas de texto para formar el título de la pista y el tracknumber
			inicio_pista = pista.index('-')
			fin_pista = pista.index('.mp3')
			nombre_pista = pista[inicio_pista+2:fin_pista]

			fin_track = pista.index('-')
			track_OK = pista[:fin_track]

			#Manejo de posible error si los .mp3 a editar no tienen etiquetas id3 iniciadas
			try:
				tags = EasyID3(ruta_pista)
			except mutagen.id3.ID3NoHeaderError:
				tags = mutagen.File(ruta_pista, easy=True)

			###########################################>>>DEPURACIÓN
			#print("Para titulo canción: " + pista_OK)
			#print("Nº de pista: " + track_OK)
			#print("Etiquetas previas: " + tags.pprint())
			###########################################<<<DEPURACIÓN

			#CAMPOS A RELLENAR: album, artist, composer, date, genre, title, tracknumber
			tags['title'] = nombre_pista
			tags['artist'] = agrupacion
			tags['album'] = agrupacion
			tags['tracknumber'] = track_OK
			tags['genre'] = genero
			tags['composer'] = autor
			tags['albumartist'] = ''
			tags['date'] = anio_agrupacion
			
			tags.save()

Y esto es todo, amigos. Como podéis ver en el código, hacemos varias cositas interesantes como manejo de cadenas, librerías de búsqueda en YouTube, etc.

Como siempre, os dejo el código en GitHub. Disfrutadlo con mucha salud.

¡Extra, extra!

Suscríbete a mi newsletter para no perderte nada de mi nuevo contenido sobre bases de datos, administración de sistemas, programación

pablo_delgado_avatar

Pablo Delgado Flores

Auténtico apasionado por la informática, especialmente por las bases de datos, administración de sistemas y desarrollo web.

Empecé a trabajar como técnico informático mucho antes de obtener una titulación oficial (sysadmin). Actualmente trabajo como DBA Oracle, aunque manejo otros motores como MySQL/MariaDB, PostgreSQL y Amazon Redshift.

También escribo sobre Bases de Datos en Como ser DBA, la terminal de Linux/Unix en #Sudosu y  desarrollo web con Woocoomerce/WordPress en DesarrolloWoo.

Subscribirse
Notificar de
guest
0 Comentarios
Comentarios en línea
Ver todos los comentarios
Scroll al inicio