Radio musicale intelligente qui ne nécessite pas de connexion Internet permanente

En travaillant et en marchant, j'écoute souvent de la musique de fond. J'avais l'habitude d'utiliser une radio Internet appelée Jango , qui convenait à presque tout le monde, sauf pour les choses suivantes:


  • inaccessibilitĂ© lors de promenades presque quotidiennes dans la forĂŞt (c'est-Ă -dire sans connexion Internet).
  • La nĂ©cessitĂ© de basculer entre les diffĂ©rents canaux afin de changer le genre de musique. Autrement dit, l'auditeur de Jango a peu de chance de dĂ©couvrir de nouveaux genres musicaux.

Un jour, l'idée est venue avec une application mobile pour écouter de la musique, qui la plupart du temps pourrait fonctionner sans Internet (c'est-à-dire la musique en cache) avec une détection automatique des préférences musicales de l'utilisateur. Je n’ai rien vu de tel (peut-être que j’ai juste mal regardé?), J’ai donc décidé de le mettre en œuvre moi-même. Maintenant, après plusieurs mois de codage dans mon temps libre à partir du travail principal, j'ai publié la première version, encore très brute, mais déjà fonctionnelle de l' application Android .



Je voulais implémenter une application avec une interface très simple et intuitive (en fait, avec seulement deux boutons: "pause" et "skip"), mais avec une logique interne suffisamment avancée pour analyser les préférences musicales (basée sur la collecte de statistiques sur la durée d'écoute des morceaux avant de sauter) et la mise en cache des pistes. Comme je ne voulais pas dupliquer la logique pour différentes plateformes, il a été décidé de l'implémenter en C ++ (qui est le "dénominateur commun" pour iOS et Android).


Pour stocker les métadonnées sur les pistes, ainsi que les préférences des utilisateurs, j'ai choisi SQLite. Les fichiers de couverture d'album et de musique sont stockés dans une arborescence de répertoires basée sur le hachage à trois niveaux (similaire à la façon dont cela fonctionne dans Git).


512 Mio ont choisi la taille du cache (ceux-ci et tout autre chiffre, bien sûr, peuvent être configurés). La logique de rotation des pistes est la suivante: 20 pistes sont téléchargées par itération de mise à jour. Une fois que l'utilisateur a écouté chaque piste au moins deux fois, une nouvelle mise à jour est lancée. Les pistes sont supprimées pour lesquelles le temps d'écoute moyen est inférieur à la limite spécifiée, et les métadonnées des nouvelles pistes sont téléchargées à partir du serveur, après quoi le téléchargement commence.


La logique de lecture est la suivante. Plus le temps d'écoute moyen d'un morceau est long, plus il est lu fréquemment.


Étant un développeur C ++ expérimenté, je n'ai pas rencontré de difficultés particulières dans la mise en œuvre de la logique décrite ci-dessus (bien qu'en réalité c'est un peu plus compliqué). Cependant, n'ayant aucune expérience dans l'écriture d'applications pour Android, j'ai dû consacrer beaucoup de temps et d'efforts à la mise en œuvre de la couche logicielle appropriée (en particulier l'interface utilisateur). Je suis sûr que beaucoup de choses sont maintenant mises en œuvre de la meilleure façon.


J'ai décidé d'écrire un wrapper Android dans Kotlin. En fait, Java ne promettait aucun avantage, car il faudrait tout de même jouer avec JNI (dans iOS, la situation serait différente, là Objective-C est beaucoup plus pratique que Swift en termes d'intégration avec le code logique natif).


J'ai utilisé Fuel pour télécharger des métadonnées JSON et Fetch pour télécharger des fichiers (j'ai été surpris que Fuel ne soit pas en mesure de télécharger efficacement des fichiers). Soit dit en passant, à la deuxième bibliothèque, j'ai des plaintes concernant la stabilité du travail.


Le code du serveur a été écrit en Golang et utilise PostgreSQL via la réforme . La base de données de métadonnées actuelle a été créée en indexant les archives musicales gratuites et, à l'avenir, je prévois également d'indexer d'autres sources ouvertes. Les pistes sur le serveur ne sont pas encore stockées pour économiser de l'espace (j'économise sur l'hébergement), mais se réfèrent directement au référentiel source.


Le serveur collecte des statistiques d'écoute des pistes pour chacun des utilisateurs. Ainsi, chaque genre musical se voit attribuer un score de préférence qui affecte la probabilité de choisir les compositions appropriées pendant la rotation.


Je serai heureux si vous essayez mon application. Tout à coup, vous l'aimerez. Sûrement pendant l'utilisation, vous rencontrerez des bugs (le programme est encore brut). La vitesse de leur correction dépendra directement de la demande pour mon travail.

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


All Articles