
Certa vez, decidi escrever um aplicativo para selecionar música para mim e ouvir em casa, na rua, durante os treinos, etc. E para que tudo funcionasse em fluxo, com a minha participação mínima. Elaborei a arquitetura, esbocei um protótipo e, no final, me deparei com um "pequeno problema".
Mas não estava claro de onde obter os próprios arquivos das músicas. Nesse momento, o VK já havia fechado a API, e nos grandes portais de música também estava tudo parado, até as músicas eram fornecidas em fragmentos para evitar a extração. Restaram apenas alguns sites temporários com uma tonelada de anúncios e lixo, vários programas de captura duvidosos e outras opções "sujas". Em resumo, nenhuma solução realmente boa. É claro que poderia comprar uma assinatura de algum serviço como Yandex Music ou semelhante. Mas, novamente, não há nenhuma API pública aberta e você não tem acesso à música programaticamente. Algumas grandes empresas, na verdade, restringiram o acesso à música para os outros. Por que isso aconteceu? Ao investigar mais a fundo, ficou claro que o principal problema são os direitos autorais. A solução atual em forma de assinaturas agrada muitos autores comerciais de obras musicais e essas mesmas empresas. Ao mesmo tempo, a música não comercial e condicionalmente comercial também entra na lista geral. Você paga por tudo ou não ouve nada.
Então, comecei a pensar no que fazer com tudo isso. Como organizar a distribuição livre de música? O que eu faria se estivesse criando música e quisesse lucrar com isso? Eu gostaria que minhas músicas fossem disseminadas de maneira pirata? Qual é a solução alternativa disponível?
Assim, surgiram dois problemas principais que precisam ser resolvidos:
- Organização da distribuição livre de música por métodos convenientes para a maioria das pessoas, incluindo métodos programáticos.
- Oferecer alternativas para os criadores de música para sua monetização
Um armazenamento musical global descentralizado
Inicialmente, tentei encontrar soluções já existentes e criar tudo com base nisso. Após algum tempo de pesquisa, me chamou a atenção . Comecei a implementação da minha ideia, mas depois de um tempo, encontrei vários problemas críticos nesta solução:
- Ipfs — um repositório para tudo e qualquer coisa. Aqui estão imagens, músicas, vídeos e o que mais você quiser. De fato, é uma grande "lixeira" planetária. Portanto, ao iniciar seu nó, você já enfrenta uma enorme carga. A máquina simplesmente sofre.
- É um mecanismo mal feito para coletar "lixo". Não sei como está agora, mas naquela época, se você configurasse para limitar o armazenamento a dez gigabytes de dados, isso não significava nada. O armazenamento se expandia, ignorando muitos parâmetros de configuração. No final, era preciso ter um grande espaço em disco até que o ipfs conseguisse se livrar do que era desnecessário.
- Na época em que usei a biblioteca (não sei como está agora), o cliente não tinha implementado timeouts. Você faz uma solicitação para obter um arquivo, e se ele não estiver lá, você simplesmente fica esperando. Claro, as pessoas inventaram várias soluções alternativas que, de certa forma, resolviam o problema, mas eram gambiarras. Essas coisas devem vir por padrão.
Além disso, havia muitos pequenos problemas, e a impressão então foi clara: isso não pode ser usado em um projeto. Continuei procurando um armazenamento, estudei diversas opções, mas não encontrei nada que fosse adequado.
No final, decidi que valia a pena tentar escrever um armazenamento descentralizado por conta própria. Mesmo que não pretenda ser interplanetário, ele resolverá a tarefa específica colocada.
Assim nasceu , , , , .
spreadable — esta é a camada básica, a mais baixa, que permite unir os nós em uma rede. Contém um algoritmo que implementei parcialmente com base em cerca de 10.000 servidores. A versão completa do algoritmo é muito mais complexa e exigiria ainda mais alguns meses adicionais (talvez mais).
Não vou descrever detalhadamente o spreadable neste artigo, é melhor escrever um separado alguma hora. Aqui, apenas menciono algumas características:
- Funciona via http/https.
- É possível criar uma rede separada para uma tarefa específica, o que reduz significativamente a carga em cada projeto individual, em comparação a se todos estivessem em uma única rede.
- Desde o início, foi planejado um mecanismo com timeouts e outras pequenas coisas. E isso funciona para todos os métodos, tanto no cliente quanto no nó. Você pode gerenciar os parâmetros de forma flexível a partir de sua aplicação.
- A biblioteca é escrita em nodejs. Os problemas de desempenho da pilha são compensados pela natureza descentralizada. A carga pode ser "distribuída" aumentando o número de nós. Em troca, há muitos benefícios: uma enorme comunidade, simplicidade e facilidade de uso, cliente isomórfico, ausência de dependências externas, etc.
storacle — é uma camada que herda de spreadable, permitindo armazenar arquivos na rede. Cada arquivo possui seu próprio hash baseado no conteúdo, que pode ser usado para recuperá-lo posteriormente. Os arquivos não são divididos em blocos, mas armazenados na íntegra.
metastocle — camada que herda de spreadable, permitindo armazenar dados na rede, mas não arquivos. A interface é semelhante a bancos de dados nosql. É possível, por exemplo, adicionar um arquivo ao storacle, obter seu hash e gravar no metastocle com uma referência a algo.
museria — herda de storacle e metastocle. Esta camada é responsável diretamente pelo armazenamento de música. O repositório trabalha apenas com arquivos mp3 e tags id3.
Usa-se o "título" completo da música como Artista (TPE1) — Título (TIT2). Por exemplo:
- Brimstone — The Burden
- Hi-rez — Lost My Way (feat. Emilio Rojas, Dani Devinci)
Para entender detalhadamente como os títulos das músicas são formados, é necessário ver a função utils.beautifySongTitle().
A correspondência de chaves é considerada um percentual definido nas configurações do nó. Por exemplo, um valor de 0.85 significa que se a função de comparação de chaves (títulos das músicas) detectar semelhança superior a 85%, trata-se da mesma música.
O algoritmo para determinar a semelhança está lá mesmo, na função utils.getSongSimilarity().
A capa da música, para recuperação posterior, também é anexada através de tags (APIC). Nas utilidades (utils), existem todos os métodos necessários para obter e processar as tags.
Um exemplo de trabalho com o armazenamento através do cliente pode ser visto em .
Todas as camadas mencionadas acima são autossuficientes e podem ser usadas separadamente como camadas mais baixas para outros projetos. Por exemplo, já há planos para criar uma camada para armazenamento de livros.
museria-global — este é um repositório git já configurado para iniciar seu próprio nó na rede global de música. Você clona, npm i && npm start e, essencialmente, é isso. É possível configurar de forma mais detalhada, iniciar em docker, etc. Informações detalhadas estão disponíveis em .
Quando o repositório é atualizado, você também precisa atualizar seu nó. Se o número da versão principal ou secundária mudar, essa ação é obrigatória; caso contrário, os nós antigos serão ignorados pela rede.
É possível trabalhar com as músicas manualmente ou programaticamente. Cada nó inicia um servidor para diversas tarefas. Isso inclui que, ao visitar o endpoint padrão, você receberá uma interface para trabalhar com músicas. Por exemplo, você pode acessar (o link pode não ser mais válido depois, os nós de entrada também podem ser obtidos no , ou você pode verificar as atualizações no GitHub).
Assim, você pode pesquisar e carregar músicas no armazenamento. O upload de músicas pode ocorrer em dois modos: normal e moderado. O segundo modo significa que um ser humano, e não um programa, está conduzindo o trabalho. Se você marcar essa opção ao adicionar, será necessário resolver um captcha. As músicas podem ser adicionadas com prioridades -1, 0 ou 1. A prioridade 1 só pode ser usada no modo moderado. As prioridades são necessárias para que o armazenamento tome decisões mais eficientes quando você tentar substituir uma música existente por uma nova. Quanto maior a prioridade, maiores as chances de você sobrescrever um arquivo existente. Isso ajuda a combater spam e aumenta a qualidade das músicas carregadas.
Se você começar a adicionar músicas ao armazenamento, tente anexar também imagens (capas), embora esse campo não seja obrigatório. Em 99% dos casos, as primeiras imagens do Google com os títulos das músicas são capas de álbuns.
Como tecnicamente acontece a adição de arquivos, em poucas palavras:
- O cliente recebe o endereço de um nó livre, que se tornará o coordenador por um tempo.
- A função de adição de música é acionada (por um humano ou por código), ocorre uma solicitação de adição ao endpoint do coordenador.
- O coordenador calcula quantos duplicados devem ser mantidos (um parâmetro configurável).
- Os nós mais adequados para armazenamento são pesquisados.
- O arquivo, diretamente, é enviado para esses nós.
Como tecnicamente acontece a obtenção de arquivos:
- O cliente recebe o endereço de um nó livre, que se tornará o coordenador por um tempo.
- A função de obtenção de música é acionada (por um humano ou por código), ocorre uma solicitação de obtenção ao endpoint do coordenador.
- O coordenador verifica a existência do link no cache. Se ele existir e estiver funcional, é imediatamente retornado ao cliente; caso contrário, os nós são consultados quanto à disponibilidade.
- Está ocorrendo a obtenção do arquivo por meio do link, caso este tenha sido encontrado.
Alternativas para criadores de música
Sempre tive curiosidade sobre como podemos avaliar objetivamente o valor de muitas obras criativas. Por que, por exemplo, uma pessoa coloca seu álbum musical à venda por 10$? Ou por 20$ ou por 100$. Onde está o algoritmo? Quando falamos sobre um produto físico, ou mesmo sobre muitos tipos de serviços, podemos ao menos calcular o custo de produção e partir disso.
Ok, suponha que o preço seja 10$. Isso é realmente eficaz? Suponha que eu escute o álbum ou uma canção de lá e decida dar uma retribuição. Mas, de acordo com minhas sensações e possibilidades, 3$ é meu teto. E como proceder aqui? Provavelmente não farei nada, assim como a maioria das pessoas.
Ao definir um preço fixo pelo trabalho criativo, você simplesmente se limita, não permitindo que mais pessoas enviem quantias menores que podem, cumulativamente, ser mais significativas do que aquelas que comprariam pelo preço que você estabeleceu. Parece-me que a criatividade é uma área onde, em primeiro lugar, as doações devem prevalecer. Para isso é necessário:
- Ensinar as pessoas a agradecer dessa forma. Os criadores devem demonstrar claramente que gostariam de receber doações, adicionando links para diferentes métodos de pagamento em todos os lugares, etc.
- Precisamos de mais mecanismos para simplificar e fortalecer esses processos. Por exemplo, criar um site global onde se possa fazer doações por meio de links autorais.
Suponha que o link seja algo como:
http://someartistsdonationsite.site/category/artist?external-infoSe restringirmos aos músicos, então:
http://someartistsdonationsite.com/music/miyagi?song=blablaO artista precisa verificar seu nome de usuário e se vincular a ele.
No cliente museria, adicionamos a função de geração de um link desse tipo, e todos os projetos que utilizam o armazenamento podem colocar em seus sites/aplicativos botões para doações com esses links ao lado das músicas. Os usuários terão a oportunidade de fazer uma doação de forma muito rápida e simples. Naturalmente, essa abordagem pode ser utilizada em qualquer projeto e categoria criativa, não apenas através do armazenamento.
Por que, exatamente, você precisa de um armazenamento musical, e como você pode participar?
- Se você está trabalhando em um projeto relacionado à música ou planeja criar um, é para isso que tudo foi pensado. Você pode usar museria para armazenar e acessar músicas, aumentando o fluxo de músicas na rede. Se você tiver a capacidade de levantar e manter pelo menos um nó próprio, isso será a melhor contribuição para o desenvolvimento da rede.
- Talvez você esteja pronto para assumir um papel diferente: ajudar com o código, ou preencher e moderar o banco de dados, espalhar informações sobre o projeto para seus conhecidos etc.
- Talvez você tenha gostado da ideia e esteja disposto a ajudar financeiramente para que tudo isso viva e cresça. Quanto mais nós, mais músicas.
- Ou talvez você precise simplesmente encontrar e baixar uma música em algum momento. Você poderá fazer isso de forma muito simples, por exemplo, através do .
O projeto está atualmente em sua fase inicial. A rede de testes foi lançada, os nós podem ser frequentemente reiniciados, exigir atualizações, etc. Na ausência de problemas críticos durante o período de avaliação, essa mesma rede se transformará na principal.
Você pode ver informações sobre um nó externamente: o número de músicas, espaço livre, etc., através de um link do tipo http://node-address/status ou http://node-address/status?pretty
Meus contatos:
Fonte: habr.com
