Tworzenie bota Telegrama do wyodrębniania kodów UPC i ISRC z platform muzycznych
Bot Telegrama wyodrębnia kody UPC i ISRC wydań muzycznych na podstawie linków z 10 platform. Przetwarza Spotify, Apple Music, Yandex.Muzyka, YouTube Music, Deezer, Tidal, SoundCloud, VK Muzyka, Zvuk oraz Amazon Music. Problem powstał z powodu braku prostego dostępu do kodów UPC u dystrybutorów i w interfejsach usług. Bot przetwarza linki, identyfikatory wydań i tekstowe zapytania, zwracając kody w ciągu 1–2 sekund dzięki mechanizmowi cache.
UPC identyfikuje wydania (albumy, singły), ISRC — konkretne utwory. Te kody są potrzebne przy migracji między dystrybutorami, rejestracji praw autorskich i rozliczaniu royalty.
Architektura systemu
System został podzielony na moduły:
- Parser URL: wykrywa platformę za pomocą wyrażeń regularnych.
- Resolver platformy: pobiera metadane przez API.
- Matcher UPC/ISRC: porównuje dane z kilku źródeł.
- Magazyn danych: Redis do cache (TTL 24 godziny), PostgreSQL do analizy.
To pozwala skalować przetwarzanie i minimalizować liczba żądań do zewnętrznych API.
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)/.+?/(")
# i inne...
]
Przetwarzanie linków i skróconych adresów
Parser używa ponad 10 wzorców regex do formatów URL. Skrócone linki (spotify.link, youtu.be) rozwiązuje poprzez żądania HEAD z przekierowaniami:
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)
Obsługiwane typy treści: albumy, utwory, artystów. Dla utworów bot szuka nadrzędnego wydania.
Praca z API Spotify
Spotify Web API udostępnia UPC w external_ids.upc albumu i ISRC w utworach. Problemy:
- Brak UPC w odpowiedzi — ponowne próby dla rynków (US, GB, DE, JP).
- Wyszukiwanie po UPC jest niestabilne dla wydań regionalnych.
- Limit szybkości: 180 żądań/min.
Cache w Redis zmniejsza obciążenie:
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:
# zapis do cache
await redis.set(cache_key, json.dumps(result), ex=86400)
return result
return None
Nieudokumentowane API: Yandex.Muzyka i VK
Bez publicznego API — reverse engineering endpointów aplikacji mobilnych. UPC w metadanych albumu, ISRC — w utworach. Format odpowiedzi zmienia się bez ostrzeżenia (2 razy w ciągu 3 miesięcy). Wymaga ciągłego monitorowania.
Funkcjonalność wykrywania wersji wydań
Bot znajduje wszystkie UPC dla jednego ISRC: singły, albumy, kompilacje. Przydatne do zachowania historii streamingu przy zmianie dystrybutora.
Komenda /full zwraca:
- Wszystkie wersje UPC.
- ISRC wszystkich utworów.
- Wytwórnię, datę, gatunek.
- BPM utworów (Spotify Audio Features).
Obsługa wejścia użytkownika
Wsparcie dla formatów:
- Linki (parsowanie).
- Liczby 12–13 cyfr (wyszukiwanie UPC).
- Tekst (wyszukiwanie po nazwie + przyciski inline).
Przykłady: "upc Morzenstern", bezpośrednie linki, nieustrukturyzowane zapytania.
Lekcje i ulepszenia
Statystyki (3 miesiące):
- 500 użytkowników/miesiąc.
- Czas odpowiedzi: 1,5 s (0,3 s z cache).
- Skuteczność: 89%.
Zalecenia:
- Dodaj MusicBrainz do weryfikacji.
- Kolejkę wiadomości dla szczytów obciążenia.
- Sprawdzanie działania API (health-check).
Wnioski architektoniczne:
- Minimalnie 2 źródła danych.
- Agresywny cache.
- Nieudokumentowane API = długi techniczny.
Co ważne:
- Oddzielenie parsowania od rozpoznawania platformy zmniejsza złożoność.
- Powtarzanie dla rynków rozwiązuje niekompletne odpowiedzi Spotify.
- Cache Redis jest niezbędny przy limitach szybkości.
- Wielo-UPC według ISRC ma kluczowe znaczenie dla artystów.
- Monitorowanie nieudokumentowanych API to codzienne zadanie.
— Editorial Team
Brak komentarzy.