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

91 lines
4.0 KiB
Python
Raw 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."