
Un giorno ho deciso di creare un'app per selezionare la musica da ascoltare a casa, mentre sono fuori, durante l'allenamento, ecc. Volevo che funzionasse in modo fluido, con il minimo mio intervento. Ho ideato l'architettura, schizzato un prototipo e alla fine mi sono trovato di fronte a un 'piccolo problema'.
Ma non è chiaro da dove recuperare i file delle canzoni. A questo punto, VKontakte ha già chiuso l'API, e anche nei grandi portali musicali c'è silenzio, persino le canzoni vengono restituite a pezzi, per evitare che vengano estratte. Restano solo alcuni siti temporanei pieni di pubblicità e spazzatura, varie applicazioni di grabbing e altre soluzioni "sporche". In sostanza, non c'è una reale e valida soluzione. Certo, si può acquistare un abbonamento a qualche servizio di musica come Yandex Music o simili. Ma ancora una volta, non c'è un API pubblico aperto, e non hai accesso alla musica in modo programmato. Diverse grandi aziende, di fatto, hanno limitato l'accesso alla musica per altri. Perché è successo tutto questo? Scavando più a fondo, è emerso che il problema principale sono i diritti d'autore. L'attuale soluzione basata su abbonamenti soddisfa molti autori commerciali di opere musicali e tali aziende. Tuttavia, anche la musica non commerciale e condizionatamente commerciale rientra nella lista generale. Devi o pagare per tutto, o non ascoltare affatto.
Iniziai a pensare a cosa fare con tutto questo. Come si può organizzare la diffusione libera della musica? Cosa farei se fossi io a creare musica e volessi guadagnare da essa? Mi piacerebbe se le mie canzoni venissero diffuse in modo pirata? Qual è, in generale, la soluzione alternativa?
Alla fine si sono presentati due problemi principali da risolvere:
- Organizzare la diffusione libera della musica con metodi convenienti per la maggior parte delle persone, inclusi quelli software.
- Proporre alternative ai creatori di musica per guadagnare
Un deposito musicale globale e decentralizzato
Inizialmente ho cercato di trovare soluzioni già esistenti e di costruire tutto su di esse. Dopo un po' di tempo di ricerche, il primo che attirò la mia attenzione fu . Cominciai a implementare la mia idea, ma dopo un po' scoprii alcuni problemi critici in questa soluzione:
- Ipfs è un deposito per qualsiasi cosa e tutto. Qui ci sono immagini, musica, video e qualsiasi cosa. In sostanza, una grande "discarica" planetaria. Quindi, quando avvii il tuo nodo, ricevi subito un carico enorme. La macchina semplicemente si contorce dal dolore.
- Un meccanismo di raccolta dei "rifiuti" incompleto. Non so come sia la situazione ora, ma in quel momento, se nel file di configurazione indicavi di voler limitare lo spazio a dieci gigabyte di dati, questo non valeva nulla. Lo spazio si espandeva, ignorando molti parametri di configurazione. Alla fine, era necessario avere un enorme spazio su disco fisso finché IPFS non capiva come eliminare l'inutile.
- Al momento dell'utilizzo della libreria (non so come sia ora), il client non aveva implementato timeout. Inviavi una richiesta per ottenere un file e se non era presente, rimanevi semplicemente bloccato. Certamente, le persone avevano inventato varie soluzioni alternative che in parte risolvevano il problema, ma erano palliativi. Queste cose dovrebbero essere disponibili di default.
C'erano anche molti piccoli problemi e l'impressione che ne ricavai fu chiara: non poteva essere usato per un progetto. Ho continuato a cercare uno spazio di archiviazione, esplorando diverse opzioni, ma non ho trovato nulla di adatto.
Alla fine, ho deciso di provare a scrivere io stesso uno spazio di archiviazione decentralizzato. Anche se non pretenderà di essere interplanetario, risolverà il compito specifico che mi sono posto.
E così sono nati , , , , .
spreadable — è il livello principale, il più basso, che consente di connettere i nodi in una rete. Contiene un algoritmo che ho implementato parzialmente per circa 10,000 server. La versione completa dell'algoritmo è molto più complessa da implementare e richiederebbe diversi mesi aggiuntivi (forse anche di più).
Non entrerò nei dettagli di spreadable in questo articolo, meglio scriverò qualcosa di separato in futuro. Qui sottolineerò solo alcune caratteristiche:
- Funziona attraverso http/https.
- È possibile creare una rete separata per compiti specifici, il che riduce notevolmente il carico su ogni singolo progetto rispetto a tenerli tutti in un'unica rete.
- Inizialmente, è stato pensato un meccanismo con timeout e altri dettagli. E questo funziona per tutti i metodi sia nel client che nel nodo. È possibile gestire flessibilmente i parametri dalla propria applicazione.
- La libreria è scritta in nodejs. I problemi di prestazioni dello stack sono compensati dalla natura decentralizzata. Il carico può essere 'spalmato' aumentando il numero di nodi. In cambio, ci sono molti vantaggi: una grande comunità, facilità e comodità d'uso, client isomorfico, assenza di dipendenze esterne, ecc.
storacle — è un layer derivante da spreadable, che consente di memorizzare file in rete. Ogni file ha un proprio hash basato sul contenuto, che consente di accedervi successivamente. I file non sono suddivisi in blocchi, ma vengono memorizzati per intero.
metastocle — è un layer derivante da spreadable, che consente di memorizzare dati in rete, ma non file. L'interfaccia è simile alle banche dati noSQL. È possibile, ad esempio, aggiungere un file in storacle, ottenere il suo hash e registrarlo in metastocle associandolo a qualcos'altro.
museria — deriva da storacle e metastocle. Questo layer è direttamente responsabile della memorizzazione della musica. Lo storage lavora solo con file mp3 e tag id3.
Come "chiave" per la canzone viene utilizzato il suo titolo completo sotto forma di Artista (TPE1) — Titolo (TIT2). Ad esempio:
- Brimstone — The Burden
- Hi-rez — Lost My Way (feat. Emilio Rojas, Dani Devinci)
È possibile approfondire come vengono formati i titoli delle canzoni . Bisogna guardare la funzione utils.beautifySongTitle().
La corrispondenza delle chiavi è considerata una certa percentuale definita nelle impostazioni del nodo. Ad esempio, un valore di 0,85 significa che se la funzione di confronto delle chiavi (titoli delle canzoni) rileva una somiglianza superiore all'85%, si tratta della stessa canzone.
L'algoritmo per la determinazione della somiglianza si trova anch'esso nella funzione utils.getSongSimilarity().
Cover di una canzone, per il successivo ottenimento, da allegare anche tramite tags (APIC). Negli utility ci sono tutti i metodi necessari per ottenere e gestire i tags.
Un esempio di utilizzo dello storage tramite client può essere visto in .
Tutti i livelli sopra menzionati sono autonomi e possono essere utilizzati separatamente come livelli più bassi per altri progetti. Ad esempio, c'è già l'idea di creare un livello per lo storage dei libri.
museria-global — è già un repository git configurato per lanciare il proprio nodo nella rete globale della musica. Clonalo, npm i && npm start e in sostanza è tutto. Puoi configurarlo in modo più dettagliato, eseguirlo in Docker, ecc. Maggiori informazioni sono disponibili su .
Quando il repository viene aggiornato, è necessario aggiornare anche il proprio nodo. Se il numero di versione maggiore o minore cambia, questa azione è obbligatoria; altrimenti, i nodi vecchi verranno ignorati dalla rete.
È possibile lavorare con le canzoni manualmente e programmaticamente. Ogni nodo avvia un server per diversi compiti. Inclusa, al visitare l'endpoint predefinito, riceverai un'interfaccia per lavorare con la musica. Ad esempio, puoi accedere al (il link potrebbe non essere più valido in seguito, è possibile ottenere anche i nodi d'ingresso su , oppure vedere gli aggiornamenti su GitHub).
In questo modo puoi cercare e caricare canzoni nel repository. Il caricamento delle canzoni può avvenire in due modalità: normale e moderata. La seconda modalità significa che un essere umano, non un programma, è coinvolto nel processo. Se selezioni questa opzione durante l'aggiunta, dovrai risolvere un captcha. Le canzoni possono essere aggiunte con priorità -1, 0 o 1. La priorità 1 può essere assegnata solo in modalità moderata. Le priorità sono necessarie affinché il repository prenda decisioni più efficaci quando tenti di sostituire una canzone esistente con una nuova. Maggiore è la priorità, maggiori saranno le possibilità di sovrascrivere un file esistente. Questo aiuta a combattere lo spam e aumenta la qualità delle canzoni caricate.
Se inizi ad aggiungere canzoni al repository, cerca di allegare anche le immagini (cover), anche se questo campo non è obbligatorio. Nel 99% dei casi, le prime immagini su Google con i titoli delle canzoni sono le copertine degli album.
Come avviene tecnicamente l'aggiunta di file, in poche parole:
- Il cliente riceve l'indirizzo di un nodo libero, che per un certo periodo diventa il coordinatore.
- Si attiva la funzione di aggiunta di una canzone (da parte di una persona o tramite codice), viene effettuata una richiesta per l'aggiunta all'endpoint del coordinatore.
- Il coordinatore calcola quanti duplicati devono essere conservati (parametro configurabile).
- Si cercano i nodi più adatti per la conservazione.
- Il file, direttamente, viene inviato a questi nodi.
Come avviene tecnicamente il recupero dei file:
- Il cliente riceve l'indirizzo di un nodo libero, che per un certo periodo diventa il coordinatore.
- Si attiva la funzione di recupero di una canzone (da parte di una persona o tramite codice), viene effettuata una richiesta per il recupero all'endpoint del coordinatore.
- Il coordinatore verifica se il link è presente nella cache. Se c'è ed è attivo, viene restituito immediatamente al cliente, altrimenti si interrogano i nodi per verificarne la disponibilità.
- Si procede al recupero del file tramite il link, se disponibile.
Alternative per i creatori di musica
Mi ha sempre incuriosito il modo di valutare oggettivamente il valore di molte opere creative. Perché, ad esempio, una persona vende il suo album musicale per 10$? O per 20$ oppure 100$. Qual è l’algoritmo? Quando parliamo di un prodotto fisico, o anche di molti tipi di servizi, possiamo almeno calcolare il costo di produzione e partire da lì.
Va bene, supponiamo di aver fissato il prezzo a 10$. È davvero efficace? Supponiamo di ascoltare l'album da qualche parte o una canzone e di voler ricompensare l'artista. Ma per quello che sento e le mie possibilità, 3$ sono il mio massimo. E come ci si comporta in questo caso? Probabilmente non farò nulla, come la maggior parte delle persone.
Fissando un prezzo fisso per il lavoro creativo, ti limiti e non permetti a un numero maggiore di persone di offrirti somme più piccole, che in totale potrebbero essere più significative rispetto a quelle di coloro che comprano al prezzo che hai impostato. Mi sembra che la creatività sia proprio il settore in cui dovrebbero prevalere le donazioni. E per questo è necessario:
- Insegnare alle persone a ringraziare in questo modo. I creatori devono dimostrarlo chiaramente, mostrando che vorrebbero ricevere donazioni, aggiungendo ovunque link a diversi metodi di pagamento, ecc.
- Serve più meccanismi per semplificare e rafforzare questi processi. Ad esempio, creare un sito globale dove si può donare per la creatività tramite link personalizzati.
Supponiamo che il link sia più o meno così:
http://someartistsdonationsite.site/category/artist?external-infoSe ci limitiamo ai musicisti, allora:
http://someartistsdonationsite.com/music/miyagi?song=blablaL'artista deve verificare il proprio nickname e associarlo.
Nel client museria, aggiungiamo la funzione di generazione di link simili, e tutti i progetti che utilizzano lo storage possono posizionare sui propri siti/app le pulsanti per le donazioni con questi link accanto alle canzoni. Gli utenti possono fare donazioni molto rapidamente e facilmente. Naturalmente, questo approccio può essere utilizzato in qualsiasi progetto e categoria creativa, non solo attraverso lo storage.
Perché, proprio per te, uno storage musicale, e come è possibile partecipare?
- Se lavori a un progetto legato alla musica o stai pianificando di crearne uno, è proprio per questo che tutto è stato concepito. Puoi utilizzare museria per memorizzare e ricevere canzoni, aumentando il flusso di musica online. Se hai anche la possibilità di ospitare e mantenere almeno un tuo nodo, ciò rappresenterà il miglior contributo allo sviluppo della rete.
- Forse sei pronto a prendere un altro ruolo: aiutare con il codice, oppure riempire e moderare il database, diffondere informazioni sul progetto ai tuoi amici, ecc.
- Magari ti è piaciuta l'idea e sei disposto ad aiutare economicamente affinché tutto possa esistere e svilupparsi. Più nodi ci sono, più canzoni ci saranno.
- Oppure, a un certo punto, potresti semplicemente aver bisogno di trovare e scaricare una canzone. Potrai farlo molto facilmente, ad esempio, tramite .
Il progetto è attualmente nella fase iniziale. È stata avviata una rete di test, i nodi possono spesso riavviarsi, richiedere aggiornamenti, ecc. In assenza di problemi critici durante il periodo di valutazione, questa stessa rete si trasformerà nella rete principale.
Visualizza informazioni sul nodo dall'esterno: numero di canzoni, spazio disponibile, ecc. tramite un link del tipo http://node-address/status o http://node-address/status?pretty
I miei contatti:
Fonte: habr.com
