Intelligentes Musikradio, für das keine permanente Internetverbindung erforderlich ist

Während ich arbeite und gehe, höre ich oft Hintergrundmusik. Ich habe früher ein Internetradio namens Jango benutzt , das bis auf die folgenden Dinge für fast jeden geeignet war:


  • Unzugänglichkeit bei fast täglichen Waldspaziergängen (d. h. ohne Internetverbindung).
  • Die Notwendigkeit, zwischen verschiedenen Kanälen zu wechseln, um das Musikgenre zu ändern. Mit anderen Worten, der Hörer von Jango hat kaum eine Chance, neue Musikgenres zu entdecken.

Eines Tages kam die Idee auf eine mobile Anwendung zum Musikhören, die die meiste Zeit ohne das Internet (d. H. Zwischengespeicherte Musik) mit automatischer Erkennung der Musikpräferenzen des Benutzers funktionieren könnte. Ich habe so etwas noch nicht gesehen (vielleicht habe ich nur schlecht ausgesehen?), Also habe ich beschlossen, es selbst zu implementieren. Jetzt, nach einigen Monaten des Codierens in meiner Freizeit von der Hauptarbeit, veröffentlichte ich die erste, immer noch sehr rohe, aber bereits funktionierende Version der Android-Anwendung .



Ich wollte eine Anwendung mit einer sehr einfachen und intuitiven Oberfläche implementieren (tatsächlich mit nur zwei Schaltflächen: "Pause" und "Überspringen"), aber mit einer ausreichend fortgeschrittenen internen Logik, um musikalische Vorlieben zu analysieren (basierend auf der Erfassung von Statistiken über die Dauer des Hörens von Titeln vor dem Überspringen). und Caching von Tracks. Da ich die Logik nicht für verschiedene Plattformen duplizieren wollte, wurde beschlossen, sie in C ++ (dem "gemeinsamen Nenner" für iOS und Android) zu implementieren.


Um die Metadaten zu den Tracks sowie die Benutzereinstellungen zu speichern, habe ich SQLite ausgewählt. Album- und Musik-Cover-Dateien werden in einem dreistufigen Hash-basierten Verzeichnisbaum gespeichert (ähnlich wie in Git).


512 MiB hat die Cache-Größe gewählt (diese und alle anderen Ziffern können natürlich konfiguriert werden). Die Logik der Drehung der Spuren lautet wie folgt: Pro Aktualisierungsiteration werden 20 Spuren heruntergeladen. Nachdem der Benutzer jeden Titel mindestens zweimal angehört hat, wird ein neues Update eingeleitet. Titel werden gelöscht, für die die durchschnittliche Hörzeit unter dem angegebenen Grenzwert liegt, und die Metadaten neuer Titel werden vom Server heruntergeladen. Danach beginnt der Download.


Die Wiedergabelogik ist wie folgt. Je länger die durchschnittliche Hörzeit eines Titels ist, desto häufiger wird er abgespielt.


Als erfahrener C ++ - Entwickler hatte ich keine besonderen Schwierigkeiten bei der Implementierung der oben beschriebenen Logik (obwohl sie in Wirklichkeit etwas komplizierter ist). Da ich jedoch keine Erfahrung mit dem Schreiben von Anwendungen für Android hatte, musste ich viel Zeit und Mühe auf die Implementierung der entsprechenden Softwareschicht (insbesondere der Benutzeroberfläche) verwenden. Ich bin sicher, dass viele Dinge jetzt nicht optimal umgesetzt werden.


Ich habe beschlossen, einen Android-Wrapper in Kotlin zu schreiben. Tatsächlich versprach Java keine Vorteile, da Sie sich immer noch mit JNI herumschlagen müssten (unter iOS wäre die Situation anders, Objective-C ist in Bezug auf die Integration mit nativem Kernlogikcode viel praktischer als Swift).


Ich habe Fuel zum Herunterladen von JSON-Metadaten und Fetch zum Herunterladen von Dateien verwendet (ich war überrascht, dass Fuel Dateien nicht effizient herunterladen kann). Übrigens habe ich in der zweiten Bibliothek Beschwerden über die Stabilität der Arbeit.


Der Servercode wurde in Golang geschrieben und verwendet PostgreSQL durch Reform . Die aktuelle Metadatendatenbank wurde durch Indizierung des Free Music Archive erstellt . In Zukunft plane ich, auch andere Open Source zu indizieren. Tracks auf dem Server werden noch nicht gespeichert, um Speicherplatz zu sparen (ich spare beim Hosting), sondern verweisen direkt auf das Quell-Repository.


Der Server sammelt Statistiken zum Abhören von Titeln für jeden Benutzer. Somit wird jedem Musikgenre eine Präferenzbewertung zugewiesen, die die Wahrscheinlichkeit der Auswahl der geeigneten Kompositionen während der Rotation beeinflusst.


Ich würde mich freuen, wenn Sie meine Bewerbung versuchen. Plötzlich wird es dir gefallen. Sicherlich werden Sie während des Gebrauchs auf Fehler stoßen (das Programm ist noch roh). Die Geschwindigkeit ihrer Korrektur hängt direkt von der Nachfrage nach meiner Arbeit ab.

Source: https://habr.com/ru/post/de463431/


All Articles