Volver al inicio

Bot de Telegram para códigos UPC de música: 10 plataformas

Bot de Telegram extrae códigos UPC e ISRC de lanzamientos de 10 plataformas mediante parseo de enlaces y API. Describe arquitectura con regex, caché de Redis, lógica de reintento para Spotify. Lecciones sobre trabajar con APIs fragmentadas y endpoints no documentados.

Bot para UPC/ISRC: parseo de 10 APIs de música
Advertisement 728x90

Creando un bot de Telegram para extraer códigos UPC e ISRC de plataformas musicales

Este bot de Telegram extrae códigos UPC e ISRC de lanzamientos musicales en 10 plataformas principales. Soporta Spotify, Apple Music, Yandex Music, YouTube Music, Deezer, Tidal, SoundCloud, VK Music, Zvuk y Amazon Music. La necesidad surgió por la falta de acceso directo a los códigos UPC a través de distribuidores o interfaces de las plataformas. El bot procesa enlaces, IDs de lanzamiento y consultas de texto, devolviendo códigos precisos en solo 1–2 segundos gracias a una caché inteligente.

El UPC identifica lanzamientos (álbumes, sencillos), mientras que el ISRC etiqueta de forma única cada pista individual. Estos identificadores son esenciales para migrar entre distribuidores, registrar derechos y rastrear regalías.

Arquitectura del sistema

El sistema es modular:

Google AdInline article slot
  • Parser de URL: Identifica la plataforma usando expresiones regulares.
  • Resolutor de plataformas: Recupera metadatos mediante APIs oficiales o reversadas.
  • Coincididor UPC/ISRC: Valida datos cruzadamente desde múltiples fuentes.
  • Almacenamiento: Redis para caché (TTL: 24 horas), PostgreSQL para análisis.

Este diseño permite procesamiento escalable y reduce la carga en APIs externas.

import re
from dataclasses import dataclass
from enum import Enum

class Platform(Enum):
    SPOTIFY = "spotify"
    APPLE_MUSIC = "apple_music"
    YANDEX_MUSIC = "yandex_music"
    YOUTUBE_MUSIC = "youtube_music"
    DEEZER = "deezer"
    TIDAL = "tidal"
    SOUNDCLOUD = "soundcloud"
    VK_MUSIC = "vk_music"
    ZVUK = "zvuk"
    AMAZON_MUSIC = "amazon_music"

@dataclass
class ParsedLink:
    platform: Platform
    content_type: str  # "album", "track", "artist"
    content_id: str

PATTERNS = [
    # Spotify
    (r"open\.spotify\.com/(album|track)/([a-zA-Z0-9]+)",
     Platform.SPOTIFY),
    # Apple Music
    (r"music\.apple\.com/.+/(album|song)/.+?/(")",
     Platform.APPLE_MUSIC),
    # y otros...
]

Manejo de enlaces y URLs acortadas

El parser utiliza más de 10 patrones regex para coincidir con formatos de URL. Los enlaces acortados (por ejemplo, spotify.link, youtu.be) se resuelven mediante solicitudes HEAD con seguimiento automático de redirecciones:

async def resolve_short_url(url: str) -> str:
    async with aiohttp.ClientSession() as session:
        async with session.head(
            url, allow_redirects=True, timeout=5
        ) as resp:
            return str(resp.url)

Los tipos de contenido soportados incluyen álbumes, pistas y artistas. Para pistas, el bot localiza automáticamente el lanzamiento padre.

Google AdInline article slot

Trabajo con la API de Spotify

La API Web de Spotify devuelve el UPC en external_ids.upc para álbumes e ISRC en los datos de pista. Los desafíos incluyen:

  • UPC ausente en respuestas — reintento en mercados (EE.UU., Reino Unido, Alemania, Japón).
  • Búsqueda inestable de UPC para lanzamientos regionales.
  • Límite de tasa: 180 solicitudes por minuto.

La caché en Redis reduce significativamente la carga en la API:

async def get_album_data(album_id: str) -> dict | None:
    cache_key = f"album:{album_id}"
    cached = await redis.get(cache_key)
    if cached:
        return json.loads(cached)
    
    for market in ["US", "GB", "DE", "JP"]:
        album = await spotify.get_album(album_id, market=market)
        upc = album.get("external_ids", {}).get("upc")
        if upc:
            # Guardar en caché
            await redis.set(cache_key, json.dumps(result), ex=86400)
            return result
    return None

APIs no documentadas: Yandex Music y VK

Sin APIs públicas disponibles, se realizaron endpoints mediante ingeniería inversa del tráfico de la app móvil. El UPC se encuentra en los metadatos del álbum; el ISRC en los datos a nivel de pista. Los formatos de respuesta cambian inesperadamente (dos veces en tres meses), requiriendo monitoreo constante.

Google AdInline article slot

Detección de versiones de lanzamientos

El bot encuentra todos los UPC asociados a un mismo ISRC —incluyendo sencillos, álbumes y recopilaciones. Esto es crucial para preservar el historial de reproducciones al cambiar de distribuidor.

El comando /full devuelve:

  • Todas las versiones UPC del lanzamiento.
  • ISRC de cada pista.
  • Discográfica, fecha de lanzamiento, género.
  • BPM de cada pista (vía Audio Features de Spotify).

Procesamiento de entradas de usuario

Soporta múltiples tipos de entrada:

  • Enlaces directos (analizados automáticamente).
  • Números de 12–13 dígitos (búsqueda por UPC).
  • Consultas de texto (búsqueda por nombre + botones integrados).

Ejemplos: "upc Morozhern", URLs directas, frases sin formato.

Lecciones aprendidas y mejoras

Estadísticas de rendimiento (3 meses):

  • 500 usuarios/mes.
  • Tiempo promedio de respuesta: 1.5 segundos (0.3 segundos con caché).
  • Tasa de éxito: 89%.

Recomendaciones:

  • Integrar MusicBrainz para verificación de datos.
  • Implementar una cola de mensajes para cargas máximas.
  • Añadir comprobaciones de salud para disponibilidad de APIs.

Consejos arquitectónicos:

  • Siempre usar al menos dos fuentes de datos.
  • Aplicar caché agresiva.
  • Las APIs no documentadas generan deuda técnica.

Conclusiones clave:

  • Separar el parsing de la resolución de plataformas simplifica el mantenimiento.
  • Los reintentos por mercado corriguen respuestas incompletas de Spotify.
  • La caché en Redis es obligatoria bajo límites de tasa.
  • Varios UPC por ISRC es vital para artistas.
  • El monitoreo diario de APIs no documentadas es imprescindible.

— Editorial Team

Advertisement 728x90

Leer después