Radio musik pintar yang tidak memerlukan koneksi Internet permanen

Saat bekerja dan berjalan, saya sering mendengarkan musik latar. Saya biasa menggunakan radio internet yang disebut Jango , yang cocok untuk hampir semua orang, kecuali untuk hal-hal berikut:


  • tidak dapat diakses selama hampir setiap hari berjalan di hutan (mis. tanpa koneksi internet).
  • Kebutuhan untuk beralih di antara saluran yang berbeda untuk mengubah genre musik. Dengan kata lain, pendengar Jango memiliki sedikit peluang untuk menemukan genre musik baru.

Suatu hari ide muncul dengan aplikasi mobile untuk mendengarkan musik, yang sebagian besar waktu dapat bekerja tanpa Internet (yaitu musik dalam cache) dengan deteksi otomatis preferensi musik pengguna. Saya belum pernah melihat yang seperti ini (mungkin saya hanya terlihat buruk?), Jadi saya memutuskan untuk mengimplementasikannya sendiri. Sekarang, setelah beberapa bulan pengkodean di waktu senggang saya dari pekerjaan utama, saya menerbitkan versi pertama, masih sangat mentah, tetapi sudah berfungsi versi aplikasi Android .



Saya ingin menerapkan aplikasi dengan antarmuka yang sangat sederhana dan intuitif (pada kenyataannya, hanya dengan dua tombol: "jeda" dan "lewati"), tetapi dengan logika internal yang cukup canggih untuk menganalisis preferensi musik (berdasarkan pengumpulan statistik pada durasi mendengarkan trek sebelum melewatkan) dan trek caching. Karena saya tidak ingin menduplikasi logika untuk platform yang berbeda, diputuskan untuk mengimplementasikannya di C ++ (yang merupakan "common denominator" untuk iOS dan Android).


Untuk menyimpan metadata tentang trek, serta preferensi pengguna, saya memilih SQLite. File sampul album dan musik disimpan dalam pohon direktori hash berbasis tiga tingkat (mirip dengan cara kerjanya di Git).


512 MiB memilih ukuran cache (ini dan digit lainnya, tentu saja, dapat dikonfigurasi). Logika rotasi trek adalah sebagai berikut: 20 trek diunduh per pembaruan iterasi. Setelah pengguna mendengarkan setiap lagu setidaknya dua kali, pembaruan baru dimulai. Lagu dihapus dimana waktu mendengarkan rata-rata lebih rendah dari batas yang ditentukan, dan metadata trek baru diunduh dari server, setelah itu pengunduhan dimulai.


Logika pemutaran adalah sebagai berikut. Semakin lama waktu mendengarkan rata-rata untuk sebuah lagu, semakin sering itu diputar.


Menjadi pengembang C ++ yang berpengalaman, saya tidak mengalami kesulitan khusus dalam mengimplementasikan logika yang dijelaskan di atas (walaupun pada kenyataannya itu agak lebih rumit). Namun, karena tidak memiliki pengalaman menulis aplikasi untuk Android, saya harus menghabiskan banyak waktu dan upaya untuk mengimplementasikan lapisan perangkat lunak yang sesuai (terutama UI). Saya yakin banyak hal yang sekarang dilaksanakan bukan dengan cara terbaik.


Saya memutuskan untuk menulis bungkus Android di Kotlin. Sebenarnya, Java tidak menjanjikan keuntungan apa pun, karena Anda masih harus mengacaukan JNI (di iOS, situasinya akan berbeda, di sana Objective-C jauh lebih nyaman daripada Swift dalam hal integrasi dengan kode logika inti asli).


Saya menggunakan Bahan Bakar untuk mengunduh metadata JSON, dan Ambil untuk mengunduh file (Saya terkejut bahwa Bahan Bakar tidak dapat mengunduh file secara efisien). Ngomong-ngomong, ke perpustakaan kedua saya punya keluhan tentang stabilitas pekerjaan.


Kode server ditulis dalam Golang dan menggunakan PostgreSQL melalui reformasi . Basis data metadata saat ini dibangun dengan mengindeks Arsip Musik Gratis , dan di masa depan saya berencana untuk mengindeks sumber terbuka lainnya juga. Trek di server belum disimpan untuk menghemat ruang (saya menghemat hosting), tetapi langsung merujuk ke repositori sumber.


Server mengumpulkan statistik mendengarkan trek untuk masing-masing pengguna. Dengan demikian, setiap genre musik diberi skor preferensi yang mempengaruhi kemungkinan memilih komposisi yang sesuai selama rotasi.


Saya akan senang jika Anda mencoba aplikasi saya. Tiba-tiba Anda akan menyukainya. Tentunya saat digunakan, Anda akan menemukan bug (program ini masih mentah). Kecepatan koreksi mereka akan langsung tergantung pada permintaan pekerjaan saya.

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


All Articles