91 lines
4.0 KiB
Python
91 lines
4.0 KiB
Python
import requests
|
||
|
||
BASE_URL = "https://musicbrainz.org/ws/2/"
|
||
HEADERS = {
|
||
"User-Agent": "IRC-Bot/1.0 (https://tu-bot.com)"
|
||
}
|
||
|
||
def buscar_musicbrainz(tipo, consulta):
|
||
"""Consulta MusicBrainz y devuelve información detallada."""
|
||
endpoint = {
|
||
"artista": "artist",
|
||
"album": "release",
|
||
"cancion": "recording"
|
||
}.get(tipo.lower())
|
||
|
||
if not endpoint:
|
||
return " Uso: `.music <artista|album|cancion> <nombre>`"
|
||
|
||
params = {
|
||
"query": consulta,
|
||
"fmt": "json",
|
||
"limit": 1
|
||
}
|
||
|
||
try:
|
||
response = requests.get(f"{BASE_URL}{endpoint}/", params=params, headers=HEADERS, timeout=5)
|
||
data = response.json()
|
||
|
||
if endpoint == "artist" and data.get("artists"):
|
||
artista = data["artists"][0]
|
||
nombre = artista.get("name", "Desconocido")
|
||
pais = artista.get("country", " Desconocido")
|
||
fecha_inicio = artista.get("life-span", {}).get("begin", " Desconocida")
|
||
fecha_fin = artista.get("life-span", {}).get("end", "️ Aún activo")
|
||
genero = ", ".join(tag["name"] for tag in artista.get("tags", [])) if artista.get("tags") else " Sin géneros registrados"
|
||
alias = ", ".join(ali["name"] for ali in artista.get("aliases", [])) if artista.get("aliases") else "Ninguno"
|
||
tipo = artista.get("type", "Desconocido")
|
||
area = artista.get("area", {}).get("name", "Desconocida")
|
||
|
||
return (f" **Artista:** {nombre} ({tipo})\n"
|
||
f" **País:** {pais} | **Región:** {area}\n"
|
||
f" **Activo desde:** {fecha_inicio} | **Fin:** {fecha_fin}\n"
|
||
f" **Géneros:** {genero}\n"
|
||
f"🆔 **Alias:** {alias}")
|
||
|
||
elif endpoint == "release" and data.get("releases"):
|
||
album = data["releases"][0]
|
||
titulo = album.get("title", "Desconocido")
|
||
artista = album.get("artist-credit", [{}])[0].get("name", "Desconocido")
|
||
fecha = album.get("date", " Fecha desconocida")
|
||
label = album.get("label-info", [{}])[0].get("label", {}).get("name", " Desconocida")
|
||
formatos = ", ".join(m["format"] for m in album.get("media", [])) if album.get("media") else " Desconocido"
|
||
tracks = album.get("track-count", "N/A")
|
||
barcode = album.get("barcode", "N/A")
|
||
|
||
return (f" **Álbum:** {titulo} | **Artista:** {artista}\n"
|
||
f" **Lanzamiento:** {fecha} | ️ **Sello:** {label}\n"
|
||
f" **Formatos:** {formatos} | **Tracks:** {tracks}\n"
|
||
f" **Código de Barras:** {barcode}")
|
||
|
||
elif endpoint == "recording" and data.get("recordings"):
|
||
cancion = data["recordings"][0]
|
||
titulo = cancion.get("title", "Desconocida")
|
||
artista = cancion.get("artist-credit", [{}])[0].get("name", "Desconocido")
|
||
duracion_ms = cancion.get("length", 0)
|
||
duracion = f"{duracion_ms // 60000}:{(duracion_ms // 1000) % 60:02d}" if duracion_ms else "⏳ Desconocida"
|
||
albumes = ", ".join(r["title"] for r in cancion.get("releases", [])) if cancion.get("releases") else " No asociado a álbum"
|
||
isrc = ", ".join(cancion.get("isrcs", [])) if "isrcs" in cancion else "N/A"
|
||
|
||
return (f" **Canción:** {titulo} | **Artista:** {artista}\n"
|
||
f"⏳ **Duración:** {duracion} min | **Álbumes:** {albumes}\n"
|
||
f" **ISRC:** {isrc}")
|
||
|
||
return " No encontré resultados en MusicBrainz."
|
||
|
||
except requests.exceptions.RequestException as e:
|
||
return f"️ Error en la consulta a MusicBrainz: {e}"
|
||
|
||
def run(*args):
|
||
"""Ejecuta la búsqueda en MusicBrainz."""
|
||
if len(args) < 2:
|
||
return " Uso: `.music <artista|album|cancion> <nombre>`"
|
||
|
||
tipo, consulta = args[0], " ".join(args[1:])
|
||
return buscar_musicbrainz(tipo, consulta)
|
||
|
||
def help():
|
||
"""Descripción del plugin para el comando .help"""
|
||
return " Usa `.music <artista|album|cancion> <nombre>` para buscar información detallada en MusicBrainz."
|
||
|