Todos os artigos

· Casimiro Ferreira· 6 min de leitura

Apresentamos os Nossos Scrapers de Bases de Dados de Música

  • Scrapers
  • Media Metadata
  • Music
  • Python
  • FOSS

Uma interface para toda a web musical

A web da música está fragmentada por muitos sites independentes. O Bandcamp vende-te um FLAC e uma licença Creative Commons. O SoundCloud transmite um remix que mais ninguém aloja. A SomaFM mantém um conjunto de canais de rádio suportados pelos ouvintes. Vários sites geridos pela comunidade mantêm enciclopédias curadas de rock progressivo, jazz, clássica e metal. Cada site tem a sua própria marcação, as suas próprias manias, a sua própria ideia do que sequer é uma “faixa”.

Mantemos uma família de clientes Python pequenos, focados e de código aberto que domam essa confusão. Todos eles fazem, em espírito, a mesma coisa: alcançam uma fonte de música e devolvem modelos de metadados de media tipados, objetos validados em vez de dicionários frágeis, para que o resto do teu código nunca tenha de se importar de que site vieram os dados. Sete dos nove estão publicados no PyPI. Os outros dois instalam-se diretamente a partir do GitHub. Todos falam o mesmo vocabulário.

Eis a visita guiada.

Streaming e rádio

py_bandcamp faz scraping do Bandcamp. Procura faixas, álbuns, artistas e editoras, navega por etiqueta de género, obtém recomendações e artistas relacionados a partir de uma semente, e extrai um URL de MP3 transmissível. As procuras devolvem objetos Release tipados que transportam título, capa, géneros, créditos e um campo de licença ao estilo SPDX com uma verificação is_open(), para que possas distinguir um lançamento Creative Commons de um com todos os direitos reservados. Uma conversão de álbum de fidelidade total preenche a tracklist ordenada a pedido.

nuvem_de_som é o nosso cliente de SoundCloud. Três backends independentes, um backend de API rico em metadados, um scraper de HTML sem dependências, e um backend yt-dlp, assentam por trás de um orquestrador que recua de um para o seguinte. Procura faixas e pessoas, resolve URLs de stream diretos (progressivo ou HLS), descarrega faixas e playlists inteiras, e traz uma aplicação de terminal, nds, para procurar e reproduzir a partir da linha de comandos. Os lançamentos vêm de volta com codec, taxa de bits, géneros, país, licença SPDX e tracklists completas dos sets.

radiosoma envolve a API pública de canais da SomaFM. A SomaFM tem uma API aberta, e o cliente modela-a diretamente: cada canal é uma obra, e cada codificação de stream (AAC a 130 kbps, MP3 a 256 kbps, HE-AAC a 64 e 32 kbps) torna-se o seu próprio Release desse canal, para que um consumidor possa escolher o melhor ajuste e desduplicar por identidade. O feed de faixas recentes mostra um horário do que tem estado a tocar.

tunein é um cliente TuneIn não oficial para as estações de rádio linear e IPTV do mundo. Um caminho rápido devolve apenas o payload da procura. Uma chamada de enriquecimento opcional preenche género, língua, país, indicativo e slogan. O TuneIn devolve múltiplos URLs de stream por estação (diferentes taxas de bits, espelhos e protocolos), por isso cada um torna-se o seu próprio Release, deixando o consumidor escolher no momento da reprodução. Uma pequena CLI dá-te saída em tabela ou JSON.

pyheartradio fala com a API pública do iHeartRadio, sem precisar de chave nem de conta. Procura estações, podcasts, artistas, faixas e playlists, obtém episódios de podcast com URLs de stream de áudio diretos, e corre as pesquisas de estação e artista concorrentemente através de obtenções de detalhes em paralelo. Cada modelo oferece os auxiliares to_external_ids() e to_signals() para uso numa pipeline de metadados tipada.

Enciclopédias e arquivos de música

A segunda metade da família visa os grandes catálogos comunitários.

