Museria – ein dezentrales Musikspeicher

Museria – ein dezentrales Musikspeicher

Ich habe mich eines Tages entschlossen, eine Anwendung zu erstellen, um Musik für mich auszuwählen und sie zu Hause, draußen, beim Training usw. zu hören. Und dass das alles im Hintergrund funktioniert, mit minimaler Beteiligung meinerseits. Ich habe die Architektur entworfen, einen Prototyp skizziert und bin schließlich auf ein "kleines Problem" gestoßen.

Ich wusste nicht, woher ich die Musikdateien bekommen sollte. Zu diesem Zeitpunkt hatte VKontakte bereits die API geschlossen, auf großen Musikportalen ist es ebenfalls still geworden, selbst die Lieder werden in Teilen angeboten, um das Parsen zu verhindern. Es blieben nur einige eintägige Webseiten mit viel Werbung und Müll, allerlei fragwürdige Grabber-Programme und andere "schmutzige" Alternativen. Kurz gesagt, es gab keine wirkliche gute Lösung. Man könnte natürlich ein Abonnement für einen Dienst wie Yandex.Music oder ähnliches kaufen. Aber auch da gibt es nirgendwo eine offene öffentliche API, und man hat keinen programmatischen Zugriff auf die Musik. Mehrere große Unternehmen haben de facto den Zugang zur Musik für andere eingeschränkt. Warum ist das überhaupt passiert? Bei näherer Betrachtung wurde klar, dass das Hauptproblem die Urheberrechte sind. Die derzeitige Lösung in Form von Abonnements gefällt vielen kommerziellen Autoren musikalischer Werke und diesen Unternehmen. Dabei kommen auch nichtkommerzielle und bedingt kommerzielle Musik in die allgemeine Liste. Entweder man bezahlt für alles, oder man hört überhaupt nichts.

Also begann ich darüber nachzudenken, was man damit machen kann. Wie könnte man die freie Verbreitung von Musik organisieren? Was würde ich tun, wenn ich selbst Musik schaffen würde und damit Geld verdienen wollte? Würde es mir gefallen, wenn meine Lieder piratisch verbreitet würden? Welche alternativen Lösungen gibt es überhaupt?

Letztendlich gibt es zwei Hauptprobleme, die gelöst werden müssen:

  • Organisation der freien Verbreitung von Musik auf für die meisten Menschen komfortable Weise, einschließlich programmatischer Lösungen.
  • Angebot von Alternativen für Musikschaffende, um Einkommen zu generieren.

Globale dezentrale Musikspeicher-Lösungen.

Zunächst habe ich versucht, bereits bestehende Lösungen zu finden und alles darauf aufzubauen. Nach einiger Zeit der Suche fiel mir als erstes ipfsins Auge. Ich begann mit der Umsetzung meiner Idee, stieß jedoch nach einiger Zeit auf mehrere kritische Probleme mit dieser Lösung:

  • Ipfs – ein Speicher für alles und jeden. Hier gibt es Bilder, Musik, Videos und alles Mögliche. Im Grunde genommen eine große planetarische „Müllhalde“. Deshalb erhältst du beim Starten deines Knotens sofort eine enorme Belastung. Die Maschine krampft schlicht vor Schmerz.
  • Eine Art unfertiger Mechanismus zur Sammlung von „Müll“. Ich weiß nicht, wie das jetzt ist, aber damals, wenn du in der Konfiguration angegeben hast, dass du deinen Speicher auf zehn Gigabyte Daten beschränken möchtest, bedeutete das nichts. Der Speicher wuchs und ignorierte viele Konfigurationsparameter. Am Ende musste man über einen riesigen Speicherplatz auf der Festplatte verfügen, bis ipfs herausfand, wie man das Unnötige loswerden kann.
  • Zum Zeitpunkt der Nutzung der Bibliothek (ich weiß nicht, wie es jetzt ist) hatte der Client keine Timeouts implementiert. Du schickst eine Anfrage zum Abrufen einer Datei und wenn sie nicht vorhanden ist, hängst du einfach fest. Natürlich haben die Leute verschiedene Umgehungsstrategien erfunden, die das Problem teilweise lösten, aber das waren Notlösungen. Solche Dinge sollten von Anfang an funktionieren.

