Napady

Chytré hudební rádio, které nevyžaduje neustálé připojení k internetu / Habr

Při práci a při chůzi často poslouchám hudbu na pozadí. Dříve jsem používal internetové rádio Jango, které mi většinou vyhovovalo, až na toto:

  • nedostupnost během téměř každodenních procházek lesem (tj. bez připojení k internetu).
  • Nutnost přepínání mezi různými kanály pro změnu hudebního žánru. Jinými slovy, posluchač Janga má malou šanci objevit nové hudební žánry.

Jednoho dne jsem přišel s nápadem na mobilní aplikaci pro poslech hudby, která by mohla fungovat většinu času bez internetu (tj. ukládat hudbu do mezipaměti) s automatickou detekcí hudebních preferencí uživatele. Nikdy jsem nic podobného neviděl (možná jsem jen dostatečně dobře nehledal?), a tak jsem se rozhodl to implementovat sám. Nyní, po několika měsících programování ve volném čase od mého hlavního zaměstnání, jsem publikoval první, stále velmi syrovou, ale již docela funkční verzi aplikace pro Android.

Chtěl jsem implementovat aplikaci s velmi jednoduchým a intuitivním rozhraním (v podstatě pouze se dvěma tlačítky: „pauza“ a „přeskočit“), ale s poměrně pokročilou interní logikou pro analýzu hudebních preferencí (na základě sběru statistik o délce poslechu skladeb před přeskakováním) a ukládání skladeb do mezipaměti. Protože jsem nechtěl logiku duplikovat pro různé platformy, rozhodl jsem se ji implementovat v C++ (což je „společný jmenovatel“ pro iOS a Android).

Pro ukládání metadat skladeb a uživatelských preferencí jsem zvolil SQLite. Soubory s obrázky alb a skladbami jsou uloženy ve tříúrovňovém adresářovém stromu založeném na hashování (podobně jako to funguje v Gitu).

Velikost mezipaměti byla nastavena na 512 MiB (tato a jakákoli další čísla lze samozřejmě konfigurovat). Logika rotace skladeb je následující: v jedné iteraci aktualizace se stáhne 20 skladeb. Poté, co si uživatel každou skladbu poslechne alespoň dvakrát, se spustí nová aktualizace. Skladby s průměrnou dobou poslechu pod zadaným limitem se smažou a ze serveru se stáhnou metadata pro nové skladby, načež se spustí jejich stahování.

Logika přehrávání je následující: Čím delší je průměrná doba poslechu skladby, tím častěji se přehrává.

Jako zkušený C++ vývojář jsem neměl s implementací výše popsané logiky velké potíže (i když ve skutečnosti je poněkud složitější). Protože jsem však neměl zkušenosti s psaním aplikací pro Android, musel jsem věnovat spoustu času a úsilí implementaci odpovídající softwarové vrstvy (zejména uživatelského rozhraní). Jsem si jistý, že mnoho věcí v současnosti není implementováno nejlepším způsobem.

Rozhodl jsem se napsat Android wrapper v Kotlinu. Java skutečně neslibovala žádné výhody, protože bych si stejně musel hrát s JNI (situace bude jiná v iOS, kde je Objective C mnohem pohodlnější než Swift z hlediska integrace s nativním kódem hlavní logiky).

Pro stahování JSON metadat jsem použil Fuel a pro stahování souborů Fetch (byl jsem překvapen, že Fuel neuměl stahovat soubory efektivně). Mimochodem, mám určité stížnosti na stabilitu druhé knihovny.

Serverový kód byl napsán v Golangu a využívá PostgreSQL pomocí reformy. Současná metadatová základna byla vytvořena indexováním Free Music Archive a v budoucnu plánuji indexovat i další otevřené zdroje. Skladby zatím nejsou uloženy na serveru, aby se ušetřilo místo (úspora na hostingu), ale jsou přímo propojeny se zdrojovým úložištěm.

Server shromažďuje statistiky poslechu skladeb pro každého uživatele. Každému hudebnímu žánru je tak přiřazeno preferenční skóre, které ovlivňuje pravděpodobnost výběru odpovídajících skladeb během rotace.

Budu rád, když si moji aplikaci vyzkoušíte. Možná se vám bude líbit. Při jejím používání pravděpodobně narazíte na chyby (program je stále v syrovém stavu). Rychlost jejich opravy bude přímo záviset na poptávce po mé práci.

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button