pyprogarchives (Prog Archives), pyjazzmusicarchives (Jazz Music Archives), e pyclassicalarchives (Classical Archives) partilham uma forma quase idêntica. Tanto o pyprogarchives como o pyjazzmusicarchives instalam-se diretamente a partir dos respetivos repositórios GitHub em vez do PyPI. Os três navegam o índice A–Z, procuram por nome, e obtêm uma página completa de artista ou compositor com biografia, país e uma discografia avaliada pelos membros. Os Prog e Jazz Archives fazem scraping de HTML. Os Classical Archives envolvem uma API JSON pública e expõem os álbuns de um compositor e uma árvore de obras achatada recursivamente. Cada modelo transporta o id canónico estável do site via to_external_ids_dict(), útil para cruzar um catálogo com outro.

pymetal é o nosso cliente para a Encyclopaedia Metallum, os Metal Archives, e o mais ambicioso do conjunto. A maioria dos scrapers achata uma faixa para (id, title, band, album). O pymetal mantém aquilo que os Metal Archives mantêm separado: uma faixa pode creditar múltiplas bandas (splits, colaborações), a formação de uma banda muda ao longo do tempo, e uma faixa pode aparecer em muitos lançamentos (compilações, reedições, singles). Modela cada um como uma entidade distinta indexada pelo id do arquivo, para que os re-scrapes sejam idempotentes. A superfície de endpoints é ampla: procura avançada de banda/álbum/canção, páginas completas de lançamento com atribuição por banda nos splits, formações particionadas por estado com intervalos de datas de função, críticas, recomendações, ligações externas e letras, tudo como modelos Pydantic v2 que fazem round-trip através de JSON.

Para além da música, tutubo faz scraping do YouTube e do YouTube Music, e pymal cobre o MyAnimeList, estendendo os mesmos padrões de metadados tipados a categorias de media mais amplas. Todos emitem o mesmo vocabulário, para que um único consumidor a jusante lide com tudo de forma uniforme.

Construídos para acesso conforme e de baixo volume

Estes clientes obtêm apenas páginas de catálogo públicas, a volumes de pedidos baixos, e verificam o robots.txt de cada site antes de fazer scraping. Vê o artigo sobre robots.txt e sitemaps para saber como funciona esse passo de reconhecimento. Por toda a família a camada HTTP é plugável. Por defeito os clientes usam um transporte cujo handshake TLS coincide com o de um navegador real (curl_cffi a coincidir com o TLS/JA3 do Chrome), para que um cliente bem-comportado não seja classificado incorretamente como automação maliciosa por sistemas de deteção afinados para abuso automatizado. As enciclopédias por trás da Cloudflare também podem encaminhar através de uma instância FlareSolverr para dados em direto, ou ler a partir do Wayback Machine do Internet Archive como reserva. A camada de parsing é independente da forma como o HTML chega, por isso o mesmo código funciona seja qual for o transporte que escolheres.

Um catálogo de música multi-fonte

O verdadeiro retorno é o que acontece quando deixas de pensar nisto como nove ferramentas separadas. Todos emitem o mesmo vocabulário de metadados tipado e todos expõem ids externos canónicos. Isso significa que podes espalhar um único artista por Bandcamp, SoundCloud, os diretórios de rádio e as enciclopédias, e depois dobrar os resultados num único catálogo: desduplicado por identidade, ciente das licenças, e pronto a alimentar um motor de recomendação, um servidor de media, ou um dataset de investigação.

Cada um destes clientes é software livre, auto-alojável, e corre no teu próprio hardware, sem necessidade de chave de API. Escolhe a fonte que te interessa: faz pip install se estiver no PyPI, ou pip install git+https://github.com/TigreGotico/<repo> para o pyprogarchives e o pyjazzmusicarchives, que são apenas GitHub. Depois começa a construir.

Todos os scrapers andam sobre as nossas sessões requests componíveis e prontas a usar. Os clientes de streaming e rádio emitem o esquema mediavocab diretamente, e cada cliente expõe ids externos canónicos, para que os metadados de música se integrem com o media-archivist, o nosso indexador multi-fonte e servidor de metadados desduplicador.