Außerdem gab es viele kleine Probleme, der Eindruck war damals eindeutig: Das kann man nicht für ein Projekt benutzen. Ich setzte die Suche nach einem Speicher fort, studierte verschiedene Optionen, fand aber nichts geeigneten.

Letztendlich beschloss ich, dass es sich lohnt, ein dezentrales Speichersystem selbst zu entwickeln. Es muss zwar nicht für interplanetare Zwecke relevant sein, aber es sollte die konkret gestellte Aufgabe lösen.

So sind sie entstanden. spreadable, storacle, metastocle, museria, museria-global.

spreadable – das ist die grundlegende, unterste Schicht, die es ermöglicht, Knoten in einem Netzwerk zu verbinden. Darin ist ein Algorithmus eingebettet, den ich bisher nur teilweise mit Blick auf etwa 10.000 Server implementiert habe. Die vollständige Version des Algorithmus ist viel komplizierter in der Umsetzung und würde noch einige zusätzliche Monate (vielleicht sogar mehr) in Anspruch nehmen.

Ich werde spreadable in diesem Artikel nicht im Detail beschreiben, besser schreibe ich irgendwann einen separaten Artikel. Hier möchte ich nur einige Besonderheiten hervorheben:

  • Es funktioniert über http/https.
  • Es ist möglich, ein separates Netzwerk für eine spezifische Aufgabe zu erstellen, was die Belastung jedes einzelnen Projekts erheblich reduziert, als wenn sie alle in einem Netzwerk wären.
  • Von Anfang an wurde ein Mechanismus mit Timeouts und anderen Kleinigkeiten durchdacht. Und das funktioniert für alle Methoden sowohl im Client als auch im Knoten. Man kann die Parameter flexibel aus seiner Anwendung steuern.
  • Die Bibliothek ist in nodejs geschrieben. Die Leistungsprobleme des Stacks werden durch die dezentralisierte Natur ausgeglichen. Die Last kann durch die Erhöhung der Anzahl der Knoten "verstreut" werden. Im Gegenzug gibt es viele Vorteile: eine riesige Community, einfache und bequeme Arbeit, ein isomorpher Client, keine externen Abhängigkeiten usw.

storacle — ist eine Schicht, die von spreadable erbt und es ermöglicht, Dateien im Netzwerk zu speichern. Jede Datei hat ihren Hash basierend auf ihrem Inhalt, über den sie später abgerufen werden kann. Dateien werden nicht in Blöcke unterteilt, sondern als Ganzes gespeichert.

metastocle — ist eine Schicht, die von spreadable erbt und es ermöglicht, Daten im Netzwerk zu speichern, jedoch keine Dateien. Die Schnittstelle ähnelt NoSQL-Datenbanken. Man kann beispielsweise eine Datei in storacle hinzufügen, ihren Hash erhalten und in metastocle mit einer Bindung an etwas schreiben.

museria — erbt von storacle und metastocle. Diese Schicht ist direkt für die Speicherung von Musik verantwortlich. Der Speicher arbeitet nur mit mp3-Dateien und ID3-Tags.

Der "Schlüssel" zum Lied ist sein vollständiger Titel in der Form Künstler (TPE1) — Titel (TIT2). Zum Beispiel:

  • Brimstone — The Burden
  • Hi-rez — Lost My Way (feat. Emilio Rojas, Dani Devinci)

Um detailliert zu erfahren, wie die Titel von Liedern gebildet werden, kann man hiernachsehen. Man muss die Funktion utils.beautifySongTitle().

Eine Übereinstimmung der Schlüssel wird durch einen in den Knoteneinstellungen definierten Prozentsatz bestimmt. Zum Beispiel bedeutet der Wert 0,85, dass, wenn die Schlüsselvergleichsfunktion (Liedtitel) eine Ähnlichkeit von mehr als 85 % feststellt, es sich um dasselbe Lied handelt.

Der Algorithmus zur Bestimmung der Ähnlichkeit befindet sich ebenfalls in der Funktion utils.getSongSimilarity().

Das Cover zum Lied kann ebenfalls über Tags angehängt werden (APIC). In den Utilities (utils) gibt es alle notwendigen Methoden zum Abrufen und Verarbeiten von Tags.

