
Pewnego dnia postanowiłem stworzyć aplikację, która wybierałaby muzykę dla mnie, abym mógł jej słuchać w domu, na ulicy, podczas treningów itd. Chciałem, aby wszystko działało w tle, z minimalnym moim udziałem. Wymyśliłem architekturę, naszkicowałem prototyp i w końcu natknąłem się na jeden "mały problem".
Nie było jasne, skąd brać same pliki utworów. W tym czasie VKontakte już zamknęło API, na dużych portalach muzycznych też nie było nic, nawet utwory były udostępniane w kawałkach, aby nie dało się ich zeskrobać. Pozostały tylko jakieś pojedyncze strony-zerówki z mnóstwem reklam i różnych śmieci, a także wątpliwe programy grabbers i inne "brudne" opcje. W sumie, żadne dobre rozwiązanie. Można by wykupić subskrypcję na Yandex Muzyka lub podobne usługi. Ale znów, tam nigdzie nie ma otwartego publicznego API i nie masz dostępu do muzyki programowo. Kilka dużych firm praktycznie ograniczyło dostęp do muzyki dla innych. Dlaczego tak się stało? Im głębiej zagłębiłem się w temat, tym bardziej zrozumiałem, że głównym problemem są prawa autorskie. Aktualne rozwiązanie w postaci subskrypcji zadowala wielu komercyjnych twórców muzycznych i te same firmy. Przy tym niekomercyjna i warunkowo komercyjna muzyka również trafiają na ogólną listę. Albo płacisz za wszystko, albo nie słuchasz w ogóle.
Zacząłem myśleć, co z tym wszystkim zrobić. Jak można zorganizować swobodne rozpowszechnianie muzyki? Co bym zrobił, gdybym sam zajmował się tworzeniem muzyki i chciał na tym zarabiać? Czy podobałoby mi się, gdyby moje utwory były rozprowadzane w sposób piracki? Jakie właściwie są alternatywne rozwiązania?
Ostatecznie pojawiły się dwa główne problemy, które należy rozwiązać:
- Organizacja swobodnego rozpowszechniania muzyki w wygodny sposób dla większości ludzi, w tym za pomocą oprogramowania.
- Propozycja alternatyw dla twórców muzyki w celu zarobku.
Globalne, zdecentralizowane przechowalnie muzyki.
Początkowo próbowałem znaleźć już istniejące rozwiązania i stworzyć wszystko na ich podstawie. Po pewnym czasie poszukiwań zwróciłem uwagę na . Rozpocząłem realizację mojego pomysłu, ale po pewnym czasie natknąłem się na kilka krytycznych problemów w tym rozwiązaniu:
- Ipfs — przechowalnia wszystkiego i wszędzie. Są tu zarówno obrazy, muzyka, wideo, jak i wszystko inne. Ogólnie rzecz biorąc, taka ogromna planetarna "śmietnisko". Dlatego, gdy uruchamiasz swój węzeł, natychmiast otrzymujesz ogromne obciążenie. Maszyna po prostu krzyczy z bólu.
- Jakiś niedokończony mechanizm zbierania "śmieci". Nie wiem jak jest teraz, ale w tamtym momencie, jeśli w konfiguracji ustawiłeś, że chcesz ograniczyć pamięć do dziesięciu gigabajtów danych, to nic to nie znaczyło. Pamięć rozrastała się, ignorując wiele parametrów konfiguracji. W efekcie, trzeba było mieć ogromny zapas dysku twardego, czekając aż ipfs zdecyduje się na usunięcie niepotrzebnych danych.
- W czasie korzystania z biblioteki (nie wiem jak jest teraz), klient nie miał zrealizowanych timeoutów. Wysyłasz zapytanie o plik, a jeśli go nie ma, to po prostu utkniesz. Oczywiście, ludzie wymyślili różne obejścia, które częściowo rozwiązywały problem, ale były to tylko prowizorki. Takie rzeczy powinny działać od razu z pudełka.
Było też wiele drobnych problemów, wrażenie jakie się wtedy uformowało: nie można tego używać do projektu. Kontynuowałem poszukiwania przechowalni, badałem różne opcje, ale nic odpowiedniego nie znalazłem.
Ostatecznie postanowiłem, że warto spróbować napisać własną zdecentralizowaną przechowalnię. Niech nie będzie pretendowała do roli międzyplanetarnej, ale będzie rozwiązywała skonkretyzowany problem.
Tak i powstały , , , , .
spreadable — to podstawowa, najniższa warstwa, która pozwala na łączenie węzłów w sieć. Zawiera algorytm, który wstępnie zrealizowałem dla około 10000 serwerów. Pełna wersja algorytmu jest znacznie bardziej skomplikowana w implementacji i wymagałaby jeszcze kilku dodatkowych miesięcy (może nawet więcej).
Nie będę dokładnie opisywał spreadable w tym artykule, lepiej napiszę osobno kiedyś. Tu tylko zaznaczę niektóre cechy:
- Działa przez http/https.
- Można tworzyć osobną sieć pod konkretne zadanie, co znacznie zmniejszy obciążenie każdego pojedynczego projektu, w porównaniu do sytuacji, gdyby wszystkie były w jednej sieci.
- Początkowo przemyślano mechanizm z timeoutami i innymi drobiazgami. I to działa dla wszystkich metod zarówno w kliencie, jak i w węźle. Można elastycznie zarządzać parametrami z własnej aplikacji.
- Biblioteka napisana jest w nodejs. Problemy z wydajnością stosu są rekompensowane zdecentralizowaną naturą. Obciążenie można «rozłożyć» poprzez zwiększenie liczby węzłów. W zamian zyskujemy wiele zalet: ogromną społeczność, prostotę i wygodę pracy, izomorficznego klienta, brak zewnętrznych zależności itd.
storacle — to warstwa dziedzicząca po spreadable, która umożliwia przechowywanie plików w sieci. Każdy plik ma swój hash oparty na zawartości, za pomocą którego można go później odzyskać. Pliki nie są dzielone na bloki, lecz przechowywane w całości.
metastocle — warstwa dziedzicząca po spreadable, która pozwala przechowywać w sieci dane, ale nie pliki. Interfejs przypomina bazy danych nosql. Można na przykład dodać plik do storacle, uzyskać jego hash i zapisać w metastocle z powiązaniem do czegokolwiek.
museria — dziedziczy po storacle i metastocle. Ta warstwa odpowiada bezpośrednio za przechowywanie muzyki. Magazyn obsługuje tylko pliki mp3 oraz tagi id3.
Całkowite nazewnictwo utworu służy jako „klucz” do piosenki w postaci Wykonawca (TPE1) — Tytuł (TIT2). Na przykład:
- Brimstone — The Burden
- Hi-rez — Lost My Way (feat. Emilio Rojas, Dani Devinci)
Najbardziej szczegółowe informacje na temat tego, jak formułowane są tytuły piosenek można znaleźć . Należy spojrzeć na funkcję utils.beautifySongTitle().
Zgodność kluczy jest określoną w ustawieniach węzła wartością procentową. Na przykład wartość 0.85 oznacza, że jeśli funkcja porównania kluczy (nazw utworów) wykryje podobieństwo większe niż 85%, to jest to ta sama piosenka.
Algorytm określania podobieństwa znajduje się tamże, w funkcji utils.getSongSimilarity().
Okładka utworu, do późniejszego uzyskania, jest również przymocowywana za pomocą tagów (APIC). W narzędziach (utils) znajdują się wszystkie niezbędne metody do uzyskania i przetwarzania tagów.
Przykład pracy z magazynem przez klienta można zobaczyć w .
Wszystkie powyższe warstwy są samowystarczalne i mogą być używane oddzielnie jako niższe warstwy dla innych projektów. Na przykład, już teraz można myśleć o stworzeniu warstwy do przechowywania książek.
museria-global — to już skonfigurowane repozytorium git do uruchomienia własnego węzła w globalnej sieci muzyki. Klonujesz, npm i && npm start i właściwie to wszystko. Można skonfigurować bardziej szczegółowo, uruchomić w dockerze itd. Szczegółowe informacje są dostępne na .
Kiedy repozytorium jest aktualizowane, należy zaktualizować również swój węzeł. Jeśli zmienia się główny lub podrzędny numer wersji, to działanie jest obowiązkowe, w przeciwnym razie stare węzły będą ignorowane przez sieć.
Z piosenkami można pracować ręcznie i programowo. Każdy węzeł uruchamia serwer do różnych zadań. W tym również, przy odwiedzeniu domyślnego punktu końcowego, otrzymasz interfejs do pracy z muzyką. Na przykład, można wejść na (link może być nieaktualny później, węzły wejściowe można również uzyskać w , albo sprawdzić aktualizacje na githubie).
W ten sposób możesz wyszukiwać i pobierać piosenki w magazynie. Pobieranie piosenek może odbywać się w dwóch trybach: zwykłym i moderowanym. Drugi tryb oznacza, że prace prowadzi człowiek, a nie program. A jeśli zaznaczysz ten checkbox podczas dodawania, to będziesz musiał rozwiązać CAPTCHA. Piosenki można dodawać z priorytetami -1, 0 lub 1. Priorytet 1 można ustawić tylko w trybie moderowanym. Priorytety są potrzebne, aby magazyn efektywniej podejmował decyzje, co zrobić, gdy próbujesz zastąpić istniejącą piosenkę nową. Im wyższy priorytet, tym większe szanse, że zastąpisz istniejący plik. Pomaga to zwalczać spam i zwiększa jakość pobieranych piosenek.
Jeśli zaczniesz dodawać piosenki do magazynu, staraj się dołączać także obrazy (okładki), mimo że to pole nie jest obowiązkowe. W 99% przypadków pierwsze zdjęcia w Google po nazwach piosenek to okładki albumów.
Jak technicznie odbywa się dodawanie plików, w skrócie:
- Klient otrzymuje adres wolnego węzła, który na jakiś czas stanie się koordynatorem.
- Funkcja dodawania piosenki (przez człowieka lub kod) jest wywoływana, następuje zapytanie o dodanie do punktu końcowego koordynatora.
- Koordynator oblicza, ile duplikatów należy zachować (parametr konfigurowalny).
- Szukane są najbardziej odpowiednie węzły do przechowywania.
- Plik bezpośrednio trafia na te węzły.
Jak technicznie odbywa się pobieranie plików:
- Klient otrzymuje adres wolnego węzła, który na jakiś czas stanie się koordynatorem.
- Funkcja pobierania piosenki (przez człowieka lub kod) jest wywoływana, następuje zapytanie o pobranie do punktu końcowego koordynatora.
- Koordynator sprawdza dostępność linku w pamięci podręcznej. Jeśli taki istnieje i jest aktywny, zostaje od razu zwrócony klientowi, w przeciwnym razie węzły są zapytane o dostępność.
- Rozpoczyna się pobieranie pliku z linku, jeśli taki istnieje.
Alternatywy dla twórców muzyki
Zawsze interesowało mnie, jak obiektywnie można ocenić wartość wielu dzieł twórczych? Dlaczego na przykład człowiek wycenia swój album muzyczny na 10$? Albo na 20$ lub 100$? Gdzie jest algorytm? Kiedy mówimy o fizycznym produkcie lub nawet wielu rodzajach usług, przynajmniej możemy obliczyć koszty produkcji i na tym się opierać.
OK, załóżmy, że ustalono 10$. Czy to jest naprawdę efektywne? Załóżmy, że przesłuchałem album gdzieś lub piosenkę z niego i postanowiłem podziękować. Jednak według moich odczuć i własnych możliwości 3$ to moja maksymalna kwota. Jak w takim razie postąpić? Prawdopodobnie po prostu nic nie zrobię, jak większość ludzi.
Ustalając jakąś stałą cenę za twórczy trud, po prostu ograniczasz się, nie pozwalając większej liczbie ludzi wpłacić ci mniejszych kwot, które w sumie mogą być bardziej znaczące niż od tych, którzy kupią to po ustalonej przez ciebie cenie. Uważam, że twórczość to właśnie ta dziedzina, w której w pierwszej kolejności powinny dominować datki. Żeby to osiągnąć potrzebne jest:
- Nauczyć ludzi, jak dziękować w taki sposób. Twórcy powinni jasno pokazywać, że chcieliby otrzymywać datki, dodając wszędzie linki do różnych metod płatności itd.
- Potrzebujemy więcej mechanizmów do uproszczenia i wzmocnienia tych procesów. Na przykład stworzyć pewną globalną stronę, na którą można wpłacać datki za twórczość za pomocą linków autorskich.
Załóżmy, że link wygląda mniej więcej tak:
http://someartistsdonationsite.site/category/artist?external-infoJeśli zawęzić do muzyków, to:
http://someartistsdonationsite.com/music/miyagi?song=blablaWykonawca musi zweryfikować swój pseudonim i przypisać się do niego.
W kliencie museria dodajemy funkcję generowania takich linków, a wszystkie projekty korzystające z magazynu mogą umieszczać na swoich stronach/aplikacjach przyciski do datków z tymi linkami obok piosenek. Użytkownicy mają możliwość bardzo szybkie i proste wpłacenie datku. Oczywiście, to podejście można wykorzystać w każdym projekcie i kategorii twórczości, nie tylko przez magazyn.
Dlaczego, dokładnie ty, muzyczne magazynie, i jak można w tym uczestniczyć?
- Jeśli pracujesz nad projektem związanym z muzyką lub planujesz taki stworzyć, to wszystko po to, aby to zrealizować. Możesz używać muserii do przechowywania i pobierania utworów, zwiększając strumień muzyki w sieci. Jeśli masz możliwość uruchomienia i utrzymania przynajmniej jednego własnego węzła, to będzie to najlepszy wkład w rozwój sieci.
- Może jesteś gotów podjąć inną rolę: pomóc w kodowaniu, moderować bazę danych, rozpowszechniać informacje o projekcie wśród znajomych itd.
- Może spodobała ci się ta idea i chcesz wesprzeć ją finansowo, aby mogła istnieć i rozwijać się. Im więcej węzłów, tym więcej utworów.
- Lub po prostu pewnego momentu możesz potrzebować znaleźć i pobrać piosenkę. Możesz to zrobić bardzo łatwo, na przykład przez .
Projekt jest obecnie na najwcześniejszym etapie. Uruchomiona została sieć testowa, węzły mogą często się restartować, wymagać aktualizacji itd. W przypadku braku krytycznych problemów w trakcie okresu oceny, ta sama sieć zostanie przekształcona w główną.
Informacje o węźle na zewnątrz: liczba utworów, wolne miejsce itd. można znaleźć pod linkiem w formacie http://node-address/status lub http://node-address/status?pretty
Moje kontakty:
Źródło: habr.com
