
Odată, m-am gândit să scriu o aplicație pentru a selecta muzica pentru mine și a o asculta acasă / afară / în timpul antrenamentelor etc. Și pentru ca totul să funcționeze în flux, cu o implicare minimă din partea mea. Am conceput arhitectura, am schițat un prototip și, în cele din urmă, m-am confruntat cu o "problemă mică".
Dar nu era clar de unde să obțin fișierele muzicale. La acel moment, VKontakte deja închise API-ul, iar pe marile portaluri muzicale nu era nimic, chiar și piesele erau oferite în bucăți pentru a evita parsarea. Rămaseră doar câteva site-uri de o zi, pline de reclame și tot felul de mizerie, programe-grabbere dubioase și alte variante "necurate". În general, nu exista nicio soluție bună și valabilă. Bineînțeles, ai putea cumpăra un abonament la vreun serviciu de muzică, cum ar fi Yandex Music. Dar din nou, nu există un API public deschis și nu ai acces la muzică programatic. Câteva mari companii, practic, au restricționat accesul altora la muzică. De ce s-a întâmplat asta? După o cercetare mai aprofundată, am realizat că problema principală este dreptul de autor. Soluția actuală sub formă de abonamente îi mulțumește pe mulți autori comerciali de muzicală și pe aceste companii. În același timp, muzica non-comercială și cea condiționat comercială ajung și ele în lista generală. Fie plătești pentru tot, fie nu asculți deloc.
Așa că am început să mă gândesc ce să fac cu toate acestea. Cum aș putea organiza distribuția liberă a muzicii? Ce aș face dacă aș fi eu cel care creează muzica și aș vrea să câștig din asta? Mi-ar plăcea dacă piesele mele ar fi distribuite pe cale pirat?
În cele din urmă, au apărut două probleme principale care trebuie rezolvate:
- Organizarea distribuției libere a muzicii prin metode convenabile pentru majoritatea oamenilor, inclusiv cele programatice.
- Oferirea de alternative creatorilor de muzică pentru a câștiga
Un depozit muzical global și descentralizat
La început, am încercat să găsesc soluții deja existente și să construiesc totul pe baza acestora. După o vreme de căutări, ceea ce mi-a atras atenția pentru prima dată a fost . Am început implementarea ideii mele, dar după un timp am descoperit câteva probleme critice cu această soluție:
- Ipfs — un stocător pentru orice și toate. Aici se găsesc imagini, muzică, videoclipuri și orice altceva. Practic, o mare «găleată» planetară. Așadar, atunci când îți lansezi nodul, primești imediat o încărcătură uriașă. Mașina pur și simplu se chinuie.
- O oarecare mecansim neterminat pentru colectarea «gunoiului». Nu știu cum stau lucrurile acum, dar în acel moment, dacă în configurare specificai că vrei să limitezi stocarea la zece gigabaiți de date, nu însemna nimic. Stocarea se extindea, ignorând multe dintre parametrii de configurare. În cele din urmă, era nevoie de un spațiu mare pe hard disk, până când ipfs își dădea seama cum să elimine inutilul.
- La momentul utilizării bibliotecii (nu știu cum stau lucrurile acum), clientul nu avea implementate time-out-uri. Trimiteai o cerere pentru a obține un fișier, și dacă nu era, pur și simplu rămâneai suspendat. Desigur, oamenii au inventat diverse soluții de ocolire, care rezolvau parțial problema, dar erau niște soluții improvizate. Astfel de lucruri ar trebui să fie incluse din cutie.
De asemenea, au existat multe probleme minore, iar impresia formată era clară: nu se putea folosi pentru un proiect. Am continuat căutările pentru un stocător, am studiat diverse opțiuni, dar nu am găsit nimic potrivit.
În cele din urmă, am decis că ar trebui să încerc să scriu un stocător descentralizat singur. Chiar dacă nu va pretinde să fie unul interplanetar, va îndeplini sarcina specifică.
Așa au rezultat , , , , .
spreadable — este stratul principal, cel mai de bază, care permite conectarea nodurilor într-o rețea. Înglobează un algoritm, pe care până acum l-am implementat parțial, estimând pentru aproximativ 10.000 de servere. Versiunea completă a algoritmului este mult mai complicată din punct de vedere al implementării și ar necesita câteva luni suplimentare (sau chiar mai mult).
Nu voi descrie în detaliu spreadable în acest articol, mai bine voi scrie separat odată. Aici doar voi sublinia câteva caracteristici:
- Funcționează prin http/https.
- Poți crea o rețea separată pentru o sarcină specifică, ceea ce va reduce semnificativ încărcătura pe fiecare proiect în parte, comparativ cu dacă ar fi toate într-o singură rețea.
- Inițial, a fost gândit un mecanism cu time-out-uri și alte detalii. Și funcționează pentru toate metodele, atât în client, cât și în nod. Poți gestiona flexibil parametrii din aplicația ta.
- Biblioteca este scrisă în nodejs. Problemele de performanță ale stivei sunt compensate de natura descentralizată. Sarcina poate fi „întinsă” prin creșterea numărului de noduri. În schimb, sunt multe avantaje: o comunitate uriașă, simplitate și ușurință în utilizare, client izomorf, fără dependențe externe etc.
storacle — este un strat care se moștenește de la spreadable, care permite stocarea fișierelor în rețea. Fiecare fișier are un hash generat pe baza conținutului său, ceea ce permite accesarea acestuia ulterior. Fișierele nu sunt fragmentate în blocuri, ci sunt stocate în întregime.
metastocle — este un strat care se moștenește de la spreadable, care permite stocarea datelor în rețea, dar nu a fișierelor. Interfața este similară cu bazele de date nosql. De exemplu, se poate adăuga un fișier în storacle, se poate obține hash-ul său și se poate înregistra în metastocle legat de ceva.
museria — se moștenește de la storacle și metastocle. Acest strat se ocupă direct cu stocarea muzicii. Stocarea funcționează doar cu fișiere mp3 și cu etichete id3.
Ca „cheie” pentru melodie se folosește denumirea completă sub formă de Artist (TPE1) — Titlu (TIT2). De exemplu:
- Brimstone — The Burden
- Hi-rez — Lost My Way (feat. Emilio Rojas, Dani Devinci)
Pentru a înțelege cât mai detaliat cum se formează titlurile melodiilor, putem Verificăm funcția utils.beautifySongTitle().
O potrivire pe chei este definită printr-un procent stabilit în setările nodului. De exemplu, o valoare de 0.85 înseamnă că, dacă funcția care compară cheile (titlurile melodiilor) a detectat o similaritate de peste 85%, atunci este aceeași melodie.
Algoritmul de determinare a similarității este același, în funcția utils.getSongSimilarity().
Coperta melodiei, pentru obținerea ulterioară, se atașează de asemenea prin etichete (APIC). În utilitare (utils) există toate metodele necesare pentru obținerea și procesarea etichetelor.
Un exemplu de lucru cu stocarea prin client poate fi văzut în .
Toate straturile menționate mai sus sunt auto-sufficiente și pot fi utilizate separat ca straturi inferioare pentru alte proiecte. De exemplu, există deja gândul de a crea un strat pentru stocarea cărților.
museria-global — acesta este un depozit git deja configurat pentru a lansa propriul nod în rețeaua globală de muzică. Clonați, npm i && npm start și, practic, asta e tot. Poți configura mai detaliat, lansa în docker etc. Informații detaliate sunt disponibile pe .
Atunci când depozitul este actualizat, trebuie să îți actualizezi și nodul. Dacă se schimbă numărul major sau minor al versiunii, această acțiune este obligatorie, altfel nodurile vechi vor fi ignorate de rețea.
Lucrul cu melodiile se poate face manual sau programatic. Fiecare nod pornește un server pentru diverse sarcini. De asemenea, la accesarea punctului final implicit, veți obține o interfață pentru lucrul cu muzica. De exemplu, puteți accesa (linkul poate fi neactualizat mai târziu, nodurile de intrare pot fi obținute și în , sau puteți verifica actualizările pe GitHub).
Astfel, puteți căuta și descărca melodii în depozit. Descărcarea melodiilor poate avea loc în două moduri: obișnuit și moderat. Al doilea mod înseamnă că lucrurile sunt gestionate de o persoană, nu de un program. Iar dacă bifezi această opțiune la adăugare, va trebui să rezolvi un captcha. Melodiile pot fi adăugate cu priorități -1, 0 sau 1. Prioritatea 1 poate fi setată doar în modul moderat. Prioritățile sunt necesare pentru ca depozitul să decidă mai eficient ce să facă atunci când încerci să înlocuiești o melodie existentă cu una nouă. Cu cât prioritatea este mai mare, cu atât mai multe șanse ai să suprascrii un fișier existent. Aceasta ajută la combaterea spamului și îmbunătățește calitatea melodiilor descărcate.
Dacă începi să adaugi melodii în depozit, încearcă să atașezi și imagini (cover), deși acest câmp nu este obligatoriu. În 99% din cazuri, primele imagini găsite pe Google după numele melodiilor sunt copertile albumelor.
Cum se adaugă tehnic fișierele, în câteva cuvinte:
- Clientul primește adresa unui nod liber, care va deveni coordonator pentru o perioadă.
- Se declanșează funcția de adăugare a melodiei (de către o persoană sau un cod), se face o cerere de adăugare la punctul final al coordonatorului.
- Coordonatorul calculează câte duplicate trebuie păstrate (parametru configurabil).
- Se caută nodurile cele mai potrivite pentru stocare.
- Fișierul, în mod direct, este trimis către aceste noduri.
Cum se obțin tehnic fișierele:
- Clientul primește adresa unui nod liber, care va deveni coordonator pentru o perioadă.
- Se declanșează funcția de obținere a melodiei (de către o persoană sau un cod), se face o cerere de obținere la punctul final al coordonatorului.
- Coordonatorul verifică existența linkului în cache. Dacă există și este funcțional, este returnat imediat clientului, altfel nodurile sunt interogate pentru a verifica disponibilitatea.
- Se obține fișierul prin link, dacă acesta a fost găsit.
Alternative pentru creatorii de muzică
M-a interesat mereu cum putem evalua obiectiv prețul multor lucrări creative. De ce, de exemplu, cineva își vinde albumul muzical cu 10$? Sau cu 20$ sau cu 100$. Unde este algoritmul? Când, de exemplu, vorbim despre un produs fizic sau chiar despre multe tipuri de servicii, putem, măcar, să calculăm costul de producție și să ne bazăm pe acesta.
Ok, să presupunem că am stabilit 10$. Este oare eficient? Să zicem că am ascultat albumul sau o melodie de acolo și am decis să ofer un suport. Dar, din păcate, impresiile și posibilitățile mele indică că 3$ sunt limita mea. Și cum trebuie să fac? Cel mai probabil, nu voi face nimic, la fel ca majoritatea oamenilor.
Stabilind un preț fix pentru munca creativă, te auto-limitezi, nu permiți unui număr mai mare de oameni să îți trimită sume mai mici, care în sumă ar putea fi mai mari decât cei care cumpără la prețul stabilit de tine. Cred că arta este exact domeniul în care contribuțiile ar trebui să domine. Pentru asta este nevoie de:
- Să învățăm oamenii să aprecieze în acest mod. Creatorii trebuie să arate clar că ar dori să primească donații, să adauge linkuri la diverse metode de plată etc.
- Este nevoie de mai multe mecanisme pentru simplificarea și întărirea acestor procese. De exemplu, să creăm un site global unde se pot face donații pentru artă prin linkuri de autor.
Să presupunem că linkul este aproximativ așa:
http://someartistsdonationsite.site/category/artist?external-infoDacă ne concentrăm pe muzicieni, atunci:
http://someartistsdonationsite.com/music/miyagi?song=blablaArtistul trebuie să își verifice numele de utilizator și să se alinieze cu acesta.
În clientul museria, adăugăm funcția de generare a unui astfel de link, iar toate proiectele care folosesc stocarea pot plasa pe site-urile sau aplicațiile lor butoane pentru donații cu aceste linkuri lângă melodii. Utilizatorii au posibilitatea de a face donații foarte rapid și simplu. Evident, această abordare poate fi utilizată în orice proiect și categorie de artă, nu doar prin stocare.
De ce, anume ție, un stoc muzical, și cum poți participa?
- Dacă lucrezi la un proiect legat de muzică sau intenționezi să creezi unul, acest lucru a fost conceput pentru asta. Poți folosi museria pentru a stoca și obține melodii, crescând fluxul de melodii în rețea. Dacă ai posibilitatea să ridici și să menții măcar un nod propriu, acesta va fi cel mai bun aport la dezvoltarea rețelei.
- Poate că ești gata să îți asumi un alt rol: să ajuți cu codul, să completezi și să moderezi baza de date, să răspândești informații despre proiect prietenilor tăi etc.
- Poate ți-a plăcut ideea și ești dispus să ajuți material, astfel încât totul să existe și să se dezvolte. Cu cât sunt mai multe noduri, cu atât sunt mai multe melodii.
- Sau poate că într-un anumit moment vei avea nevoie să găsești și să descarci o melodie. Vei putea face acest lucru foarte simplu, de exemplu, prin .
Proiectul se află în prezent în stadiul incipient. A fost lansată o rețea de testare, nodurile pot fi restartate frecvent, pot necesita actualizări etc. În cazul în care nu există probleme critice în perioada de evaluare, această rețea se va transforma în rețeaua principală.
Poți vizualiza informații despre nod din exterior: numărul de melodii, spațiul liber etc. la un link de tipul http://node-address/status sau http://node-address/status?pretty
Contactele mele:
Sursa: habr.com