Ein Beispiel für die Arbeit mit dem Speicher über den Client kann in gesehen werden readme.

Alle oben genannten Schichten sind eigenständig und können separat als niedrigere Schichten für andere Projekte verwendet werden. Zum Beispiel gibt es bereits Überlegungen, eine Schicht für die Speicherung von Büchern zu schaffen.

museria-global — ist ein bereits konfiguriertes Git-Repository zum Starten eines eigenen Knotens im globalen Musiknetz. Klonen, npm i && npm start und das war's. Man kann es detaillierter konfigurieren, im Docker ausführen usw. Detaillierte Informationen sind auf GitHub.

Wenn das Repository aktualisiert wird, muss auch Ihr Knoten aktualisiert werden. Wenn sich die Haupt- oder Nebenversion ändert, ist dieser Schritt erforderlich, andernfalls werden alte Knoten vom Netzwerk ignoriert.

Sie können mit Songs sowohl manuell als auch programmatisch arbeiten. Jeder Knoten startet einen Server für verschiedene Aufgaben. Unter anderem erhalten Sie beim Besuch des Standard-Endpunkts eine Schnittstelle zur Arbeit mit Musik. Zum Beispiel können Sie auf den Wurzelknoten (der Link könnte später nicht mehr aktuell sein, Eingangs-Knoten können auch in der Telegram, oder Sie können die Updates auf GitHub einsehen).

So können Sie Songs im Speicher suchen und hochladen. Das Hochladen von Songs kann in zwei Modi erfolgen: normal und moderiert. Der zweite Modus bedeutet, dass eine Person, nicht ein Programm, die Arbeit durchführt. Wenn Sie dieses Kästchen beim Hinzufügen ankreuzen, müssen Sie ein Captcha lösen. Songs können mit Prioritäten von -1, 0 oder 1 hinzugefügt werden. Priorität 1 kann nur im moderierten Modus gesetzt werden. Die Prioritäten sind notwendig, damit der Speicher effektiver entscheiden kann, was zu tun ist, wenn Sie versuchen, einen bereits vorhandenen Song durch einen neuen zu ersetzen. Je höher die Priorität, desto größer sind die Chancen, dass Sie die vorhandene Datei überschreiben. Dies hilft, Spam zu bekämpfen und die Qualität der hochgeladenen Songs zu erhöhen.

Wenn Sie beginnen, Songs im Speicher hinzuzufügen, versuchen Sie, auch Bilder (Cover) anzuhängen, auch wenn dieses Feld nicht obligatorisch ist. In 99 % der Fälle sind die ersten Bilder, die Sie in Google zu den Songtiteln finden, Albumcover.

Wie das Hinzufügen von Dateien technisch abläuft, in Kürze:

  • Der Client erhält die Adresse eines freien Knotens, der für einige Zeit zum Koordinator wird.
  • Die Funktion zum Hinzufügen eines Songs (durch eine Person oder Code) wird ausgelöst, und eine Anfrage zum Hinzufügen wird an den Endpunkt des Koordinators gesendet.
  • Der Koordinator berechnet, wie viele Duplikate gespeichert werden müssen (konfigurierbarer Parameter).
  • Es werden die am besten geeigneten Knoten zum Speichern gesucht.
  • Die Datei wird direkt auf diese Knoten gesendet.

Wie das Abrufen von Dateien technisch abläuft:

  • Der Client erhält die Adresse eines freien Knotens, der für einige Zeit zum Koordinator wird.
  • Die Funktion zum Abrufen eines Songs (durch eine Person oder Code) wird ausgelöst, und eine Anfrage zum Abrufen wird an den Endpunkt des Koordinators gesendet.
  • Der Koordinator überprüft, ob der Link im Cache vorhanden ist. Wenn ja und er funktioniert, wird er sofort an den Client zurückgegeben, andernfalls werden die Knoten nach der Verfügbarkeit befragt.
  • Die Datei wird über den Link abgerufen, sofern ein solcher gefunden wurde.

Alternativen für Musikschaffende

