¿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.