myircbot/plugins/music.py
2025-05-29 22:58:53 +02:00

91 lines
4.0 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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