Mich hat immer die Frage interessiert, wie man den Wert vieler kreativer Werke objektiv einschätzen kann. Warum beispielsweise verlangt jemand für sein Musikalbum 10 $? Oder 20 $ oder 100 $. Wo ist der Algorithmus? Wenn wir über ein physisches Produkt oder sogar über viele Dienstleistungen sprechen, können wir mindestens die Selbstkosten berechnen und darauf basierend vorgehen.

Okay, nehmen wir an, es wurden 10 $ festgelegt. Ist das wirklich effektiv? Angenommen, ich habe irgendwo das Album oder einen song daraus gehört und möchte mich bedanken. Aber nach meinem Empfinden und meinen Möglichkeiten sind 3 $ mein Höchstbetrag. Und was mache ich jetzt? Wahrscheinlich werde ich einfach nichts tun, wie die meisten Leute.

Wenn du einen festen Preis für kreative Arbeit festlegst, schränkst du dich einfach ein und gibst einer größeren Anzahl von Menschen nicht die Möglichkeit, dir weniger Geld zu schicken, was insgesamt mehr sein könnte als von denjenigen, die zu dem von dir festgelegten Preis kaufen. Ich denke, Kreativität ist genau das Gebiet, in dem in erster Linie Spenden entscheidend sein sollten. Dafür braucht es:

  • Die Menschen zu lehren, auf diese Weise Dankbarkeit zu zeigen. Die Kreativen müssen klar zeigen, dass sie sich Spenden wünschen und überall Links zu verschiedenen Zahlungsmethoden hinzufügen usw.
  • Es braucht mehr Mechanismen zur Vereinfachung und Verstärkung dieser Prozesse. Zum Beispiel einen globalen Ort zu schaffen, wo man für Kreativität durch spezielle Links spenden kann.

    Angenommen, der Link sieht ungefähr so aus:

    http://someartistsdonationsite.site/category/artist?external-info

    Wenn wir uns auf Musiker konzentrieren, dann:

    http://someartistsdonationsite.com/music/miyagi?song=blabla

    Der Künstler muss seinen Nicknamen verifizieren und an ihn gebunden sein.

    Im Client museria fügen wir eine Funktion zur Generierung eines solchen Links hinzu, und alle Projekte, die das Speicherformat nutzen, können auf ihren Websites/Apps Schaltflächen für Spenden mit diesen Links neben den Songs platzieren. Die Nutzer haben die Möglichkeit, sehr schnell und einfach zu spenden. Natürlich kann dieser Ansatz auch in jedem Projekt und in jeder Kategorie der Kreativität verwendet werden, nicht nur über das Speicherformat.

Warum gerade dir, ein musikalisches Speicherformat, und wie man daran teilnehmen kann?

  • Wenn du an einem Projekt arbeitest, das mit Musik zu tun hat, oder planst, eines zu erstellen, dann wurde genau dafür alles ins Leben gerufen. Du kannst museria nutzen, um Songs zu speichern und abzurufen und damit den Songfluss im Netz zu erhöhen. Wenn du in der Lage bist, mindestens einen eigenen Knoten zu betreiben und zu halten, wäre das der beste Beitrag zur Entwicklung des Netzwerks.
  • Vielleicht bist du bereit, einen anderen Teil zu übernehmen: beim Programmieren zu helfen, die Datenbank zu füllen und zu moderieren, Informationen über das Projekt an deine Bekannten zu verbreiten usw.
  • Vielleicht gefällt dir die Idee und du bist bereit, finanziell zu helfen, damit all dies lebt und sich entwickelt. Je mehr Knoten, desto mehr Songs.
  • Oder du wirst möglicherweise einfach irgendwann einen Song finden und herunterladen wollen. Das kannst du ganz einfach tun, zum Beispiel über einen Telegram-Bot.

Das Projekt befindet sich derzeit in der allerersten Phase. Ein Testnetz wurde gestartet, Knoten können oft neu gestartet werden, Updates erfordern usw. Sollte es während der Bewertungsphase keine kritischen Probleme geben, wird dasselbe Netzwerk in das Hauptnetz umgewandelt.

Informationen über einen Knoten von außen einsehen: Anzahl der Songs, freien Speicherplatz usw. kannst du über einen Link in der Form http://node-address/status oder http://node-address/status?pretty

Meine Kontakte:

Quelle: habr.com

60GB SSD 8Gb DDR4